From 24aaaf0600dda2501abb579bb47815041a14043c Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 21 Jan 2026 11:56:30 +0530 Subject: [PATCH 001/247] Sort http resources in service designer view --- .../ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx | 1 + 1 file changed, 1 insertion(+) 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 623ee74550f..43c44cae0d3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -949,6 +949,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { return nameMatch || iconMatch; }) .filter((resource) => resource.type === DIRECTORY_MAP.RESOURCE) + .sort((a, b) => a.position?.startLine - b.position?.startLine) .map((resource, index) => ( Date: Wed, 21 Jan 2026 14:27:49 +0530 Subject: [PATCH 002/247] Sort http resources in artifact tree view --- .../project-explorer-provider.ts | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) 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 000b94c6903..423b9ab3599 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 @@ -99,8 +99,8 @@ export class ProjectExplorerEntryProvider implements vscode.TreeDataProvider { try { this._data = []; - - const data = await getProjectStructureData(); + + const data = await getProjectStructureData(); this._data = data; // Fire the event after data is fully populated this._onDidChangeTreeData.fire(); @@ -110,7 +110,7 @@ export class ProjectExplorerEntryProvider implements vscode.TreeDataProvider { uniqueProjects.set(project.projectPath, project); } } - + const filteredProjects = Array.from(uniqueProjects.values()); - + const isSingleProject = filteredProjects.length === 1; for (const project of filteredProjects) { const projectTree = generateTreeData(project, isSingleProject); @@ -539,8 +539,10 @@ function getComponents(items: ProjectStructureArtifactResponse[], itemType: DIRE fileEntry.tooltip = comp.context; // Get the children for services only if (itemType === DIRECTORY_MAP.SERVICE) { - const resourceFunctions = getComponents(comp.resources, DIRECTORY_MAP.RESOURCE, projectPath); - const remoteFunctions = getComponents(comp.resources, DIRECTORY_MAP.REMOTE, projectPath); + const resourceFunctions = getComponents(comp.resources, DIRECTORY_MAP.RESOURCE, projectPath) + .sort((a, b) => (a.position && b.position) ? a.position.startLine - b.position.startLine : 0); + const remoteFunctions = getComponents(comp.resources, DIRECTORY_MAP.REMOTE, projectPath) + .sort((a, b) => (a.position && b.position) ? a.position.startLine - b.position.startLine : 0); fileEntry.children = [...resourceFunctions, ...remoteFunctions]; if (fileEntry.children.length > 0) { fileEntry.collapsibleState = vscode.TreeItemCollapsibleState.Expanded; From 6c5cc8d764f858a2c2e6a5d6177c3305e7a40d93 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 21 Jan 2026 17:46:11 +0530 Subject: [PATCH 003/247] Group module level inputs into single input node --- .../src/rpc-managers/data-mapper/utils.ts | 38 +++++++++++++++++-- .../Node/Input/InputNodeTreeItemWidget.tsx | 5 ++- .../Diagram/Node/Input/InputNodeWidget.tsx | 3 +- .../Diagram/Node/commons/DataMapperNode.ts | 5 ++- .../components/Diagram/utils/node-utils.ts | 2 +- 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index 649e782c2df..15a5e9dfad4 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -32,7 +32,8 @@ import { ExpandModelOptions, ExpandedDMModel, MACHINE_VIEW, - IntermediateClauseType + IntermediateClauseType, + InputCategory } from "@wso2/ballerina-core"; import { updateSourceCode, UpdateSourceCodeRequest } from "../../utils"; import { StateMachine, updateDataMapperView } from "../../stateMachine"; @@ -481,10 +482,13 @@ export function expandDMModel( */ function processInputRoots(model: DMModel): IOType[] { const inputs: IORoot[] = []; + const moduleLevelInputs: IORoot[] = []; const focusInputs: Record = {}; for (const input of model.inputs) { if (input.focusExpression && (input.isIterationVariable || input.isSeq || input.isGroupingKey)) { focusInputs[input.focusExpression] = input as IOTypeField; + } else if (isModuleLevelInput(input)) { + moduleLevelInputs.push(input); } else { inputs.push(input); } @@ -497,10 +501,39 @@ function processInputRoots(model: DMModel): IOType[] { focusInputs }; - return inputs.map(input => { + const processedInputs = inputs.map(input => { preProcessedModel.traversingRoot = input.name; return processIORoot(input, preProcessedModel); }); + + return moduleLevelInputs.length + ? [buildModuleLevelInputsGroup(moduleLevelInputs, preProcessedModel), ...processedInputs] + : processedInputs; +} + +function isModuleLevelInput(input: IORoot): boolean { + return input.category === InputCategory.Constant + || input.category === InputCategory.Configurable + || input.category === InputCategory.ModuleVariable + || input.category === InputCategory.Variable; +} + +function buildModuleLevelInputsGroup(moduleLevelInputs: IORoot[], model: DMModel): IOType { + + const id = "$MODULE_LEVEL_INPUTS$"; + model.traversingRoot = id; + const fields = moduleLevelInputs.map(input => { + model.focusInputRootMap[input.name] = model.traversingRoot; + return processIORoot(input, model); + }); + + return { + id, + name: id, + displayName: "Module Level Inputs", + kind: TypeKind.Record, + fields + }; } /** @@ -787,4 +820,3 @@ function processEnum( ...(member.optional && { optional: member.optional }) })); } - diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx index 495b830ce6b..f97f90cea5c 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx @@ -29,6 +29,7 @@ import { useIONodesStyles } from "../../../styles"; import { useDMCollapsedFieldsStore, useDMExpandedFieldsStore } from '../../../../store/store'; import { getTypeName, isEnumMember } from "../../utils/type-utils"; import { InputNode } from "./InputNode"; +import { InputCategoryIcon } from "./InputCategoryIcon"; export interface InputNodeTreeItemWidgetProps { parentId: string; @@ -51,7 +52,8 @@ export function InputNodeTreeItemWidget(props: InputNodeTreeItemWidgetProps) { const fieldName = dmType.name; const displayName = dmType.displayName || fieldName; const typeName = getTypeName(dmType); - const fieldId = dmType.isFocused ? fieldName : `${parentId}.${fieldName}`; + const skipParentId = dmType.isFocused || dmType.category; + const fieldId = skipParentId ? fieldName : `${parentId}.${fieldName}`; const portOut = getPort(`${fieldId}.OUT`); const isUnknownType = dmType.kind === TypeKind.Unknown; @@ -134,6 +136,7 @@ export function InputNodeTreeItemWidget(props: InputNodeTreeItemWidgetProps) { {expanded ? : } } {label} + {portOut && !portOut.attributes.isPreview && diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx index f994148a33e..b0dfbab112c 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx @@ -79,10 +79,11 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { expanded = false; } + const headerLabel = valueLabel || dmType.displayName || dmType.name || id; const label = ( - {valueLabel ? valueLabel : id} + {headerLabel} {typeName && ( diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index cd32e27a636..788c20e9e44 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -113,8 +113,9 @@ export abstract class DataMapperNodeModel extends NodeModel Date: Wed, 21 Jan 2026 19:20:13 +0530 Subject: [PATCH 004/247] Fix InputCategoryIcon alignment --- .../components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx | 2 +- .../src/components/Diagram/Node/Input/InputNodeWidget.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx index f97f90cea5c..ebb98722f2d 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx @@ -75,7 +75,7 @@ export function InputNodeTreeItemWidget(props: InputNodeTreeItemWidgetProps) { const indentation = fields ? 0 : ((treeDepth + 1) * 16) + 8; const label = ( - + {displayName} {dmType.optional && "?"} diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx index b0dfbab112c..04237a4a4a0 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx @@ -152,7 +152,7 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { - {portOut && + {portOut && !expanded && portOut.linkedPorts.length > 0 && } From dfae202bc9a59e02f567d2c1c50aa38d29af21b1 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 21 Jan 2026 20:17:22 +0530 Subject: [PATCH 005/247] Special case group header port handling --- .../src/rpc-managers/data-mapper/utils.ts | 2 +- .../components/Diagram/LinkState/CreateLinkState.ts | 5 ++--- .../src/components/Diagram/utils/common-utils.ts | 13 ++++++++++++- .../src/components/Diagram/utils/port-utils.ts | 4 ---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index 15a5e9dfad4..7c1bc1f61fa 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -520,7 +520,7 @@ function isModuleLevelInput(input: IORoot): boolean { function buildModuleLevelInputsGroup(moduleLevelInputs: IORoot[], model: DMModel): IOType { - const id = "$MODULE_LEVEL_INPUTS$"; + const id = "MODULE_LEVEL_INPUTS$"; // Suffix $ to avoid conflicts with user defined names and special case port handling model.traversingRoot = id; const fields = moduleLevelInputs.map(input => { model.focusInputRootMap[input.name] = model.traversingRoot; diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/LinkState/CreateLinkState.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/LinkState/CreateLinkState.ts index 870a6762b4f..6f590033d42 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/LinkState/CreateLinkState.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/LinkState/CreateLinkState.ts @@ -25,11 +25,10 @@ import { InputOutputPortModel } from '../Port/model/InputOutputPortModel'; import { isInputNode, isLinkModel, isOutputNode } from '../Actions/utils'; import { DataMapperLinkModel } from '../Link/DataMapperLink'; import { DataMapperNodeModel } from '../Node/commons/DataMapperNode'; -import { getMappingType, handleExpand, isExpandable, isPendingMappingRequired } from '../utils/common-utils'; +import { getMappingType, handleExpand, isExpandable, isPendingMappingRequired, isGroupHeaderPort, isQueryHeaderPort } from '../utils/common-utils'; import { removePendingMappingTempLinkIfExists } from '../utils/link-utils'; import { useDMExpressionBarStore } from '../../../store/store'; import { IntermediatePortModel } from '../Port/IntermediatePort'; -import { isQueryHeaderPort } from '../utils/port-utils'; import { ClauseConnectorNode, LinkConnectorNode } from '../Node'; /** * This state is controlling the creation of a link. @@ -121,7 +120,7 @@ export class CreateLinkState extends State { this.eject(); } else if (element instanceof PortModel && !this.sourcePort) { if (element instanceof InputOutputPortModel) { - if (element.attributes.portType === "OUT") { + if (element.attributes.portType === "OUT" && !isGroupHeaderPort(element)) { this.sourcePort = element; element.fireEvent({}, "mappingStartedFrom"); element.linkedPorts.forEach((linkedPort) => { diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts index 07efd9e053b..78d65216fae 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts @@ -111,7 +111,7 @@ export function getMappingType(sourcePort: PortModel, targetPort: PortModel): Ma if (sourceDim > 0) { const dimDelta = sourceDim - targetDim; if (dimDelta == 0) { - if(targetPort.attributes.portName.endsWith(".#")) { + if(isQueryHeaderPort(targetPort)) { return MappingType.ArrayConnect; } return MappingType.ArrayToArray; @@ -345,3 +345,14 @@ export function getTargetField(viewId: string, outputId: string){ export function isWithinSubMappingRootView(views: View[]): boolean { return views.length > 1 && views[views.length - 1].subMappingInfo?.focusedOnSubMappingRoot; } + +export function isQueryHeaderPort(port: InputOutputPortModel): boolean { + // This function intentionally place here instead of port-utils.ts to avoid cyclic dependency issues + return port.attributes.portName.endsWith(".#"); +} + +export function isGroupHeaderPort(port: InputOutputPortModel): boolean { + // This function intentionally place here instead of port-utils.ts to avoid cyclic dependency issues + return port.attributes.portName.endsWith("$"); +} + diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/port-utils.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/port-utils.ts index a4f34f5b280..eb60aca5660 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/port-utils.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/port-utils.ts @@ -71,7 +71,3 @@ export function getTargetPortPrefix(node: NodeModel): string { return ""; } } - -export function isQueryHeaderPort(port: InputOutputPortModel): boolean { - return port.attributes.portName.endsWith(".#"); -} From 2eb15be5da8d9c5fe1aaac5bc2c0a8283877d1f8 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 21 Jan 2026 20:24:06 +0530 Subject: [PATCH 006/247] Prevent type label display for group header ports in InputNodeWidget --- .../src/components/Diagram/Node/Input/InputNodeWidget.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx index 04237a4a4a0..b33322c195f 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx @@ -31,6 +31,7 @@ import { useDMCollapsedFieldsStore, useDMExpandedFieldsStore, useDMIOConfigPanel import { getTypeName } from "../../utils/type-utils"; import { useShallow } from "zustand/react/shallow"; import { InputCategoryIcon } from "./InputCategoryIcon"; +import { isGroupHeaderPort } from "../../utils/common-utils"; export interface InputNodeWidgetProps { id: string; // this will be the root ID used to prepend for UUIDs of nested fields @@ -85,7 +86,7 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { {headerLabel} - {typeName && ( + {typeName && !isGroupHeaderPort(portOut) && ( {typeName} From 8c221460b1d6809421f6281d5c4e6f957eaf8178 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 21 Jan 2026 20:38:48 +0530 Subject: [PATCH 007/247] Refactor InputNodeWidget to improve group header port handling --- .../src/components/Diagram/Node/Input/InputNodeWidget.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx index b33322c195f..92c7aa86013 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx @@ -80,13 +80,15 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { expanded = false; } + const isNotGroupHeaderPort = !isGroupHeaderPort(portOut); + const headerLabel = valueLabel || dmType.displayName || dmType.name || id; const label = ( {headerLabel} - {typeName && !isGroupHeaderPort(portOut) && ( + {typeName && isNotGroupHeaderPort && ( {typeName} @@ -153,7 +155,7 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { - {portOut && !expanded && portOut.linkedPorts.length > 0 && + {portOut && (isNotGroupHeaderPort || !expanded && portOut.linkedPorts.length > 0) && } From c7053e415275871244b9867989734c40a089dfc7 Mon Sep 17 00:00:00 2001 From: choreo-cicd Date: Thu, 22 Jan 2026 06:20:05 +0000 Subject: [PATCH 008/247] Update version to ballerina-integrator-1.6.1 --- workspaces/bi/bi-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 0d15980bcf2..5c777e1bc92 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.6.0", + "version": "1.6.1", "publisher": "wso2", "icon": "resources/images/wso2-ballerina-integrator-logo.png", "repository": { From 394dfcf2a148403cb727beda53896604063c0931 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Thu, 22 Jan 2026 13:13:45 +0530 Subject: [PATCH 009/247] Improve logic for group header port check and correct comments in common-utils --- .../src/components/Diagram/Node/Input/InputNodeWidget.tsx | 2 +- .../data-mapper/src/components/Diagram/utils/common-utils.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx index 92c7aa86013..fb02acf6c25 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx @@ -80,7 +80,7 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { expanded = false; } - const isNotGroupHeaderPort = !isGroupHeaderPort(portOut); + const isNotGroupHeaderPort = !(portOut && isGroupHeaderPort(portOut)); const headerLabel = valueLabel || dmType.displayName || dmType.name || id; const label = ( diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts index 78d65216fae..61070964a47 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/utils/common-utils.ts @@ -347,12 +347,12 @@ export function isWithinSubMappingRootView(views: View[]): boolean { } export function isQueryHeaderPort(port: InputOutputPortModel): boolean { - // This function intentionally place here instead of port-utils.ts to avoid cyclic dependency issues + // This function intentionally placed here instead of port-utils.ts to avoid cyclic dependency issues return port.attributes.portName.endsWith(".#"); } export function isGroupHeaderPort(port: InputOutputPortModel): boolean { - // This function intentionally place here instead of port-utils.ts to avoid cyclic dependency issues + // This function intentionally placed here instead of port-utils.ts to avoid cyclic dependency issues return port.attributes.portName.endsWith("$"); } From 88fe8e411e57f741f32d7e9415030fa6e22711b3 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Thu, 22 Jan 2026 13:20:00 +0530 Subject: [PATCH 010/247] Add JSDoc comments for module level input grouping util functions --- .../src/rpc-managers/data-mapper/utils.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index 7c1bc1f61fa..7f247513fba 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -511,6 +511,9 @@ function processInputRoots(model: DMModel): IOType[] { : processedInputs; } +/** + * Checks if the given input is a module level input + */ function isModuleLevelInput(input: IORoot): boolean { return input.category === InputCategory.Constant || input.category === InputCategory.Configurable @@ -518,6 +521,9 @@ function isModuleLevelInput(input: IORoot): boolean { || input.category === InputCategory.Variable; } +/** + * Builds an IOType to group module level inputs + */ function buildModuleLevelInputsGroup(moduleLevelInputs: IORoot[], model: DMModel): IOType { const id = "MODULE_LEVEL_INPUTS$"; // Suffix $ to avoid conflicts with user defined names and special case port handling From 855742f09a9388eace2531061d59ed8c20f8704a Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 22 Jan 2026 13:23:07 +0530 Subject: [PATCH 011/247] Add ftp deprecated api support --- .../src/views/BI/ServiceDesigner/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 623ee74550f..bed4ba1a7fc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -248,11 +248,14 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const onCreateFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onCreate'); const onDeleteFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onDelete'); + const onChangeFunction = serviceModel.functions.filter(fn => fn.metadata?.label === 'EVENT'); const hasAvailableOnCreate = onCreateFunctions.length > 0 && onCreateFunctions.some(fn => !fn.enabled); const hasAvailableOnDelete = onDeleteFunctions.length > 0 && onDeleteFunctions.some(fn => !fn.enabled); + const hasOnChange = onChangeFunction.length > 0 && onChangeFunction.some(fn => fn.enabled); - return hasAvailableOnCreate || hasAvailableOnDelete; + // Remove the add handler option if deprecated APIs present + return (hasAvailableOnCreate || hasAvailableOnDelete) && !hasOnChange; }; useEffect(() => { From bf590a496438e5e5af145f4e4e7df8b209b031b0 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Thu, 22 Jan 2026 15:02:41 +0530 Subject: [PATCH 012/247] Update input category check and rename display name for module level inputs --- .../ballerina-extension/src/rpc-managers/data-mapper/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index 7f247513fba..9b8e12ca60c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -518,7 +518,7 @@ function isModuleLevelInput(input: IORoot): boolean { return input.category === InputCategory.Constant || input.category === InputCategory.Configurable || input.category === InputCategory.ModuleVariable - || input.category === InputCategory.Variable; + || input.category === InputCategory.Enum; } /** @@ -536,7 +536,7 @@ function buildModuleLevelInputsGroup(moduleLevelInputs: IORoot[], model: DMModel return { id, name: id, - displayName: "Module Level Inputs", + displayName: "Global Inputs", kind: TypeKind.Record, fields }; From 8251276929f09292ebcc045609aba7416dd04b0d Mon Sep 17 00:00:00 2001 From: ChamodA Date: Thu, 22 Jan 2026 16:48:23 +0530 Subject: [PATCH 013/247] Add CLAUSE_EXPRESSION type to form field inputs and update related components --- .../ballerina/ballerina-core/src/interfaces/bi.ts | 3 ++- .../src/components/editors/EditorFactory.tsx | 4 +++- .../src/views/BI/Forms/FormGeneratorNew/index.tsx | 2 +- .../DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx | 10 +++++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index e1670d8e31c..777254dba86 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -153,7 +153,8 @@ export type FormFieldInputType = "TEXT" | "ENUM" | "DM_JOIN_CLAUSE_RHS_EXPRESSION" | "RECORD_MAP_EXPRESSION" | - "PROMPT"; + "PROMPT" | + "CLAUSE_EXPRESSION"; export interface BaseType { fieldType: FormFieldInputType; 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 00ac3bf8413..8d1c1ded6e6 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -97,7 +97,8 @@ export const EditorFactory = (props: FormFieldEditorProps) => { type.fieldType === "MAPPING_EXPRESSION" || (type.fieldType === "SINGLE_SELECT" && isDropDownType(type)) || type.fieldType === "RECORD_MAP_EXPRESSION" || - (field.type === "FLAG" && field.types?.length > 1) + (field.type === "FLAG" && field.types?.length > 1) || + type.fieldType === "CLAUSE_EXPRESSION" ); }); @@ -224,6 +225,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { ); } else if (field.type === "DM_JOIN_CLAUSE_RHS_EXPRESSION") { // Expression field for Data Mapper join on condition RHS + field.type = "CLAUSE_EXPRESSION"; // This mutation is required to support diagnostics return ( { - if (!showDiagnostics || isDataMapperEditor) { + if (!showDiagnostics) { setDiagnosticsInfo({ key, diagnostics: [] }); return; } diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx index 63de8b1f622..4a66e8a7a03 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx @@ -71,7 +71,7 @@ export function ClauseEditor(props: ClauseEditorProps) { editable: true, documentation: clauseType === IntermediateClauseType.JOIN ? "Represents each record in the joined collection" : "Enter a name for the variable", value: clauseProps?.name ?? "", - types: [{ fieldType: "IDENTIFIER", scope: "Global", selected: false }], + types: [{ fieldType: "IDENTIFIER", selected: false }], enabled: true, } @@ -92,14 +92,14 @@ export function ClauseEditor(props: ClauseEditorProps) { label: clauseType === IntermediateClauseType.JOIN ? "Join With Collection" : clauseType === IntermediateClauseType.GROUP_BY ? "Grouping Key" : "Expression", - type: "EXPRESSION", + type: "CLAUSE_EXPRESSION", optional: false, editable: true, documentation: clauseType === IntermediateClauseType.JOIN ? "Collection to be joined" : clauseType === IntermediateClauseType.GROUP_BY ? "Enter the grouping key expression" : "Enter the expression of the clause", value: clauseProps?.expression ?? "", - types: [{ fieldType: "EXPRESSION", selected: false }], + types: [{ fieldType: "CLAUSE_EXPRESSION", selected: false }], enabled: true, } @@ -119,12 +119,12 @@ export function ClauseEditor(props: ClauseEditorProps) { const lhsExpressionField: DMFormField = { key: "lhsExpression", label: "LHS Expression", - type: "EXPRESSION", + type: "CLAUSE_EXPRESSION", optional: false, editable: true, documentation: "Enter the LHS expression of join-on condition", value: clauseProps?.lhsExpression ?? "", - types: [{ fieldType: "EXPRESSION", selected: false }], + types: [{ fieldType: "CLAUSE_EXPRESSION", selected: false }], enabled: true, } From 6ed12bd7653ce52051201c1f03cc47cff383bb3d Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Fri, 23 Jan 2026 07:45:23 +0530 Subject: [PATCH 014/247] Resolve the github suggestions --- .../src/views/BI/ServiceDesigner/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 bed4ba1a7fc..f67572eb753 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -248,14 +248,14 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const onCreateFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onCreate'); const onDeleteFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onDelete'); - const onChangeFunction = serviceModel.functions.filter(fn => fn.metadata?.label === 'EVENT'); + const deprecatedFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'EVENT'); const hasAvailableOnCreate = onCreateFunctions.length > 0 && onCreateFunctions.some(fn => !fn.enabled); const hasAvailableOnDelete = onDeleteFunctions.length > 0 && onDeleteFunctions.some(fn => !fn.enabled); - const hasOnChange = onChangeFunction.length > 0 && onChangeFunction.some(fn => fn.enabled); + const hasDeprecatedFunctions = deprecatedFunctions.length > 0 && deprecatedFunctions.some(fn => fn.enabled); // Remove the add handler option if deprecated APIs present - return (hasAvailableOnCreate || hasAvailableOnDelete) && !hasOnChange; + return (hasAvailableOnCreate || hasAvailableOnDelete) && !hasDeprecatedFunctions; }; useEffect(() => { From bee6f7fc61b4927339decf4639f7a072d489d25f Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 23 Jan 2026 16:03:09 +0530 Subject: [PATCH 015/247] Enhance Data Mapper join clause editor to support diagnostics and transform field type --- .../src/components/editors/EditorFactory.tsx | 9 +++++++-- .../components/editors/ExpressionEditor.tsx | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) 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 8d1c1ded6e6..f5c4f999758 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -225,10 +225,15 @@ export const EditorFactory = (props: FormFieldEditorProps) => { ); } else if (field.type === "DM_JOIN_CLAUSE_RHS_EXPRESSION") { // Expression field for Data Mapper join on condition RHS - field.type = "CLAUSE_EXPRESSION"; // This mutation is required to support diagnostics + const clauseExpressionField: FormField = { + ...field, + type: "CLAUSE_EXPRESSION", + types: [{ fieldType: "CLAUSE_EXPRESSION", selected: false }] + }; // Transforming to CLAUSE_EXPRESSION type to support diagnostics + return ( { + const varName = form.watch('name'); + const joinExpression = form.watch('expression'); + const prefixExpr = `from var ${varName} in ${joinExpression} select `; + return await expressionEditor.getExpressionEditorDiagnostics( + showDiagnostics, + prefixExpr + expression, + key, + property + ); + } + return ( Date: Fri, 23 Jan 2026 16:03:26 +0530 Subject: [PATCH 016/247] Update field type scope in ClauseEditor and SubMappingConfigForm to 'Local' --- .../DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx | 2 +- .../SidePanel/SubMappingConfig/SubMappingConfigForm.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx index 4a66e8a7a03..132d1d49e7c 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseEditor.tsx @@ -71,7 +71,7 @@ export function ClauseEditor(props: ClauseEditorProps) { editable: true, documentation: clauseType === IntermediateClauseType.JOIN ? "Represents each record in the joined collection" : "Enter a name for the variable", value: clauseProps?.name ?? "", - types: [{ fieldType: "IDENTIFIER", selected: false }], + types: [{ fieldType: "IDENTIFIER", scope: "Local", selected: false }], enabled: true, } diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/SubMappingConfig/SubMappingConfigForm.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/SubMappingConfig/SubMappingConfigForm.tsx index 502e8b0ae19..99e73249d18 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/SubMappingConfig/SubMappingConfigForm.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/SidePanel/SubMappingConfig/SubMappingConfigForm.tsx @@ -123,7 +123,7 @@ export function SubMappingConfigForm(props: SubMappingConfigFormProps) { editable: true, documentation: "Enter the name of the sub mapping.", value: formValues.name, - types: [{ fieldType: "IDENTIFIER", scope: "Global", selected: false }], + types: [{ fieldType: "IDENTIFIER", scope: "Local", selected: false }], enabled: true, }; From 6720af92d62fc4b21ac9f2a79d297072002a098d Mon Sep 17 00:00:00 2001 From: NipunaRanasinghe Date: Tue, 27 Jan 2026 10:46:35 +0530 Subject: [PATCH 017/247] Add check for multiple Ballerina installations in PATH to prevent version conflicts --- .../ballerina-extension/src/core/extension.ts | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index e63257c23b4..8d892bc1730 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -487,6 +487,9 @@ export class BallerinaExtension { debug(`[INIT] Auto-detected Ballerina Home: ${this.ballerinaHome}`); debug(`[INIT] Is old Ballerina distribution: ${isOldBallerinaDist}`); debug(`[INIT] Is Ballerina not found: ${isBallerinaNotFound}`); + + // Check for multiple Ballerina installations in PATH + this.checkMultipleBallerinaInstallations(); } catch (error) { debug(`[INIT] Error auto-detecting Ballerina home: ${error}`); throw error; @@ -2281,6 +2284,91 @@ export class BallerinaExtension { return result; } + /** + * Check if multiple Ballerina installations exist in the system PATH. + * Logs a warning if different installations are detected, as this can cause + * unpredictable behavior when different versions are used for different actions. + */ + private checkMultipleBallerinaInstallations(): void { + debug("[MULTI_BAL_CHECK] Checking for multiple Ballerina installations in PATH..."); + + try { + let ballerinaPathsOutput = ''; + const execOptions = { + encoding: 'utf8' as const, + timeout: 10000, + env: { ...process.env } + }; + + if (isWindows()) { + // On Windows, use 'where bal' to find all occurrences + try { + ballerinaPathsOutput = execSync('where bal', execOptions).toString(); + debug(`[MULTI_BAL_CHECK] Windows 'where bal' output: ${ballerinaPathsOutput}`); + } catch (error) { + debug(`[MULTI_BAL_CHECK] 'where bal' command failed: ${error}`); + return; + } + } else { + // On Unix-like systems (including WSL and macOS), find all bal executables in PATH + // Use portable commands available in standard POSIX shells instead of shell-specific built-ins + try { + ballerinaPathsOutput = execSync( + 'which -a bal 2>/dev/null || command -v bal 2>/dev/null || type -ap bal 2>/dev/null', + { + encoding: 'utf8', + timeout: 10000, + env: { ...process.env }, + shell: '/bin/sh' + } + ).toString(); + debug(`[MULTI_BAL_CHECK] Unix 'which/command/type bal' output: ${ballerinaPathsOutput}`); + } catch (error) { + debug(`[MULTI_BAL_CHECK] Command to find bal executables failed: ${error}`); + return; + } + } + + // Parse the output to get unique paths + const paths = ballerinaPathsOutput + .split(/\r?\n/) + .map(p => p.trim()) + .filter(p => p.length > 0); + + debug(`[MULTI_BAL_CHECK] Found ${paths.length} Ballerina path(s): ${JSON.stringify(paths)}`); + + if (paths.length >= 2) { + // Get unique parent directories to identify different installations + const installationDirs = new Set(); + for (const balPath of paths) { + installationDirs.add(path.dirname(path.resolve(balPath))); + } + + if (installationDirs.size >= 2) { + const warningMessage = `[WARNING] Multiple Ballerina installations detected in PATH. This may cause unpredictable behavior.`; + log(warningMessage); + log(`[WARNING] Detected Ballerina paths:`); + let index = 1; + installationDirs.forEach((p) => { + log(`[WARNING] ${index}. ${p}`); + index++; + }); + log(`[WARNING] Consider removing duplicate installations or adjusting your PATH to avoid version conflicts.`); + } else { + debug(`[MULTI_BAL_CHECK] Multiple paths found but they point to the same installation directory`); + } + } else if (paths.length === 1) { + debug(`[MULTI_BAL_CHECK] Single Ballerina installation found: ${paths[0]}`); + } else { + debug(`[MULTI_BAL_CHECK] No Ballerina paths found in PATH`); + } + } catch (error) { + // No need to throw. This is a non-critical check. + debug(`[MULTI_BAL_CHECK] Error checking for multiple installations: ${error}`); + + } + } + public overrideBallerinaHome(): boolean { return workspace.getConfiguration().get(OVERRIDE_BALLERINA_HOME); } From bd7f8b925b439d5fd7cb5abfc38111d4bee8ad3a Mon Sep 17 00:00:00 2001 From: NipunaRanasinghe Date: Tue, 27 Jan 2026 11:05:06 +0530 Subject: [PATCH 018/247] Add warning message for multiple Ballerina installations in PATH --- .../ballerina-extension/src/core/extension.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 8d892bc1730..20d05c6a0dc 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -2349,11 +2349,25 @@ export class BallerinaExtension { log(warningMessage); log(`[WARNING] Detected Ballerina paths:`); let index = 1; + const pathsList: string[] = []; installationDirs.forEach((p) => { log(`[WARNING] ${index}. ${p}`); + pathsList.push(`${index}. ${p}`); index++; }); log(`[WARNING] Consider removing duplicate installations or adjusting your PATH to avoid version conflicts.`); + + // Show popup notification to user + const viewDetails = 'View Details'; + window.showWarningMessage( + 'Multiple Ballerina installations detected in PATH. This may cause unpredictable behavior.', + viewDetails + ).then((selection) => { + if (selection === viewDetails) { + const detailMessage = `Detected Ballerina installations:\n${pathsList.join('\n')}\n\nConsider removing duplicate installations or adjusting your PATH to avoid version conflicts.`; + window.showWarningMessage(detailMessage, { modal: true }); + } + }); } else { debug(`[MULTI_BAL_CHECK] Multiple paths found but they point to the same installation directory`); } From 052a291db6293350e394817a3ab1746c2b799aef Mon Sep 17 00:00:00 2001 From: NipunaRanasinghe Date: Tue, 27 Jan 2026 11:20:07 +0530 Subject: [PATCH 019/247] Fix formatting --- workspaces/ballerina/ballerina-extension/src/core/extension.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 20d05c6a0dc..062ec17109d 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -2379,7 +2379,6 @@ export class BallerinaExtension { } catch (error) { // No need to throw. This is a non-critical check. debug(`[MULTI_BAL_CHECK] Error checking for multiple installations: ${error}`); - } } From d568bcb9fdfe5329d46cfce7d85dbf6df08df2e4 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 27 Jan 2026 13:19:22 +0530 Subject: [PATCH 020/247] feat: Add function to extract Ballerina distribution version and update project files accordingly --- .../ballerina-extension/src/utils/bi.ts | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/bi.ts b/workspaces/ballerina/ballerina-extension/src/utils/bi.ts index 80c0c7859b5..884dd47d9da 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/bi.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/bi.ts @@ -40,6 +40,7 @@ import { URI } from "vscode-uri"; import { debug } from "./logger"; import { parse } from "@iarna/toml"; import { getProjectTomlValues } from "./config"; +import { extension } from "../BalExtensionContext"; export const README_FILE = "readme.md"; export const FUNCTIONS_FILE = "functions.bal"; @@ -196,6 +197,27 @@ function resolveWorkspacePath(basePath: string, workspaceName: string): string { return resolveDirectoryPath(basePath, workspaceName, true); } +/** + * Extracts the Ballerina version number from the ballerinaVersion string + * @returns The version number (e.g., "2201.13.0") or undefined if not available + */ +function getBallerinaDistribution(): string | undefined { + try { + const ballerinaVersion = extension.ballerinaExtInstance?.ballerinaVersion; + if (!ballerinaVersion) { + return undefined; + } + + // Extract version number from strings like "Ballerina 2201.13.0" or "2201.13.0" + // Match pattern: .. + const versionMatch = ballerinaVersion.match(/(\d+\.\d+\.\d+)/); + return versionMatch ? versionMatch[1] : undefined; + } catch (error) { + debug(`Failed to extract Ballerina distribution version: ${error}`); + return undefined; + } +} + /** * Orchestrates the setup of project information * @param projectRequest - The project request containing all necessary information @@ -251,12 +273,18 @@ export function createBIProjectPure(projectRequest: ProjectRequest): string { const EMPTY = "\n"; + // Get the Ballerina distribution version + const distribution = getBallerinaDistribution(); + + // Build the distribution line if version is available + const distributionLine = distribution ? `distribution = "${distribution}"\n` : ''; + const ballerinaTomlContent = ` [package] org = "${finalOrgName}" name = "${finalPackageName}" version = "${finalVersion}" -title = "${integrationName}" +${distributionLine}title = "${integrationName}" [build-options] sticky = true @@ -484,7 +512,12 @@ export async function createBIProjectFromMigration(params: MigrateRequest) { if (fileName === "Ballerina.toml") { content = content.replace(/name = ".*?"/, `name = "${sanitizedPackageName}"`); content = content.replace(/org = ".*?"/, `org = "${projectInfo.finalOrgName}"`); - content = content.replace(/version = ".*?"/, `version = "${projectInfo.finalVersion}"\ntitle = "${projectInfo.integrationName}"`); + + // Get the Ballerina distribution version + const distribution = getBallerinaDistribution(); + const distributionLine = distribution ? `\ndistribution = "${distribution}"` : ''; + + content = content.replace(/version = ".*?"/, `version = "${projectInfo.finalVersion}"${distributionLine}\ntitle = "${projectInfo.integrationName}"`); } writeBallerinaFileDidOpen(filePath, content || EMPTY); From fde0a958f1467edac703ab98521971d062021e76 Mon Sep 17 00:00:00 2001 From: NipunaRanasinghe Date: Tue, 27 Jan 2026 15:03:54 +0530 Subject: [PATCH 021/247] Update warning message --- workspaces/ballerina/ballerina-extension/src/core/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 062ec17109d..13421fa84c7 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -2345,7 +2345,7 @@ export class BallerinaExtension { } if (installationDirs.size >= 2) { - const warningMessage = `[WARNING] Multiple Ballerina installations detected in PATH. This may cause unpredictable behavior.`; + const warningMessage = `[WARNING] Multiple Ballerina installations detected. This may cause unpredictable behavior.`; log(warningMessage); log(`[WARNING] Detected Ballerina paths:`); let index = 1; From e2f1f9e5a1165dcb508460fa7830b519906e1c3c Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 22 Jan 2026 13:23:07 +0530 Subject: [PATCH 022/247] Add ftp deprecated api support --- .../src/views/BI/ServiceDesigner/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 623ee74550f..bed4ba1a7fc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -248,11 +248,14 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const onCreateFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onCreate'); const onDeleteFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onDelete'); + const onChangeFunction = serviceModel.functions.filter(fn => fn.metadata?.label === 'EVENT'); const hasAvailableOnCreate = onCreateFunctions.length > 0 && onCreateFunctions.some(fn => !fn.enabled); const hasAvailableOnDelete = onDeleteFunctions.length > 0 && onDeleteFunctions.some(fn => !fn.enabled); + const hasOnChange = onChangeFunction.length > 0 && onChangeFunction.some(fn => fn.enabled); - return hasAvailableOnCreate || hasAvailableOnDelete; + // Remove the add handler option if deprecated APIs present + return (hasAvailableOnCreate || hasAvailableOnDelete) && !hasOnChange; }; useEffect(() => { From 951774e3460b23372ccb0d43301a97de1f16ecfe Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Fri, 23 Jan 2026 07:45:23 +0530 Subject: [PATCH 023/247] Resolve the github suggestions --- .../src/views/BI/ServiceDesigner/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 bed4ba1a7fc..f67572eb753 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -248,14 +248,14 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const onCreateFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onCreate'); const onDeleteFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'onDelete'); - const onChangeFunction = serviceModel.functions.filter(fn => fn.metadata?.label === 'EVENT'); + const deprecatedFunctions = serviceModel.functions.filter(fn => fn.metadata?.label === 'EVENT'); const hasAvailableOnCreate = onCreateFunctions.length > 0 && onCreateFunctions.some(fn => !fn.enabled); const hasAvailableOnDelete = onDeleteFunctions.length > 0 && onDeleteFunctions.some(fn => !fn.enabled); - const hasOnChange = onChangeFunction.length > 0 && onChangeFunction.some(fn => fn.enabled); + const hasDeprecatedFunctions = deprecatedFunctions.length > 0 && deprecatedFunctions.some(fn => fn.enabled); // Remove the add handler option if deprecated APIs present - return (hasAvailableOnCreate || hasAvailableOnDelete) && !hasOnChange; + return (hasAvailableOnCreate || hasAvailableOnDelete) && !hasDeprecatedFunctions; }; useEffect(() => { From 5ae0382798cc600640f3f25f0ee8f0521e4c7da5 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 21 Jan 2026 11:56:30 +0530 Subject: [PATCH 024/247] Sort http resources in service designer view --- .../ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx | 1 + 1 file changed, 1 insertion(+) 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 f67572eb753..01e1affa042 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -952,6 +952,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { return nameMatch || iconMatch; }) .filter((resource) => resource.type === DIRECTORY_MAP.RESOURCE) + .sort((a, b) => a.position?.startLine - b.position?.startLine) .map((resource, index) => ( Date: Wed, 21 Jan 2026 14:27:49 +0530 Subject: [PATCH 025/247] Sort http resources in artifact tree view --- .../project-explorer-provider.ts | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) 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 000b94c6903..423b9ab3599 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 @@ -99,8 +99,8 @@ export class ProjectExplorerEntryProvider implements vscode.TreeDataProvider { try { this._data = []; - - const data = await getProjectStructureData(); + + const data = await getProjectStructureData(); this._data = data; // Fire the event after data is fully populated this._onDidChangeTreeData.fire(); @@ -110,7 +110,7 @@ export class ProjectExplorerEntryProvider implements vscode.TreeDataProvider { uniqueProjects.set(project.projectPath, project); } } - + const filteredProjects = Array.from(uniqueProjects.values()); - + const isSingleProject = filteredProjects.length === 1; for (const project of filteredProjects) { const projectTree = generateTreeData(project, isSingleProject); @@ -539,8 +539,10 @@ function getComponents(items: ProjectStructureArtifactResponse[], itemType: DIRE fileEntry.tooltip = comp.context; // Get the children for services only if (itemType === DIRECTORY_MAP.SERVICE) { - const resourceFunctions = getComponents(comp.resources, DIRECTORY_MAP.RESOURCE, projectPath); - const remoteFunctions = getComponents(comp.resources, DIRECTORY_MAP.REMOTE, projectPath); + const resourceFunctions = getComponents(comp.resources, DIRECTORY_MAP.RESOURCE, projectPath) + .sort((a, b) => (a.position && b.position) ? a.position.startLine - b.position.startLine : 0); + const remoteFunctions = getComponents(comp.resources, DIRECTORY_MAP.REMOTE, projectPath) + .sort((a, b) => (a.position && b.position) ? a.position.startLine - b.position.startLine : 0); fileEntry.children = [...resourceFunctions, ...remoteFunctions]; if (fileEntry.children.length > 0) { fileEntry.collapsibleState = vscode.TreeItemCollapsibleState.Expanded; From 0a6db69b1affab3b74e40ccd6f9d9c141e45aea6 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Mon, 26 Jan 2026 13:49:57 +0530 Subject: [PATCH 026/247] Fix issue on allowing save without field values --- .../ballerina/type-editor/src/TypeEditor/EnumEditor.tsx | 2 +- .../ballerina/type-editor/src/TypeEditor/TypeField.tsx | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/EnumEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/EnumEditor.tsx index 23f434e3d03..36308d7165c 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/EnumEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/EnumEditor.tsx @@ -235,7 +235,7 @@ export function EnumEditor({ type, onChange, onValidationError }: EnumEditorProp onChange={(value) => updateMember(index, value)} placeholder="Enum member name" rootType={type} - autoFocus={index === 0} + autoFocus={true} onValidationError={(hasError) => onFieldValidation(index, hasError)} /> diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx index deca976b51d..db09d7f3a4c 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx @@ -222,6 +222,11 @@ export const TypeField = forwardRef((props, re }; }, [typeFieldRef.current]); + /* Validate on initial mount to catch empty fields and existing errors */ + useEffect(() => { + validateType(memberName); + }, []); + return ( <> Date: Mon, 26 Jan 2026 15:14:27 +0530 Subject: [PATCH 027/247] Fix parameter as required entity for testFunction --- .../src/views/BI/TestFunctionForm/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index e088b31be55..eb57c570502 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -146,7 +146,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { key: `params`, label: 'Parameters', type: 'PARAM_MANAGER', - optional: false, + optional: true, editable: true, enabled: true, advanced: true, From c83a64303951d6121466bf84707838ae44c05b76 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Mon, 26 Jan 2026 15:16:05 +0530 Subject: [PATCH 028/247] Allow nodeType clickable only if a type is linked --- .../EntityNode/Attribute/AttributeCard.tsx | 5 ++++- .../src/components/entity-relationship/EntityNode/styles.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/Attribute/AttributeCard.tsx b/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/Attribute/AttributeCard.tsx index b00ac204f3b..70476807613 100644 --- a/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/Attribute/AttributeCard.tsx +++ b/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/Attribute/AttributeCard.tsx @@ -58,6 +58,8 @@ export function AttributeWidget(props: AttributeProps) { } } + const hasLinkedNode = !!attribute?.refs?.[0]; + return ( {attributeType} diff --git a/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/styles.ts b/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/styles.ts index b452a77003f..36adde106e1 100644 --- a/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/styles.ts +++ b/workspaces/ballerina/type-diagram/src/components/entity-relationship/EntityNode/styles.ts @@ -120,7 +120,7 @@ export const AttributeType: React.FC = styled.span` min-width: 60px; padding-inline: 6px; text-align: center; - cursor: pointer; + cursor: ${(props: StyleProps) => props.isClickable ? 'pointer' : 'default'}; white-space: nowrap; `; From c46974268f54a5696e46a4bdfaa1e663058dff63 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Tue, 27 Jan 2026 11:41:05 +0530 Subject: [PATCH 029/247] Add cleanup logic to clean the project after test --- .../src/test/e2e-playwright-tests/test.list.ts | 18 ++++++++++++++++-- .../testProject/sample/Ballerina.toml | 7 ------- .../new-project/testProject/sample/main.bal | 13 ------------- 3 files changed, 16 insertions(+), 22 deletions(-) delete mode 100644 workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/Ballerina.toml delete mode 100644 workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/main.bal 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 85de42ee19d..ea5a1573536 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 @@ -17,7 +17,7 @@ */ import { test } from '@playwright/test'; -import { page, extensionsFolder } from './utils/helpers'; +import { page, extensionsFolder, newProjectPath } from './utils/helpers'; import { downloadExtensionFromMarketplace } from '@wso2/playwright-vscode-tester'; const fs = require('fs'); const path = require('path'); @@ -129,5 +129,19 @@ test.afterAll(async () => { console.log('💾 Saving test video...'); await page.page?.close(); page.page.video()?.saveAs(path.join(videosFolder, `test_${dateTime}.webm`)); - console.log('✅ Video saved successfully\n'); + console.log('✅ Video saved successfully'); + + // Clean up the test project directory + console.log('🧹 Cleaning up test project...'); + if (fs.existsSync(newProjectPath)) { + try { + fs.rmSync(newProjectPath, { recursive: true, force: true }); + console.log('✅ Test project cleaned up successfully\n'); + } catch (error) { + console.error('❌ Failed to clean up test project:', error); + console.log('⚠️ Test project cleanup failed, but continuing...\n'); + } + } else { + console.log('ℹ️ Test project directory does not exist, skipping cleanup\n'); + } }); diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/Ballerina.toml b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/Ballerina.toml deleted file mode 100644 index 82389a78257..00000000000 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/Ballerina.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -org = "nino" -name = "sample" -version = "0.1.0" - -[build-options] -sticky = true \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/main.bal b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/main.bal deleted file mode 100644 index 9db45286b81..00000000000 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/data/new-project/testProject/sample/main.bal +++ /dev/null @@ -1,13 +0,0 @@ -import ballerina/http; - -listener http:Listener httpDefaultListener = http:getDefaultListener(); - -service /foo on httpDefaultListener { - resource function get greeting() returns error|json|http:InternalServerError { - do { - } on fail error err { - // handle error - return error("unhandled error", err); - } - } -} From 4cf7b92d5708c541986a52cde3d99af77a72514c Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Tue, 27 Jan 2026 11:42:12 +0530 Subject: [PATCH 030/247] Add test function tests --- .../test-function/test-function.spec.ts | 102 ++++++++++++++++++ .../test/e2e-playwright-tests/test.list.ts | 5 + 2 files changed, 107 insertions(+) create mode 100644 workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test-function/test-function.spec.ts diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test-function/test-function.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test-function/test-function.spec.ts new file mode 100644 index 00000000000..975e8ed8c52 --- /dev/null +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test-function/test-function.spec.ts @@ -0,0 +1,102 @@ +/** + * 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 } from '@playwright/test'; +import { initTest, page } from '../utils/helpers'; +import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; + +export default function createTests() { + test.describe('Test Function Tests', { + tag: '@group1', + }, async () => { + initTest(); + + test('Create Test Function with Name and Return Type', async ({ }, testInfo) => { + const testAttempt = testInfo.retry + 1; + console.log('Creating test function in test attempt: ', testAttempt); + + // 1. Execute command to add test function + console.log('Executing command to add test function...'); + await page.executePaletteCommand('BI.test.add.function'); + + // 2. Get the webview after command execution + const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page, 30000); + if (!artifactWebView) { + throw new Error('WSO2 Integrator: BI webview not found'); + } + + // 3. Verify the "Create New Test Case" form is displayed + const createForm = artifactWebView.getByRole('heading', { name: /Create New Test Case/i }); + await createForm.waitFor({ timeout: 10000 }); + + // 4. Verify the form subtitle shows "Create a new test for your integration" + const subtitle = artifactWebView.getByText(/Create a new test for your integration/i); + await subtitle.waitFor(); + + // 5. Fill the Test Function name field + const functionName = `testFunction${testAttempt}`; + console.log(`Filling test function name: ${functionName}`); + + const form = new Form(page.page, 'WSO2 Integrator: BI', artifactWebView); + await form.switchToFormView(false, artifactWebView); + + await form.fill({ + values: { + 'Test Function*Test function': { + type: 'input', + value: functionName, + } + } + }); + + // 6. Click on "Advanced Configurations" to expand the section (if not already expanded) + const advancedConfigExpand = artifactWebView.getByText('Expand').first(); + if (await advancedConfigExpand.isVisible({ timeout: 2000 }).catch(() => false)) { + await advancedConfigExpand.click(); + await page.page.waitForTimeout(500); + } + + // 7. Fill the Return Type field in the advanced section + const returnType = 'string'; + console.log(`Filling return type: ${returnType}`); + + // Try to fill return type using form fill first + await form.fill({ + values: { + 'Return Type': { + type: 'textarea', + value: returnType, + } + } + }); + + // 8. Click on the "Save" button + const saveButton = artifactWebView.getByRole('button', { name: 'Save' }).first(); + await saveButton.waitFor(); + await saveButton.click(); + + // 9. Verify the Automation is created and the automation designer view is displayed + const diagramCanvas = artifactWebView.locator('#bi-diagram-canvas'); + await diagramCanvas.waitFor({ state: 'visible', timeout: 30000 }); + + // 10. Verify the automation name is displayed (default: "main") + const diagramTitle = artifactWebView.locator('h2', { hasText: 'Function' }); + await diagramTitle.waitFor(); + }); + }); +} 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 ea5a1573536..ace6857e063 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 @@ -55,6 +55,8 @@ import importIntegration from './import-integration/import-integration.spec'; import reusableDataMapper from './data-mapper/reusable-data-mapper.spec'; import inlineDataMapper from './data-mapper/inline-data-mapper.spec'; +import testFunction from './test-function/test-function.spec'; + test.describe.configure({ mode: 'default' }); test.beforeAll(async () => { @@ -120,6 +122,9 @@ test.describe(importIntegration); test.describe(reusableDataMapper); test.describe(inlineDataMapper); +// <----Test Function Test----> +test.describe(testFunction); + test.afterAll(async () => { console.log('\n' + '='.repeat(80)); console.log('✅ BI EXTENSION E2E TEST SUITE COMPLETED'); From 9168df41383d55319764fd2210de8baceb43aa82 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 26 Jan 2026 15:48:02 +0530 Subject: [PATCH 031/247] Add validation to prevent package names from starting with an underscore --- .../ballerina-visualizer/src/views/BI/ProjectForm/utils.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts index 3d210daa161..389d605468a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts @@ -45,6 +45,10 @@ export const validatePackageName = (name: string, integrationName: string): stri return "Package name cannot have consecutive dots"; } + if (name.startsWith("_")) { + return "Package name cannot start with an underscore"; + } + if (name.endsWith("_")) { return "Package name cannot end with an underscore"; } From 499b91e387735db36d74b66b86c255b30eb9cc19 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 27 Jan 2026 09:56:12 +0530 Subject: [PATCH 032/247] Reorder validation logic --- .../src/views/BI/ProjectForm/utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts index 389d605468a..1a393b83773 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts @@ -37,6 +37,10 @@ export const validatePackageName = (name: string, integrationName: string): stri return "Package name can only contain lowercase letters, numbers, underscores, and dots"; } + if (name.startsWith("_")) { + return "Package name cannot start with an underscore"; + } + if (/__/.test(name)) { return "Package name cannot have consecutive underscores"; } @@ -45,10 +49,6 @@ export const validatePackageName = (name: string, integrationName: string): stri return "Package name cannot have consecutive dots"; } - if (name.startsWith("_")) { - return "Package name cannot start with an underscore"; - } - if (name.endsWith("_")) { return "Package name cannot end with an underscore"; } From c17f0492d3fa234e7baa0c654acf1d0de3431b2d Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 27 Jan 2026 10:31:37 +0530 Subject: [PATCH 033/247] Enhance sanitizePackageName to convert consecutive underscores to a single underscore --- .../ballerina-visualizer/src/views/BI/ProjectForm/utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts index 1a393b83773..b80761d1bed 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts @@ -79,9 +79,10 @@ export const isFormValidAddProject = (formData: AddProjectFormData, isInWorkspac }; export const sanitizePackageName = (name: string): string => { - // Allow dots but sanitize other characters, then convert consecutive dots to single dot + // Allow dots but sanitize other characters, then convert consecutive dots/underscores to single ones return name .replace(/[^a-z0-9._]/gi, "_") .toLowerCase() - .replace(/\.{2,}/g, "."); // Convert multiple consecutive dots to single dot + .replace(/\.{2,}/g, ".") // Convert multiple consecutive dots to single dot + .replace(/_{2,}/g, "_"); // Convert multiple consecutive underscores to single underscore }; From eba9f47cdc5f3ef7842f2705a344b2455ee71463 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 27 Jan 2026 10:34:24 +0530 Subject: [PATCH 034/247] Update sanitizePackageName comment to clarify allowed characters --- .../ballerina-visualizer/src/views/BI/ProjectForm/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts index b80761d1bed..47a04f17b98 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts @@ -79,7 +79,7 @@ export const isFormValidAddProject = (formData: AddProjectFormData, isInWorkspac }; export const sanitizePackageName = (name: string): string => { - // Allow dots but sanitize other characters, then convert consecutive dots/underscores to single ones + // Allow dots/underscores but sanitize other characters, then convert consecutive dots/underscores to single ones return name .replace(/[^a-z0-9._]/gi, "_") .toLowerCase() From fce505984b3afc87e65614ddb6d7fbf542b51175 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 27 Jan 2026 10:55:22 +0530 Subject: [PATCH 035/247] Add validation for package name length to enforce a maximum of 256 characters --- .../ballerina-visualizer/src/views/BI/ProjectForm/utils.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts index 47a04f17b98..f1b774c6685 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/utils.ts @@ -57,6 +57,10 @@ export const validatePackageName = (name: string, integrationName: string): stri return "Package name cannot end with a dot"; } + if (name.length > 256) { + return "Package name cannot exceed 256 characters"; + } + return null; // No error }; From c3cef95306af49e9060c20c85ff0616a73cf5bdd Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 26 Jan 2026 11:41:34 +0530 Subject: [PATCH 036/247] Fix: Save user messages to chat state for multi-turn context --- .../src/features/ai/agent/AgentExecutor.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index d0b054519f9..b2aa831b853 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -262,11 +262,14 @@ Generation stopped by user. The last in-progress task was not saved. Files have `, }); - // Update generation with partial messages + // Update generation with user message + partial messages const workspaceId = this.config.executionContext.projectPath; const threadId = 'default'; chatStateStorage.updateGeneration(workspaceId, threadId, this.config.generationId, { - modelMessages: messagesToSave, + modelMessages: [ + { role: "user", content: streamContext.userMessageContent }, + ...messagesToSave, + ], }); // Clear review state @@ -422,9 +425,12 @@ Generation stopped by user. The last in-progress task was not saved. Files have console.log(`[AgentExecutor] Accumulated modified files: ${accumulatedModifiedFiles.length} total (${existingReview.reviewState.modifiedFiles?.length || 0} existing + ${context.modifiedFiles.length} new)`); } - // Update chat state storage + // Update chat state storage with user message + assistant messages chatStateStorage.updateGeneration(workspaceId, threadId, context.messageId, { - modelMessages: assistantMessages, + modelMessages: [ + { role: "user", content: context.userMessageContent }, + ...assistantMessages, + ], }); // Skip review mode if no files were modified From 4a457a0198b83363e42b2e825220b3c1033ceec6 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Wed, 28 Jan 2026 15:39:21 +0530 Subject: [PATCH 037/247] Add complete filePath to get test model --- .../src/features/project/cmds/cmd-runner.ts | 3 ++- .../src/features/test-explorer/commands.ts | 12 ++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) 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 4adf71b06ee..ec8018823d2 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 @@ -90,7 +90,8 @@ export enum MESSAGES { INVALID_JSON_RESPONSE = "JSON response is invalid.", INVALID_XML = "Invalid XML String", INVALID_XML_RESPONSE = "XML response is invalid.", - NO_PROJECT_FOUND = "No Ballerina project found." + NO_PROJECT_FOUND = "No Ballerina project found.", + NO_FILE_FOUND = "Unable to locate the file." } export const BAL_CONFIG_FILE = 'Config.toml'; diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index dd21af2f309..10c7126cea6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -70,10 +70,10 @@ export function activateEditBiTest() { }); commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION_DEF, async (entry: TestItem) => { - const projectPath = await findProjectPath(entry.uri?.fsPath); + const fileUri = entry.uri?.fsPath; - if (!projectPath) { - window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + if (!fileUri) { + window.showErrorMessage(MESSAGES.NO_FILE_FOUND); return; } @@ -81,12 +81,8 @@ export function activateEditBiTest() { return; } - const fileName = entry.id.split(":")[1]; - const fileUri = path.resolve(projectPath, `tests`, fileName); - if (fileUri) { - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BITestFunctionForm, + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BITestFunctionForm, documentUri: fileUri, identifier: entry.label, serviceType: 'UPDATE_TEST' }); - } }); } From 7a99d28e3771d9d6664804ca50f0b2d787be673b Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Wed, 28 Jan 2026 15:39:34 +0530 Subject: [PATCH 038/247] Update test form descriptions --- .../src/views/BI/TestFunctionForm/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index e088b31be55..e09d3b5e30d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -312,8 +312,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { return { functionName: { metadata: { - label: "Test Function", - description: "Test function" + label: "Name", + description: "Name of the test function" }, value: "", optional: false, @@ -324,7 +324,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { returnType: { metadata: { label: "Return Type", - description: "Return type of the function" + description: "Type of the return value" }, optional: true, editable: true, From 1e801f4a98cb065d97c30e7a1d862cf7034afef8 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Wed, 28 Jan 2026 21:00:12 +0530 Subject: [PATCH 039/247] Fix recursive type creation --- .../views/BI/Forms/FormGenerator/index.tsx | 21 +++- .../views/BI/Forms/FormGeneratorNew/index.tsx | 26 ++++- .../src/views/BI/TypeEditor/index.tsx | 6 +- .../src/views/GraphQLDiagram/index.tsx | 19 ++- .../src/views/TypeDiagram/index.tsx | 108 +++++++++++------- .../type-editor/src/Context/index.tsx | 2 +- .../src/TypeEditor/ArrayEditor.tsx | 1 + .../src/TypeEditor/ClassEditor.tsx | 2 + .../ContextTypeCreator.tsx | 1 + .../ContextTypeEditor.tsx | 2 +- .../SchemaRecordEditor.tsx | 1 + .../TypeEditor/Contexts/TypeEditorContext.ts | 1 + .../src/TypeEditor/FieldEditor.tsx | 6 +- .../src/TypeEditor/RecordEditor.tsx | 3 +- .../type-editor/src/TypeEditor/TypeEditor.tsx | 2 +- .../type-editor/src/TypeEditor/TypeField.tsx | 4 +- .../src/TypeEditor/UnionEditor.tsx | 1 + 17 files changed, 144 insertions(+), 62 deletions(-) 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 ff669f4be60..dce3845e1fd 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 @@ -318,6 +318,10 @@ export const FormGenerator = forwardRef(func if (stack.length === 0) return; setStack((prev) => { const newStack = [...prev]; + //preserve fieldIndex if exists + if (newStack[newStack.length - 1].fieldIndex) { + item.fieldIndex = newStack[newStack.length - 1].fieldIndex; + } newStack[newStack.length - 1] = item; return newStack; }); @@ -1079,8 +1083,16 @@ export const FormGenerator = forwardRef(func const onSaveType = (type: Type | string) => { handleValueTypeConstChange(typeof type === 'string' ? type : (type as Type).name); if (stack.length > 0) { + if (stack.length > 1) { + const newStack = [...stack] + const currentTop = newStack[newStack.length - 1]; + const newTop = newStack[newStack.length - 2]; + newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + newStack[newStack.length - 2] = newTop; + newStack.pop(); + setStack(newStack); + } setRefetchForCurrentModal(true); - popTypeStack(); } handleSelectedTypeChange(typeof type === 'string' ? type : (type as Type).name); setTypeEditorState({ ...typeEditorState, isOpen: stack.length !== 1 }); @@ -1288,7 +1300,12 @@ export const FormGenerator = forwardRef(func }) } - const getNewTypeCreateForm = (typeName?: string) => { + const getNewTypeCreateForm = (fieldIndex?: number, typeName?: string) => { + const currentTopItem = peekTypeStack(); + if (currentTopItem) { + currentTopItem.fieldIndex = fieldIndex; + replaceTop(currentTopItem); + } pushTypeStack(getDefaultValue(typeName)); } 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 d9083dfe928..0ad8de1deae 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 @@ -285,6 +285,10 @@ export function FormGeneratorNew(props: FormProps) { if (stack.length === 0) return; setStack((prev) => { const newStack = [...prev]; + //preserve fieldIndex if exists + if (newStack[newStack.length - 1].fieldIndex) { + item.fieldIndex = newStack[newStack.length - 1].fieldIndex; + } newStack[newStack.length - 1] = item; return newStack; }); @@ -853,17 +857,31 @@ export function FormGeneratorNew(props: FormProps) { setTypeEditorState({ ...typeEditorState, isOpen: state }); } - const getNewTypeCreateForm = (typeName?: string) => { + const getNewTypeCreateForm = (fieldIndex?: number, typeName?: string) => { + const currentTopItem = peekTypeStack(); + if (currentTopItem) { + currentTopItem.fieldIndex = fieldIndex; + replaceTop(currentTopItem); + } pushTypeStack({ type: defaultType(typeName), - isDirty: false - }) + isDirty: false, + fieldIndex: fieldIndex + }); } const onSaveType = () => { if (stack.length > 0) { + if (stack.length > 1) { + const newStack = [...stack] + const currentTop = newStack[newStack.length - 1]; + const newTop = newStack[newStack.length - 2]; + newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + newStack[newStack.length - 2] = newTop; + newStack.pop(); + setStack(newStack); + } setRefetchForCurrentModal(true); - popTypeStack(); } setTypeEditorState({ ...typeEditorState, isOpen: stack.length !== 1 }); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx index 480b99ee377..87d52ea4c41 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx @@ -46,7 +46,7 @@ type FormTypeEditorProps = { newTypeValue?: string; onCloseCompletions?: () => void; onTypeCreate: (typeName?: string) => void; - getNewTypeCreateForm: (typeName?: string) => void; + getNewTypeCreateForm: (fieldIndex?: number, typeName?: string) => void; onSaveType: (type: Type | string, imports?: Imports) => void refetchTypes: boolean; isPopupTypeForm: boolean; @@ -244,8 +244,8 @@ export const FormTypeEditor = (props: FormTypeEditorProps) => { return await addFunction(item); }; - const handleTypeCreate = (typeName?: string) => { - getNewTypeCreateForm(typeName); + const handleTypeCreate = (fieldIndex: number, typeName?: string) => { + getNewTypeCreateForm(fieldIndex, typeName); }; return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx index d0cbcffb126..13bc6148d83 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx @@ -137,6 +137,10 @@ export function GraphQLDiagram(props: GraphQLDiagramProps) { if (stack.length <= 1) return; setStack((prev) => { const newStack = [...prev]; + //preserve fieldIndex if exists + if (newStack[newStack.length - 1].fieldIndex) { + item.fieldIndex = newStack[newStack.length - 1].fieldIndex; + } newStack[newStack.length - 1] = item; return newStack; }); @@ -362,16 +366,25 @@ export function GraphQLDiagram(props: GraphQLDiagramProps) { const onSaveType = () => { if (stack.length > 0) { + if (stack.length > 1) { + const newStack = [...stack] + const currentTop = newStack[newStack.length - 1]; + const newTop = newStack[newStack.length - 2]; + newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + newStack[newStack.length - 2] = newTop; + newStack.pop(); + setStack(newStack); + } setRefetchForCurrentModal(true); - popTypeStack(); } setIsTypeEditorOpen(stack.length !== 1); } - const getNewTypeCreateForm = () => { + const getNewTypeCreateForm = (fieldIndex?: number, typeName?: string) => { pushTypeStack({ type: createNewType(), - isDirty: false + isDirty: false, + fieldIndex: fieldIndex }); setIsTypeEditorOpen(true); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx index 5f31f94789b..c216e0c44aa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx @@ -66,9 +66,25 @@ export function TypeDiagram(props: TypeDiagramProps) { editingType: undefined, }); + const createNewType = (): Type => ({ + name: "", + members: [] as Member[], + editable: true, + metadata: { + description: "", + label: "" + }, + properties: {}, + codedata: { + node: "RECORD" as TypeNodeKind + }, + includes: [] as string[], + allowAdditionalFields: false + }); + const [stack, setStack] = useState([{ isDirty: false, - type: undefined + type: createNewType() }]); const [refetchStates, setRefetchStates] = useState([false]); @@ -109,9 +125,13 @@ export function TypeDiagram(props: TypeDiagramProps) { }; const replaceTop = (item: StackItem) => { - if (stack.length <= 1) return; + if (stack.length === 0) return; setStack((prev) => { const newStack = [...prev]; + //preserve fieldIndex if exists + if (newStack[newStack.length - 1].fieldIndex) { + item.fieldIndex = newStack[newStack.length - 1].fieldIndex; + } newStack[newStack.length - 1] = item; return newStack; }); @@ -194,8 +214,19 @@ export function TypeDiagram(props: TypeDiagramProps) { const onSaveType = () => { if (stack.length > 0) { + if (stack.length > 1) { + const newStack = [...stack] + const currentTop = newStack[newStack.length - 1]; + const newTop = newStack[newStack.length - 2]; + newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + newStack[newStack.length - 2] = newTop; + newStack.pop(); + setStack(newStack); + } + else { + popTypeStack(); + } setRefetchForCurrentModal(true); - popTypeStack(); } setTypeEditorState({ ...typeEditorState, @@ -203,26 +234,17 @@ export function TypeDiagram(props: TypeDiagramProps) { }); } - const createNewType = (): Type => ({ - name: "", - members: [] as Member[], - editable: true, - metadata: { - description: "", - label: "" - }, - properties: {}, - codedata: { - node: "RECORD" as TypeNodeKind - }, - includes: [] as string[], - allowAdditionalFields: false - }); - const getNewTypeCreateForm = () => { + const getNewTypeCreateForm = (fieldIndex?: number, typeName?: string) => { + const currentTop = peekTypeStack(); + if (currentTop) { + currentTop.fieldIndex = fieldIndex; + replaceTop(currentTop); + } pushTypeStack({ type: createNewType(), - isDirty: false + isDirty: false, + fieldIndex: fieldIndex }); setTypeEditorState({ ...typeEditorState, @@ -504,30 +526,30 @@ export function TypeDiagram(props: TypeDiagramProps) { - {/* Panel for editing and creating types */} - - { }} - isPopupTypeForm={false} - onSaveType={onSaveType} - getNewTypeCreateForm={getNewTypeCreateForm} - refetchTypes={true} - /> - + {/* Panel for editing and creating types */} + + { }} + isPopupTypeForm={false} + onSaveType={onSaveType} + getNewTypeCreateForm={getNewTypeCreateForm} + refetchTypes={true} + /> + {stack.slice(1).map((item, i) => { return ( diff --git a/workspaces/ballerina/type-editor/src/Context/index.tsx b/workspaces/ballerina/type-editor/src/Context/index.tsx index dde62803946..99c4d8c460b 100644 --- a/workspaces/ballerina/type-editor/src/Context/index.tsx +++ b/workspaces/ballerina/type-editor/src/Context/index.tsx @@ -48,7 +48,7 @@ export type TypeHelperContext = { // Callback function to close the completions onCloseCompletions?: () => void; // Callback function to be executed when a new type is created - onTypeCreate?: (typeName?: string) => void; + onTypeCreate?: (fieldIndex: number,typeName?: string) => void; }; const defaultTypeHelperContext: TypeHelperContext = { diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/ArrayEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/ArrayEditor.tsx index b21948e993c..e4d7eddace7 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/ArrayEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/ArrayEditor.tsx @@ -126,6 +126,7 @@ export function ArrayEditor(props: ArrayEditorProps) { updateMember(newType)} diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/ClassEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/ClassEditor.tsx index 047748f9a97..38050119ac5 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/ClassEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/ClassEditor.tsx @@ -380,6 +380,7 @@ export function ClassEditor({ type, onChange, isGraphql, onValidationError }: Cl placeholder="Name" /> updateFunction(index, { returnType: newType })} @@ -450,6 +451,7 @@ export function ClassEditor({ type, onChange, isGraphql, onValidationError }: Cl placeholder={isGraphql ? "Argument Name" : "Parameter Name"} /> setParameterForm(prev => ({ ...prev, type: newType }))} diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeCreator.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeCreator.tsx index 53efa04e98f..548d2e86146 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeCreator.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeCreator.tsx @@ -191,6 +191,7 @@ export function ContextTypeCreatorTab(props: ContextTypeCreatorProps) { }, [editingType?.name, newType]); const handleSetType = (type: Type) => { + onTypeChange(type); replaceTop({ type: type, isDirty: true diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeEditor.tsx index c4b1e38879d..5a10503b213 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/ContextTypeEditor.tsx @@ -98,7 +98,7 @@ interface ContextTypeEditorProps { onSearchTypeBrowser: (searchText: string) => void; onTypeItemClick: (item: TypeHelperItem) => Promise; onCloseCompletions?: () => void; - onTypeCreate?: (typeName?: string) => void; + onTypeCreate?: (fieldIndex: number, typeName?: string) => void; } } diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/SchemaRecordEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/SchemaRecordEditor.tsx index 0c34e27ca99..492229f4549 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/SchemaRecordEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/ContextBasedTypeEditor/SchemaRecordEditor.tsx @@ -130,6 +130,7 @@ export const SchemaRecordEditor = forwardRef<{ addMember: () => void }, SchemaRe <> void; onDelete: () => void; isGraphql?: boolean; + index: number; } const ButtonDeactivated = styled.div<{}>` @@ -73,7 +74,7 @@ const CheckBoxGroup = styled.div` `; export const FieldEditor: React.FC = (props) => { - const { member, onChange, onDelete, type, onValidationError, onFieldValidation, onRecordValidation, isGraphql } = props; + const { member, onChange, onDelete, type, onValidationError, onFieldValidation, onRecordValidation, isGraphql, index } = props; const [panelOpened, setPanelOpened] = useState(false); const recordEditorRef = useRef<{ addMember: () => void }>(null); const currentImports = useRef(); @@ -166,6 +167,7 @@ export const FieldEditor: React.FC = (props) => {
= (props) => { onChange({ ...member, readonly: checked - } + } ); }} /> diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx index 9cd1f46e9f2..7a66c853ccd 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx @@ -120,7 +120,7 @@ export const RecordEditor = forwardRef<{ addMember: () => void }, RecordEditorPr
{!isAnonymous &&
- {isGraphql ? (newType? 'Input Object Fields' : 'Object Fields'): 'Fields'} + {isGraphql ? (newType ? 'Input Object Fields' : 'Object Fields') : 'Fields'}
@@ -129,6 +129,7 @@ export const RecordEditor = forwardRef<{ addMember: () => void }, RecordEditorPr {type.members.map((member, index) => ( <> void; onTypeItemClick: (item: TypeHelperItem) => Promise; onCloseCompletions?: () => void; - onTypeCreate?: (typeName?: string) => void; + onTypeCreate?: (fieldIndex: number, typeName?: string) => void; } } diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx index db09d7f3a4c..5bd939f24b7 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/TypeField.tsx @@ -39,12 +39,14 @@ interface TypeFieldProps { label?: string; required?: boolean; autoFocus?: boolean; + fieldIndex?: number; } export const TypeField = forwardRef((props, ref) => { const { type, onChange, + fieldIndex, onUpdateImports, placeholder, sx, @@ -206,7 +208,7 @@ export const TypeField = forwardRef((props, re const handleTypeCreate = (typeName?: string) => { setHelperPaneOpened(false); - onTypeCreate?.(typeName); + onTypeCreate?.(fieldIndex, typeName); }; /* Track cursor position */ diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/UnionEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/UnionEditor.tsx index b6eb884fa5f..4c6ba8fbb97 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/UnionEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/UnionEditor.tsx @@ -221,6 +221,7 @@ export function UnionEditor({ type, onChange, rpcClient, onValidationError }: Un {type.members.map((member, index) => ( updateMember(index, newType)} From 0355e0ba3fbe9c829a38461af608fdbd196b08c7 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Wed, 28 Jan 2026 21:49:39 +0530 Subject: [PATCH 040/247] Fix graphql recusive type creation not updating issue --- .../src/views/BI/Forms/FormGenerator/index.tsx | 9 +++++++-- .../views/BI/Forms/FormGeneratorNew/index.tsx | 16 +++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) 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 dce3845e1fd..a6041c50007 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 @@ -448,7 +448,7 @@ export const FormGenerator = forwardRef(func const recordTypeFields = Object.entries(formProperties) .filter(([_, property]) => { const primaryInputType = getPrimaryInputType(property?.types); - + return primaryInputType?.typeMembers && primaryInputType?.typeMembers.some(member => member.kind === "RECORD_TYPE"); }) @@ -1087,7 +1087,12 @@ export const FormGenerator = forwardRef(func const newStack = [...stack] const currentTop = newStack[newStack.length - 1]; const newTop = newStack[newStack.length - 2]; - newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + if (newTop.type.codedata.node === "CLASS") { + newTop.type.functions[newTop.fieldIndex!].returnType = currentTop!.type.name; + } + else { + newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + } newStack[newStack.length - 2] = newTop; newStack.pop(); setStack(newStack); 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 0ad8de1deae..e583b63c92c 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 @@ -865,18 +865,24 @@ export function FormGeneratorNew(props: FormProps) { } pushTypeStack({ type: defaultType(typeName), - isDirty: false, - fieldIndex: fieldIndex - }); + isDirty: false + }) } - const onSaveType = () => { + + const onSaveType = (type: Type | string) => { + handleValueTypeConstChange(typeof type === 'string' ? type : (type as Type).name); if (stack.length > 0) { if (stack.length > 1) { const newStack = [...stack] const currentTop = newStack[newStack.length - 1]; const newTop = newStack[newStack.length - 2]; - newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + if (newTop.type.codedata.node === "CLASS") { + newTop.type.functions[newTop.fieldIndex!].returnType = currentTop!.type.name; + } + else { + newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + } newStack[newStack.length - 2] = newTop; newStack.pop(); setStack(newStack); From 80a733bd152acedc9dcc973e7cb15e3e93bd1be3 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 28 Jan 2026 23:48:08 +0530 Subject: [PATCH 041/247] Add validation for project path and name in project forms --- .../src/rpc-types/bi-diagram/index.ts | 5 +- .../src/rpc-types/bi-diagram/interfaces.ts | 11 +++ .../src/rpc-types/bi-diagram/rpc-type.ts | 5 +- .../rpc-managers/bi-diagram/rpc-handler.ts | 5 +- .../rpc-managers/bi-diagram/rpc-manager.ts | 8 ++- .../ballerina-extension/src/utils/bi.ts | 53 ++++++++++++++ .../src/rpc-clients/bi-diagram/rpc-client.ts | 7 ++ .../views/BI/ProjectForm/AddProjectForm.tsx | 62 ++++++++++++---- .../src/views/BI/ProjectForm/index.tsx | 70 +++++++++++++++---- 9 files changed, 196 insertions(+), 30 deletions(-) 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 4e452c463ae..cfe224b7e68 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 @@ -121,7 +121,9 @@ import { GeneratedClientSaveResponse, AddProjectToWorkspaceRequest, DeleteProjectRequest, - OpenReadmeRequest + OpenReadmeRequest, + ValidateProjectPathRequest, + ValidateProjectPathResponse } from "./interfaces"; export interface BIDiagramAPI { @@ -140,6 +142,7 @@ export interface BIDiagramAPI { getNodeTemplate: (params: BINodeTemplateRequest) => Promise; getAiSuggestions: (params: BIAiSuggestionsRequest) => Promise; createProject: (params: ProjectRequest) => void; + validateProjectPath: (params: ValidateProjectPathRequest) => Promise; deleteProject: (params: DeleteProjectRequest) => void; addProjectToWorkspace: (params: AddProjectToWorkspaceRequest) => void; getWorkspaces: () => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts index 40c49a5447c..599b9997036 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts @@ -197,3 +197,14 @@ export interface GeneratedClientSaveResponse { export interface DeleteProjectRequest { projectPath: string; } + +export interface ValidateProjectPathRequest { + projectPath: string; + projectName: string; + createDirectory: boolean; +} + +export interface ValidateProjectPathResponse { + isValid: boolean; + errorMessage?: string; +} 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 1da53727308..97966918fd0 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 @@ -123,7 +123,9 @@ import { GeneratedClientSaveResponse, AddProjectToWorkspaceRequest, DeleteProjectRequest, - OpenReadmeRequest + OpenReadmeRequest, + ValidateProjectPathRequest, + ValidateProjectPathResponse } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; @@ -143,6 +145,7 @@ export const getEnclosedFunction: RequestType = { method: `${_preFix}/getNodeTemplate` }; export const getAiSuggestions: RequestType = { method: `${_preFix}/getAiSuggestions` }; export const createProject: NotificationType = { method: `${_preFix}/createProject` }; +export const validateProjectPath: RequestType = { method: `${_preFix}/validateProjectPath` }; export const deleteProject: NotificationType = { method: `${_preFix}/deleteProject` }; export const addProjectToWorkspace: NotificationType = { method: `${_preFix}/addProjectToWorkspace` }; export const getWorkspaces: RequestType = { method: `${_preFix}/getWorkspaces` }; 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 bdd91ec0b50..fa1e3d3005c 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 @@ -151,7 +151,9 @@ import { UpdateTypesRequest, verifyTypeDelete, VerifyTypeDeleteRequest, - VisibleTypesRequest + VisibleTypesRequest, + ValidateProjectPathRequest, + validateProjectPath } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { BiDiagramRpcManager } from "./rpc-manager"; @@ -173,6 +175,7 @@ export function registerBiDiagramRpcHandlers(messenger: Messenger) { messenger.onRequest(getNodeTemplate, (args: BINodeTemplateRequest) => rpcManger.getNodeTemplate(args)); messenger.onRequest(getAiSuggestions, (args: BIAiSuggestionsRequest) => rpcManger.getAiSuggestions(args)); messenger.onNotification(createProject, (args: ProjectRequest) => rpcManger.createProject(args)); + messenger.onRequest(validateProjectPath, (args: ValidateProjectPathRequest) => rpcManger.validateProjectPath(args)); messenger.onNotification(deleteProject, (args: DeleteProjectRequest) => rpcManger.deleteProject(args)); messenger.onNotification(addProjectToWorkspace, (args: AddProjectToWorkspaceRequest) => rpcManger.addProjectToWorkspace(args)); messenger.onRequest(getWorkspaces, () => rpcManger.getWorkspaces()); 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 dca33238b36..b5becf5d684 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 @@ -67,6 +67,8 @@ import { DeleteProjectRequest, DeleteTypeRequest, DeleteTypeResponse, + ValidateProjectPathRequest, + ValidateProjectPathResponse, DeploymentRequest, DeploymentResponse, DevantMetadata, @@ -169,7 +171,7 @@ import { BreakpointManager } from "../../features/debugger/breakpoint-manager"; import { StateMachine, updateView } from "../../stateMachine"; import { getAccessToken, getLoginMethod } from "../../utils/ai/auth"; import { getCompleteSuggestions } from '../../utils/ai/completions'; -import { README_FILE, addProjectToExistingWorkspace, convertProjectToWorkspace, createBIAutomation, createBIFunction, createBIProjectPure, createBIWorkspace, deleteProjectFromWorkspace, openInVSCode } from "../../utils/bi"; +import { README_FILE, addProjectToExistingWorkspace, convertProjectToWorkspace, createBIAutomation, createBIFunction, createBIProjectPure, createBIWorkspace, deleteProjectFromWorkspace, openInVSCode, validateProjectPath } from "../../utils/bi"; import { writeBallerinaFileDidOpen } from "../../utils/modification"; import { updateSourceCode } from "../../utils/source-utils"; import { getView } from "../../utils/state-machine-utils"; @@ -614,6 +616,10 @@ export class BiDiagramRpcManager implements BIDiagramAPI { } } + async validateProjectPath(params: ValidateProjectPathRequest): Promise { + return validateProjectPath(params.projectPath, params.projectName, params.createDirectory); + } + async deleteProject(params: DeleteProjectRequest): Promise { const projectInfo = StateMachine.context().projectInfo; const targetProject = projectInfo?.children.find((child) => child.projectPath === params.projectPath); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/bi.ts b/workspaces/ballerina/ballerina-extension/src/utils/bi.ts index 80c0c7859b5..8405c9d6226 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/bi.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/bi.ts @@ -125,6 +125,59 @@ export function getUsername(): string { return username; } +/** + * Validates the project path before creating a new project + * @param projectPath - The directory path where the project will be created + * @param projectName - The name of the project (used if createDirectory is true) + * @param createDirectory - Whether a new directory will be created + * @returns Validation result with error message if invalid + */ +export function validateProjectPath(projectPath: string, projectName: string, createDirectory: boolean): { isValid: boolean; errorMessage?: string } { + try { + // Check if projectPath is provided and not empty + if (!projectPath || projectPath.trim() === '') { + return { isValid: false, errorMessage: 'Project path is required' }; + } + + // Check if the base directory exists + if (!fs.existsSync(projectPath)) { + // Check if parent directory exists and we can create the path + const parentDir = path.dirname(projectPath); + if (!fs.existsSync(parentDir)) { + return { isValid: false, errorMessage: `Directory path does not exist: ${projectPath}` }; + } + } + + // Determine the final project path + const finalPath = createDirectory ? path.join(projectPath, sanitizeName(projectName)) : projectPath; + + // If not creating a new directory, check if the target directory already has a Ballerina project + if (!createDirectory) { + const ballerinaTomlPath = path.join(finalPath, 'Ballerina.toml'); + if (fs.existsSync(ballerinaTomlPath)) { + return { isValid: false, errorMessage: 'Existing Ballerina project detected in the selected directory' }; + } + } else { + // If creating a new directory, check if it already exists + if (fs.existsSync(finalPath)) { + return { isValid: false, errorMessage: `A directory with name '${sanitizeName(projectName)}' already exists at the selected location` }; + } + } + + // Validate if we have write permissions + try { + // Try to access the directory with write permissions + fs.accessSync(projectPath, fs.constants.W_OK); + } catch (error) { + return { isValid: false, errorMessage: 'No write permission for the selected directory' }; + } + + return { isValid: true }; + } catch (error) { + return { isValid: false, errorMessage: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}` }; + } +} + /** * Generic function to resolve directory paths and create directories if needed * Can be used for both project and workspace directory creation 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 1e45c2e40b0..2bc4cdd15e4 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 @@ -119,6 +119,8 @@ import { UpdateTypesRequest, UpdateTypesResponse, UpdatedArtifactsResponse, + ValidateProjectPathRequest, + ValidateProjectPathResponse, VerifyTypeDeleteRequest, VerifyTypeDeleteResponse, VisibleTypesRequest, @@ -200,6 +202,7 @@ import { updateServiceClass, updateType, updateTypes, + validateProjectPath, verifyTypeDelete } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; @@ -272,6 +275,10 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendNotification(createProject, HOST_EXTENSION, params); } + validateProjectPath(params: ValidateProjectPathRequest): Promise { + return this._messenger.sendRequest(validateProjectPath, HOST_EXTENSION, params); + } + deleteProject(params: DeleteProjectRequest): void { return this._messenger.sendNotification(deleteProject, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx index e3f9ccc58cb..f0ad7e11f2e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx @@ -89,9 +89,14 @@ export function AddProjectForm() { const [isInWorkspace, setIsInWorkspace] = useState(false); const [path, setPath] = useState(""); const [isLoading, setIsLoading] = useState(false); + const [validationError, setValidationError] = useState(null); const handleFormDataChange = (data: Partial) => { setFormData(prev => ({ ...prev, ...data })); + // Clear validation error when form data changes + if (validationError) { + setValidationError(null); + } }; useEffect(() => { @@ -104,17 +109,38 @@ export function AddProjectForm() { }); }, []); - const handleAddProject = () => { + const handleAddProject = async () => { setIsLoading(true); - rpcClient.getBIDiagramRpcClient().addProjectToWorkspace({ - projectName: formData.integrationName, - packageName: formData.packageName, - convertToWorkspace: !isInWorkspace, - path: path, - workspaceName: formData.workspaceName, - orgName: formData.orgName || undefined, - version: formData.version || undefined, - }); + setValidationError(null); + + try { + // Validate the project path + const validationResult = await rpcClient.getBIDiagramRpcClient().validateProjectPath({ + projectPath: path, + projectName: formData.packageName, + createDirectory: true, + }); + + if (!validationResult.isValid) { + setValidationError(validationResult.errorMessage || "Invalid project path"); + setIsLoading(false); + return; + } + + // If validation passes, add the project + rpcClient.getBIDiagramRpcClient().addProjectToWorkspace({ + projectName: formData.integrationName, + packageName: formData.packageName, + convertToWorkspace: !isInWorkspace, + path: path, + workspaceName: formData.workspaceName, + orgName: formData.orgName || undefined, + version: formData.version || undefined, + }); + } catch (error) { + setValidationError("An error occurred during validation"); + setIsLoading(false); + } }; const goBack = () => { @@ -144,6 +170,18 @@ export function AddProjectForm() { + {validationError && ( + + {validationError} + + )} From f9fafc290afab8f292b91e8858cf01cf77a494fd Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 28 Jan 2026 23:52:14 +0530 Subject: [PATCH 042/247] Updated the LocationSelector component to include an error message prop for better user feedback. --- .../LocationSelector/LocationSelector.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/LocationSelector/LocationSelector.tsx b/workspaces/common-libs/ui-toolkit/src/components/LocationSelector/LocationSelector.tsx index 9fb0555a6bc..1f5bbcae100 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/LocationSelector/LocationSelector.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/LocationSelector/LocationSelector.tsx @@ -30,6 +30,7 @@ type FileSelectorBaseProps = { required?: boolean; sx?: any; onSelect: () => void; + errorMsg?: string; } export type FileSelectorProps = FileSelectorBaseProps & { @@ -64,8 +65,14 @@ const PathText = styled.div` opacity: 0.8; `; +const ErrorText = styled.div` + color: var(--vscode-errorForeground); + font-size: 12px; + margin-top: 4px; +`; + export const LocationSelector: React.FC = (props: FileSelectorProps) => { - const { id, label, required, selectionText, sx, btnText, onSelect, selectedFile } = props; + const { id, label, required, selectionText, sx, btnText, onSelect, selectedFile, errorMsg } = props; return ( @@ -81,12 +88,13 @@ export const LocationSelector: React.FC = (props: FileSelecto {btnText || "Select Location"} + {errorMsg && {errorMsg}} ); }; export const FormLocationSelector = (props: FormFileSelectorProps) => { - const { id, name, control, label, selectionText, btnText, required, onSelect, sx } = props; + const { id, name, control, label, selectionText, btnText, required, onSelect, sx, errorMsg } = props; const { field: { value, ...rest }, } = useController({ name, control }); @@ -102,6 +110,7 @@ export const FormLocationSelector = (props: FormFileSelec btnText={btnText} required={required} sx={sx} + errorMsg={errorMsg} {...rest} /> ); From 2f089edbf437eff9c099cd940b3f32355f9d64ab Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 28 Jan 2026 23:52:41 +0530 Subject: [PATCH 043/247] Added error handling to display appropriate messages for invalid inputs. --- .../src/rpc-types/bi-diagram/index.ts | 6 +-- .../src/rpc-types/bi-diagram/interfaces.ts | 10 ++++- .../src/rpc-types/bi-diagram/rpc-type.ts | 6 +-- .../rpc-managers/bi-diagram/rpc-handler.ts | 4 +- .../rpc-managers/bi-diagram/rpc-manager.ts | 6 +-- .../ballerina-extension/src/utils/bi.ts | 19 ++++----- .../src/rpc-clients/bi-diagram/rpc-client.ts | 6 +-- .../views/BI/ProjectForm/AddProjectForm.tsx | 34 +++++++++++----- .../BI/ProjectForm/AddProjectFormFields.tsx | 6 ++- .../BI/ProjectForm/ProjectFormFields.tsx | 7 +++- .../src/views/BI/ProjectForm/index.tsx | 40 +++++++++---------- 11 files changed, 85 insertions(+), 59 deletions(-) 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 cfe224b7e68..117e6ef986f 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 @@ -122,8 +122,8 @@ import { AddProjectToWorkspaceRequest, DeleteProjectRequest, OpenReadmeRequest, - ValidateProjectPathRequest, - ValidateProjectPathResponse + ValidateProjectFormRequest, + ValidateProjectFormResponse } from "./interfaces"; export interface BIDiagramAPI { @@ -142,7 +142,7 @@ export interface BIDiagramAPI { getNodeTemplate: (params: BINodeTemplateRequest) => Promise; getAiSuggestions: (params: BIAiSuggestionsRequest) => Promise; createProject: (params: ProjectRequest) => void; - validateProjectPath: (params: ValidateProjectPathRequest) => Promise; + validateProjectPath: (params: ValidateProjectFormRequest) => Promise; deleteProject: (params: DeleteProjectRequest) => void; addProjectToWorkspace: (params: AddProjectToWorkspaceRequest) => void; getWorkspaces: () => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts index 599b9997036..69509acac1b 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts @@ -198,13 +198,19 @@ export interface DeleteProjectRequest { projectPath: string; } -export interface ValidateProjectPathRequest { +export interface ValidateProjectFormRequest { projectPath: string; projectName: string; createDirectory: boolean; } -export interface ValidateProjectPathResponse { +export interface ValidateProjectFormResponse { isValid: boolean; errorMessage?: string; + errorField?: ValidateProjectFormErrorField; +} + +export enum ValidateProjectFormErrorField { + PATH = 'path', + NAME = 'name' } 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 97966918fd0..18b39538b8b 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 @@ -124,8 +124,8 @@ import { AddProjectToWorkspaceRequest, DeleteProjectRequest, OpenReadmeRequest, - ValidateProjectPathRequest, - ValidateProjectPathResponse + ValidateProjectFormRequest, + ValidateProjectFormResponse } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; @@ -145,7 +145,7 @@ export const getEnclosedFunction: RequestType = { method: `${_preFix}/getNodeTemplate` }; export const getAiSuggestions: RequestType = { method: `${_preFix}/getAiSuggestions` }; export const createProject: NotificationType = { method: `${_preFix}/createProject` }; -export const validateProjectPath: RequestType = { method: `${_preFix}/validateProjectPath` }; +export const validateProjectPath: RequestType = { method: `${_preFix}/validateProjectPath` }; export const deleteProject: NotificationType = { method: `${_preFix}/deleteProject` }; export const addProjectToWorkspace: NotificationType = { method: `${_preFix}/addProjectToWorkspace` }; export const getWorkspaces: RequestType = { method: `${_preFix}/getWorkspaces` }; 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 fa1e3d3005c..9bd592a67cd 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 @@ -152,7 +152,7 @@ import { verifyTypeDelete, VerifyTypeDeleteRequest, VisibleTypesRequest, - ValidateProjectPathRequest, + ValidateProjectFormRequest, validateProjectPath } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; @@ -175,7 +175,7 @@ export function registerBiDiagramRpcHandlers(messenger: Messenger) { messenger.onRequest(getNodeTemplate, (args: BINodeTemplateRequest) => rpcManger.getNodeTemplate(args)); messenger.onRequest(getAiSuggestions, (args: BIAiSuggestionsRequest) => rpcManger.getAiSuggestions(args)); messenger.onNotification(createProject, (args: ProjectRequest) => rpcManger.createProject(args)); - messenger.onRequest(validateProjectPath, (args: ValidateProjectPathRequest) => rpcManger.validateProjectPath(args)); + messenger.onRequest(validateProjectPath, (args: ValidateProjectFormRequest) => rpcManger.validateProjectPath(args)); messenger.onNotification(deleteProject, (args: DeleteProjectRequest) => rpcManger.deleteProject(args)); messenger.onNotification(addProjectToWorkspace, (args: AddProjectToWorkspaceRequest) => rpcManger.addProjectToWorkspace(args)); messenger.onRequest(getWorkspaces, () => rpcManger.getWorkspaces()); 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 b5becf5d684..94d4a80166c 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 @@ -67,8 +67,8 @@ import { DeleteProjectRequest, DeleteTypeRequest, DeleteTypeResponse, - ValidateProjectPathRequest, - ValidateProjectPathResponse, + ValidateProjectFormRequest, + ValidateProjectFormResponse, DeploymentRequest, DeploymentResponse, DevantMetadata, @@ -616,7 +616,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { } } - async validateProjectPath(params: ValidateProjectPathRequest): Promise { + async validateProjectPath(params: ValidateProjectFormRequest): Promise { return validateProjectPath(params.projectPath, params.projectName, params.createDirectory); } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/bi.ts b/workspaces/ballerina/ballerina-extension/src/utils/bi.ts index 8405c9d6226..e60fab5546b 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/bi.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/bi.ts @@ -31,7 +31,8 @@ import { ProjectRequest, STModification, SyntaxTreeResponse, - WorkspaceTomlValues + WorkspaceTomlValues, + ValidateProjectFormErrorField } from "@wso2/ballerina-core"; import { StateMachine, history, openView } from "../stateMachine"; import { applyModifications, modifyFileContent, writeBallerinaFileDidOpen } from "./modification"; @@ -130,13 +131,13 @@ export function getUsername(): string { * @param projectPath - The directory path where the project will be created * @param projectName - The name of the project (used if createDirectory is true) * @param createDirectory - Whether a new directory will be created - * @returns Validation result with error message if invalid + * @returns Validation result with error message and field information if invalid */ -export function validateProjectPath(projectPath: string, projectName: string, createDirectory: boolean): { isValid: boolean; errorMessage?: string } { +export function validateProjectPath(projectPath: string, projectName: string, createDirectory: boolean): { isValid: boolean; errorMessage?: string; errorField?: ValidateProjectFormErrorField } { try { // Check if projectPath is provided and not empty if (!projectPath || projectPath.trim() === '') { - return { isValid: false, errorMessage: 'Project path is required' }; + return { isValid: false, errorMessage: 'Project path is required', errorField: ValidateProjectFormErrorField.PATH }; } // Check if the base directory exists @@ -144,7 +145,7 @@ export function validateProjectPath(projectPath: string, projectName: string, cr // Check if parent directory exists and we can create the path const parentDir = path.dirname(projectPath); if (!fs.existsSync(parentDir)) { - return { isValid: false, errorMessage: `Directory path does not exist: ${projectPath}` }; + return { isValid: false, errorMessage: 'Directory path does not exist', errorField: ValidateProjectFormErrorField.PATH }; } } @@ -155,12 +156,12 @@ export function validateProjectPath(projectPath: string, projectName: string, cr if (!createDirectory) { const ballerinaTomlPath = path.join(finalPath, 'Ballerina.toml'); if (fs.existsSync(ballerinaTomlPath)) { - return { isValid: false, errorMessage: 'Existing Ballerina project detected in the selected directory' }; + return { isValid: false, errorMessage: 'Existing Ballerina project detected in the selected directory', errorField: ValidateProjectFormErrorField.PATH }; } } else { // If creating a new directory, check if it already exists if (fs.existsSync(finalPath)) { - return { isValid: false, errorMessage: `A directory with name '${sanitizeName(projectName)}' already exists at the selected location` }; + return { isValid: false, errorMessage: `A directory with this name already exists at the selected location`, errorField: ValidateProjectFormErrorField.NAME}; } } @@ -169,12 +170,12 @@ export function validateProjectPath(projectPath: string, projectName: string, cr // Try to access the directory with write permissions fs.accessSync(projectPath, fs.constants.W_OK); } catch (error) { - return { isValid: false, errorMessage: 'No write permission for the selected directory' }; + return { isValid: false, errorMessage: 'No write permission for the selected directory', errorField: ValidateProjectFormErrorField.PATH }; } return { isValid: true }; } catch (error) { - return { isValid: false, errorMessage: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}` }; + return { isValid: false, errorMessage: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`, errorField: ValidateProjectFormErrorField.PATH }; } } 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 2bc4cdd15e4..c5e1a0d3489 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 @@ -119,8 +119,8 @@ import { UpdateTypesRequest, UpdateTypesResponse, UpdatedArtifactsResponse, - ValidateProjectPathRequest, - ValidateProjectPathResponse, + ValidateProjectFormRequest, + ValidateProjectFormResponse, VerifyTypeDeleteRequest, VerifyTypeDeleteResponse, VisibleTypesRequest, @@ -275,7 +275,7 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendNotification(createProject, HOST_EXTENSION, params); } - validateProjectPath(params: ValidateProjectPathRequest): Promise { + validateProjectPath(params: ValidateProjectFormRequest): Promise { return this._messenger.sendRequest(validateProjectPath, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx index f0ad7e11f2e..3e896ae03c2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/AddProjectForm.tsx @@ -26,6 +26,7 @@ import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { AddProjectFormFields, AddProjectFormData } from "./AddProjectFormFields"; import { isFormValidAddProject } from "./utils"; +import { ValidateProjectFormErrorField } from "@wso2/ballerina-core"; const PageWrapper = styled.div` display: flex; @@ -89,13 +90,17 @@ export function AddProjectForm() { const [isInWorkspace, setIsInWorkspace] = useState(false); const [path, setPath] = useState(""); const [isLoading, setIsLoading] = useState(false); - const [validationError, setValidationError] = useState(null); + const [pathError, setPathError] = useState(null); + const [packageNameValidationError, setPackageNameValidationError] = useState(null); const handleFormDataChange = (data: Partial) => { setFormData(prev => ({ ...prev, ...data })); - // Clear validation error when form data changes - if (validationError) { - setValidationError(null); + // Clear validation errors when form data changes + if (pathError) { + setPathError(null); + } + if (packageNameValidationError) { + setPackageNameValidationError(null); } }; @@ -111,7 +116,8 @@ export function AddProjectForm() { const handleAddProject = async () => { setIsLoading(true); - setValidationError(null); + setPathError(null); + setPackageNameValidationError(null); try { // Validate the project path @@ -122,7 +128,12 @@ export function AddProjectForm() { }); if (!validationResult.isValid) { - setValidationError(validationResult.errorMessage || "Invalid project path"); + // Show error on the appropriate field + if (validationResult.errorField === ValidateProjectFormErrorField.PATH) { + setPathError(validationResult.errorMessage || "Invalid project path"); + } else if (validationResult.errorField === ValidateProjectFormErrorField.NAME) { + setPackageNameValidationError(validationResult.errorMessage || "Invalid project name"); + } setIsLoading(false); return; } @@ -138,7 +149,7 @@ export function AddProjectForm() { version: formData.version || undefined, }); } catch (error) { - setValidationError("An error occurred during validation"); + setPathError("An error occurred during validation"); setIsLoading(false); } }; @@ -166,11 +177,12 @@ export function AddProjectForm() { formData={formData} onFormDataChange={handleFormDataChange} isInWorkspace={isInWorkspace} + packageNameValidationError={packageNameValidationError || undefined} /> - {validationError && ( + {pathError && ( - {validationError} + {pathError} )}
); } + +function handleArgChange(param: Parameter, allParams: Parameter[]) { + const arg = param.formValues["variable"]; + const name = arg.split('.').pop(); + + let key = name; + let i = 2; + while (allParams.some(p => p.key === key && p.id !== param.id)) { + key = name + (i++); + } + + const type = param.formValues["type"]; + + const defaultValue = + Object.keys(param.formValues).indexOf("defaultable") > -1 && `${param.formValues["defaultable"]} `; + let value = `${type} ${key} `; + if (defaultValue) { + value += ` = ${defaultValue} `; + } + + return { + ...param, + key: key, + value: value, + }; +} From 3505d801c7ca4004cb685973365f1395ad5a18b3 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 1 Feb 2026 18:37:12 +0530 Subject: [PATCH 056/247] Update EditorFactory to handle DATA_MAPPER_CREATION in repeatable property condition --- workspaces/ballerina/ballerina-core/src/interfaces/bi.ts | 1 + .../src/components/editors/EditorFactory.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index e1670d8e31c..af715adde0c 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -480,6 +480,7 @@ export type NodeKind = | "CONTINUE" | "DATA_MAPPER_CALL" | "DATA_MAPPER_DEFINITION" + | "DATA_MAPPER_CREATION" | "DRAFT" | "ELSE" | "EMPTY" 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 2b70b8ce98a..45f981feac1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -196,7 +196,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { } else if (field.type === "VIEW") { // Skip this property return <>; - } else if(field.type === "REPEATABLE_PROPERTY" && selectedNode === "DATA_MAPPER_DEFINITION"){ + } else if(field.type === "REPEATABLE_PROPERTY" && selectedNode === "DATA_MAPPER_CREATION") { return ; }else if ( (field.type === "PARAM_MANAGER") || From f993cb53273c5b4704ee5c63e735e44039ec8a9b Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 1 Feb 2026 18:37:23 +0530 Subject: [PATCH 057/247] Update required field message in ArgManagerEditor for clarity --- .../src/components/ParamManager/ArgManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index 230f0d6e9f3..4142ec0e550 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -128,7 +128,7 @@ export function ArgManagerEditor(props: ArgManagerEditorProps) { rules={{ required: { value: !field.optional && !field.placeholder, - message: `${selectedNode === "DATA_MAPPER_DEFINITION" ? 'Input type' : field.label} is required` + message: "Arguments are required" } }} render={({ field: { onChange }, fieldState: { error } }) => ( From 29126ccf188eae5602ed1d280bb7e6944d1602f4 Mon Sep 17 00:00:00 2001 From: gigara Date: Mon, 2 Feb 2026 13:45:04 +0530 Subject: [PATCH 058/247] Update branch references from 'release-*' to 'stable/*' in workflow files --- .github/actions/pr/action.yml | 12 ++++++------ .github/workflows/build.yml | 4 ++-- .github/workflows/sync-main-with-releases.yml | 2 +- .github/workflows/test-pr.yml | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/actions/pr/action.yml b/.github/actions/pr/action.yml index fbe3a08175b..79c9663a6e1 100644 --- a/.github/actions/pr/action.yml +++ b/.github/actions/pr/action.yml @@ -128,17 +128,17 @@ runs: run: | baseBranch="" if [ "${{ inputs.ballerina }}" == 'true' ]; then - baseBranch="release-ballerina" + baseBranch="stable/ballerina" elif [ "${{ inputs.bi }}" == 'true' ]; then - baseBranch="release-bi" + baseBranch="stable/bi" elif [ "${{ inputs.wso2-platform }}" == 'true' ]; then - baseBranch="release-platform" + baseBranch="stable/platform" elif [ "${{ inputs.choreo }}" == 'true' ]; then - baseBranch="release-choreo" + baseBranch="stable/choreo" elif [ "${{ inputs.apk }}" == 'true' ]; then - baseBranch="release-apk" + baseBranch="stable/apk" elif [ "${{ inputs.mi }}" == 'true' ]; then - baseBranch="release-mi" + baseBranch="stable/mi" fi pr=$(gh pr create -B "$baseBranch" -H "${{ inputs.version }}" --title "Merge \"${{ inputs.version }}\" into \"$baseBranch\"" --body '$subject') echo "prURL=$pr" >> $GITHUB_OUTPUT diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8522f3cb7c2..ce5c20ca896 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -233,7 +233,7 @@ jobs: name: Run Ballerina extension tests needs: Build_Stage if: false - # if: ${{ inputs.runTests || (inputs.isReleaseBuild && (inputs.ballerina || inputs.bi)) || needs.Build_Stage.outputs.runBalExtTests == 'true' || github.base_ref == 'release-ballerina' }} + # if: ${{ inputs.runTests || (inputs.isReleaseBuild && (inputs.ballerina || inputs.bi)) || needs.Build_Stage.outputs.runBalExtTests == 'true' || github.base_ref == 'stable/ballerina' }} timeout-minutes: 45 runs-on: ${{ inputs.runOnAWS && inputs.awsRunnerId || 'ubuntu-latest' }} steps: @@ -281,7 +281,7 @@ jobs: ExtTest_MI: name: Run MI diagram tests needs: Build_Stage - if: ${{ inputs.runTests || (inputs.isReleaseBuild && inputs.mi) || needs.Build_Stage.outputs.runMIExtTests == 'true' || github.base_ref == 'release-mi' }} + if: ${{ inputs.runTests || (inputs.isReleaseBuild && inputs.mi) || needs.Build_Stage.outputs.runMIExtTests == 'true' || github.base_ref == 'stable/mi' }} timeout-minutes: 30 runs-on: ${{ inputs.runOnAWS && inputs.awsRunnerId || 'ubuntu-latest' }} steps: diff --git a/.github/workflows/sync-main-with-releases.yml b/.github/workflows/sync-main-with-releases.yml index 8255d27bdc0..48bebbf58fb 100644 --- a/.github/workflows/sync-main-with-releases.yml +++ b/.github/workflows/sync-main-with-releases.yml @@ -4,7 +4,7 @@ on: types: - closed branches: - - 'release-**' + - 'stable/**' jobs: sync-main: diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index 6dcc056684d..b7513480cfb 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -17,5 +17,5 @@ jobs: with: runOnAWS: ${{ contains(github.event.pull_request.labels.*.name, 'Runner/AWS') }} enableE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Enable UI Tests') }} - runBIE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run BI UI Tests') || github.base_ref == 'release-bi' || github.base_ref == 'release-ballerina' }} - runMIE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run MI UI Tests') || github.base_ref == 'release-mi' }} + runBIE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run BI UI Tests') || github.base_ref == 'stable/bi' || github.base_ref == 'stable/ballerina' }} + runMIE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run MI UI Tests') || github.base_ref == 'stable/mi' }} From b73e53c020a8722c869bc23ebfba65b502af1ffc Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 3 Feb 2026 11:23:32 +0530 Subject: [PATCH 059/247] Remove activation event for onStartupFinished in Ballerina extension package.json --- workspaces/ballerina/ballerina-extension/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index aa02b262118..9b6ee5bbc5d 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -24,7 +24,6 @@ "Snippets" ], "activationEvents": [ - "onStartupFinished", "onLanguage:ballerina", "workspaceContains:**/Ballerina.toml", "onNotebook:ballerina-notebook", From 7cc88c032aa09ba3d60eef1ebf3b4362d4d6bd2e Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 11:27:11 +0530 Subject: [PATCH 060/247] Remove unused value and type assignments in handleArgChange function --- .../src/components/ParamManager/ArgManager.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index 4142ec0e550..39e6f9983eb 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -389,18 +389,8 @@ function handleArgChange(param: Parameter, allParams: Parameter[]) { key = name + (i++); } - const type = param.formValues["type"]; - - const defaultValue = - Object.keys(param.formValues).indexOf("defaultable") > -1 && `${param.formValues["defaultable"]} `; - let value = `${type} ${key} `; - if (defaultValue) { - value += ` = ${defaultValue} `; - } - return { ...param, - key: key, - value: value, + key: key }; } From 3912aacba4e1ad53e71fffd6325c125cba0b7635 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 11:44:46 +0530 Subject: [PATCH 061/247] Update button label from 'Collapsed' to 'Collapse' in Form, ArgManagerEditor, and ParamManagerEditor components --- .../ballerina-side-panel/src/components/Form/index.tsx | 2 +- .../src/components/ParamManager/ArgManager.tsx | 2 +- .../src/components/ParamManager/ParamManager.tsx | 2 +- 3 files changed, 3 insertions(+), 3 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 c0c95b4c22c..e50cce857d1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -1058,7 +1058,7 @@ export const Form = forwardRef((props: FormProps) => { name={"chevron-up"} iconSx={{ fontSize: 12 }} sx={{ height: 12 }} - />Collapsed + />Collapse )} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index 39e6f9983eb..b632b7248ef 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -165,7 +165,7 @@ export function ArgManagerEditor(props: ArgManagerEditorProps) { sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} > - Collapsed + Collapse )} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx index 99b0b61d179..0562a1f7d53 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx @@ -185,7 +185,7 @@ export function ParamManagerEditor(props: ParamManagerEditorProps) { sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} > - Collapsed + Collapse )} From 899a2fb60126bc5ccc24ccf52fa8aec63718395f Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 12:45:27 +0530 Subject: [PATCH 062/247] Update copyright year to 2026 and refactor useEffect for GraphQL context in ArgManager component --- .../components/ParamManager/ArgManager.tsx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index b632b7248ef..a242c4f09a8 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except @@ -202,6 +202,15 @@ export function ArgManager(props: ArgManagerProps) { const [paramComponents, setParamComponents] = useState([]); const [isGraphql, setIsGraphql] = useState(false); + useEffect(() => { + rpcClient.getVisualizerLocation().then(context => { + if (context.view === "GraphQL Diagram") { + setIsGraphql(true); + } + }); + renderParams(); + }, [parameters, editingSegmentId, paramConfigs]); + const getTypeFromArg = async ( arg: string ) => { @@ -308,15 +317,6 @@ export function ArgManager(props: ArgManagerProps) { setIsNew(false); }; - useEffect(() => { - rpcClient.getVisualizerLocation().then(context => { - if (context.view === "GraphQL Diagram") { - setIsGraphql(true); - } - }); - renderParams(); - }, [parameters, editingSegmentId, paramConfigs]); - const renderParams = () => { const render: React.ReactElement[] = []; parameters From 3c902df8e7acd874c56f81255dc1833dba64abcf Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 13:39:29 +0530 Subject: [PATCH 063/247] Remove unused 'isGraphql' state and related logic from ArgManager component --- .../src/components/ParamManager/ArgManager.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index a242c4f09a8..8b6cc4a5f04 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -188,11 +188,10 @@ export function ArgManagerEditor(props: ArgManagerEditorProps) { } export function ArgManager(props: ArgManagerProps) { - const { field, readonly, onChange, openRecordEditor, selectedNode, setSubComponentEnabled } = props; + const { field, readonly, onChange, openRecordEditor, setSubComponentEnabled } = props; const propertyKey = field.key; const paramConfigs = field.paramManagerProps; - const { rpcClient } = useRpcContext(); const { fileName, targetLineRange } = useFormContext(); @@ -200,14 +199,8 @@ export function ArgManager(props: ArgManagerProps) { const [isNew, setIsNew] = useState(false); const [parameters, setParameters] = useState(paramConfigs.paramValues); const [paramComponents, setParamComponents] = useState([]); - const [isGraphql, setIsGraphql] = useState(false); useEffect(() => { - rpcClient.getVisualizerLocation().then(context => { - if (context.view === "GraphQL Diagram") { - setIsGraphql(true); - } - }); renderParams(); }, [parameters, editingSegmentId, paramConfigs]); @@ -333,9 +326,6 @@ export function ArgManager(props: ArgManagerProps) { field.editable = param.identifierEditable; field.lineRange = param.identifierRange; } - if (field.key === "type" && field.type === "ACTION_TYPE" && param.formValues['isGraphqlId'] !== undefined) { - field.isGraphqlId = param.formValues['isGraphqlId']; - } } }) render.push( From 22beba4dc99d150775abf18bfe6484d0bacdc72f Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 13:41:31 +0530 Subject: [PATCH 064/247] Remove advanced fields rendering from arg manager --- .../components/ParamManager/ArgManager.tsx | 49 +------------------ 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index 8b6cc4a5f04..c2cc5bbe103 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -100,18 +100,7 @@ export interface ArgManagerEditorProps { export function ArgManagerEditor(props: ArgManagerEditorProps) { const { field, openRecordEditor, selectedNode, setSubComponentEnabled } = props; const { form } = useFormContext(); - const { control, setValue, getValues } = form; - - const hasAdvancedFields = field.advanceProps?.length > 0; - const [showAdvancedOptions, setShowAdvancedOptions] = useState(false); - - const handleOnShowAdvancedOptions = () => { - setShowAdvancedOptions(true); - } - - const handleOnHideAdvancedOptions = () => { - setShowAdvancedOptions(false); - } + const { control } = form; return ( @@ -146,42 +135,6 @@ export function ArgManagerEditor(props: ArgManagerEditorProps) { )} /> - {hasAdvancedFields && ( - - Optional Configurations - - {!showAdvancedOptions && ( - - - Expand - - )} - {showAdvancedOptions && ( - - - Collapse - - )} - - - )} - {hasAdvancedFields && showAdvancedOptions && ( - - {field.advanceProps.map((advanceProp) => { - advanceProp.key = getFieldKeyForAdvanceProp(field.key, advanceProp.key); - if (getValues(advanceProp.key) === undefined) { - setValue(advanceProp.key, advanceProp.value); - } - return - })} - - )} ); From 055fe360d660b4eacd1b8c232e934ae78f960e3d Mon Sep 17 00:00:00 2001 From: gigara Date: Mon, 2 Feb 2026 15:52:10 +0530 Subject: [PATCH 065/247] chore: update eslint to version 9.26.0 in multiple packages; update fast-xml-parser to version 5.3.4 in mi-extension and mi-visualizer --- .../autoinstallers/rush-plugins/package.json | 2 +- .../rush-plugins/pnpm-lock.yaml | 392 +- common/config/rush/.pnpmfile.cjs | 18 + common/config/rush/pnpm-lock.yaml | 5134 ++++++++--------- .../ballerina/overview-view/package.json | 2 +- workspaces/bi/bi-extension/package.json | 2 +- .../common-libs/ui-toolkit/package.json | 2 +- .../mcp-inspector-extension/package.json | 2 +- workspaces/mi/mi-extension/package.json | 2 +- workspaces/mi/mi-visualizer/package.json | 2 +- 10 files changed, 2354 insertions(+), 3204 deletions(-) diff --git a/common/autoinstallers/rush-plugins/package.json b/common/autoinstallers/rush-plugins/package.json index b2c99024a8a..edcf1c25360 100644 --- a/common/autoinstallers/rush-plugins/package.json +++ b/common/autoinstallers/rush-plugins/package.json @@ -8,6 +8,6 @@ } }, "dependencies": { - "@gigara/rush-github-action-build-cache-plugin": "^1.1.1" + "@gigara/rush-github-action-build-cache-plugin": "^1.1.3" } } diff --git a/common/autoinstallers/rush-plugins/pnpm-lock.yaml b/common/autoinstallers/rush-plugins/pnpm-lock.yaml index 858b4c47307..7327120f7e5 100644 --- a/common/autoinstallers/rush-plugins/pnpm-lock.yaml +++ b/common/autoinstallers/rush-plugins/pnpm-lock.yaml @@ -12,28 +12,40 @@ importers: .: dependencies: '@gigara/rush-github-action-build-cache-plugin': - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^1.1.3 + version: 1.1.3 packages: - '@actions/cache@4.1.0': - resolution: {integrity: sha512-z3Opg+P4Y7baq+g1dODXgdtsvPLSewr3ZKpp3U0HQR1A/vWCoJFS52XSezjdngo4SIOdR5oHtyK3a3Arar+X9A==} + '@actions/cache@5.0.5': + resolution: {integrity: sha512-jiQSg0gfd+C2KPgcmdCOq7dCuCIQQWQ4b1YfGIRaaA9w7PJbRwTOcCz4LiFEUnqZGf0ha/8OKL3BeNwetHzYsQ==} - '@actions/core@1.11.1': - resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} + '@actions/core@2.0.3': + resolution: {integrity: sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==} - '@actions/exec@1.1.1': - resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} + '@actions/core@3.0.0': + resolution: {integrity: sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==} - '@actions/glob@0.1.2': - resolution: {integrity: sha512-SclLR7Ia5sEqjkJTPs7Sd86maMDw43p769YxBOxvPvEWuPEhpAnBsQfENOpXjFYMmhCqd127bmf+YdvJqVqR4A==} + '@actions/exec@2.0.0': + resolution: {integrity: sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==} - '@actions/http-client@2.2.3': - resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} + '@actions/exec@3.0.0': + resolution: {integrity: sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==} - '@actions/io@1.1.3': - resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + '@actions/glob@0.5.1': + resolution: {integrity: sha512-+dv/t2aKQdKp9WWSp+1yIXVJzH5Q38M0Mta26pzIbeec14EcIleMB7UU6N7sNgbEuYfyuVGpE5pOKjl6j1WXkA==} + + '@actions/http-client@3.0.2': + resolution: {integrity: sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==} + + '@actions/http-client@4.0.0': + resolution: {integrity: sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==} + + '@actions/io@2.0.0': + resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} + + '@actions/io@3.0.2': + resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} '@azure/abort-controller@1.1.0': resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} @@ -83,19 +95,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/ms-rest-js@2.7.0': - resolution: {integrity: sha512-ngbzWbqF+NmztDOpLBVDxYM+XLcUj7nKhxGbSU9WtIsXfRB//cf2ZbAG5HkOrhU9/wd/ORRB6lM/d69RKVjiyA==} - - '@azure/storage-blob@12.29.1': - resolution: {integrity: sha512-7ktyY0rfTM0vo7HvtK6E3UvYnI9qfd6Oz6z/+92VhGRveWng3kJwMKeUpqmW/NmwcDNbxHpSlldG+vsUnRFnBg==} + '@azure/storage-blob@12.30.0': + resolution: {integrity: sha512-peDCR8blSqhsAKDbpSP/o55S4sheNwSrblvCaHUZ5xUI73XA7ieUGGwrONgD/Fng0EoDe1VOa3fAQ7+WGB3Ocg==} engines: {node: '>=20.0.0'} - '@azure/storage-common@12.1.1': - resolution: {integrity: sha512-eIOH1pqFwI6UmVNnDQvmFeSg0XppuzDLFeUNO/Xht7ODAzRLgGDh7h550pSxoA+lPDxBl1+D2m/KG3jWzCUjTg==} + '@azure/storage-common@12.2.0': + resolution: {integrity: sha512-YZLxiJ3vBAAnFbG3TFuAMUlxZRexjQX5JDQxOkFGb6e2TpoxH3xyHI6idsMe/QrWtj41U/KoqBxlayzhS+LlwA==} engines: {node: '>=20.0.0'} - '@gigara/rush-github-action-build-cache-plugin@1.1.1': - resolution: {integrity: sha512-lSGoYyG+EPYmQhqUTBq6tJupNZgiWWFG2OWtqU2TY16FB5DPgk2Y3WbBHOcBb4rL3tr2srmH82ffc5lT83qfCg==} + '@gigara/rush-github-action-build-cache-plugin@1.1.3': + resolution: {integrity: sha512-nTxC8UmNEN2AO7K2pcdOVmERvo+IYZVHe1IpMiAvAk7x+2hnduW/LmC59kz7YbGfKHhiIwrzu/c8vH1om6IZOg==} '@protobuf-ts/runtime-rpc@2.11.1': resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} @@ -107,31 +116,16 @@ packages: resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==} engines: {node: '>=20.0.0'} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -144,73 +138,14 @@ packages: supports-color: optional: true - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - fast-xml-parser@5.3.3: - resolution: {integrity: sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==} + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} hasBin: true - form-data@2.5.5: - resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} - engines: {node: '>= 0.12'} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -219,40 +154,12 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} - engines: {node: '>=11.0.0'} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -260,12 +167,6 @@ packages: strnum@2.1.2: resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -273,66 +174,63 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - undici@7.18.2: - resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} + undici@7.20.0: + resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - snapshots: - '@actions/cache@4.1.0': + '@actions/cache@5.0.5': dependencies: - '@actions/core': 1.11.1 - '@actions/exec': 1.1.1 - '@actions/glob': 0.1.2 - '@actions/http-client': 2.2.3 - '@actions/io': 1.1.3 + '@actions/core': 2.0.3 + '@actions/exec': 2.0.0 + '@actions/glob': 0.5.1 + '@actions/http-client': 3.0.2 + '@actions/io': 2.0.0 '@azure/abort-controller': 1.1.0 - '@azure/ms-rest-js': 2.7.0 - '@azure/storage-blob': 12.29.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/storage-blob': 12.30.0 '@protobuf-ts/runtime-rpc': 2.11.1 semver: 6.3.1 transitivePeerDependencies: - - encoding - supports-color - '@actions/core@1.11.1': + '@actions/core@2.0.3': + dependencies: + '@actions/exec': 2.0.0 + '@actions/http-client': 3.0.2 + + '@actions/core@3.0.0': + dependencies: + '@actions/exec': 3.0.0 + '@actions/http-client': 4.0.0 + + '@actions/exec@2.0.0': dependencies: - '@actions/exec': 1.1.1 - '@actions/http-client': 2.2.3 + '@actions/io': 2.0.0 - '@actions/exec@1.1.1': + '@actions/exec@3.0.0': dependencies: - '@actions/io': 1.1.3 + '@actions/io': 3.0.2 - '@actions/glob@0.1.2': + '@actions/glob@0.5.1': dependencies: - '@actions/core': 1.11.1 + '@actions/core': 2.0.3 minimatch: 3.1.2 - '@actions/http-client@2.2.3': + '@actions/http-client@3.0.2': dependencies: tunnel: 0.0.6 - undici: 7.18.2 + undici: 7.20.0 - '@actions/io@1.1.3': {} + '@actions/http-client@4.0.0': + dependencies: + tunnel: 0.0.6 + undici: 7.20.0 + + '@actions/io@2.0.0': {} + + '@actions/io@3.0.2': {} '@azure/abort-controller@1.1.0': dependencies: @@ -409,7 +307,7 @@ snapshots: '@azure/core-xml@1.5.0': dependencies: - fast-xml-parser: 5.3.3 + fast-xml-parser: 5.3.4 tslib: 2.8.1 '@azure/logger@1.3.0': @@ -419,21 +317,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/ms-rest-js@2.7.0': - dependencies: - '@azure/core-auth': 1.10.1 - abort-controller: 3.0.0 - form-data: 2.5.5 - node-fetch: 2.7.0 - tslib: 1.14.1 - tunnel: 0.0.6 - uuid: 8.3.2 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@azure/storage-blob@12.29.1': + '@azure/storage-blob@12.30.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 @@ -446,13 +330,13 @@ snapshots: '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.0 '@azure/logger': 1.3.0 - '@azure/storage-common': 12.1.1 + '@azure/storage-common': 12.2.0 events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/storage-common@12.1.1': + '@azure/storage-common@12.2.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 @@ -466,12 +350,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@gigara/rush-github-action-build-cache-plugin@1.1.1': + '@gigara/rush-github-action-build-cache-plugin@1.1.3': dependencies: - '@actions/cache': 4.1.0 - '@actions/core': 1.11.1 + '@actions/cache': 5.0.5 + '@actions/core': 3.0.0 transitivePeerDependencies: - - encoding - supports-color '@protobuf-ts/runtime-rpc@2.11.1': @@ -488,14 +371,8 @@ snapshots: transitivePeerDependencies: - supports-color - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - agent-base@7.1.4: {} - asynckit@0.4.0: {} - balanced-match@1.0.2: {} brace-expansion@1.1.12: @@ -503,93 +380,18 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - concat-map@0.0.1: {} debug@4.4.3: dependencies: ms: 2.1.3 - delayed-stream@1.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - event-target-shim@5.0.1: {} - events@3.3.0: {} - fast-xml-parser@5.3.3: + fast-xml-parser@5.3.4: dependencies: strnum: 2.1.2 - form-data@2.5.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - safe-buffer: 5.2.1 - - function-bind@1.1.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - gopd@1.2.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -604,54 +406,18 @@ snapshots: transitivePeerDependencies: - supports-color - math-intrinsics@1.1.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 ms@2.1.3: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - safe-buffer@5.2.1: {} - - sax@1.4.4: {} - semver@6.3.1: {} strnum@2.1.2: {} - tr46@0.0.3: {} - - tslib@1.14.1: {} - tslib@2.8.1: {} tunnel@0.0.6: {} - undici@7.18.2: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - xml2js@0.5.0: - dependencies: - sax: 1.4.4 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} + undici@7.20.0: {} diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 62e4429631d..dc450d8b274 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -63,6 +63,15 @@ module.exports = { if (pkg.dependencies['js-yaml']) { pkg.dependencies['js-yaml'] = '^4.1.1'; } + if (pkg.dependencies['diff']) { + pkg.dependencies['diff'] = '^8.0.3'; + } + if (pkg.dependencies['eslint']) { + pkg.dependencies['eslint'] = '^9.26.0'; + } + if (pkg.dependencies['fast-xml-parser']) { + pkg.dependencies['fast-xml-parser'] = '5.3.4'; + } } if (pkg.devDependencies) { @@ -106,6 +115,15 @@ module.exports = { if (pkg.devDependencies['min-document']) { pkg.devDependencies['min-document'] = '^2.19.1'; } + if (pkg.devDependencies['diff']) { + pkg.devDependencies['diff'] = '^8.0.3'; + } + if (pkg.devDependencies['eslint']) { + pkg.devDependencies['eslint'] = '^9.26.0'; + } + if (pkg.devDependencies['fast-xml-parser']) { + pkg.devDependencies['fast-xml-parser'] = '5.3.4'; + } } return pkg; diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b059881d669..947deff5fc6 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -30,13 +30,13 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^8.52.0 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -130,16 +130,16 @@ importers: version: 1.108.1 '@typescript-eslint/eslint-plugin': specifier: ^6.4.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.4.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.3.4 version: 2.5.2 eslint: - specifier: ^8.47.0 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) rimraf: specifier: ~5.0.5 version: 5.0.10 @@ -185,13 +185,13 @@ importers: 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) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^8.52.0 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -215,7 +215,7 @@ importers: version: 3.14.0(@codemirror/language@6.11.3)(@lezer/highlight@1.2.3)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 - version: 4.41.0 + version: 4.43.0 '@tanstack/react-query': specifier: 4.0.10 version: 4.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -291,7 +291,7 @@ importers: version: 4.14.202 '@types/node': specifier: ^20.10.6 - version: 20.19.29 + version: 20.19.30 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -312,7 +312,7 @@ importers: version: 5.2.7(webpack@5.104.1) sass-loader: specifier: ^13.2.0 - version: 13.3.3(sass@1.97.2)(webpack@5.104.1) + version: 13.3.3(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^4.0.1 version: 4.0.2(webpack@5.104.1) @@ -351,10 +351,10 @@ importers: version: 1.108.1 '@typescript-eslint/eslint-plugin': specifier: ~5.48.2 - version: 5.48.2(@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 5.48.2(@typescript-eslint/parser@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~5.48.2 - version: 5.48.2(eslint@8.57.1)(typescript@5.8.3) + version: 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.3.2 version: 2.5.2 @@ -365,8 +365,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.32.0 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -454,10 +454,10 @@ importers: dependencies: '@ai-sdk/amazon-bedrock': specifier: ^4.0.4 - version: 4.0.17(zod@4.1.11) + version: 4.0.46(zod@4.1.11) '@ai-sdk/anthropic': specifier: ^3.0.2 - version: 3.0.13(zod@4.1.11) + version: 3.0.35(zod@4.1.11) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -490,7 +490,7 @@ importers: version: link:../../wso2-platform/wso2-platform-core ai: specifier: ^6.0.7 - version: 6.0.35(zod@4.1.11) + version: 6.0.67(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -707,7 +707,7 @@ importers: version: 3.2.0(date-fns@4.1.0) dexie: specifier: ^4.0.11 - version: 4.2.1 + version: 4.3.0 graphql: specifier: ^16.11.0 version: 16.12.0 @@ -716,7 +716,7 @@ importers: version: 4.7.8 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) joi: specifier: ^17.13.3 version: 17.13.3 @@ -762,31 +762,31 @@ importers: version: 7.27.2(@babel/core@7.27.7) '@rollup/plugin-commonjs': specifier: ^28.0.3 - version: 28.0.9(rollup@4.55.1) + version: 28.0.9(rollup@4.57.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.55.1) + version: 6.1.0(rollup@4.57.1) '@rollup/plugin-node-resolve': specifier: ^16.0.1 - version: 16.0.3(rollup@4.55.1) + version: 16.0.3(rollup@4.57.1) '@storybook/addon-actions': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-essentials': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) '@storybook/addon-links': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.16 - version: 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -816,7 +816,7 @@ importers: version: 10.0.0 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + version: 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) @@ -828,7 +828,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) express: specifier: ^4.22.1 version: 4.22.1 @@ -843,25 +843,25 @@ importers: version: 11.1.0 react-scripts-ts: specifier: ^3.1.0 - version: 3.1.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 3.1.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) react-test-renderer: specifier: ^19.1.0 - version: 19.1.4(react@18.2.0) + version: 19.1.5(react@18.2.0) rimraf: specifier: ^6.0.1 version: 6.0.1 rollup: specifier: ^4.41.0 - version: 4.55.1 + version: 4.57.1 rollup-plugin-import-css: specifier: ^3.5.8 - version: 3.5.8(rollup@4.55.1) + version: 3.5.8(rollup@4.57.1) rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.55.1) + version: 2.2.4(rollup@4.57.1) rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) rollup-plugin-scss: specifier: ^4.0.1 version: 4.0.1 @@ -870,13 +870,13 @@ importers: version: 2.0.0 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.55.1)(typescript@5.8.3) + version: 0.36.0(rollup@4.57.1)(typescript@5.8.3) sass: specifier: ^1.89.0 - version: 1.97.2 + version: 1.97.3 sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.2)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) storybook: specifier: ^8.6.14 version: 8.6.15(prettier@3.5.3) @@ -912,7 +912,7 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) @@ -966,7 +966,7 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.27.0 + specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 @@ -1048,7 +1048,7 @@ importers: version: 1.2.3 prosemirror-markdown: specifier: ~1.13.2 - version: 1.13.2 + version: 1.13.3 prosemirror-model: specifier: ~1.25.4 version: 1.25.4 @@ -1121,7 +1121,7 @@ importers: version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) '@tanstack/query-core': specifier: ^5.77.1 - version: 5.90.17 + version: 5.90.20 '@tanstack/react-query': specifier: 5.77.1 version: 5.77.1(react@18.2.0) @@ -1266,7 +1266,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) eslint: specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) @@ -1278,7 +1278,7 @@ importers: version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.2)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -1369,7 +1369,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1378,7 +1378,7 @@ importers: version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1408,7 +1408,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -1417,10 +1417,10 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.4(react@18.2.0) + version: 19.1.5(react@18.2.0) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1487,7 +1487,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1496,7 +1496,7 @@ importers: version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1526,7 +1526,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -1535,10 +1535,10 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.4(react@18.2.0) + version: 19.1.5(react@18.2.0) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1568,7 +1568,7 @@ importers: version: 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@tanstack/query-core': specifier: ^5.77.1 - version: 5.90.17 + version: 5.90.20 '@tanstack/react-query': specifier: 5.77.1 version: 5.77.1(react@18.2.0) @@ -1619,7 +1619,7 @@ importers: version: 3.17.5 zustand: specifier: ^5.0.4 - version: 5.0.10(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) + version: 5.0.11(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) devDependencies: '@types/blueimp-md5': specifier: ^2.18.2 @@ -1647,7 +1647,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) eslint: specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) @@ -1732,13 +1732,13 @@ importers: version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) graphql: specifier: ^16.11.0 version: 16.12.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.9.4(webpack@5.104.1) + version: 2.10.0(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -1872,22 +1872,22 @@ importers: 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) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.1) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.26(eslint@8.57.1) + version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1984,7 +1984,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -2080,8 +2080,8 @@ importers: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.6.1) + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2139,7 +2139,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2154,19 +2154,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.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.6.1) + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.26.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) prettier: specifier: ~3.5.3 version: 3.5.3 @@ -2187,7 +2187,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0))(@types/react@17.0.90)(react@19.1.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 - version: 4.41.0 + version: 4.43.0 '@tanstack/react-query': specifier: 4.0.10 version: 4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2342,10 +2342,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.2)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -2466,7 +2466,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -2565,8 +2565,8 @@ importers: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.6.1) + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2603,10 +2603,10 @@ importers: version: 1.108.1 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@8.57.1)(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -2623,8 +2623,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -2773,7 +2773,7 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-loader: specifier: ~9.5.2 version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) @@ -2873,13 +2873,13 @@ importers: version: 1.57.5 autoprefixer: specifier: ^10.4.21 - version: 10.4.23(postcss@8.5.6) + version: 10.4.24(postcss@8.5.6) copyfiles: specifier: ~2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.104.1) @@ -2894,7 +2894,7 @@ importers: version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.2)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -3037,25 +3037,25 @@ importers: 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) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.52.0 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) eslint-plugin-react: specifier: ^7.33.1 - version: 7.37.5(eslint@8.57.1) + version: 7.37.5(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) + version: 4.6.2(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.26(eslint@8.57.1) + version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3128,7 +3128,7 @@ importers: version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': specifier: ^8.6.14 - version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.55.1)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2)) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.57.1)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -3143,25 +3143,25 @@ importers: 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) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) + version: 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) + version: 7.37.5(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.1) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.1)(typescript@5.8.3) + version: 0.8.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -3182,13 +3182,13 @@ importers: version: 5.8.3 vite: specifier: ^6.0.7 - version: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2) + version: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) ../../workspaces/mcp-inspector/mcp-inspector-extension: dependencies: '@modelcontextprotocol/inspector': specifier: ^0.17.2 - version: 0.17.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3) + version: 0.17.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3) devDependencies: '@types/mocha': specifier: ^10.0.3 @@ -3201,10 +3201,10 @@ importers: version: 1.108.1 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@8.57.1)(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3218,8 +3218,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.26.0 + version: 9.27.0(jiti@2.6.1) mocha: specifier: ^11.2.2 version: 11.7.5 @@ -3237,7 +3237,7 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 version: 5.1.4(webpack@5.104.1) @@ -3334,7 +3334,7 @@ importers: specifier: ^8.32.1 version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^9.27.0 + specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 @@ -3365,7 +3365,7 @@ importers: version: 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@tanstack/query-core': specifier: ^5.76.2 - version: 5.90.17 + version: 5.90.20 '@tanstack/react-query': specifier: 5.76.2 version: 5.76.2(react@18.2.0) @@ -3419,7 +3419,7 @@ importers: version: 3.17.5 zustand: specifier: ^5.0.5 - version: 5.0.10(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) + version: 5.0.11(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) devDependencies: '@types/blueimp-md5': specifier: ^2.18.2 @@ -3447,9 +3447,9 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) eslint: - specifier: ^9.27.0 + specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 @@ -3630,7 +3630,7 @@ importers: version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-webpack5': specifier: ^8.6.14 - version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/test': specifier: ^8.6.14 version: 8.6.15(storybook@8.6.15(prettier@3.5.3)) @@ -3642,7 +3642,7 @@ importers: version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/deep-equal': specifier: ~1.0.4 version: 1.0.4 @@ -3675,7 +3675,7 @@ importers: version: 3.0.0 jest: specifier: ^30.0.0 - version: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + version: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -3684,13 +3684,13 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.4(react@18.2.0) + version: 19.1.5(react@18.2.0) storybook: specifier: ^8.6.14 version: 8.6.15(prettier@3.5.3) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3711,7 +3711,7 @@ importers: dependencies: '@ai-sdk/anthropic': specifier: ^2.0.35 - version: 2.0.57(zod@3.25.76) + version: 2.0.58(zod@3.25.76) '@apidevtools/json-schema-ref-parser': specifier: 12.0.2 version: 12.0.2 @@ -3771,7 +3771,7 @@ importers: version: 0.5.16 ai: specifier: ^5.0.76 - version: 5.0.121(zod@3.25.76) + version: 5.0.124(zod@3.25.76) axios: specifier: ~1.12.0 version: 1.12.2 @@ -3785,8 +3785,8 @@ importers: specifier: ~16.5.0 version: 16.5.0 fast-xml-parser: - specifier: ~5.2.3 - version: 5.2.5 + specifier: 5.3.4 + version: 5.3.4 find-process: specifier: ~1.4.10 version: 1.4.11 @@ -3909,7 +3909,7 @@ importers: specifier: ^1.0.1 version: 1.0.1 eslint: - specifier: ^9.27.0 + specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) glob: specifier: ^11.0.2 @@ -3979,7 +3979,7 @@ importers: specifier: ^8.32.1 version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^9.27.0 + specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 @@ -4019,7 +4019,7 @@ importers: version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@tanstack/query-core': specifier: ^5.76.0 - version: 5.90.17 + version: 5.90.20 '@tanstack/react-query': specifier: 5.76.1 version: 5.76.1(react@18.2.0) @@ -4078,8 +4078,8 @@ importers: specifier: ~1.0.20 version: 1.0.20 fast-xml-parser: - specifier: ~5.2.3 - version: 5.2.5 + specifier: 5.3.4 + version: 5.3.4 lodash: specifier: 4.17.23 version: 4.17.23 @@ -4176,10 +4176,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.2)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -4214,7 +4214,7 @@ importers: specifier: ~22.15.21 version: 22.15.35 eslint: - specifier: ~9.27.0 + specifier: ^9.26.0 version: 9.27.0(jiti@2.6.1) jsonix: specifier: ~3.0.0 @@ -4249,7 +4249,7 @@ importers: version: 11.2.0 tsdx: specifier: ^0.14.1 - version: 0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35) + version: 0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35)(jiti@2.6.1) tslib: specifier: ^2.5.0 version: 2.8.1 @@ -4277,7 +4277,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.969.0 + version: 3.980.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -4340,7 +4340,7 @@ importers: version: 3.25.76 zustand: specifier: ^5.0.5 - version: 5.0.10(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) + version: 5.0.11(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) devDependencies: '@biomejs/biome': specifier: ^1.9.4 @@ -4389,7 +4389,7 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-loader: specifier: ~9.5.2 version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) @@ -4510,13 +4510,13 @@ importers: version: 1.57.5 autoprefixer: specifier: ^10.4.19 - version: 10.4.23(postcss@8.5.6) + version: 10.4.24(postcss@8.5.6) copyfiles: specifier: ~2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.104.1) + version: 7.1.3(webpack@5.104.1) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.104.1) @@ -4531,7 +4531,7 @@ importers: version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.2)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 version: 5.0.0(webpack@5.104.1) @@ -4562,32 +4562,32 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/amazon-bedrock@4.0.17': - resolution: {integrity: sha512-JLQ5uNY2DWFxGfX17+yZAvOvC9ABUCwpvAKc8WXSjdQHp66WNkv9/SgjvSPkYrawagZw6v1VjQTRUSJEnrxE1A==} + '@ai-sdk/amazon-bedrock@4.0.46': + resolution: {integrity: sha512-Hm6yeK8ABvh+TvIYnJzGO6IOVS0/xk96FbtWHSZ8d0MYuxVgbXmEEyC71E+RsxwXVI4RZr9VuoUSA78nz5VX8g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.57': - resolution: {integrity: sha512-DREpYqW2pylgaj69gZ+K8u92bo9DaMgFdictYnY+IwYeY3bawQ4zI7l/o1VkDsBDljAx8iYz5lPURwVZNu+Xpg==} + '@ai-sdk/anthropic@2.0.58': + resolution: {integrity: sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.13': - resolution: {integrity: sha512-62UqSpZWuR8pU2ZLc1IgPYiNdH01blAcaNEjrQtx4wCN7L2fUTXm/iG6Tq9qRCiRED+8eQ43olggbf0fbguqkA==} + '@ai-sdk/anthropic@3.0.35': + resolution: {integrity: sha512-Y3g/5uVj621XSB9lGF7WrD7qR+orhV5xpaYkRF8kfj2j4W7e7BBGIvxcdsCf85FjJbc6tKQdNTZ84ZEqT3Y5TQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.27': - resolution: {integrity: sha512-8hbezMsGa0crSt7/DKjkYL1UbbJJW/UFxTfhmf5qcIeYeeWG4dTNmm+DWbUdIsTaWvp59KC4eeC9gYXBbTHd7w==} + '@ai-sdk/gateway@2.0.30': + resolution: {integrity: sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.14': - resolution: {integrity: sha512-udVpkDaQ00jMcBvtGGvmkEBU31XidsHB4E8HIF9l7/H7lyjOS/EtXzN2adoupDg5j1/VjjSI3Ny5P1zHUvLyMA==} + '@ai-sdk/gateway@3.0.32': + resolution: {integrity: sha512-7clZRr07P9rpur39t1RrbIe7x8jmwnwUWI8tZs+BvAfX3NFgdSVGGIaT7bTz2pb08jmLXzTSDbrOTqAQ7uBkBQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4598,8 +4598,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.6': - resolution: {integrity: sha512-o/SP1GQOrpXAzHjMosPHI0Pu+YkwxIMndSjSLrEXtcVixdrjqrGaA9I7xJcWf+XpRFJ9byPHrKYnprwS+36gMg==} + '@ai-sdk/provider-utils@4.0.13': + resolution: {integrity: sha512-HHG72BN4d+OWTcq2NwTxOm/2qvk1duYsnhCDtsbYwn/h/4zeqURu1S0+Cn0nY2Ysq9a9HGKvrYuMn9bgFhR2Og==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4608,8 +4608,8 @@ packages: resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.3': - resolution: {integrity: sha512-qGPYdoAuECaUXPrrz0BPX1SacZQuJ6zky0aakxpW89QW1hrY0eF4gcFm/3L9Pk8C5Fwe+RvBf2z7ZjDhaPjnlg==} + '@ai-sdk/provider@3.0.7': + resolution: {integrity: sha512-VkPLrutM6VdA924/mG8OS+5frbVTcu6e046D2bgDo00tehBANR1QBJ/mPcZ9tXMFOsVcm6SQArOregxePzTFPw==} engines: {node: '>=18'} '@alloc/quick-lru@5.2.0': @@ -4655,131 +4655,131 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.969.0': - resolution: {integrity: sha512-dd19qt9wCY60AS0gc7K+C26U1SdtJddn8DkwHu3psCuGaZ8r9EAKbHTNC53iLsYD5OVGsZ5bkHKQ/BjjbSyVTQ==} + '@aws-sdk/client-s3@3.980.0': + resolution: {integrity: sha512-ch8QqKehyn1WOYbd8LyDbWjv84Z9OEj9qUxz8q3IOCU3ftAVkVR0wAuN96a1xCHnpOJcQZo3rOB08RlyKdkGxQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.969.0': - resolution: {integrity: sha512-Qn0Uz6o15q2S+1E6OpwRKmaAMoT4LktEn+Oibk28qb2Mne+emaDawhZXahOJb/wFw5lN2FEH7XoiSNenNNUmCw==} + '@aws-sdk/client-sso@3.980.0': + resolution: {integrity: sha512-AhNXQaJ46C1I+lQ+6Kj+L24il5K9lqqIanJd8lMszPmP7bLnmX0wTKK0dxywcvrLdij3zhWttjAKEBNgLtS8/A==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.969.0': - resolution: {integrity: sha512-qqmQt4z5rEK1OYVkVkboWgy/58CC5QaQ7oy0tvLe3iri/mfZbgJkA+pkwQyRP827DfCBZ3W7Ki9iwSa+B2U7uQ==} + '@aws-sdk/core@3.973.5': + resolution: {integrity: sha512-IMM7xGfLGW6lMvubsA4j6BHU5FPgGAxoQ/NA63KqNLMwTS+PeMBcx8DPHL12Vg6yqOZnqok9Mu4H2BdQyq7gSA==} engines: {node: '>=20.0.0'} - '@aws-sdk/crc64-nvme@3.969.0': - resolution: {integrity: sha512-IGNkP54HD3uuLnrPCYsv3ZD478UYq+9WwKrIVJ9Pdi3hxPg8562CH3ZHf8hEgfePN31P9Kj+Zu9kq2Qcjjt61A==} + '@aws-sdk/crc64-nvme@3.972.0': + resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.969.0': - resolution: {integrity: sha512-yS96heH5XDUqS3qQNcdObKKMOqZaivuNInMVRpRli48aXW8fX1M3fY67K/Onlqa3Wxu6WfDc3ZGF52SywdLvbg==} + '@aws-sdk/credential-provider-env@3.972.3': + resolution: {integrity: sha512-OBYNY4xQPq7Rx+oOhtyuyO0AQvdJSpXRg7JuPNBJH4a1XXIzJQl4UHQTPKZKwfJXmYLpv4+OkcFen4LYmDPd3g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.969.0': - resolution: {integrity: sha512-QCEFxBiUYFUW5VG6k8jKhT4luZndpC7uUY4u1olwt+OnJrl3N2yC7oS34isVBa3ioXZ4A0YagbXTa/3mXUhlAA==} + '@aws-sdk/credential-provider-http@3.972.5': + resolution: {integrity: sha512-GpvBgEmSZPvlDekd26Zi+XsI27Qz7y0utUx0g2fSTSiDzhnd1FSa1owuodxR0BcUKNL7U2cOVhhDxgZ4iSoPVg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.969.0': - resolution: {integrity: sha512-lsXyTDkUrZPxjr0XruZrqdcHY9zHcIuoY3TOCQEm23VTc8Np2BenTtjGAIexkL3ar69K4u3FVLQroLpmFxeXqA==} + '@aws-sdk/credential-provider-ini@3.972.3': + resolution: {integrity: sha512-rMQAIxstP7cLgYfsRGrGOlpyMl0l8JL2mcke3dsIPLWke05zKOFyR7yoJzWCsI/QiIxjRbxpvPiAeKEA6CoYkg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.969.0': - resolution: {integrity: sha512-bIRFDf54qIUFFLTZNYt40d6EseNeK9w80dHEs7BVEAWoS23c9+MSqkdg/LJBBK9Kgy01vRmjiedfBZN+jGypLw==} + '@aws-sdk/credential-provider-login@3.972.3': + resolution: {integrity: sha512-Gc3O91iVvA47kp2CLIXOwuo5ffo1cIpmmyIewcYjAcvurdFHQ8YdcBe1KHidnbbBO4/ZtywGBACsAX5vr3UdoA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.969.0': - resolution: {integrity: sha512-lImMjcy/5SGDIBk7PFJCqFO4rFuapKCvo1z2PidD3Cbz2D7wsJnyqUNQIp5Ix0Xc3/uAYG9zXI9kgaMf1dspIQ==} + '@aws-sdk/credential-provider-node@3.972.4': + resolution: {integrity: sha512-UwerdzosMSY7V5oIZm3NsMDZPv2aSVzSkZxYxIOWHBeKTZlUqW7XpHtJMZ4PZpJ+HMRhgP+MDGQx4THndgqJfQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.969.0': - resolution: {integrity: sha512-2qQkM0rwd8Hl9nIHtUaqT8Z/djrulovqx/wBHsbRKaISwc2fiT3De1Lk1jx34Jzrz/dTHAMJJi+cML1N4Lk3kw==} + '@aws-sdk/credential-provider-process@3.972.3': + resolution: {integrity: sha512-xkSY7zjRqeVc6TXK2xr3z1bTLm0wD8cj3lAkproRGaO4Ku7dPlKy843YKnHrUOUzOnMezdZ4xtmFc0eKIDTo2w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.969.0': - resolution: {integrity: sha512-JHqXw9Ct3dtZB86/zGFJYWyodr961GyIrqTBhV0brrZFPvcinM9abDSK58jt6GNBM2lqfMCvXL6I4ahNsMdkrg==} + '@aws-sdk/credential-provider-sso@3.972.3': + resolution: {integrity: sha512-8Ww3F5Ngk8dZ6JPL/V5LhCU1BwMfQd3tLdoEuzaewX8FdnT633tPr+KTHySz9FK7fFPcz5qG3R5edVEhWQD4AA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.969.0': - resolution: {integrity: sha512-mKCZtqrs3ts3YmIjT4NFlYgT2Oe6syW0nX5m2l7iyrFrLXw26Zo3rx29DjGzycPdJHZZvsIy5y6yqChDuF65ng==} + '@aws-sdk/credential-provider-web-identity@3.972.3': + resolution: {integrity: sha512-62VufdcH5rRfiRKZRcf1wVbbt/1jAntMj1+J0qAd+r5pQRg2t0/P9/Rz16B1o5/0Se9lVL506LRjrhIJAhYBfA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.969.0': - resolution: {integrity: sha512-MlbrlixtkTVhYhoasblKOkr7n2yydvUZjjxTnBhIuHmkyBS1619oGnTfq/uLeGYb4NYXdeQ5OYcqsRGvmWSuTw==} + '@aws-sdk/middleware-bucket-endpoint@3.972.3': + resolution: {integrity: sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.969.0': - resolution: {integrity: sha512-qXygzSi8osok7tH9oeuS3HoKw6jRfbvg5Me/X5RlHOvSSqQz8c5O9f3MjUApaCUSwbAU92KrbZWasw2PKiaVHg==} + '@aws-sdk/middleware-expect-continue@3.972.3': + resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.969.0': - resolution: {integrity: sha512-RKpo76qcHhQkSgu+wJNvwio8MzMD7ScwBaMCQhJfqzFTrhhlKtMkf8oxhBRRYU7rat368p35h6CbfxM18g/WNQ==} + '@aws-sdk/middleware-flexible-checksums@3.972.3': + resolution: {integrity: sha512-MkNGJ6qB9kpsLwL18kC/ZXppsJbftHVGCisqpEVbTQsum8CLYDX1Bmp/IvhRGNxsqCO2w9/4PwhDKBjG3Uvr4Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.969.0': - resolution: {integrity: sha512-AWa4rVsAfBR4xqm7pybQ8sUNJYnjyP/bJjfAw34qPuh3M9XrfGbAHG0aiAfQGrBnmS28jlO6Kz69o+c6PRw1dw==} + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.969.0': - resolution: {integrity: sha512-zH7pDfMLG/C4GWMOpvJEoYcSpj7XsNP9+irlgqwi667sUQ6doHQJ3yyDut3yiTk0maq1VgmriPFELyI9lrvH/g==} + '@aws-sdk/middleware-location-constraint@3.972.3': + resolution: {integrity: sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.969.0': - resolution: {integrity: sha512-xwrxfip7Y2iTtCMJ+iifN1E1XMOuhxIHY9DreMCvgdl4r7+48x2S1bCYPWH3eNY85/7CapBWdJ8cerpEl12sQQ==} + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.969.0': - resolution: {integrity: sha512-2r3PuNquU3CcS1Am4vn/KHFwLi8QFjMdA/R+CRDXT4AFO/0qxevF/YStW3gAKntQIgWgQV8ZdEtKAoJvLI4UWg==} + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.969.0': - resolution: {integrity: sha512-xjcyZrbtvVaqkmjkhmqX+16Wf7zFVS/cYnNFu/JyG6ekkIxSXEAjptNwSEDzlAiLzf0Hf6dYj5erLZYGa40eWg==} + '@aws-sdk/middleware-sdk-s3@3.972.5': + resolution: {integrity: sha512-3IgeIDiQ15tmMBFIdJ1cTy3A9rXHGo+b9p22V38vA3MozeMyVC8VmCYdDLA0iMWo4VHA9LDJTgCM0+xU3wjBOg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.969.0': - resolution: {integrity: sha512-9wUYtd5ye4exygKHyl02lPVHUoAFlxxXoqvlw7u2sycfkK6uHLlwdsPru3MkMwj47ZSZs+lkyP/sVKXVMhuaAg==} + '@aws-sdk/middleware-ssec@3.972.3': + resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.969.0': - resolution: {integrity: sha512-Y6WkW8QQ2X9jG9HNBWyzp5KlJOCtLqX8VIvGLoGc2wXdZH7dgOy62uFhkfnHbgfiel6fkNYaycjGx/yyxi0JLQ==} + '@aws-sdk/middleware-user-agent@3.972.5': + resolution: {integrity: sha512-TVZQ6PWPwQbahUI8V+Er+gS41ctIawcI/uMNmQtQ7RMcg3JYn6gyKAFKUb3HFYx2OjYlx1u11sETSwwEUxVHTg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.969.0': - resolution: {integrity: sha512-MJrejgODxVYZjQjSpPLJkVuxnbrue1x1R8+as3anT5V/wk9Qc/Pf5B1IFjM3Ak6uOtzuRYNY4auOvcg4U8twDA==} + '@aws-sdk/nested-clients@3.980.0': + resolution: {integrity: sha512-/dONY5xc5/CCKzOqHZCTidtAR4lJXWkGefXvTRKdSKMGaYbbKsxDckisd6GfnvPSLxWtvQzwgRGRutMRoYUApQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.969.0': - resolution: {integrity: sha512-scj9OXqKpcjJ4jsFLtqYWz3IaNvNOQTFFvEY8XMJXTv+3qF5I7/x9SJtKzTRJEBF3spjzBUYPtGFbs9sj4fisQ==} + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.969.0': - resolution: {integrity: sha512-pv8BEQOlUzK+ww8ZfXZOnDzLfPO5+O7puBFtU1fE8CdCAQ/RP/B1XY3hxzW9Xs0dax7graYKnY8wd8ooYy7vBw==} + '@aws-sdk/signature-v4-multi-region@3.980.0': + resolution: {integrity: sha512-tO2jBj+ZIVM0nEgi1SyxWtaYGpuAJdsrugmWcI3/U2MPWCYsrvKasUo0026NvJJao38wyUq9B8XTG8Xu53j/VA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.969.0': - resolution: {integrity: sha512-ucs6QczPkvGinbGmhMlPCQnagGJ+xsM6itsSWlJzxo9YsP6jR75cBU8pRdaM7nEbtCDnrUHf8W9g3D2Hd9mgVA==} + '@aws-sdk/token-providers@3.980.0': + resolution: {integrity: sha512-1nFileg1wAgDmieRoj9dOawgr2hhlh7xdvcH57b1NnqfPaVlcqVJyPc6k3TLDUFPY69eEwNxdGue/0wIz58vjA==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.969.0': - resolution: {integrity: sha512-7IIzM5TdiXn+VtgPdVLjmE6uUBUtnga0f4RiSEI1WW10RPuNvZ9U+pL3SwDiRDAdoGrOF9tSLJOFZmfuwYuVYQ==} + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.968.0': - resolution: {integrity: sha512-gqqvYcitIIM2K4lrDX9de9YvOfXBcVdxfT/iLnvHJd4YHvSXlt+gs+AsL4FfPCxG4IG9A+FyulP9Sb1MEA75vw==} + '@aws-sdk/util-arn-parser@3.972.2': + resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.969.0': - resolution: {integrity: sha512-H2x2UwYiA1pHg40jE+OCSc668W9GXRShTiCWy1UPKtZKREbQ63Mgd7NAj+bEMsZUSCdHywqmSsLqKM9IcqQ3Bg==} + '@aws-sdk/util-endpoints@3.980.0': + resolution: {integrity: sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.2': - resolution: {integrity: sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==} + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.969.0': - resolution: {integrity: sha512-bpJGjuKmFr0rA6UKUCmN8D19HQFMLXMx5hKBXqBlPFdalMhxJSjcxzX9DbQh0Fn6bJtxCguFmRGOBdQqNOt49g==} + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} - '@aws-sdk/util-user-agent-node@3.969.0': - resolution: {integrity: sha512-D11ZuXNXdUMv8XTthMx+LPzkYNQAeQ68FnCTGnFLgLpnR8hVTeZMBBKjQ77wYGzWDk/csHKdCy697gU1On5KjA==} + '@aws-sdk/util-user-agent-node@3.972.3': + resolution: {integrity: sha512-gqG+02/lXQtO0j3US6EVnxtwwoXQC5l2qkhLCrqUrqdtcQxV7FDMbm9wLjKqoronSHyELGTjbFKK/xV5q1bZNA==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -4787,8 +4787,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.969.0': - resolution: {integrity: sha512-BSe4Lx/qdRQQdX8cSSI7Et20vqBspzAjBy8ZmXVoyLkol3y4sXBXzn+BiLtR+oh60ExQn6o2DU4QjdOZbXaKIQ==} + '@aws-sdk/xml-builder@3.972.2': + resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.3': @@ -4833,24 +4833,24 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.28.0': - resolution: {integrity: sha512-dURPBeBrsg1ZzifxhZ8U3FKSA1yGc/tO4EnwiOTHm/bf98hN4MoRb1YyOa5tx+ymFAfhQIUgP+8jQ3RI+nP6Xw==} + '@azure/msal-browser@4.28.1': + resolution: {integrity: sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.14.0': - resolution: {integrity: sha512-aNuorSQxzsJQ6IUjJtN+rCInLfLOo3VpNYiXaHBK9XL8Ieg1y4F5ZFjI19GErbVvwqvwGNyJ9AZ/sAxOWhoSUw==} + '@azure/msal-common@15.14.1': + resolution: {integrity: sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.8.5': - resolution: {integrity: sha512-xRSAfH27bIp3vtjtTFyyhdm18lq2pzdoNG7DA2IH1fXzJ30mymryv0wK/Gph+x4y0Rx+5mMLU5JTPiCeQ75Aug==} + '@azure/msal-node@3.8.6': + resolution: {integrity: sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==} engines: {node: '>=16'} - '@babel/code-frame@7.28.6': - resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.6': - resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} '@babel/core@7.12.9': @@ -4861,8 +4861,8 @@ packages: resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.6': - resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + '@babel/generator@7.29.0': + resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -4895,8 +4895,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0-0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4965,8 +4965,8 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true @@ -5007,8 +5007,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-decorators@7.28.6': - resolution: {integrity: sha512-RVdFPPyY9fCRAX68haPmOk2iyKW8PKJFthmm8NeSI3paNxKWGZIn99+VbIf0FrtCpFnPgnpF/L48tadi617ULg==} + '@babel/plugin-proposal-decorators@7.29.0': + resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5203,8 +5203,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.6': - resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5269,8 +5269,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': - resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5347,8 +5347,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5359,8 +5359,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5455,8 +5455,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.6': - resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5574,8 +5574,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.28.6': - resolution: {integrity: sha512-kz2fAQ5UzjV7X7D3ySxmj3vRq89dTpqOZWv76Z6pNPztkwb/0Yj1Mtx1xFrYj6mbIHysxtBot8J4o0JLCblcFw==} + '@babel/runtime-corejs3@7.29.0': + resolution: {integrity: sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==} engines: {node: '>=6.9.0'} '@babel/runtime@7.28.6': @@ -5586,12 +5586,12 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.6': - resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.1': @@ -5797,9 +5797,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.25': - resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.0.26': + resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -6089,10 +6088,6 @@ packages: 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} @@ -6101,22 +6096,10 @@ packages: resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.3.3': resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@9.26.0': - resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.27.0': resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6132,14 +6115,14 @@ packages: '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - '@floating-ui/core@1.7.3': - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} - '@floating-ui/react-dom@2.1.6': - resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -6255,19 +6238,10 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -6532,44 +6506,128 @@ packages: peerDependencies: tslib: '2' + '@jsonjoy.com/base64@17.65.0': + resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/buffers@1.2.1': resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/buffers@17.65.0': + resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/codegen@1.0.0': resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/codegen@17.65.0': + resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.56.10': + resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.56.10': + resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.56.10': + resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.56.10': + resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.56.10': + resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.56.10': + resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.56.10': + resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.56.10': + resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/json-pack@1.21.0': resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/json-pack@17.65.0': + resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/json-pointer@1.0.2': resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/json-pointer@17.65.0': + resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/util@1.9.0': resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/util@17.65.0': + resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@keyv/bigmap@1.3.0': - resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} peerDependencies: - keyv: ^5.5.4 + keyv: ^5.6.0 '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} @@ -6675,8 +6733,8 @@ packages: '@lezer/json@1.0.3': resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - '@lezer/lr@1.4.7': - resolution: {integrity: sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q==} + '@lezer/lr@1.4.8': + resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} '@lezer/markdown@1.6.3': resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==} @@ -6696,8 +6754,8 @@ packages: '@lezer/xml@1.0.6': resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} - '@lezer/yaml@1.0.3': - resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + '@lezer/yaml@1.0.4': + resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} @@ -6801,8 +6859,8 @@ packages: engines: {node: '>=22.7.5'} hasBin: true - '@modelcontextprotocol/sdk@1.25.2': - resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} + '@modelcontextprotocol/sdk@1.25.3': + resolution: {integrity: sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -6918,86 +6976,86 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@parcel/watcher-android-arm64@2.5.4': - resolution: {integrity: sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.4': - resolution: {integrity: sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.4': - resolution: {integrity: sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.4': - resolution: {integrity: sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.4': - resolution: {integrity: sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.4': - resolution: {integrity: sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.4': - resolution: {integrity: sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.4': - resolution: {integrity: sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.4': - resolution: {integrity: sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.4': - resolution: {integrity: sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.4': - resolution: {integrity: sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.4': - resolution: {integrity: sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.4': - resolution: {integrity: sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.4': - resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} '@peculiar/asn1-cms@2.6.0': @@ -8076,128 +8134,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.55.1': - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.55.1': - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.1': - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.55.1': - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.55.1': - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.55.1': - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.55.1': - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.55.1': - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.55.1': - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.55.1': - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.55.1': - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.55.1': - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.55.1': - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] @@ -8276,8 +8334,8 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.34.47': - resolution: {integrity: sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==} + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} @@ -8340,8 +8398,8 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.20.5': - resolution: {integrity: sha512-0Tz77Td8ynHaowXfOdrD0F1IH4tgWGUhwmLwmpFyTbr+U9WHXNNp9u/k2VjBXGnSe7BwjBERRpXsokGTXzNjhA==} + '@smithy/core@3.22.0': + resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.8': @@ -8404,12 +8462,12 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.6': - resolution: {integrity: sha512-dpq3bHqbEOBqGBjRVHVFP3eUSPpX0BYtg1D5d5Irgk6orGGAuZfY22rC4sErhg+ZfY/Y0kPqm1XpAmDZg7DeuA==} + '@smithy/middleware-endpoint@4.4.12': + resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.22': - resolution: {integrity: sha512-vwWDMaObSMjw6WCC/3Ae9G7uul5Sk95jr07CDk1gkIMpaDic0phPS1MpVAZ6+YkF7PAzRlpsDjxPwRlh/S11FQ==} + '@smithy/middleware-retry@4.4.29': + resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -8456,8 +8514,8 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.7': - resolution: {integrity: sha512-Uznt0I9z3os3Z+8pbXrOSCTXCA6vrjyN7Ub+8l2pRDum44vLv8qw0qGVkJN0/tZBZotaEFHrDPKUoPNueTr5Vg==} + '@smithy/smithy-client@4.11.1': + resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -8492,12 +8550,12 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.21': - resolution: {integrity: sha512-DtmVJarzqtjghtGjCw/PFJolcJkP7GkZgy+hWTAN3YLXNH+IC82uMoMhFoC3ZtIz5mOgCm5+hOGi1wfhVYgrxw==} + '@smithy/util-defaults-mode-browser@4.3.28': + resolution: {integrity: sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.24': - resolution: {integrity: sha512-JelBDKPAVswVY666rezBvY6b0nF/v9TXjUbNwDNAyme7qqKYEX687wJv0uze8lBIZVbg30wlWnlYfVSjjpKYFA==} + '@smithy/util-defaults-mode-node@4.2.31': + resolution: {integrity: sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -9512,104 +9570,104 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@swagger-api/apidom-ast@1.2.0': - resolution: {integrity: sha512-euK4S0OEXLQIiWzYOJ2zQDItjFnVZdxRDMNUqw7aJ1PjC+m0QyZSolBZyuMQ+8Mzo7lUw7TgfxNOIqMzlGps7Q==} + '@swagger-api/apidom-ast@1.3.0': + resolution: {integrity: sha512-CfaqcwdkWoJ8RAmmhp3fJVz+weyZ5ByKtGSlBgAlUMhfuo6qOsNIMYbSDiPZilUEbR3aXMdtqqXCpgOgZ6dMjg==} - '@swagger-api/apidom-core@1.2.0': - resolution: {integrity: sha512-coGZ3rNKDVNQjxOsX+3BH8IYGy0+4sV3XNP5dkAN/uMGNP4NouoG2m2/nLx1YggIPdiY03+TpFSQwvK7BMjmmQ==} + '@swagger-api/apidom-core@1.3.0': + resolution: {integrity: sha512-xm98bBpZbaqzsednoVZ51itqby3jVZdHZSOqtucGVixcI+1mXzkUMSOrgyw/XIFeXJUevCBx56v5ihSxAdM8+w==} - '@swagger-api/apidom-error@1.2.0': - resolution: {integrity: sha512-QuH5kqPi4UlswNJcfP3KuA2CvhGpQVYxWUcZC+RllcBkpBon+6fAdCl5MmElujuAAd2FtKHluzAHuMohCmJQqA==} + '@swagger-api/apidom-error@1.3.0': + resolution: {integrity: sha512-UX+2W4+kpK53666CxapjnNZyFse5nRO4fVltcFdaqWtUKcsQVoryxlcpmZJA7R/c7djROc3FesoawjAArdZYlw==} - '@swagger-api/apidom-json-pointer@1.2.0': - resolution: {integrity: sha512-0TJM2rQD3EG9JY9Mq/mGJDam/9EAW2R9qd4HaV3JMu0MvjG1hPdeOcZqbjmW6Dl02kZUjXCoywI13Jv4WaGfKw==} + '@swagger-api/apidom-json-pointer@1.3.0': + resolution: {integrity: sha512-yj2ViZkBla11sRcfxzmXJjv9LSXjYVuHsMy1nqjzWeHHMHsEedVIu9PUWT7QWqTAWXsNEt5BBOU/pY5L1dLkOw==} - '@swagger-api/apidom-ns-api-design-systems@1.2.0': - resolution: {integrity: sha512-EKU+TcShPfKcbmIqgJmCGgp+uewWNZmFdeco1viJHTHn2wr5QUD1VJ4FwYIdzGw4Xg6TXDXGpuupHVYvkTAqnA==} + '@swagger-api/apidom-ns-api-design-systems@1.3.0': + resolution: {integrity: sha512-iNPagRcxfDn9mdpfm6SXMDZjcKfV/LfTokRfp3uPlDD0DKzrJn66me8E1De3uOy7veK8NGsniR7j0GbNg6mMCg==} - '@swagger-api/apidom-ns-arazzo-1@1.2.0': - resolution: {integrity: sha512-zTH0QOTIFh/jIrjZZ+YjIG94AoidxzgMEMRtViAa10X8iXQq4Dbzr/pogy92+6ulZIPmLDPlT62naqbp+Zba5A==} + '@swagger-api/apidom-ns-arazzo-1@1.3.0': + resolution: {integrity: sha512-9xgNd6smc46HZxFdnfWTvogFgVusaDl4/XQI2b/cK2i1M2+nxSD8akJaf9Fdjz982YBAsVkagUzl4VBTVdgZZA==} - '@swagger-api/apidom-ns-asyncapi-2@1.2.0': - resolution: {integrity: sha512-/7VvP07OFq92ajNyFIt84VIsQf0kkSE/DiSU82FytkmbtoM7XBnaXQgTBg5CP/Z5TksRopFQzzuM+IJ1eTNkHg==} + '@swagger-api/apidom-ns-asyncapi-2@1.3.0': + resolution: {integrity: sha512-gUYMHXh8CQZSIwhLf0IyLF2vApLilr/tmtHDs/rwxN7ZTA+k3jALVZ/EfP4Oq7TcsfHe4lw4vIkS0vAGRUhq4g==} - '@swagger-api/apidom-ns-asyncapi-3@1.2.0': - resolution: {integrity: sha512-BDi1zE1XV2PWGjSrr5d4jXS7ekI1SBY0koViDJviig1eUNJm+My3qpWTYyQfZd2r8B44BjwSdRsVmW9g6dg9Rw==} + '@swagger-api/apidom-ns-asyncapi-3@1.3.0': + resolution: {integrity: sha512-A5ZB2N++Kd9sfP7sxQq4wIuVOTh4ZuLAmOYvfqgefMHE8SLZfxDYIIERs7p20NhlsxedWVj9kBNW2aIs4cIIpQ==} - '@swagger-api/apidom-ns-json-schema-2019-09@1.2.0': - resolution: {integrity: sha512-CZYOIXeaX8zG+tuZKeg/urYug8cxTlGPVkLyrvekInOp63KvkLAVIm+AknO1mwGEKLq8L/IQNhwRj0VEdvqZDw==} + '@swagger-api/apidom-ns-json-schema-2019-09@1.3.0': + resolution: {integrity: sha512-ZWKwv5XGsOmrfKPAl+YdbVFi+WjiGhAe4JjPdwpBmIYtzk/QrfmUKcpJPuNGrEphwYxkM1dzI53kkZ7eZvyFRQ==} - '@swagger-api/apidom-ns-json-schema-2020-12@1.2.0': - resolution: {integrity: sha512-+12NtUzK4bmvgw6W9S2aGo9UWyjFP/JnsKsmOO0cEqeeZEnTAfKL6WWxdOxInFX3Fh5TZud2DpLFrZJL+SGRfg==} + '@swagger-api/apidom-ns-json-schema-2020-12@1.3.0': + resolution: {integrity: sha512-Wayw8aPAOT/oYy4gMx5pyIgVOQrQg3p6XH6lxjGo63ODEmVJDrk5aj1XCoLMxwPXrECQI33jYxnqpG0ej2xsNQ==} - '@swagger-api/apidom-ns-json-schema-draft-4@1.2.0': - resolution: {integrity: sha512-7LhU7XUuHDzvFYv280GskxDp95zjmZlkVvzln6M+7jjeusxqqQpKqNDN9+mEQlPXHOpgz5ybH8rm52Vi+jHhCA==} + '@swagger-api/apidom-ns-json-schema-draft-4@1.3.0': + resolution: {integrity: sha512-55Ua8EuNRRLKj6zRw38GruRUmfdlyGSfM/rXyWdCHMh59IXXdRnNERYmXIcMUhU45opTeEr53hCORRFcVnMTow==} - '@swagger-api/apidom-ns-json-schema-draft-6@1.2.0': - resolution: {integrity: sha512-0aLZQmkaAjI/eSuOB9p+yzSK6CuZljwkHFxlCHZjnKKr5/lGG79fICkSlqdl7trhQMP/T0eH3xOPKoqcAb9wlA==} + '@swagger-api/apidom-ns-json-schema-draft-6@1.3.0': + resolution: {integrity: sha512-ZC6RBv5GQMy5Dcq6aFKt9SkEXMagRPMDstkWc80MKeO7L3i5MRyGiTeo3lN2euDZGwofdEHRcO1jpzJbPUpU5A==} - '@swagger-api/apidom-ns-json-schema-draft-7@1.2.0': - resolution: {integrity: sha512-7h5HZULf2Wv5w+2s96AGr5C4EJKu8Y6Lvkkjpuc9jPnYP13f5y5H7gfbo8JdyDzGM3pyWMIki4WETcELUXioaQ==} + '@swagger-api/apidom-ns-json-schema-draft-7@1.3.0': + resolution: {integrity: sha512-DLEjKKz9y7ht4iat8HeN2o9bHo84iSxKPS1cPmJMq5BavSN3yDYDqPks8Vni+LZI9SeWpzrPA1s9FbgqmDjCEQ==} - '@swagger-api/apidom-ns-openapi-2@1.2.0': - resolution: {integrity: sha512-iSwpwN9LkAHDlcQz9m44lSm8QYmsRoGcgjPbOUq1uNdq/Gi+bJ2X0figcXEPDs2FtUrL8dd5J4Iv6kQXBTvByg==} + '@swagger-api/apidom-ns-openapi-2@1.3.0': + resolution: {integrity: sha512-aRx8PBOQ2Xc3+fkJ6asODjuJk/0/uECrLc1b4X5T2m3eJk1/YGjAjZHcSBYO/isRSLcRgzgqCZG6iFn3mtHakw==} - '@swagger-api/apidom-ns-openapi-3-0@1.2.0': - resolution: {integrity: sha512-MdM8qBb2jVQ2RQ2Zvapa0VRlSOl5BvIWdZzjcVX10T5UzZBM++d5OqoNvSNH1sNrxoYmV/n12X4z4StISqjfVQ==} + '@swagger-api/apidom-ns-openapi-3-0@1.3.0': + resolution: {integrity: sha512-H9l72st2q8mUOVVftoexIDNJPD6jz6wxfVkJWcrPYsHcnpMdWDKeHxqMZAsoZozAZxM1hMG3p40BzPi/8ZBJhQ==} - '@swagger-api/apidom-ns-openapi-3-1@1.2.0': - resolution: {integrity: sha512-nL/u4ooFyEEJEi28w2ZU0XpW+m2NycyHW88d6nGiToh5jOswmS2DYodxoV/rxaYNJvp5POaZe55OhDr+tEmtiA==} + '@swagger-api/apidom-ns-openapi-3-1@1.3.0': + resolution: {integrity: sha512-g9Wzq4Wv7P1tYf1Eo1AQjXwQWjCt47QUOzrIsPDvd6J0BFbNkAZRns1xSwhh9wblFOmAqBioRTcurlMWibR4lQ==} - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.2.0': - resolution: {integrity: sha512-81SqBdhsJ1+P5u3mey96q0wLOBwItpfnhp6wNJJuQhK3udJ0cEgHLe7iKh0BUGsRdhmCGzqgWyogs9GnsdvASQ==} + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.3.0': + resolution: {integrity: sha512-ICxejvaXXujP0igfZ3Ielf9/FxBe+lbAlROU/NIYt2eJUWpG7TnG/RzDKuqv2OIgosWm6iqhe5EIZwptCjMpMA==} - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.2.0': - resolution: {integrity: sha512-esU/sFHlS3d4g3wkWa1k8D28QL3QG/KMTZbOjc+sWPOYY2KyG92IklRFo3FshBRDhfN/znYb3jAYQXcPSh/VSQ==} + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.3.0': + resolution: {integrity: sha512-wysRnFKThjD/BfVXDxrXH8HtGe0dyjwKyH6WUltE97MyY3NqJjICCEJxfjWlp1DpH4p8ngYM8S6GYDqKlFBLuQ==} - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.2.0': - resolution: {integrity: sha512-B06arRC0SdJRGUMTn2/zcYoFEof4/Q6t9sbd0I3VMhoE0ZqF7/cE1YtquBqBZ6pWOGzTth/rTpDK95s0rJXPmA==} + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.3.0': + resolution: {integrity: sha512-S1RR3Ma7h98PQt6gnxi63Ya/826FPIcoa5uJqYBV4y4xO0OId0BWq9JkmKBxxhmrmlmZr+Ztxa7EaGtpvUZ/nA==} - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.2.0': - resolution: {integrity: sha512-M1PkY1vDxtcU0nx6KgM1xnNZLvFlTljyXI1ZVbeHcn+MTad+K/+rB2XOM/55ZXxzChtETXPWIEkQ3lqFdVKUug==} + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.3.0': + resolution: {integrity: sha512-MLpTLMyFgp2BpIpMB5vPf2riW4CsqW5oKL7SuYAkwmpM8GnFxG1x6+4T1YHaZrRjj6l4/6JFpPx+gjJP293OOw==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.2.0': - resolution: {integrity: sha512-j6wyBmVKXyzH4A8PuDUZM2rorRUwrXxo0eP77tH+4YmrUlpc+QC+DXXuQPDKtcqM7oRuREF6dncmU7RTD98X7w==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.3.0': + resolution: {integrity: sha512-JIFDUmEsTkEneRdeBhSsHSaPd8/F8hkeSp9ePAvWbruI40iCC8gQLbiVs1SgEtaMjU/SNEl2X1yVJqYNKfwWHw==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.2.0': - resolution: {integrity: sha512-IDkkXrdViX0FJHzjL7XQCgJ1XNsZAg9ZnUg9Ly/HgnqCHCJyDAR5iCUEsg6i39EBlTtEqvDwxhISADm25DNn5A==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.3.0': + resolution: {integrity: sha512-MYXkj2VJcp7b0wT5rzJDseNkWr8KzjmlxD9yWj9T+RDG76BmZBQSU0Xb1HDmW9TBk3vEWNrNfY7hk/8iD7QbTA==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.2.0': - resolution: {integrity: sha512-OkY/NYkuDJY+7kQ3wc/mkeiw6IJgiMbmkzVlcS+oXHVC46qUXXWMsnTxX88hPityDkeEIMsO54l1f3+5g/8crQ==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.3.0': + resolution: {integrity: sha512-jGg0JF9Y5K7hpRS0Bghl/iJcy14fUye8rMzM62aZlUm6pla/Gc3oIX/UF3WS9mPCTMtY0KLMhExFPs4VgPW7iA==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.2.0': - resolution: {integrity: sha512-VPcIi5ZtBlQSRRHLFeywiXvz5Vjv4sA3CfSRDEBy9H3pcwesgF2DbbepTW5MeAHu6ahk3D05wYeQf7WIteAXEg==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.3.0': + resolution: {integrity: sha512-/xLKCYbjy3pTIIIbviFs3Zbud8BAS4OU8NhERYf2uoubfzCbxjJge0XyoiwSue0u7cGcponFOZtvxuFIwIRoMg==} - '@swagger-api/apidom-parser-adapter-json@1.2.0': - resolution: {integrity: sha512-PU6gSich4Upmd+BfGffUXZWyvGqhgSwFSD/6QT/zTKC6n5DDEBrFmhZK7KW7gk/ITmj7hHVHRYMPu0nBx8t8cQ==} + '@swagger-api/apidom-parser-adapter-json@1.3.0': + resolution: {integrity: sha512-tAJ2sKfv5nPDYHXaoXMPE+yBoNF7ribMlMCx5raw9u1CC76wTC65uG1VvmL6DdqlDuyD3hxdlOSMIXLQ3/CLaQ==} - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.2.0': - resolution: {integrity: sha512-Cay3Ew7HEpculSV1NiCZ52kVzc04zOpCI9dl+MQagk8/Uw6pN3fslHkcJPn0jZHuo5iz3L+kB9Xxug6XL/06ag==} + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.3.0': + resolution: {integrity: sha512-ncfY8UThDhYA/CfsogLLVeUtUWvQJ0UIN2BKxyfIRkExPSFxinOZRo4rLlice6cpEVuQUh0BWVlwC0x3+sd58w==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.2.0': - resolution: {integrity: sha512-lBbbYAXg9D+xecg0PlajoTbFGAurB6rnEVFImbZXgnyO/NlEV8IySnBn40mH7s7yvVsoyo68cWSxT2t3Ev9BPg==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.3.0': + resolution: {integrity: sha512-Oy29Pw7F5BLjhmCVUHsjcQizbnNBYj1Hm0nc/XWlu7D/V2lutaLUGE7Z7fankvC5chVhnuOdOOpiY23w/616XQ==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.2.0': - resolution: {integrity: sha512-ifxdUc5UdjMzc6nQojSUqpwGiok4IrH7wld76Rnmb0lToZBMPO0WN4q/IUwIkzx2v8P+GWESpzaCtC0irfyHfA==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.3.0': + resolution: {integrity: sha512-NIhIQ+l4adbbXuawZ1VGw5iesBCfFDosd2cxU+H+Q4iEazKm+IXF/gxKEWWJCsw5s9umzt1+oCwzLutSufz4lA==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.2.0': - resolution: {integrity: sha512-TsVTVb7jpR2TWOHF/qyiyx9a9zlDumqiU0VRuQ6cZRvmZ+uZ6HCp3n50jFIE29XRqMQbMSbjpfjjgci35JXYcA==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.3.0': + resolution: {integrity: sha512-tmNaZaVEgDuHOray+xV23rD88bvQtDp0k+9uiUhg4Xl/DtA451r47ai/wEduEXmjCSCe+dpdCnR17nhe2FD+CA==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.2.0': - resolution: {integrity: sha512-ziACRJl5Fgc8XZgjll9QQgdRGCFTcBKPfCxIPMJGDrHgtxQHHxUCXD9Unq8lMy4Jsr2VlfUt8gafPJf3n5VfDg==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.3.0': + resolution: {integrity: sha512-I1BTjMo8HODyeIbwE9ZG7uyc5yfPCL3QvkBGi8N+er26POTBTN/g+n+/IovtT7XlymKSrfnOnTtqCxEBA5+X8g==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.2.0': - resolution: {integrity: sha512-SZXJ6l2/0Q2Reo68CCUm+JGETeZAbYcMmYEuIybNgoFuW591quBB2yIa+TFlTWCe0+tTvoNrzH804voRI14ibA==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.3.0': + resolution: {integrity: sha512-ZaPsg7yH/2p/kp2VrwAxOQEVsNe57zN5h8vOQAfikLQ2Qpek/B77Y99wnPIl2YscuFKPdn3Vw+tcEGbHe9wmhw==} - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.2.0': - resolution: {integrity: sha512-ql885WO9QOBnMAskeJcprhif/jsG5nlUE1PpcxRUofOjsO4i8nM4cqna9XoQbo9TfxYdQs18epNqPjwageJ61w==} + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.3.0': + resolution: {integrity: sha512-iGTkPgLQ/gT9jodwierviRbqAQzU8odHNXS8/XG6UbiOALOpbXyd1KhInXNGy54EMFHa3BgvIXNswBGhTRGIzw==} - '@swagger-api/apidom-reference@1.2.0': - resolution: {integrity: sha512-Bg/roKeVATnIHLowUvCK1zFhyA0M9K86+ltPhX2wvu1dNP9Axca3yoY1003gxyGjxrmu0RUmZtFKrCOKFc+ZvA==} + '@swagger-api/apidom-reference@1.3.0': + resolution: {integrity: sha512-SnSOWLX+dCBJvs6oeNy2BmO1PBpW1x+jQupfETE323tEjf9uemxFo0/gj0hiNB/IAKHRqXQtsYlGM6ciSgyIWw==} '@swaggerexpert/cookie@2.0.2': resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} @@ -9619,68 +9677,68 @@ packages: resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} engines: {node: '>=12.20.0'} - '@swc/core-darwin-arm64@1.15.8': - resolution: {integrity: sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==} + '@swc/core-darwin-arm64@1.15.11': + resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.8': - resolution: {integrity: sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==} + '@swc/core-darwin-x64@1.15.11': + resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.8': - resolution: {integrity: sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==} + '@swc/core-linux-arm-gnueabihf@1.15.11': + resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.8': - resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==} + '@swc/core-linux-arm64-gnu@1.15.11': + resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.8': - resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} + '@swc/core-linux-arm64-musl@1.15.11': + resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.8': - resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} + '@swc/core-linux-x64-gnu@1.15.11': + resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.8': - resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} + '@swc/core-linux-x64-musl@1.15.11': + resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.8': - resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==} + '@swc/core-win32-arm64-msvc@1.15.11': + resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.8': - resolution: {integrity: sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==} + '@swc/core-win32-ia32-msvc@1.15.11': + resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.8': - resolution: {integrity: sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==} + '@swc/core-win32-x64-msvc@1.15.11': + resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.8': - resolution: {integrity: sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==} + '@swc/core@1.15.11': + resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -9704,8 +9762,8 @@ packages: '@tanstack/query-core@4.27.0': resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} - '@tanstack/query-core@4.41.0': - resolution: {integrity: sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==} + '@tanstack/query-core@4.43.0': + resolution: {integrity: sha512-m1QeUUIpNXDYxmfuuWNFZLky0EwVmbE0hj8ulZ2nIGA1183raJgDCn0IKlxug80NotRqzodxAaoYTKHbE1/P/Q==} '@tanstack/query-core@5.76.0': resolution: {integrity: sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==} @@ -9716,8 +9774,8 @@ packages: '@tanstack/query-core@5.77.1': resolution: {integrity: sha512-nfxVhy4UynChMFfN4NxwI8pktV9R3Zt/ROxOAe6pdOf8CigDLn26p+ex1YW5uien26BBICLmN0dTvIELHCs5vw==} - '@tanstack/query-core@5.90.17': - resolution: {integrity: sha512-hDww+RyyYhjhUfoYQ4es6pbgxY7LNiPWxt4l1nJqhByjndxJ7HIjDxTBtfvMr5HwjYavMrd+ids5g4Rfev3lVQ==} + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} '@tanstack/query-persist-client-core@4.27.0': resolution: {integrity: sha512-A+dPA7zG0MJOMDeBc/2WcKXW4wV2JMkeBVydobPW9G02M4q0yAj7vI+7SmM2dFuXyIvxXp4KulCywN6abRKDSQ==} @@ -9791,8 +9849,8 @@ packages: resolution: {integrity: sha512-xDXgLjVunjHqczScfkCJ9iyjdNOVHvvCdqHSSxwM9L0l/wHkTRum67SDc020uAlCoqktJplgO2AAQeLP1wgqDQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.3.1': - resolution: {integrity: sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==} + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -9812,20 +9870,20 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@textlint/ast-node-types@15.5.0': - resolution: {integrity: sha512-K0LEuuTo4rza8yDrlYkRdXLao8Iz/QBMsQdIxRrOOrLYb4HAtZaypZ78c+J6rDA1UlGxadZVLmkkiv4KV5fMKQ==} + '@textlint/ast-node-types@15.5.1': + resolution: {integrity: sha512-2ABQSaQoM9u9fycXLJKcCv4XQulJWTUSwjo6F0i/ujjqOH8/AZ2A0RDKKbAddqxDhuabVB20lYoEsZZgzehccg==} - '@textlint/linter-formatter@15.5.0': - resolution: {integrity: sha512-DPTm2+VXKID41qKQWagg/4JynM6hEEpvbq0PlGsEoC4Xm7IqXIxFym3mSf5+ued0cuiIV1hR9kgXjqGdP035tw==} + '@textlint/linter-formatter@15.5.1': + resolution: {integrity: sha512-7wfzpcQtk7TZ3UJO2deTI71mJCm4VvPGUmSwE4iuH6FoaxpdWpwSBiMLcZtjYrt/oIFOtNz0uf5rI+xJiHTFww==} - '@textlint/module-interop@15.5.0': - resolution: {integrity: sha512-rqfouEhBEgZlR9umswWXXRBcmmSM28Trpr9b0duzgehKYVc7wSQCuQMagr6YBJa2NRMfRNinupusbJXMg0ij2A==} + '@textlint/module-interop@15.5.1': + resolution: {integrity: sha512-Y1jcFGCKNSmHxwsLO3mshOfLYX4Wavq2+w5BG6x5lGgZv0XrF1xxURRhbnhns4LzCu0fAcx6W+3V8/1bkyTZCw==} - '@textlint/resolver@15.5.0': - resolution: {integrity: sha512-kK5nFbg5N3kVoZExQI/dnYjCInmTltvXDnuCRrBxHI01i6kO/o8R7Lc2aFkAZ6/NUZuRPalkyDdwZJke4/R2wg==} + '@textlint/resolver@15.5.1': + resolution: {integrity: sha512-CVHxMIm8iNGccqM12CQ/ycvh+HjJId4RyC6as5ynCcp2E1Uy1TCe0jBWOpmLsbT4Nx15Ke29BmspyByawuIRyA==} - '@textlint/types@15.5.0': - resolution: {integrity: sha512-EjAPbuA+3NyQ9WyFP7iUlddi35F3mGrf4tb4cZM0nWywbtEJ3+XAYqL+5RsF0qFeSguxGir09NdZOWrG9wVOUQ==} + '@textlint/types@15.5.1': + resolution: {integrity: sha512-IY1OVZZk8LOOrbapYCsaeH7XSJT89HVukixDT8CoiWMrKGCTCZ3/Kzoa3DtMMbY8jtY777QmPOVCNnR+8fF6YQ==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -10010,8 +10068,8 @@ packages: '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -10131,8 +10189,8 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@20.19.29': - resolution: {integrity: sha512-YrT9ArrGaHForBaCNwFjoqJWmn8G1Pr7+BH/vwyLHciA9qT/wSiuOhxGCT50JA5xLvFBd6PIiGkE3afxcPE1nw==} + '@types/node@20.19.30': + resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -11180,14 +11238,14 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@5.0.121: - resolution: {integrity: sha512-3iYPdARKGLryC/7OA9RgBUaym1gynvWS7UPy8NwoRNCKP52lshldtHB5xcEfVviw7liWH2zJlW9yEzsDglcIEQ==} + ai@5.0.124: + resolution: {integrity: sha512-Li6Jw9F9qsvFJXZPBfxj38ddP2iURCnMs96f9Q3OeQzrDVcl1hvtwSEAuxA/qmfh6SDV2ERqFUOFzigvr0697g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - ai@6.0.35: - resolution: {integrity: sha512-MxgtU6CjnegH1rhRfomM0gptKxP6r+9sxbLvYq36C1l85+o0LacqbXLdNVYzqab+lHN4q7ZP3QS8wZq4YkZahA==} + ai@6.0.67: + resolution: {integrity: sha512-xBnTcByHCj3OcG6V8G1s6zvSEqK0Bdiu+IEXYcpGrve1iGFFRgcrKeZtr/WAW/7gupnSvBbDF24BEv1OOfqi1g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -11577,8 +11635,8 @@ packages: autolinker@3.16.2: resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} - autoprefixer@10.4.23: - resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} + autoprefixer@10.4.24: + resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -11810,8 +11868,8 @@ packages: babel-plugin-named-exports-order@0.0.2: resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -11830,8 +11888,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -12060,8 +12118,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.2: - resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} + bare-fs@4.5.3: + resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -12096,8 +12154,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.14: - resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true basic-auth@2.0.1: @@ -12345,8 +12403,8 @@ packages: resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} engines: {node: '>=18'} - cacheable@2.3.1: - resolution: {integrity: sha512-yr+FSHWn1ZUou5LkULX/S+jhfgfnLbuKQjE40tyEd4fxGZVMbBL5ifno0J0OauykS8UiCSgHi+DV/YD+rjFxFg==} + cacheable@2.3.2: + resolution: {integrity: sha512-w+ZuRNmex9c1TR9RcsxbfTKCjSL0rh1WA5SABbrWprIHeNBdmyQLSYonlDy9gpD+63XT8DgZ/wNh1Smvc9WnJA==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -12418,11 +12476,11 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001764: - resolution: {integrity: sha512-YyNfCBk+Ocx+FuE2htDw/gGkALnGDPqmG3BeYm24SrhvTx6tW8lgVgjmCdRxpKuSbTfwyMr4/OzirkVh5UvuHg==} + caniuse-db@1.0.30001767: + resolution: {integrity: sha512-7tm2xRGN747GhoKBdUYRLdr4QbhOxEvj/I4jx7FWHO5sTaepFgNBIgxNv7IWdv9xLUIlnTIsQc9bD+qE1QOzSg==} - caniuse-lite@1.0.30001764: - resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} canvas@3.2.1: resolution: {integrity: sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==} @@ -12516,9 +12574,6 @@ packages: chardet@0.4.2: resolution: {integrity: sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -12529,8 +12584,8 @@ packages: cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - cheerio@1.1.2: - resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} engines: {node: '>=20.18.1'} chokidar@1.7.0: @@ -12565,8 +12620,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} citty@0.1.6: @@ -12650,22 +12705,23 @@ packages: cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} clipboard-copy@4.0.1: resolution: {integrity: sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==} + clipboard-image@0.1.0: + resolution: {integrity: sha512-SWk7FgaXLNFld19peQ/rTe0n97lwR1WbkqxV6JKCAOh7U52AKV/PeMFCyt/8IhBdqyDA8rdyewQMKZqvWT5Akg==} + engines: {node: '>=20'} + hasBin: true + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - clipboardy@5.0.2: - resolution: {integrity: sha512-3IG8i8Yfb410yqDlCx9Ve3lYLFN3bD1IkrWcowT1kyTo6y4bwYf2guK9Q8a6zck5vWm7afm6Y61i7BG/Ir3FMA==} + clipboardy@5.2.0: + resolution: {integrity: sha512-qlXzpbPfFtMKUMeLRkKDe42uRfhRVGTv86VOy7vDVjFh5cHhkCrxPlXfgiJdL65X/Lr+iJtl1haUtq7dMfEilA==} engines: {node: '>=20'} cliui@3.2.0: @@ -12844,8 +12900,8 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} commander@2.13.0: @@ -12993,18 +13049,18 @@ packages: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true - core-js-compat@3.47.0: - resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} - core-js-pure@3.47.0: - resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==} + core-js-pure@3.48.0: + resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==} core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-js@3.47.0: - resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + core-js@3.48.0: + resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -13016,8 +13072,8 @@ packages: resolution: {integrity: sha512-8OBFwnzMgR4mNrAeAyOLB2EruS2z7u02of2bOu7i9kKYlZG+niS7CTHLPgEXKWW2NAOJWRry9RRCaL9lJRjNqg==} engines: {node: '>=0.10.0'} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} corser@2.0.1: @@ -13125,6 +13181,10 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + css-color-names@0.0.4: resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} @@ -13166,8 +13226,8 @@ packages: webpack: optional: true - css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + css-loader@7.1.3: + resolution: {integrity: sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -13367,8 +13427,8 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-named-character-reference@1.2.0: - resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -13553,8 +13613,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dexie@4.2.1: - resolution: {integrity: sha512-Ckej0NS6jxQ4Po3OrSQBFddayRhTCic2DoCAG5zacOfOVB9P2Q5Xc5uL/nVa7ZVs+HdMnvUPzLFCB/JwpB6Csg==} + dexie@4.3.0: + resolution: {integrity: sha512-5EeoQpJvMKHe6zWt/FSIIuRa3CWlZeIl6zKXt+Lz7BU6RoRRLgX9dZEynRfXrkLcldKYCBiz7xekTEylnie1Ug==} diagnostic-channel-publishers@0.3.5: resolution: {integrity: sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==} @@ -13731,8 +13791,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + electron-to-chromium@1.5.283: + resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -13747,9 +13807,6 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -13809,6 +13866,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -13882,8 +13943,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.43.0: - resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} + es-toolkit@1.44.0: + resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} @@ -14071,18 +14132,10 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-utils@1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} - eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -14109,28 +14162,6 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@6.8.0: - resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - eslint@9.26.0: - resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - eslint@9.27.0: resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14149,14 +14180,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} @@ -14230,8 +14253,8 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} @@ -14351,10 +14374,6 @@ packages: resolution: {integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==} engines: {node: '>=0.12'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - extract-text-webpack-plugin@3.0.2: resolution: {integrity: sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==} engines: {node: '>= 4.8 < 5.0.0 || >= 5.10'} @@ -14413,8 +14432,8 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} hasBin: true fastest-levenshtein@1.0.16: @@ -14489,16 +14508,8 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - file-entry-cache@11.1.1: - resolution: {integrity: sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==} - - file-entry-cache@5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@11.1.2: + resolution: {integrity: sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -14623,10 +14634,6 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} - flat-cache@2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14635,16 +14642,13 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.19: - resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} + flat-cache@6.1.20: + resolution: {integrity: sha512-AhHYqwvN62NVLp4lObVXGVluiABTHapoB57EyegZVmazN+hhGhLTn3uZbOofoTw4DSDvVCadzzyChXhOAvy8uQ==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@2.0.2: - resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -14652,8 +14656,8 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flow-parser@0.296.1: - resolution: {integrity: sha512-dASEzkw6jlgYx1poIqbf8f21OiyD5f0ebEbvwZVohEixE7agpGb+HbAL35BrzAUyb390nfRfFOsG+alNx1Sqww==} + flow-parser@0.299.0: + resolution: {integrity: sha512-phGMRoNt6SNglPHGRbCyWm9/pxfe6t/t4++EIYPaBGWT6e0lphLBgUMrvpL62NbRo9R549o3oqrbKHq82kANCw==} engines: {node: '>=0.4.0'} flush-write-stream@1.1.1: @@ -15062,14 +15066,6 @@ packages: global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@12.4.0: - resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} - engines: {node: '>=8'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -15334,8 +15330,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.15.0: - resolution: {integrity: sha512-51w+ZZGt7Zw5q7rM3nC4t3aLn/xvKDETsXqMczndvwyVQhAHfUmUuFBRFcos8Iyebtk7OAE9dL26wFNzZVVOkw==} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -15417,8 +15413,8 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 - html-webpack-plugin@5.6.5: - resolution: {integrity: sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==} + html-webpack-plugin@5.6.6: + resolution: {integrity: sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==} engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -15429,8 +15425,8 @@ packages: webpack: optional: true - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -15441,8 +15437,8 @@ packages: http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} http-errors@2.0.1: @@ -15667,10 +15663,6 @@ packages: inquirer@3.3.0: resolution: {integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==} - inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -16987,8 +16979,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.5: - resolution: {integrity: sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} kill-port@2.0.1: resolution: {integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==} @@ -17309,8 +17301,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} engines: {node: 20 || >=22} lru-cache@4.1.5: @@ -17343,6 +17335,10 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + macos-version@6.0.0: + resolution: {integrity: sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -17537,8 +17533,8 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - memfs@4.51.1: - resolution: {integrity: sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==} + memfs@4.56.10: + resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} memoizee@0.4.17: resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} @@ -17790,8 +17786,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - mini-css-extract-plugin@2.9.4: - resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} + mini-css-extract-plugin@2.10.0: + resolution: {integrity: sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -17969,8 +17965,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.24.0: - resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==} + nan@2.25.0: + resolution: {integrity: sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==} nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} @@ -18040,8 +18036,8 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.85.0: - resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} + node-abi@3.87.0: + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} engines: {node: '>=10'} node-abort-controller@3.1.1: @@ -19287,6 +19283,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.2.0: + resolution: {integrity: sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==} + engines: {node: '>=20'} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -19464,8 +19464,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.2: - resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + prosemirror-markdown@1.13.3: + resolution: {integrity: sha512-3E+Et6cdXIH0EgN2tGYQ+EBT7N4kMiZFsW+hzx+aPtOmADDHWCdd2uUQb7yklJrfUYUOjEEu22BiN6UFgPe4cQ==} prosemirror-model@1.25.4: resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} @@ -19479,8 +19479,8 @@ packages: prosemirror-state@1.4.4: resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} - prosemirror-transform@1.10.5: - resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + prosemirror-transform@1.11.0: + resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} prosemirror-view@1.41.5: resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} @@ -19556,8 +19556,8 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qified@0.5.3: - resolution: {integrity: sha512-kXuQdQTB6oN3KhI6V4acnBSZx8D2I4xzZvn9+wFLLFCoBNQY/sFnCW6c43OL7pOQ2HvGV4lnWIXNmgfp7cTWhQ==} + qified@0.6.0: + resolution: {integrity: sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==} engines: {node: '>=20'} qs@6.14.1: @@ -19817,8 +19817,8 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.2.3: - resolution: {integrity: sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==} + react-is@19.2.4: + resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} react-json-view-lite@2.5.0: resolution: {integrity: sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==} @@ -19952,10 +19952,10 @@ packages: peerDependencies: react: '>= 0.14.0' - react-test-renderer@19.1.4: - resolution: {integrity: sha512-dmcR2lSwouaNJKNRd53eeZHuWjF4YYZIq/q6wLiVz50ENrkU/Pds+pS+4XyJ/nwWmjA1ZhHxAp+vfR8A9PEcYQ==} + react-test-renderer@19.1.5: + resolution: {integrity: sha512-V+ZFUbqCiXshpb1JIqs/XLukYXvpvUGTy0syzKajbzAh1fMIAaz0x6d1I3kzCYGgBzr8FtFYnlllg1/6WimbZA==} peerDependencies: - react: ^19.1.4 + react: ^19.1.5 react-textarea-autosize@8.5.9: resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} @@ -20136,10 +20136,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpp@2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -20454,8 +20450,8 @@ packages: resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} hasBin: true - rollup@4.55.1: - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -20478,6 +20474,10 @@ packages: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + run-jxa@3.0.0: + resolution: {integrity: sha512-4f2CrY7H+sXkKXJn/cE6qRA3z+NMVO7zvlZ/nUV0e62yWftpiLAfw5eV9ZdomzWd2TXWwEIiGjAT57+lWIzzvA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -20490,10 +20490,6 @@ packages: rx-lite@4.0.8: resolution: {integrity: sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==} - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -20584,8 +20580,8 @@ packages: webpack: optional: true - sass@1.97.2: - resolution: {integrity: sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==} + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} engines: {node: '>=14.0.0'} hasBin: true @@ -20645,8 +20641,8 @@ packages: select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - selenium-webdriver@4.39.0: - resolution: {integrity: sha512-NAs9jCU+UeZ/ZmRb8R6zOp7N8eMklefdBYASnaRmCNXdgFE8w3OCxxZmLixkwqnGDHY5VF7hCulfw1Mls43N/A==} + selenium-webdriver@4.40.0: + resolution: {integrity: sha512-dU0QbnVKdPmoNP8OtMCazRdtU2Ux6Wl4FEpG1iwUbDeajJK1dBAywBLrC1D7YFRtogHzN96AbXBgBAJaarcysw==} engines: {node: '>= 20.0.0'} selfsigned@5.5.0: @@ -20705,8 +20701,8 @@ packages: serve-handler@6.1.6: resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + serve-index@1.9.2: + resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} engines: {node: '>= 0.8.0'} serve-static@1.16.3: @@ -20742,9 +20738,6 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -20858,10 +20851,6 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -21124,10 +21113,6 @@ packages: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} - string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -21140,8 +21125,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.1.0: - resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} engines: {node: '>=20'} string.fromcodepoint@0.2.1: @@ -21351,6 +21336,10 @@ packages: subarg@1.0.0: resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} + subsume@4.0.0: + resolution: {integrity: sha512-BWnYJElmHbYZ/zKevy+TG+SsyoFCmRPDHJbR1MzLxkPOv1Jp/4hGhVUtP98s+wZBsBsHwCXvPTP0x287/WMjGg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -21457,8 +21446,8 @@ packages: resolution: {integrity: sha512-v/hu7KQQtospyDLpZxz7m5c7s90aj53YEkJ/A8x3mLPlSgIkZ6RKJkTjBG75P1p/fo5IeSA4TycyJg3VSu/aPw==} deprecated: 'Please migrate to Workbox: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-sw' - swagger-client@3.36.0: - resolution: {integrity: sha512-9fkjxGHXuKy20jj8zwE6RwgFSOGKAyOD5U7aKgW/+/futtHZHOdZeqiEkb97sptk2rdBv7FEiUQDNlWZR186RA==} + swagger-client@3.36.1: + resolution: {integrity: sha512-bcYpeN4P3sOoKi22zsxIlL9lSgouBAmQmL5hH4g5yeOvyTUvq1+OFtGTs0l1C5Dkb0ZN+2vNgp0FBAFulmUklA==} swagger-ui-react@5.21.0: resolution: {integrity: sha512-lS5paITM1kkcBb/BTTSMHKelh8elHfcuUP4T3R3mO80tDR0AYJL2HR5UdQD6nV1LwdvekzRM8gKjJA6hVayi0A==} @@ -21502,16 +21491,12 @@ packages: tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - 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'} - tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tailwind-merge@2.6.1: + resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} tailwindcss@3.4.19: resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} @@ -21546,6 +21531,7 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me targz@1.0.1: resolution: {integrity: sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==} @@ -21610,8 +21596,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} hasBin: true @@ -22215,8 +22201,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.18.2: - resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} + undici@7.20.0: + resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} unfetch@4.2.0: @@ -22293,6 +22279,10 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + unist-builder@2.0.3: resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} @@ -22344,8 +22334,8 @@ packages: unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} unit-compare@1.0.1: resolution: {integrity: sha512-AeLMQr8gcen2WOTwV0Gvi1nKKbY4Mms79MoltZ6hrZV/VANgE/YQly3jtWZJA/fa9m4ajhynq3XMqh5rOyZclA==} @@ -22553,9 +22543,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - v8-to-istanbul@4.1.4: resolution: {integrity: sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==} engines: {node: 8.x.x || >=10.10.0} @@ -22786,8 +22773,8 @@ packages: resolution: {integrity: sha512-FAk18nzhYggg939xgRRLJjvqmAKZciO24wr8neoxNPl87w8J3m784wxL4zFBwME+0gNQ2Sv/vfsCrUxPxU2Dmg==} engines: {'0': node >=0.1.95} - watchpack@2.5.0: - resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -23149,10 +23136,6 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - write@1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - ws@5.2.4: resolution: {integrity: sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==} @@ -23360,8 +23343,8 @@ packages: zod@4.1.11: resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} - zustand@5.0.10: - resolution: {integrity: sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==} + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -23388,39 +23371,39 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/amazon-bedrock@4.0.17(zod@4.1.11)': + '@ai-sdk/amazon-bedrock@4.0.46(zod@4.1.11)': dependencies: - '@ai-sdk/anthropic': 3.0.13(zod@4.1.11) - '@ai-sdk/provider': 3.0.3 - '@ai-sdk/provider-utils': 4.0.6(zod@4.1.11) + '@ai-sdk/anthropic': 3.0.35(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) '@smithy/eventstream-codec': 4.2.8 '@smithy/util-utf8': 4.2.0 aws4fetch: 1.0.20 zod: 4.1.11 - '@ai-sdk/anthropic@2.0.57(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.58(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/anthropic@3.0.13(zod@4.1.11)': + '@ai-sdk/anthropic@3.0.35(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 3.0.3 - '@ai-sdk/provider-utils': 4.0.6(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/gateway@2.0.27(zod@3.25.76)': + '@ai-sdk/gateway@2.0.30(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@vercel/oidc': 3.1.0 zod: 3.25.76 - '@ai-sdk/gateway@3.0.14(zod@4.1.11)': + '@ai-sdk/gateway@3.0.32(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 3.0.3 - '@ai-sdk/provider-utils': 4.0.6(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) '@vercel/oidc': 3.1.0 zod: 4.1.11 @@ -23431,9 +23414,9 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.6(zod@4.1.11)': + '@ai-sdk/provider-utils@4.0.13(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 3.0.3 + '@ai-sdk/provider': 3.0.7 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 4.1.11 @@ -23442,7 +23425,7 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.3': + '@ai-sdk/provider@3.0.7': dependencies: json-schema: 0.4.0 @@ -23472,21 +23455,21 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-locate-window': 3.965.2 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -23495,15 +23478,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-locate-window': 3.965.2 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -23512,35 +23495,35 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.969.0': + '@aws-sdk/client-s3@3.980.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.969.0 - '@aws-sdk/credential-provider-node': 3.969.0 - '@aws-sdk/middleware-bucket-endpoint': 3.969.0 - '@aws-sdk/middleware-expect-continue': 3.969.0 - '@aws-sdk/middleware-flexible-checksums': 3.969.0 - '@aws-sdk/middleware-host-header': 3.969.0 - '@aws-sdk/middleware-location-constraint': 3.969.0 - '@aws-sdk/middleware-logger': 3.969.0 - '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-sdk-s3': 3.969.0 - '@aws-sdk/middleware-ssec': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.969.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/signature-v4-multi-region': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 - '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-node': 3.972.4 + '@aws-sdk/middleware-bucket-endpoint': 3.972.3 + '@aws-sdk/middleware-expect-continue': 3.972.3 + '@aws-sdk/middleware-flexible-checksums': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-location-constraint': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/middleware-ssec': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/signature-v4-multi-region': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.22.0 '@smithy/eventstream-serde-browser': 4.2.8 '@smithy/eventstream-serde-config-resolver': 4.3.8 '@smithy/eventstream-serde-node': 4.2.8 @@ -23551,21 +23534,21 @@ snapshots: '@smithy/invalid-dependency': 4.2.8 '@smithy/md5-js': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23576,41 +23559,41 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.969.0': + '@aws-sdk/client-sso@3.980.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.969.0 - '@aws-sdk/middleware-host-header': 3.969.0 - '@aws-sdk/middleware-logger': 3.969.0 - '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.969.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 - '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.22.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23619,59 +23602,59 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.969.0': + '@aws-sdk/core@3.973.5': dependencies: - '@aws-sdk/types': 3.969.0 - '@aws-sdk/xml-builder': 3.969.0 - '@smithy/core': 3.20.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.2 + '@smithy/core': 3.22.0 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/crc64-nvme@3.969.0': + '@aws-sdk/crc64-nvme@3.972.0': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.969.0': + '@aws-sdk/credential-provider-env@3.972.3': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.969.0': + '@aws-sdk/credential-provider-http@3.972.5': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 '@smithy/fetch-http-handler': 5.3.9 '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.969.0': - dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/credential-provider-env': 3.969.0 - '@aws-sdk/credential-provider-http': 3.969.0 - '@aws-sdk/credential-provider-login': 3.969.0 - '@aws-sdk/credential-provider-process': 3.969.0 - '@aws-sdk/credential-provider-sso': 3.969.0 - '@aws-sdk/credential-provider-web-identity': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/credential-provider-ini@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-login': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23680,11 +23663,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.969.0': + '@aws-sdk/credential-provider-login@3.972.3': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23693,15 +23676,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.969.0': + '@aws-sdk/credential-provider-node@3.972.4': dependencies: - '@aws-sdk/credential-provider-env': 3.969.0 - '@aws-sdk/credential-provider-http': 3.969.0 - '@aws-sdk/credential-provider-ini': 3.969.0 - '@aws-sdk/credential-provider-process': 3.969.0 - '@aws-sdk/credential-provider-sso': 3.969.0 - '@aws-sdk/credential-provider-web-identity': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-ini': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23710,21 +23693,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.969.0': + '@aws-sdk/credential-provider-process@3.972.3': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.969.0': + '@aws-sdk/credential-provider-sso@3.972.3': dependencies: - '@aws-sdk/client-sso': 3.969.0 - '@aws-sdk/core': 3.969.0 - '@aws-sdk/token-providers': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/client-sso': 3.980.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/token-providers': 3.980.0 + '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -23732,11 +23715,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.969.0': + '@aws-sdk/credential-provider-web-identity@3.972.3': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -23744,31 +23727,31 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.969.0': + '@aws-sdk/middleware-bucket-endpoint@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-arn-parser': 3.968.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.969.0': + '@aws-sdk/middleware-expect-continue@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.969.0': + '@aws-sdk/middleware-flexible-checksums@3.972.3': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.969.0 - '@aws-sdk/crc64-nvme': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/crc64-nvme': 3.972.0 + '@aws-sdk/types': 3.973.1 '@smithy/is-array-buffer': 4.2.0 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 @@ -23778,43 +23761,43 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.969.0': + '@aws-sdk/middleware-host-header@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.969.0': + '@aws-sdk/middleware-location-constraint@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.969.0': + '@aws-sdk/middleware-logger@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.969.0': + '@aws-sdk/middleware-recursion-detection@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@aws/lambda-invoke-store': 0.2.3 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.969.0': + '@aws-sdk/middleware-sdk-s3@3.972.5': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-arn-parser': 3.968.0 - '@smithy/core': 3.20.5 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/core': 3.22.0 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 '@smithy/util-middleware': 4.2.8 @@ -23822,57 +23805,57 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.969.0': + '@aws-sdk/middleware-ssec@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.969.0': + '@aws-sdk/middleware-user-agent@3.972.5': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 - '@smithy/core': 3.20.5 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@smithy/core': 3.22.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.969.0': + '@aws-sdk/nested-clients@3.980.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.969.0 - '@aws-sdk/middleware-host-header': 3.969.0 - '@aws-sdk/middleware-logger': 3.969.0 - '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.969.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.969.0 - '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.22.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23881,28 +23864,28 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.969.0': + '@aws-sdk/region-config-resolver@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/config-resolver': 4.4.6 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.969.0': + '@aws-sdk/signature-v4-multi-region@3.980.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.969.0': + '@aws-sdk/token-providers@3.980.0': dependencies: - '@aws-sdk/core': 3.969.0 - '@aws-sdk/nested-clients': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -23910,46 +23893,46 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.969.0': + '@aws-sdk/types@3.973.1': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.968.0': + '@aws-sdk/util-arn-parser@3.972.2': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.969.0': + '@aws-sdk/util-endpoints@3.980.0': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.2': + '@aws-sdk/util-locate-window@3.965.4': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.969.0': + '@aws-sdk/util-user-agent-browser@3.972.3': dependencies: - '@aws-sdk/types': 3.969.0 + '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.969.0': + '@aws-sdk/util-user-agent-node@3.972.3': dependencies: - '@aws-sdk/middleware-user-agent': 3.969.0 - '@aws-sdk/types': 3.969.0 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/types': 3.973.1 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.969.0': + '@aws-sdk/xml-builder@3.972.2': dependencies: '@smithy/types': 4.12.0 - fast-xml-parser: 5.2.5 + fast-xml-parser: 5.3.4 tslib: 2.8.1 '@aws/lambda-invoke-store@0.2.3': {} @@ -24017,8 +24000,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.28.0 - '@azure/msal-node': 3.8.5 + '@azure/msal-browser': 4.28.1 + '@azure/msal-node': 3.8.6 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -24031,36 +24014,36 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.28.0': + '@azure/msal-browser@4.28.1': dependencies: - '@azure/msal-common': 15.14.0 + '@azure/msal-common': 15.14.1 - '@azure/msal-common@15.14.0': {} + '@azure/msal-common@15.14.1': {} - '@azure/msal-node@3.8.5': + '@azure/msal-node@3.8.6': dependencies: - '@azure/msal-common': 15.14.0 + '@azure/msal-common': 15.14.1 jsonwebtoken: 9.0.3 uuid: 8.3.2 - '@babel/code-frame@7.28.6': + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.6': {} + '@babel/compat-data@7.29.0': {} '@babel/core@7.12.9': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.12.9) '@babel/helpers': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 convert-source-map: 1.9.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -24075,15 +24058,15 @@ snapshots: '@babel/core@7.27.7': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) '@babel/helpers': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -24092,21 +24075,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.6': + '@babel/generator@7.29.0': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 browserslist: 4.28.1 lru-cache: 5.1.1 @@ -24120,7 +24103,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.7) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -24138,7 +24121,7 @@ snapshots: '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -24152,7 +24135,7 @@ snapshots: '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -24160,7 +24143,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.27.7)': + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.28.6 @@ -24175,15 +24158,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -24192,7 +24175,7 @@ snapshots: '@babel/core': 7.12.9 '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24201,13 +24184,13 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.10.4': {} @@ -24218,7 +24201,7 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24227,14 +24210,14 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -24247,25 +24230,25 @@ snapshots: '@babel/helper-wrap-function@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 - '@babel/parser@7.28.6': + '@babel/parser@7.29.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24292,7 +24275,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24304,7 +24287,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.28.6(@babel/core@7.27.7)': + '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) @@ -24333,7 +24316,7 @@ snapshots: '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 @@ -24502,12 +24485,12 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.27.7)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24554,7 +24537,7 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.7) - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24568,7 +24551,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24583,7 +24566,7 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.27.7)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) @@ -24623,7 +24606,7 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24663,13 +24646,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24681,7 +24664,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) @@ -24709,7 +24692,7 @@ snapshots: '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -24785,7 +24768,7 @@ snapshots: '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -24795,7 +24778,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.27.7)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 @@ -24875,7 +24858,7 @@ snapshots: '@babel/preset-env@7.27.2(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 @@ -24890,7 +24873,7 @@ snapshots: '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) @@ -24901,7 +24884,7 @@ snapshots: '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.7) @@ -24913,9 +24896,9 @@ snapshots: '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.7) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.27.7) @@ -24927,7 +24910,7 @@ snapshots: '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -24940,10 +24923,10 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.27.7) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.7) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.27.7) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.27.7) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.7) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.27.7) - core-js-compat: 3.47.0 + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.27.7) + core-js-compat: 3.48.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -24959,7 +24942,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 esutils: 2.0.3 '@babel/preset-react@7.27.1(@babel/core@7.27.7)': @@ -25005,31 +24988,31 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 - '@babel/runtime-corejs3@7.28.6': + '@babel/runtime-corejs3@7.29.0': dependencies: - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 - '@babel/traverse@7.28.6': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.28.6': + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 @@ -25080,14 +25063,14 @@ snapshots: '@cacheable/memory@2.0.7': dependencies: '@cacheable/utils': 2.3.3 - '@keyv/bigmap': 1.3.0(keyv@5.5.5) - hookified: 1.15.0 - keyv: 5.5.5 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 '@cacheable/utils@2.3.3': dependencies: hashery: 1.4.0 - keyv: 5.5.5 + keyv: 5.6.0 '@cnakazawa/watch@1.0.4': dependencies: @@ -25115,7 +25098,7 @@ snapshots: '@codemirror/language': 6.11.3 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-cpp@6.0.3': dependencies: @@ -25171,7 +25154,7 @@ snapshots: '@codemirror/language': 6.11.3 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-json@6.0.2': dependencies: @@ -25184,7 +25167,7 @@ snapshots: '@codemirror/language': 6.11.3 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-liquid@6.3.1': dependencies: @@ -25195,7 +25178,7 @@ snapshots: '@codemirror/view': 6.38.8 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-markdown@6.5.0': dependencies: @@ -25243,7 +25226,7 @@ snapshots: '@codemirror/state': 6.5.4 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-vue@0.1.3': dependencies: @@ -25252,14 +25235,14 @@ snapshots: '@codemirror/language': 6.11.3 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-wast@6.0.2': dependencies: '@codemirror/language': 6.11.3 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@codemirror/lang-xml@6.1.0': dependencies: @@ -25277,8 +25260,8 @@ snapshots: '@codemirror/state': 6.5.4 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 - '@lezer/yaml': 1.0.3 + '@lezer/lr': 1.4.8 + '@lezer/yaml': 1.0.4 '@codemirror/language-data@6.5.2': dependencies: @@ -25312,7 +25295,7 @@ snapshots: '@codemirror/view': 6.38.8 '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 style-mod: 4.1.3 '@codemirror/legacy-modes@6.5.2': @@ -25408,7 +25391,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.25': {} + '@csstools/css-syntax-patches-for-csstree@1.0.26': {} '@csstools/css-tokenizer@3.0.4': {} @@ -25717,16 +25700,6 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.1(eslint@9.26.0(jiti@2.6.1))': - dependencies: - eslint: 9.26.0(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.27.0(jiti@2.6.1))': dependencies: eslint: 9.27.0(jiti@2.6.1) @@ -25744,10 +25717,6 @@ snapshots: '@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 @@ -25756,20 +25725,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.3(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 @@ -25784,10 +25739,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - - '@eslint/js@9.26.0': {} - '@eslint/js@9.27.0': {} '@eslint/object-schema@2.1.7': {} @@ -25799,36 +25750,36 @@ snapshots: '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - '@floating-ui/core@1.7.3': + '@floating-ui/core@1.7.4': dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.4': + '@floating-ui/dom@1.7.5': dependencies: - '@floating-ui/core': 1.7.3 + '@floating-ui/core': 1.7.4 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/dom': 1.7.4 + '@floating-ui/dom': 1.7.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@floating-ui/react-dom@2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.7.4 + '@floating-ui/dom': 1.7.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/react-dom@2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.7.4 + '@floating-ui/dom': 1.7.5 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) '@floating-ui/react@0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.2.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -25986,18 +25937,8 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.4.3': {} '@iarna/toml@2.2.5': {} @@ -26089,7 +26030,7 @@ snapshots: - supports-color - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -26103,7 +26044,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -26124,7 +26065,7 @@ snapshots: - supports-color - ts-node - '@jest/core@30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3))': + '@jest/core@30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3))': dependencies: '@jest/console': 30.2.0 '@jest/pattern': 30.0.1 @@ -26135,11 +26076,11 @@ snapshots: '@types/node': 22.15.35 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-haste-map: 30.2.0 jest-message-util: 30.2.0 jest-regex-util: 30.0.1 @@ -26355,7 +26296,7 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.47 + '@sinclair/typebox': 0.34.48 '@jest/snapshot-utils@30.2.0': dependencies: @@ -26411,7 +26352,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: @@ -26542,12 +26486,12 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': dependencies: glob: 10.5.0 magic-string: 0.27.0 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: typescript: 5.8.3 @@ -26581,14 +26525,82 @@ snapshots: dependencies: tslib: 2.8.1 + '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) @@ -26601,25 +26613,48 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@juggle/resize-observer@3.4.0': {} - '@keyv/bigmap@1.3.0(keyv@5.5.5)': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: hashery: 1.4.0 - hookified: 1.15.0 - keyv: 5.5.5 + hookified: 1.15.1 + keyv: 5.6.0 '@keyv/serialize@1.1.1': {} @@ -26775,19 +26810,19 @@ snapshots: dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/css@1.3.0': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/go@1.0.1': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/highlight@1.2.3': dependencies: @@ -26797,27 +26832,27 @@ snapshots: dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/java@1.1.3': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/javascript@1.5.4': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/json@1.0.3': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 - '@lezer/lr@1.4.7': + '@lezer/lr@1.4.8': dependencies: '@lezer/common': 1.5.0 @@ -26830,37 +26865,37 @@ snapshots: dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/python@1.1.18': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/rust@1.0.2': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/sass@1.1.0': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@lezer/xml@1.0.6': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 - '@lezer/yaml@1.0.3': + '@lezer/yaml@1.0.4': dependencies: '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.7 + '@lezer/lr': 1.4.8 '@marijn/find-cluster-break@1.0.2': {} @@ -27073,7 +27108,7 @@ snapshots: '@modelcontextprotocol/inspector-cli@0.17.5': dependencies: - '@modelcontextprotocol/sdk': 1.25.2 + '@modelcontextprotocol/sdk': 1.25.3 commander: 13.1.0 spawn-rx: 5.1.2 transitivePeerDependencies: @@ -27083,7 +27118,7 @@ snapshots: '@modelcontextprotocol/inspector-client@0.17.5(@types/react-dom@18.2.0)(@types/react@18.2.0)': dependencies: - '@modelcontextprotocol/sdk': 1.25.2 + '@modelcontextprotocol/sdk': 1.25.3 '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': 1.3.2(react@18.3.1) @@ -27106,7 +27141,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-simple-code-editor: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) serve-handler: 6.1.6 - tailwind-merge: 2.6.0 + tailwind-merge: 2.6.1 zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' @@ -27117,8 +27152,8 @@ snapshots: '@modelcontextprotocol/inspector-server@0.17.5': dependencies: - '@modelcontextprotocol/sdk': 1.25.2 - cors: 2.8.5 + '@modelcontextprotocol/sdk': 1.25.3 + cors: 2.8.6 express: 5.2.1 shell-quote: 1.8.3 spawn-rx: 5.1.2 @@ -27131,18 +27166,18 @@ snapshots: - supports-color - utf-8-validate - '@modelcontextprotocol/inspector@0.17.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3)': + '@modelcontextprotocol/inspector@0.17.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3)': dependencies: '@modelcontextprotocol/inspector-cli': 0.17.5 '@modelcontextprotocol/inspector-client': 0.17.5(@types/react-dom@18.2.0)(@types/react@18.2.0) '@modelcontextprotocol/inspector-server': 0.17.5 - '@modelcontextprotocol/sdk': 1.25.2 + '@modelcontextprotocol/sdk': 1.25.3 concurrently: 9.2.1 node-fetch: 3.3.2 open: 10.2.0 shell-quote: 1.8.3 spawn-rx: 5.1.2 - ts-node: 10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.18)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(typescript@5.8.3) zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' @@ -27157,13 +27192,13 @@ snapshots: - typescript - utf-8-validate - '@modelcontextprotocol/sdk@1.25.2': + '@modelcontextprotocol/sdk@1.25.3': dependencies: '@hono/node-server': 1.19.9 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 - cors: 2.8.5 + cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.0.6 @@ -27319,65 +27354,65 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@parcel/watcher-android-arm64@2.5.4': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.4': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.4': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.4': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.4': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.4': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.4': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.4': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.4': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.4': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.4': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.4': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.4': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.4': + '@parcel/watcher@2.5.6': dependencies: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 picomatch: 4.0.3 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.4 - '@parcel/watcher-darwin-arm64': 2.5.4 - '@parcel/watcher-darwin-x64': 2.5.4 - '@parcel/watcher-freebsd-x64': 2.5.4 - '@parcel/watcher-linux-arm-glibc': 2.5.4 - '@parcel/watcher-linux-arm-musl': 2.5.4 - '@parcel/watcher-linux-arm64-glibc': 2.5.4 - '@parcel/watcher-linux-arm64-musl': 2.5.4 - '@parcel/watcher-linux-x64-glibc': 2.5.4 - '@parcel/watcher-linux-x64-musl': 2.5.4 - '@parcel/watcher-win32-arm64': 2.5.4 - '@parcel/watcher-win32-ia32': 2.5.4 - '@parcel/watcher-win32-x64': 2.5.4 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 optional: true '@peculiar/asn1-cms@2.6.0': @@ -27479,44 +27514,44 @@ snapshots: dependencies: playwright: 1.55.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) type-fest: 4.41.0 webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18)) + '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + webpack-dev-server: 5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 @@ -27533,7 +27568,7 @@ snapshots: '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 @@ -27550,7 +27585,7 @@ snapshots: '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 @@ -27567,7 +27602,7 @@ snapshots: '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: anser: 2.3.5 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 react-refresh: 0.11.0 @@ -28334,7 +28369,7 @@ snapshots: '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 - '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.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) @@ -28353,7 +28388,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.28.6 - '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/react-dom': 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@19.1.0) @@ -28371,7 +28406,7 @@ snapshots: '@radix-ui/react-popper@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) @@ -28389,7 +28424,7 @@ snapshots: '@radix-ui/react-popper@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.3.1) @@ -29300,18 +29335,18 @@ snapshots: dependencies: react: 18.2.0 - '@redhat-developer/locators@1.18.1(@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.39.0)(typescript@5.8.3))(selenium-webdriver@4.39.0)': + '@redhat-developer/locators@1.18.1(@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0)': dependencies: - '@redhat-developer/page-objects': 1.18.1(selenium-webdriver@4.39.0)(typescript@5.8.3) - selenium-webdriver: 4.39.0 + '@redhat-developer/page-objects': 1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3) + selenium-webdriver: 4.40.0 - '@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.39.0)(typescript@5.8.3)': + '@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3)': dependencies: - clipboardy: 5.0.2 + clipboardy: 5.2.0 clone-deep: 4.0.1 compare-versions: 6.1.1 fs-extra: 11.3.3 - selenium-webdriver: 4.39.0 + selenium-webdriver: 4.40.0 type-fest: 4.41.0 typescript: 5.8.3 @@ -29337,9 +29372,9 @@ snapshots: resolve: 1.22.11 rollup: 1.32.1 - '@rollup/plugin-commonjs@28.0.9(rollup@4.55.1)': + '@rollup/plugin-commonjs@28.0.9(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -29347,28 +29382,28 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.3 optionalDependencies: - rollup: 4.55.1 + rollup: 4.57.1 '@rollup/plugin-json@4.1.0(rollup@1.32.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@1.32.1) rollup: 1.32.1 - '@rollup/plugin-json@6.1.0(rollup@4.55.1)': + '@rollup/plugin-json@6.1.0(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) optionalDependencies: - rollup: 4.55.1 + rollup: 4.57.1 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.55.1)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.55.1 + rollup: 4.57.1 '@rollup/plugin-node-resolve@9.0.0(rollup@1.32.1)': dependencies: @@ -29398,87 +29433,87 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.3.0(rollup@4.55.1)': + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.55.1 + rollup: 4.57.1 - '@rollup/rollup-android-arm-eabi@4.55.1': + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.55.1': + '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.55.1': + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.55.1': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.55.1': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.55.1': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.55.1': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-openbsd-x64@4.55.1': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true '@rtsao/scc@1.1.0': {} @@ -29515,9 +29550,9 @@ snapshots: dependencies: '@secretlint/resolver': 10.2.2 '@secretlint/types': 10.2.2 - '@textlint/linter-formatter': 15.5.0 - '@textlint/module-interop': 15.5.0 - '@textlint/types': 15.5.0 + '@textlint/linter-formatter': 15.5.1 + '@textlint/module-interop': 15.5.1 + '@textlint/types': 15.5.1 chalk: 5.6.2 debug: 4.4.3(supports-color@8.1.1) pluralize: 8.0.0 @@ -29591,7 +29626,7 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.34.47': {} + '@sinclair/typebox@0.34.48': {} '@sindresorhus/is@5.6.0': {} @@ -29656,7 +29691,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.20.5': + '@smithy/core@3.22.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -29760,9 +29795,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.6': + '@smithy/middleware-endpoint@4.4.12': dependencies: - '@smithy/core': 3.20.5 + '@smithy/core': 3.22.0 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -29771,12 +29806,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.22': + '@smithy/middleware-retry@4.4.29': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -29850,10 +29885,10 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.10.7': + '@smithy/smithy-client@4.11.1': dependencies: - '@smithy/core': 3.20.5 - '@smithy/middleware-endpoint': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/middleware-endpoint': 4.4.12 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 @@ -29898,20 +29933,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.21': + '@smithy/util-defaults-mode-browser@4.3.28': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.24': + '@smithy/util-defaults-mode-node@4.2.31': dependencies: '@smithy/config-resolver': 4.4.6 '@smithy/credential-provider-imds': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -29991,7 +30026,7 @@ snapshots: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -30084,7 +30119,7 @@ snapshots: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 memoizerific: 1.11.3 regenerator-runtime: 0.13.11 @@ -30139,18 +30174,18 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/addon-controls@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 lodash: 4.17.23 ts-dedent: 2.2.0 optionalDependencies: @@ -30177,7 +30212,7 @@ snapshots: '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 lodash: 4.17.23 ts-dedent: 2.2.0 optionalDependencies: @@ -30246,7 +30281,7 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30255,7 +30290,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(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-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) @@ -30267,7 +30302,7 @@ 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) babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -30312,7 +30347,7 @@ 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) babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -30420,29 +30455,29 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/addon-controls': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30469,7 +30504,7 @@ snapshots: '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: @@ -30580,7 +30615,7 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/qs': 6.14.0 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 prop-types: 15.8.1 qs: 6.14.1 @@ -30622,7 +30657,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 optionalDependencies: react: 18.2.0 @@ -30680,7 +30715,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 @@ -30735,7 +30770,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 regenerator-runtime: 0.13.11 optionalDependencies: react: 18.2.0 @@ -30781,7 +30816,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 memoizerific: 1.11.3 prop-types: 15.8.1 @@ -30841,7 +30876,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -30857,7 +30892,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -30888,7 +30923,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -30910,7 +30945,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -31038,15 +31073,15 @@ snapshots: - encoding - supports-color - '@storybook/builder-vite@8.6.15(storybook@8.6.15(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2))': + '@storybook/builder-vite@8.6.15(storybook@8.6.15(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@storybook/csf-plugin': 8.6.15(storybook@8.6.15(prettier@3.5.3)) browser-assert: 1.2.1 storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) - '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31056,7 +31091,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31068,33 +31103,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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - raw-loader: 4.0.2(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + raw-loader: 4.0.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31108,7 +31143,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31118,7 +31153,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-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) @@ -31132,7 +31167,7 @@ snapshots: autoprefixer: 9.8.8 babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 @@ -31154,69 +31189,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack4@6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.7 - '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/channel-postmessage': 6.5.16 - '@storybook/channels': 6.5.16 - '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 6.5.16 - '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-events': 6.5.16 - '@storybook/node-logger': 6.5.16 - '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/semver': 7.3.2 - '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/node': 16.18.126 - '@types/webpack': 4.41.40 - autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.104.1) - file-loader: 6.2.0(webpack@5.104.1) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6 - glob: 7.2.3 - glob-promise: 3.4.0(glob@7.2.3) - global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1) - pnp-webpack-plugin: 1.6.4(typescript@5.8.3) - postcss: 7.0.39 - postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1) - raw-loader: 4.0.2(webpack@5.104.1) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.104.1) - terser-webpack-plugin: 4.2.3(webpack@5.104.1) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) - util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-dev-middleware: 3.7.3(webpack@5.104.1) webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) webpack-hot-middleware: 2.26.1 @@ -31256,7 +31229,7 @@ snapshots: autoprefixer: 9.8.8 babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 @@ -31318,7 +31291,7 @@ snapshots: autoprefixer: 9.8.8 babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 @@ -31380,7 +31353,7 @@ snapshots: autoprefixer: 9.8.8 babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 @@ -31418,7 +31391,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31428,7 +31401,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-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) @@ -31441,22 +31414,22 @@ snapshots: babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 5.2.7(webpack@5.104.1) fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.5(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 style-loader: 2.0.0(webpack@5.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-dev-middleware: 4.3.0(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 @@ -31495,19 +31468,19 @@ snapshots: babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 5.2.7(webpack@5.104.1) fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.5(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 style-loader: 2.0.0(webpack@5.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 webpack: 5.104.1(webpack-cli@4.10.0) @@ -31545,7 +31518,7 @@ snapshots: '@storybook/router': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 7.4.6 '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1) @@ -31557,20 +31530,20 @@ snapshots: express: 4.22.1 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.5(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) semver: 7.7.3 style-loader: 3.3.4(webpack@5.104.1) - swc-loader: 0.2.7(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) webpack-dev-middleware: 6.1.3(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 @@ -31606,33 +31579,33 @@ snapshots: '@storybook/router': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/store': 7.4.6 '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.5(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + html-webpack-plugin: 5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) path-browserify: 1.0.1 process: 0.11.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) semver: 7.7.3 - style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - swc-loader: 0.2.7(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) - webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31648,7 +31621,7 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@8.6.15(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/builder-webpack5@8.6.15(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@types/semver': 7.7.1 @@ -31656,23 +31629,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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) + css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) - html-webpack-plugin: 5.6.5(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + html-webpack-plugin: 5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) + style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31695,14 +31668,14 @@ snapshots: css-loader: 6.11.0(webpack@5.104.1) es-module-lexer: 1.7.0 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1) - html-webpack-plugin: 5.6.5(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) style-loader: 3.3.4(webpack@5.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 @@ -31725,7 +31698,7 @@ snapshots: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 qs: 6.14.1 telejson: 6.0.8 @@ -31734,13 +31707,13 @@ snapshots: dependencies: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 telejson: 6.0.8 '@storybook/channels@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -31766,7 +31739,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.6.21 '@storybook/core-common': 7.6.21(encoding@0.1.13) @@ -31816,7 +31789,7 @@ snapshots: '@storybook/cli@8.6.15(@babel/preset-env@7.27.2(@babel/core@7.27.7))(prettier@3.5.3)': dependencies: '@babel/core': 7.27.7 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@storybook/codemod': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@types/semver': 7.7.1 commander: 12.1.0 @@ -31854,7 +31827,7 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/qs': 6.14.0 '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -31879,7 +31852,7 @@ snapshots: '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/qs': 6.14.0 '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -31900,7 +31873,7 @@ snapshots: '@storybook/client-logger@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 '@storybook/client-logger@7.4.6': @@ -31915,7 +31888,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@storybook/csf': 0.1.13 '@storybook/csf-tools': 7.6.21 '@storybook/node-logger': 7.6.21 @@ -31934,11 +31907,11 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@storybook/core': 8.6.15(prettier@3.5.3)(storybook@8.6.15(prettier@3.5.3)) '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 - es-toolkit: 1.43.0 + es-toolkit: 1.44.0 globby: 14.1.0 jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)) prettier: 3.5.3 @@ -31955,7 +31928,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 qs: 6.14.1 react: 18.2.0 @@ -31968,7 +31941,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 qs: 6.14.1 react: 19.1.0 @@ -32016,7 +31989,7 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.5.3) - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)))': + '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -32030,7 +32003,7 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 qs: 6.14.1 @@ -32040,7 +32013,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 @@ -32058,7 +32031,7 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 qs: 6.14.1 @@ -32068,7 +32041,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 @@ -32086,7 +32059,7 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 qs: 6.14.1 @@ -32105,11 +32078,11 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/core-common@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32133,15 +32106,15 @@ 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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32158,7 +32131,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32170,11 +32143,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32202,7 +32175,7 @@ snapshots: babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 @@ -32223,72 +32196,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(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.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.7 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.27.7) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.7) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) - '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.6(@babel/core@7.27.7) - '@storybook/node-logger': 6.5.16 - '@storybook/semver': 7.3.2 - '@types/node': 16.18.126 - '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) - chalk: 4.1.2 - core-js: 3.47.0 - express: 4.22.1 - file-system-cache: 1.1.0 - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) - 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.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32304,7 +32212,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32332,7 +32240,7 @@ snapshots: babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 @@ -32369,7 +32277,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32397,7 +32305,7 @@ snapshots: babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 @@ -32434,7 +32342,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32462,7 +32370,7 @@ snapshots: babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 @@ -32555,7 +32463,7 @@ snapshots: '@storybook/core-events@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 '@storybook/core-events@7.4.6': dependencies: @@ -32565,20 +32473,20 @@ snapshots: dependencies: ts-dedent: 2.2.0 - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32589,7 +32497,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32610,13 +32518,13 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.5.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + watchpack: 2.5.1 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32655,7 +32563,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32676,7 +32584,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.5.0 + watchpack: 2.5.1 webpack: 5.104.1(webpack-cli@4.10.0) ws: 8.19.0 x-default-browser: 0.4.0 @@ -32697,84 +32605,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/node-logger': 6.5.16 - '@storybook/semver': 7.3.2 - '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@types/node': 16.18.126 - '@types/node-fetch': 2.6.13 - '@types/pretty-hrtime': 1.0.3 - '@types/webpack': 4.41.40 - better-opn: 2.1.1 - boxen: 5.1.2 - chalk: 4.1.2 - cli-table3: 0.6.5 - commander: 6.2.1 - compression: 1.8.1 - core-js: 3.47.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.22.1 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.23 - node-fetch: 2.6.13(encoding@0.1.13) - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - serve-favicon: 2.5.1 - slash: 3.0.0 - telejson: 6.0.8 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - watchpack: 2.5.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) - ws: 8.19.0 - x-default-browser: 0.4.0 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32785,7 +32629,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32806,8 +32650,8 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.5.0 - webpack: 5.104.1(webpack-cli@5.1.4) + watchpack: 2.5.1 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32849,7 +32693,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32870,7 +32714,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.5.0 + watchpack: 2.5.1 webpack: 5.104.1(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 @@ -32913,7 +32757,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32934,7 +32778,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.5.0 + watchpack: 2.5.1 webpack: 5.104.1(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 @@ -32993,7 +32837,7 @@ snapshots: ts-dedent: 2.2.0 util: 0.12.5 util-deprecate: 1.0.2 - watchpack: 2.5.0 + watchpack: 2.5.1 ws: 8.19.0 transitivePeerDependencies: - bufferutil @@ -33017,16 +32861,16 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -33065,35 +32909,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)))': + '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@storybook/core-server': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1)': - dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33194,15 +33016,15 @@ snapshots: '@storybook/csf-tools@6.5.16': dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.7) - core-js: 3.47.0 + core-js: 3.48.0 fs-extra: 9.1.0 global: 4.4.0 regenerator-runtime: 0.13.11 @@ -33212,10 +33034,10 @@ snapshots: '@storybook/csf-tools@7.4.6': dependencies: - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@storybook/csf': 0.1.13 '@storybook/types': 7.4.6 fs-extra: 11.3.3 @@ -33226,10 +33048,10 @@ snapshots: '@storybook/csf-tools@7.6.21': dependencies: - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@storybook/csf': 0.1.13 '@storybook/types': 7.6.21 fs-extra: 11.3.3 @@ -33257,7 +33079,7 @@ snapshots: '@babel/core': 7.27.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 doctrine: 3.0.0 lodash: 4.17.23 regenerator-runtime: 0.13.11 @@ -33271,7 +33093,7 @@ snapshots: '@babel/core': 7.27.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 doctrine: 3.0.0 lodash: 4.17.23 regenerator-runtime: 0.13.11 @@ -33360,29 +33182,29 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.5.3) - '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33390,14 +33212,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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33411,14 +33233,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': 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.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/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) @@ -33427,7 +33249,7 @@ snapshots: babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 file-loader: 6.2.0(webpack@5.104.1) @@ -33447,58 +33269,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.7 - '@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.104.1) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/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.104.1) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.104.1) - express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1) - node-fetch: 2.6.13(encoding@0.1.13) - pnp-webpack-plugin: 1.6.4(typescript@5.8.3) - react: 18.2.0 - 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.104.1) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) - util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-dev-middleware: 3.7.3(webpack@5.104.1) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -33529,7 +33300,7 @@ snapshots: babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 file-loader: 6.2.0(webpack@5.104.1) @@ -33580,7 +33351,7 @@ snapshots: babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 file-loader: 6.2.0(webpack@5.104.1) @@ -33631,7 +33402,7 @@ snapshots: babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 file-loader: 6.2.0(webpack@5.104.1) @@ -33666,14 +33437,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': 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.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/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) @@ -33681,12 +33452,12 @@ snapshots: babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 5.2.7(webpack@5.104.1) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.5(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33696,10 +33467,10 @@ snapshots: resolve-from: 5.0.0 style-loader: 2.0.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-dev-middleware: 4.3.0(webpack@5.104.1) webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -33730,12 +33501,12 @@ snapshots: babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 css-loader: 5.2.7(webpack@5.104.1) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.5(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33745,7 +33516,7 @@ snapshots: resolve-from: 5.0.0 style-loader: 2.0.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 webpack: 5.104.1(webpack-cli@4.10.0) @@ -33768,10 +33539,10 @@ snapshots: '@storybook/mdx1-csf@0.0.1(@babel/core@7.27.7)': dependencies: - '@babel/generator': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.17.17 js-string-escape: 1.0.1 @@ -33789,7 +33560,7 @@ snapshots: dependencies: '@types/npmlog': 4.1.6 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 npmlog: 5.0.1 pretty-hrtime: 1.0.3 @@ -33799,7 +33570,7 @@ snapshots: '@storybook/postinstall@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 '@storybook/postinstall@7.4.6': {} @@ -33877,11 +33648,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/preset-react-webpack@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33892,7 +33663,7 @@ snapshots: semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33976,7 +33747,7 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 qs: 6.14.1 @@ -33997,7 +33768,7 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 qs: 6.14.1 @@ -34025,7 +33796,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)))': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -34035,7 +33806,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - supports-color @@ -34049,11 +33820,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -34063,7 +33834,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) transitivePeerDependencies: - supports-color @@ -34109,11 +33880,11 @@ snapshots: react-dom: 19.1.0(react@19.1.0) storybook: 8.6.15(prettier@3.5.3) - '@storybook/react-vite@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.55.1)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2))': + '@storybook/react-vite@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.57.1)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2)) - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) - '@storybook/builder-vite': 8.6.15(storybook@8.6.15(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@storybook/builder-vite': 8.6.15(storybook@8.6.15(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.21 @@ -34123,7 +33894,7 @@ snapshots: resolve: 1.22.11 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: '@storybook/test': 8.6.15(storybook@8.6.15(prettier@3.5.3)) transitivePeerDependencies: @@ -34189,10 +33960,10 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react-webpack5@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react-webpack5@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/builder-webpack5': 8.6.15(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.15(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + '@storybook/preset-react-webpack': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34227,15 +33998,15 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 @@ -34250,7 +34021,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -34266,11 +34037,11 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -34314,7 +34085,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -34355,81 +34126,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@storybook/semver': 7.3.2 - '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/estree': 0.0.51 - '@types/node': 16.18.126 - '@types/webpack-env': 1.18.8 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 - escodegen: 2.1.0 - fs-extra: 9.1.0 - global: 4.4.0 - html-tags: 3.3.1 - lodash: 4.17.23 - 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.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) - optionalDependencies: - '@babel/core': 7.27.7 - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - '@types/webpack' - - bufferutil - - encoding - - esbuild - - eslint - - sockjs-client - - supports-color - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -34440,7 +34149,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -34456,7 +34165,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -34502,7 +34211,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -34564,7 +34273,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -34698,7 +34407,7 @@ snapshots: '@storybook/router@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 qs: 6.14.1 react: 18.2.0 @@ -34708,7 +34417,7 @@ snapshots: '@storybook/router@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 qs: 6.14.1 react: 19.1.0 @@ -34733,7 +34442,7 @@ snapshots: '@storybook/semver@7.3.2': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 find-up: 4.1.0 '@storybook/source-loader@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -34741,7 +34450,7 @@ snapshots: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 estraverse: 5.3.0 global: 4.4.0 loader-utils: 2.0.4 @@ -34757,7 +34466,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -34777,7 +34486,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.23 @@ -34796,39 +34505,12 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/telemetry@6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - chalk: 4.1.2 - core-js: 3.47.0 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 9.1.0 - global: 4.4.0 - isomorphic-unfetch: 3.1.0(encoding@0.1.13) - nanoid: 3.3.11 - 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(@swc/core@1.15.8(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34850,12 +34532,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34882,7 +34564,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34909,7 +34591,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34936,7 +34618,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34997,7 +34679,7 @@ snapshots: '@storybook/theming@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -35006,7 +34688,7 @@ snapshots: '@storybook/theming@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -35059,7 +34741,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 qs: 6.14.1 react: 18.2.0 @@ -35078,7 +34760,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 qs: 6.14.1 react: 19.1.0 @@ -35086,20 +34768,20 @@ snapshots: regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - '@swagger-api/apidom-ast@1.2.0': + '@swagger-api/apidom-ast@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-error': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) unraw: 3.0.0 - '@swagger-api/apidom-core@1.2.0': + '@swagger-api/apidom-core@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-ast': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 minim: 0.23.8 ramda: 0.30.1 @@ -35107,246 +34789,246 @@ snapshots: short-unique-id: 5.3.2 ts-mixer: 6.0.4 - '@swagger-api/apidom-error@1.2.0': + '@swagger-api/apidom-error@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 + '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-json-pointer@1.2.0': + '@swagger-api/apidom-json-pointer@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@swaggerexpert/json-pointer': 2.10.2 - '@swagger-api/apidom-ns-api-design-systems@1.2.0': + '@swagger-api/apidom-ns-api-design-systems@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-arazzo-1@1.2.0': + '@swagger-api/apidom-ns-arazzo-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-2@1.2.0': + '@swagger-api/apidom-ns-asyncapi-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-3@1.2.0': + '@swagger-api/apidom-ns-asyncapi-3@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-json-schema-2019-09@1.2.0': + '@swagger-api/apidom-ns-json-schema-2019-09@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-2020-12@1.2.0': + '@swagger-api/apidom-ns-json-schema-2020-12@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-2019-09': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-4@1.2.0': + '@swagger-api/apidom-ns-json-schema-draft-4@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-ast': 1.2.0 - '@swagger-api/apidom-core': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-6@1.2.0': + '@swagger-api/apidom-ns-json-schema-draft-6@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-7@1.2.0': + '@swagger-api/apidom-ns-json-schema-draft-7@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-6': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-2@1.2.0': + '@swagger-api/apidom-ns-openapi-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-openapi-3-0@1.2.0': + '@swagger-api/apidom-ns-openapi-3-0@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-3-1@1.2.0': + '@swagger-api/apidom-ns-openapi-3-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-ast': 1.2.0 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-json-pointer': 1.2.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-json-pointer': 1.3.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.2.0': + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-api-design-systems': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-api-design-systems': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.2.0': + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-api-design-systems': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-api-design-systems': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.2.0': + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-arazzo-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-arazzo-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.2.0': + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-arazzo-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-arazzo-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.2.0': + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.2.0': + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-asyncapi-3': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.2.0': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.2.0': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-asyncapi-3': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-json@1.2.0': + '@swagger-api/apidom-parser-adapter-json@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-ast': 1.2.0 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) @@ -35355,78 +35037,78 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.2.0': + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-openapi-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.2.0': + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.2.0': + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.2.0': + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-openapi-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.2.0': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.2.0': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.2.0': + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-ast': 1.2.0 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -35435,11 +35117,11 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-reference@1.2.0': + '@swagger-api/apidom-reference@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.6 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 axios: 1.12.2 minimatch: 7.4.6 @@ -35447,28 +35129,28 @@ snapshots: ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.2.0 - '@swagger-api/apidom-ns-arazzo-1': 1.2.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.2.0 - '@swagger-api/apidom-ns-openapi-2': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.2.0 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.2.0 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.2.0 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.2.0 - '@swagger-api/apidom-parser-adapter-json': 1.2.0 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.2.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.2.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.2.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.2.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.2.0 + '@swagger-api/apidom-json-pointer': 1.3.0 + '@swagger-api/apidom-ns-arazzo-1': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-ns-openapi-2': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.3.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.3.0 + '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 transitivePeerDependencies: - debug @@ -35480,51 +35162,51 @@ snapshots: dependencies: apg-lite: 1.0.5 - '@swc/core-darwin-arm64@1.15.8': + '@swc/core-darwin-arm64@1.15.11': optional: true - '@swc/core-darwin-x64@1.15.8': + '@swc/core-darwin-x64@1.15.11': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.8': + '@swc/core-linux-arm-gnueabihf@1.15.11': optional: true - '@swc/core-linux-arm64-gnu@1.15.8': + '@swc/core-linux-arm64-gnu@1.15.11': optional: true - '@swc/core-linux-arm64-musl@1.15.8': + '@swc/core-linux-arm64-musl@1.15.11': optional: true - '@swc/core-linux-x64-gnu@1.15.8': + '@swc/core-linux-x64-gnu@1.15.11': optional: true - '@swc/core-linux-x64-musl@1.15.8': + '@swc/core-linux-x64-musl@1.15.11': optional: true - '@swc/core-win32-arm64-msvc@1.15.8': + '@swc/core-win32-arm64-msvc@1.15.11': optional: true - '@swc/core-win32-ia32-msvc@1.15.8': + '@swc/core-win32-ia32-msvc@1.15.11': optional: true - '@swc/core-win32-x64-msvc@1.15.8': + '@swc/core-win32-x64-msvc@1.15.11': optional: true - '@swc/core@1.15.8(@swc/helpers@0.5.18)': + '@swc/core@1.15.11(@swc/helpers@0.5.18)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.8 - '@swc/core-darwin-x64': 1.15.8 - '@swc/core-linux-arm-gnueabihf': 1.15.8 - '@swc/core-linux-arm64-gnu': 1.15.8 - '@swc/core-linux-arm64-musl': 1.15.8 - '@swc/core-linux-x64-gnu': 1.15.8 - '@swc/core-linux-x64-musl': 1.15.8 - '@swc/core-win32-arm64-msvc': 1.15.8 - '@swc/core-win32-ia32-msvc': 1.15.8 - '@swc/core-win32-x64-msvc': 1.15.8 + '@swc/core-darwin-arm64': 1.15.11 + '@swc/core-darwin-x64': 1.15.11 + '@swc/core-linux-arm-gnueabihf': 1.15.11 + '@swc/core-linux-arm64-gnu': 1.15.11 + '@swc/core-linux-arm64-musl': 1.15.11 + '@swc/core-linux-x64-gnu': 1.15.11 + '@swc/core-linux-x64-musl': 1.15.11 + '@swc/core-win32-arm64-msvc': 1.15.11 + '@swc/core-win32-ia32-msvc': 1.15.11 + '@swc/core-win32-x64-msvc': 1.15.11 '@swc/helpers': 0.5.18 '@swc/counter@0.1.3': {} @@ -35543,7 +35225,7 @@ snapshots: '@tanstack/query-core@4.27.0': {} - '@tanstack/query-core@4.41.0': {} + '@tanstack/query-core@4.43.0': {} '@tanstack/query-core@5.76.0': {} @@ -35551,7 +35233,7 @@ snapshots: '@tanstack/query-core@5.77.1': {} - '@tanstack/query-core@5.90.17': {} + '@tanstack/query-core@5.90.20': {} '@tanstack/query-persist-client-core@4.27.0': dependencies: @@ -35564,7 +35246,7 @@ snapshots: '@tanstack/react-query@4.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/query-core': 4.41.0 + '@tanstack/query-core': 4.43.0 '@types/use-sync-external-store': 0.0.3 react: 18.2.0 use-sync-external-store: 1.6.0(react@18.2.0) @@ -35573,7 +35255,7 @@ snapshots: '@tanstack/react-query@4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/query-core': 4.41.0 + '@tanstack/query-core': 4.43.0 '@types/use-sync-external-store': 0.0.3 react: 19.1.0 use-sync-external-store: 1.6.0(react@19.1.0) @@ -35619,7 +35301,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -35630,7 +35312,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -35659,7 +35341,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 @@ -35673,15 +35355,15 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@textlint/ast-node-types@15.5.0': {} + '@textlint/ast-node-types@15.5.1': {} - '@textlint/linter-formatter@15.5.0': + '@textlint/linter-formatter@15.5.1': dependencies: '@azu/format-text': 1.0.2 '@azu/style-format': 1.0.1 - '@textlint/module-interop': 15.5.0 - '@textlint/resolver': 15.5.0 - '@textlint/types': 15.5.0 + '@textlint/module-interop': 15.5.1 + '@textlint/resolver': 15.5.1 + '@textlint/types': 15.5.1 chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) js-yaml: 4.1.1 @@ -35694,13 +35376,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@textlint/module-interop@15.5.0': {} + '@textlint/module-interop@15.5.1': {} - '@textlint/resolver@15.5.0': {} + '@textlint/resolver@15.5.1': {} - '@textlint/types@15.5.0': + '@textlint/types@15.5.1': dependencies: - '@textlint/ast-node-types': 15.5.0 + '@textlint/ast-node-types': 15.5.1 '@tokenizer/token@0.3.0': {} @@ -35748,24 +35430,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/blueimp-md5@2.18.2': {} @@ -35907,7 +35589,7 @@ snapshots: '@types/html-minifier-terser@6.1.0': {} - '@types/http-cache-semantics@4.0.4': {} + '@types/http-cache-semantics@4.2.0': {} '@types/http-errors@2.0.5': {} @@ -36031,7 +35713,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.19.29': + '@types/node@20.19.30': dependencies: undici-types: 6.21.0 @@ -36250,11 +35932,11 @@ snapshots: - webpack-cli optional: true - '@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))': + '@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))': dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -36262,11 +35944,11 @@ snapshots: - webpack-cli optional: true - '@types/webpack@5.28.5(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1)': + '@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1)': dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -36316,11 +35998,11 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10)': + '@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10)': dependencies: - '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - eslint: 6.8.0 + '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + eslint: 9.27.0(jiti@2.6.1) functional-red-black-tree: 1.0.1 regexpp: 3.2.0 tsutils: 3.21.0(typescript@3.9.10) @@ -36329,14 +36011,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.48.2(@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@5.48.2(@typescript-eslint/parser@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@typescript-eslint/parser': 5.48.2(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/type-utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/type-utils': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) ignore: 5.3.2 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -36347,16 +36029,16 @@ snapshots: 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)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.27.0(jiti@2.6.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/type-utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -36367,16 +36049,16 @@ snapshots: 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)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.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/type-utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -36387,15 +36069,15 @@ snapshots: 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)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.27.0(jiti@2.6.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/type-utils': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -36422,23 +36104,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.26.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -36473,62 +36138,62 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@2.34.0(eslint@6.8.0)(typescript@3.9.10)': + '@typescript-eslint/experimental-utils@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10)': dependencies: '@types/json-schema': 7.0.15 '@typescript-eslint/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) eslint-scope: 5.1.1 eslint-utils: 2.1.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10)': + '@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10)': dependencies: '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@3.9.10) + '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) '@typescript-eslint/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) eslint-visitor-keys: 1.3.0 optionalDependencies: typescript: 3.9.10 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/parser@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/types': 5.48.2 '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/parser@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -36546,30 +36211,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.33.1 @@ -36625,53 +36266,42 @@ snapshots: dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@5.48.2(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - '@typescript-eslint/utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@9.27.0(jiti@2.6.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) + '@typescript-eslint/utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.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)': + '@typescript-eslint/type-utils@7.18.0(eslint@9.27.0(jiti@2.6.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) + '@typescript-eslint/utils': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) @@ -36808,72 +36438,61 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.48.2(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/types': 5.48.2 '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.57.1) + eslint-utils: 3.0.0(eslint@9.27.0(jiti@2.6.1)) semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@5.62.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) eslint-scope: 5.1.1 semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.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 + eslint: 9.27.0(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.26.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) @@ -37143,7 +36762,7 @@ snapshots: '@vscode/vsce-sign': 2.0.9 azure-devops-node-api: 12.5.0 chalk: 2.4.2 - cheerio: 1.1.2 + cheerio: 1.2.0 cockatiel: 3.2.1 commander: 6.2.1 form-data: 4.0.5 @@ -37181,7 +36800,7 @@ snapshots: '@vscode/vsce-sign': 2.0.9 azure-devops-node-api: 12.5.0 chalk: 4.1.2 - cheerio: 1.1.2 + cheerio: 1.2.0 cockatiel: 3.2.1 commander: 12.1.0 form-data: 4.0.5 @@ -37356,7 +36975,7 @@ snapshots: '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) optionalDependencies: webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) @@ -37485,19 +37104,19 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.121(zod@3.25.76): + ai@5.0.124(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 2.0.27(zod@3.25.76) + '@ai-sdk/gateway': 2.0.30(zod@3.25.76) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ai@6.0.35(zod@4.1.11): + ai@6.0.67(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 3.0.14(zod@4.1.11) - '@ai-sdk/provider': 3.0.3 - '@ai-sdk/provider-utils': 4.0.6(zod@4.1.11) + '@ai-sdk/gateway': 3.0.32(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) '@opentelemetry/api': 1.9.0 zod: 4.1.11 @@ -37886,10 +37505,10 @@ snapshots: dependencies: tslib: 2.8.1 - autoprefixer@10.4.23(postcss@8.5.6): + autoprefixer@10.4.24(postcss@8.5.6): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001764 + caniuse-lite: 1.0.30001767 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -37898,7 +37517,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001764 + caniuse-db: 1.0.30001767 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -37907,7 +37526,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001764 + caniuse-lite: 1.0.30001767 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -37916,7 +37535,7 @@ snapshots: autoprefixer@9.8.8: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001764 + caniuse-lite: 1.0.30001767 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -37986,13 +37605,13 @@ snapshots: dependencies: '@babel/core': 7.27.7 - babel-eslint@10.1.0(eslint@6.8.0): + babel-eslint@10.1.0(eslint@9.27.0(jiti@2.6.1)): dependencies: - '@babel/code-frame': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - eslint: 6.8.0 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + eslint: 9.27.0(jiti@2.6.1) eslint-visitor-keys: 1.3.0 resolve: 1.22.11 transitivePeerDependencies: @@ -38142,7 +37761,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.104.1): dependencies: @@ -38150,16 +37769,16 @@ snapshots: find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1): dependencies: @@ -38168,14 +37787,14 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1): dependencies: @@ -38252,13 +37871,13 @@ snapshots: babel-plugin-jest-hoist@25.5.0: dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__traverse': 7.28.0 babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -38280,11 +37899,11 @@ snapshots: babel-plugin-named-exports-order@0.0.2: {} - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.27.7): + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.27.7): dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/core': 7.27.7 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.27.7) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -38293,15 +37912,15 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.27.7) - core-js-compat: 3.47.0 + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.7): dependencies: '@babel/core': 7.27.7 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) - core-js-compat: 3.47.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.27.7) + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color @@ -38312,10 +37931,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.27.7): + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.27.7): dependencies: '@babel/core': 7.27.7 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color @@ -38715,7 +38334,7 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.2: + bare-fs@4.5.3: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 @@ -38754,7 +38373,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.14: {} + baseline-browser-mapping@2.9.19: {} basic-auth@2.0.1: dependencies: @@ -38907,19 +38526,19 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001764 - electron-to-chromium: 1.5.267 + caniuse-db: 1.0.30001767 + electron-to-chromium: 1.5.283 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001764 - electron-to-chromium: 1.5.267 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.283 browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.14 - caniuse-lite: 1.0.30001764 - electron-to-chromium: 1.5.267 + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.283 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -39072,7 +38691,7 @@ snapshots: cacheable-request@10.2.14: dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 get-stream: 6.0.1 http-cache-semantics: 4.2.0 keyv: 4.5.4 @@ -39082,7 +38701,7 @@ snapshots: cacheable-request@12.0.1: dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 get-stream: 9.0.1 http-cache-semantics: 4.2.0 keyv: 4.5.4 @@ -39090,13 +38709,13 @@ snapshots: normalize-url: 8.1.1 responselike: 3.0.0 - cacheable@2.3.1: + cacheable@2.3.2: dependencies: '@cacheable/memory': 2.0.7 '@cacheable/utils': 2.3.3 - hookified: 1.15.0 - keyv: 5.5.5 - qified: 0.5.3 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.6.0 call-bind-apply-helpers@1.0.2: dependencies: @@ -39160,20 +38779,20 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001764 + caniuse-db: 1.0.30001767 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001764 + caniuse-lite: 1.0.30001767 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001764: {} + caniuse-db@1.0.30001767: {} - caniuse-lite@1.0.30001764: {} + caniuse-lite@1.0.30001767: {} canvas@3.2.1: dependencies: @@ -39269,8 +38888,6 @@ snapshots: chardet@0.4.2: {} - chardet@0.7.0: {} - check-error@1.0.3: dependencies: get-func-name: 2.0.2 @@ -39286,18 +38903,18 @@ snapshots: domhandler: 5.0.3 domutils: 3.2.2 - cheerio@1.1.2: + cheerio@1.2.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 domutils: 3.2.2 encoding-sniffer: 0.2.1 - htmlparser2: 10.0.0 + htmlparser2: 10.1.0 parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.18.2 + undici: 7.20.0 whatwg-mimetype: 4.0.0 chokidar@1.7.0: @@ -39341,7 +38958,7 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.3.1: {} + ci-info@4.4.0: {} citty@0.1.6: dependencies: @@ -39414,28 +39031,32 @@ snapshots: cli-truncate@5.1.1: dependencies: slice-ansi: 7.1.2 - string-width: 8.1.0 + string-width: 8.1.1 cli-width@2.2.1: {} - cli-width@3.0.0: {} - client-only@0.0.1: {} clipboard-copy@4.0.1: {} + clipboard-image@0.1.0: + dependencies: + run-jxa: 3.0.0 + clipboardy@4.0.0: dependencies: execa: 8.0.1 is-wsl: 3.1.0 is64bit: 2.0.0 - clipboardy@5.0.2: + clipboardy@5.2.0: dependencies: + clipboard-image: 0.1.0 execa: 9.6.1 is-wayland: 0.1.0 is-wsl: 3.1.0 is64bit: 2.0.0 + powershell-utils: 0.2.0 cliui@3.2.0: dependencies: @@ -39615,7 +39236,7 @@ snapshots: commander@13.1.0: {} - commander@14.0.2: {} + commander@14.0.3: {} commander@2.13.0: {} @@ -39745,7 +39366,7 @@ snapshots: schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -39757,15 +39378,15 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 - core-js-compat@3.47.0: + core-js-compat@3.48.0: dependencies: browserslist: 4.28.1 - core-js-pure@3.47.0: {} + core-js-pure@3.48.0: {} core-js@2.6.12: {} - core-js@3.47.0: {} + core-js@3.48.0: {} core-util-is@1.0.2: {} @@ -39778,7 +39399,7 @@ snapshots: transitivePeerDependencies: - debug - cors@2.8.5: + cors@2.8.6: dependencies: object-assign: 4.1.1 vary: 1.1.2 @@ -39866,13 +39487,13 @@ snapshots: dependencies: capture-stack-trace: 1.0.2 - create-jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -39934,6 +39555,10 @@ snapshots: crypto-random-string@2.0.0: {} + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + css-color-names@0.0.4: {} css-declaration-sorter@6.4.1(postcss@8.5.6): @@ -39959,7 +39584,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + css-loader@3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -39974,7 +39599,7 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) css-loader@3.6.0(webpack@5.104.1): dependencies: @@ -39991,7 +39616,7 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) css-loader@5.2.7(webpack@5.104.1): dependencies: @@ -40007,7 +39632,7 @@ snapshots: semver: 7.7.3 webpack: 5.104.1(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)): + css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -40018,9 +39643,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -40031,7 +39656,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) css-loader@6.11.0(webpack@5.104.1): dependencies: @@ -40046,7 +39671,7 @@ snapshots: optionalDependencies: webpack: 5.104.1(webpack-cli@5.1.4) - css-loader@7.1.2(webpack@5.104.1): + css-loader@7.1.3(webpack@5.104.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -40057,7 +39682,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -40305,7 +39930,7 @@ snapshots: decimal.js@10.6.0: {} - decode-named-character-reference@1.2.0: + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -40505,7 +40130,7 @@ snapshots: dependencies: dequal: 2.0.3 - dexie@4.2.1: {} + dexie@4.3.0: {} diagnostic-channel-publishers@0.3.5(diagnostic-channel@0.2.0): dependencies: @@ -40685,7 +40310,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.267: {} + electron-to-chromium@1.5.283: {} email-addresses@5.0.0: {} @@ -40697,8 +40322,6 @@ snapshots: emoji-regex@10.6.0: {} - emoji-regex@7.0.3: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -40756,6 +40379,8 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} envinfo@7.21.0: {} @@ -40897,7 +40522,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.43.0: {} + es-toolkit@1.44.0: {} es5-ext@0.10.64: dependencies: @@ -41008,23 +40633,23 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@6.15.0(eslint@6.8.0): + eslint-config-prettier@6.15.0(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) get-stdin: 6.0.0 - eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@6.8.0))(eslint-plugin-flowtype@3.13.0(eslint@6.8.0))(eslint-plugin-import@2.32.0(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@6.8.0))(eslint@6.8.0): + eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)): dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - babel-eslint: 10.1.0(eslint@6.8.0) + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + babel-eslint: 10.1.0(eslint@9.27.0(jiti@2.6.1)) confusing-browser-globals: 1.0.11 - eslint: 6.8.0 - eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) - eslint-plugin-import: 2.32.0(eslint@6.8.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) - eslint-plugin-react: 7.37.5(eslint@6.8.0) - eslint-plugin-react-hooks: 2.5.1(eslint@6.8.0) + eslint: 9.27.0(jiti@2.6.1) + eslint-plugin-flowtype: 3.13.0(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 2.5.1(eslint@9.27.0(jiti@2.6.1)) eslint-import-resolver-node@0.3.9: dependencies: @@ -41032,18 +40657,18 @@ snapshots: is-core-module: 2.16.1 resolve: 1.22.11 - eslint-module-utils@2.12.1(eslint@6.8.0): + eslint-module-utils@2.12.1(eslint@9.27.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) - eslint-plugin-flowtype@3.13.0(eslint@6.8.0): + eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) lodash: 4.17.23 - eslint-plugin-import@2.32.0(eslint@6.8.0): + eslint-plugin-import@2.32.0(eslint@9.27.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -41052,9 +40677,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint@6.8.0) + eslint-module-utils: 2.12.1(eslint@9.27.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -41066,7 +40691,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -41076,7 +40701,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -41085,43 +40710,31 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@6.8.0))(eslint@6.8.0)(prettier@1.19.1): + eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1))(prettier@1.19.1): dependencies: - eslint: 6.8.0 + eslint: 9.27.0(jiti@2.6.1) prettier: 1.19.1 prettier-linter-helpers: 1.0.1 optionalDependencies: - eslint-config-prettier: 6.15.0(eslint@6.8.0) - - eslint-plugin-react-hooks@2.5.1(eslint@6.8.0): - dependencies: - eslint: 6.8.0 - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 + eslint-config-prettier: 6.15.0(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + eslint-plugin-react-hooks@2.5.1(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) - eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.6.1)): + eslint-plugin-react-hooks@4.6.2(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 9.26.0(jiti@2.6.1) + eslint: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.6.1)): dependencies: eslint: 9.27.0(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.26(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.26(eslint@9.27.0(jiti@2.6.1)): dependencies: eslint: 9.27.0(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@6.8.0): + eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -41129,29 +40742,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - 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.2 - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -41165,23 +40756,17 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.8.0(eslint@8.57.1)(typescript@5.8.3): + eslint-plugin-storybook@0.8.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3): dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 5.62.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.27.0(jiti@2.6.1) requireindex: 1.2.0 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1)): - dependencies: - eslint: 9.26.0(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)): dependencies: eslint: 9.27.0(jiti@2.6.1) @@ -41193,27 +40778,18 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@1.4.3: - dependencies: - eslint-visitor-keys: 1.3.0 - eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 - eslint-utils@3.0.0(eslint@8.57.1): + eslint-utils@3.0.0(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 8.57.1 + eslint: 9.27.0(jiti@2.6.1) eslint-visitor-keys: 2.1.0 eslint-visitor-keys@1.3.0: {} @@ -41224,137 +40800,6 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@6.8.0: - dependencies: - '@babel/code-frame': 7.28.6 - ajv: 6.12.6 - chalk: 2.4.2 - cross-spawn: 6.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - eslint-scope: 5.1.1 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.7.0 - esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 12.4.0 - ignore: 4.0.6 - import-fresh: 3.3.1 - imurmurhash: 0.1.4 - inquirer: 7.3.3 - is-glob: 4.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.23 - minimatch: 3.1.2 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.1 - strip-ansi: 5.2.0 - strip-json-comments: 3.1.1 - table: 5.4.6 - text-table: 0.2.0 - v8-compile-cache: 2.4.0 - transitivePeerDependencies: - - supports-color - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - eslint@9.26.0(jiti@2.6.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.13.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.25.2 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - zod: 3.25.76 - optionalDependencies: - jiti: 2.6.1 - transitivePeerDependencies: - - '@cfworker/json-schema' - - hono - - supports-color - eslint@9.27.0(jiti@2.6.1): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) @@ -41410,18 +40855,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@6.2.1: - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 - - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@2.7.3: {} esprima@4.0.1: {} @@ -41442,8 +40875,8 @@ snapshots: estree-to-babel@3.2.1: dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -41480,7 +40913,7 @@ snapshots: eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} events-universal@1.0.1: dependencies: @@ -41727,18 +41160,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - extract-text-webpack-plugin@3.0.2(webpack@5.104.1): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -41803,7 +41230,7 @@ snapshots: fast-uri@3.1.0: {} - fast-xml-parser@5.2.5: + fast-xml-parser@5.3.4: dependencies: strnum: 2.1.2 @@ -41888,17 +41315,9 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - file-entry-cache@11.1.1: - dependencies: - flat-cache: 6.1.19 - - file-entry-cache@5.0.1: - dependencies: - flat-cache: 2.0.1 - - file-entry-cache@6.0.1: + file-entry-cache@11.1.2: dependencies: - flat-cache: 3.2.0 + flat-cache: 6.1.20 file-entry-cache@8.0.0: dependencies: @@ -41914,19 +41333,19 @@ snapshots: dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) file-loader@6.2.0(webpack@5.104.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -42068,12 +41487,6 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 - flat-cache@2.0.1: - dependencies: - flatted: 2.0.2 - rimraf: 2.6.3 - write: 1.0.3 - flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -42085,21 +41498,19 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.19: + flat-cache@6.1.20: dependencies: - cacheable: 2.3.1 + cacheable: 2.3.2 flatted: 3.3.3 - hookified: 1.15.0 + hookified: 1.15.1 flat@5.0.2: {} - flatted@2.0.2: {} - flatted@3.3.3: {} flatten@1.0.3: {} - flow-parser@0.296.1: {} + flow-parser@0.299.0: {} flush-write-stream@1.1.1: dependencies: @@ -42145,11 +41556,11 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 2.4.2 micromatch: 4.0.8 minimatch: 3.1.2 @@ -42157,29 +41568,9 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1): - dependencies: - '@babel/code-frame': 7.28.6 - '@types/json-schema': 7.0.15 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 6.0.0 - deepmerge: 4.3.1 - fs-extra: 9.1.0 - glob: 7.2.3 - memfs: 3.5.3 - minimatch: 3.1.2 - schema-utils: 2.7.0 - semver: 7.7.3 - tapable: 1.1.3 - typescript: 5.8.3 - webpack: 5.104.1(webpack-cli@5.1.4) - optionalDependencies: - eslint: 9.26.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -42197,9 +41588,9 @@ snapshots: optionalDependencies: eslint: 9.27.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -42213,13 +41604,13 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: eslint: 9.27.0(jiti@2.6.1) fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -42233,13 +41624,13 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: eslint: 9.27.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -42252,11 +41643,11 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -42269,11 +41660,11 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -42290,7 +41681,7 @@ snapshots: fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 4.0.3 cosmiconfig: 8.3.6(typescript@5.8.3) @@ -42303,7 +41694,7 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -42428,7 +41819,7 @@ snapshots: fsevents@1.2.13: dependencies: bindings: 1.5.0 - nan: 2.24.0 + nan: 2.25.0 optional: true fsevents@2.3.2: @@ -42708,14 +42099,6 @@ snapshots: min-document: 2.19.2 process: 0.11.10 - globals@12.4.0: - dependencies: - type-fest: 0.8.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} globals@9.18.0: {} @@ -42930,7 +42313,7 @@ snapshots: hashery@1.4.0: dependencies: - hookified: 1.15.0 + hookified: 1.15.1 hasown@2.0.2: dependencies: @@ -43024,7 +42407,7 @@ snapshots: mdast-util-to-hast: 13.2.1 parse5: 7.3.0 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -43129,7 +42512,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.15.0: {} + hookified@1.15.1: {} hosted-git-info@2.8.9: {} @@ -43182,7 +42565,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.44.1 + terser: 5.46.0 html-minifier@3.5.21: dependencies: @@ -43214,9 +42597,9 @@ snapshots: lodash: 4.17.23 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + html-webpack-plugin@4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -43227,7 +42610,7 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) html-webpack-plugin@4.5.2(webpack@5.104.1): dependencies: @@ -43240,9 +42623,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@5.6.5(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)): + html-webpack-plugin@5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -43250,9 +42633,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - html-webpack-plugin@5.6.5(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + html-webpack-plugin@5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -43260,9 +42643,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@5.6.5(webpack@5.104.1): + html-webpack-plugin@5.6.6(webpack@5.104.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -43270,14 +42653,14 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - htmlparser2@10.0.0: + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 - entities: 6.0.1 + entities: 7.0.1 htmlparser2@6.1.0: dependencies: @@ -43290,12 +42673,13 @@ snapshots: http-deceiver@1.2.7: {} - http-errors@1.6.3: + http-errors@1.8.1: dependencies: depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 statuses: 1.5.0 + toidentifier: 1.0.1 http-errors@2.0.1: dependencies: @@ -43540,22 +42924,6 @@ snapshots: strip-ansi: 4.0.0 through: 2.3.8 - inquirer@7.3.3: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.23 - 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 @@ -44007,7 +43375,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -44017,7 +43385,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.3 @@ -44252,16 +43620,16 @@ snapshots: - supports-color - utf-8-validate - jest-cli@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -44271,15 +43639,15 @@ snapshots: - supports-color - ts-node - jest-cli@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + jest-cli@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 30.2.0 jest-validate: 30.2.0 yargs: 17.7.2 @@ -44344,7 +43712,7 @@ snapshots: - supports-color - utf-8-validate - jest-config@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@babel/core': 7.27.7 '@jest/test-sequencer': 29.7.0 @@ -44370,12 +43738,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.15.35 - ts-node: 10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + jest-config@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@babel/core': 7.27.7 '@jest/get-type': 30.1.0 @@ -44384,7 +43752,7 @@ snapshots: '@jest/types': 30.2.0 babel-jest: 30.2.0(@babel/core@7.27.7) chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 deepmerge: 4.3.1 glob: 10.5.0 graceful-fs: 4.2.11 @@ -44404,7 +43772,7 @@ snapshots: optionalDependencies: '@types/node': 22.15.35 esbuild-register: 3.6.0(esbuild@0.25.12) - ts-node: 10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -44669,7 +44037,7 @@ snapshots: jest-jasmine2@25.5.4: dependencies: - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -44754,7 +44122,7 @@ snapshots: jest-message-util@22.4.3: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 2.4.2 micromatch: 4.0.8 slash: 1.0.0 @@ -44762,7 +44130,7 @@ snapshots: jest-message-util@25.5.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@jest/types': 25.5.0 '@types/stack-utils': 1.0.1 chalk: 3.0.0 @@ -44773,7 +44141,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -44785,7 +44153,7 @@ snapshots: jest-message-util@30.2.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -45124,7 +44492,7 @@ snapshots: jest-snapshot@25.5.1: dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -45143,10 +44511,10 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.6 + '@babel/generator': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -45168,10 +44536,10 @@ snapshots: jest-snapshot@30.2.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.6 + '@babel/generator': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@jest/expect-utils': 30.2.0 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.2.0 @@ -45242,7 +44610,7 @@ snapshots: '@jest/types': 30.2.0 '@types/node': 22.15.35 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 graceful-fs: 4.2.11 picomatch: 4.0.3 @@ -45381,24 +44749,24 @@ snapshots: - supports-color - utf-8-validate - jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest-cli: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -45443,7 +44811,7 @@ snapshots: jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)): dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.27.7) @@ -45454,7 +44822,7 @@ snapshots: '@babel/register': 7.28.6(@babel/core@7.27.7) babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) chalk: 4.1.2 - flow-parser: 0.296.1 + flow-parser: 0.299.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -45722,7 +45090,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.5: + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -45764,7 +45132,7 @@ snapshots: dependencies: '@babel/runtime': 7.28.6 app-root-dir: 1.0.2 - core-js: 3.47.0 + core-js: 3.48.0 dotenv: 8.6.0 dotenv-expand: 5.1.0 @@ -45816,7 +45184,7 @@ snapshots: lint-staged@16.2.7: dependencies: - commander: 14.0.2 + commander: 14.0.3 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 @@ -45830,7 +45198,7 @@ snapshots: dependencies: cli-truncate: 5.1.1 colorette: 2.0.20 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.2 @@ -46036,7 +45404,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.4: {} + lru-cache@11.2.5: {} lru-cache@4.1.5: dependencies: @@ -46065,6 +45433,10 @@ snapshots: lz-string@1.5.0: {} + macos-version@6.0.0: + dependencies: + semver: 7.7.3 + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -46205,7 +45577,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -46365,7 +45737,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -46377,7 +45749,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@1.1.0: {} @@ -46411,8 +45783,16 @@ snapshots: dependencies: fs-monkey: 1.1.0 - memfs@4.51.1: + memfs@4.56.10: dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) @@ -46496,7 +45876,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -46709,7 +46089,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -46757,7 +46137,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.3(supports-color@8.1.1) - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -46822,7 +46202,7 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.4(webpack@5.104.1): + mini-css-extract-plugin@2.10.0(webpack@5.104.1): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 @@ -47004,13 +46384,13 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - monaco-page-objects@3.14.1(selenium-webdriver@4.39.0)(typescript@5.8.3): + monaco-page-objects@3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3): dependencies: clipboardy: 4.0.0 clone-deep: 4.0.1 compare-versions: 6.1.1 fs-extra: 11.3.3 - selenium-webdriver: 4.39.0 + selenium-webdriver: 4.40.0 type-fest: 4.41.0 typescript: 5.8.3 @@ -47050,7 +46430,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.24.0: {} + nan@2.25.0: {} nano-spawn@2.0.0: {} @@ -47099,7 +46479,7 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.85.0: + node-abi@3.87.0: dependencies: semver: 7.7.3 @@ -47695,7 +47075,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -47706,14 +47086,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 index-to-position: 1.2.0 type-fest: 4.41.0 @@ -47786,7 +47166,7 @@ snapshots: path-scurry@2.0.1: dependencies: - lru-cache: 11.2.4 + lru-cache: 11.2.5 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -48081,13 +47461,13 @@ snapshots: postcss-load-options: 1.2.0 postcss-load-plugins: 2.3.0 - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2): dependencies: @@ -48114,7 +47494,7 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -48122,7 +47502,7 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1): dependencies: @@ -48132,7 +47512,7 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1): dependencies: @@ -48480,6 +47860,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.2.0: {} + prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -48488,7 +47870,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.85.0 + node-abi: 3.87.0 pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 @@ -48663,7 +48045,7 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-gapcursor@1.4.0: dependencies: @@ -48675,21 +48057,21 @@ snapshots: prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-view: 1.41.5 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.2: + prosemirror-markdown@1.13.3: dependencies: '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 @@ -48707,15 +48089,15 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-view: 1.41.5 - prosemirror-transform@1.10.5: + prosemirror-transform@1.11.0: dependencies: prosemirror-model: 1.25.4 @@ -48723,7 +48105,7 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 protobufjs@7.5.4: dependencies: @@ -48808,9 +48190,9 @@ snapshots: q@1.5.1: {} - qified@0.5.3: + qified@0.6.0: dependencies: - hookified: 1.15.0 + hookified: 1.15.1 qs@6.14.1: dependencies: @@ -48870,17 +48252,17 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + raw-loader@4.0.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) raw-loader@4.0.2(webpack@5.104.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -48984,7 +48366,7 @@ snapshots: react-docgen@5.4.3: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.6 + '@babel/generator': 7.29.0 '@babel/runtime': 7.28.6 ast-types: 0.14.2 commander: 2.20.3 @@ -48999,8 +48381,8 @@ snapshots: react-docgen@7.1.1: dependencies: '@babel/core': 7.27.7 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -49168,7 +48550,7 @@ snapshots: react-is@18.3.1: {} - react-is@19.2.3: {} + react-is@19.2.4: {} react-json-view-lite@2.5.0(react@18.2.0): dependencies: @@ -49215,7 +48597,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -49232,7 +48614,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -49341,7 +48723,7 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - react-scripts-ts@3.1.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): + react-scripts-ts@3.1.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): dependencies: autoprefixer: 7.1.6 babel-jest: 20.0.3 @@ -49377,7 +48759,7 @@ snapshots: typescript: 5.8.3 uglifyjs-webpack-plugin: 1.2.5(webpack@5.104.1) url-loader: 0.6.2(file-loader@1.1.5(webpack@5.104.1)) - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) webpack-manifest-plugin: 1.3.2(webpack@5.104.1) whatwg-fetch: 2.0.3 @@ -49500,10 +48882,10 @@ snapshots: react: 18.2.0 refractor: 3.6.0 - react-test-renderer@19.1.4(react@18.2.0): + react-test-renderer@19.1.5(react@18.2.0): dependencies: react: 18.2.0 - react-is: 19.2.3 + react-is: 19.2.4 scheduler: 0.26.0 react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): @@ -49751,8 +49133,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpp@2.0.1: {} - regexpp@3.2.0: {} regexpu-core@2.0.0: @@ -50078,16 +49458,16 @@ snapshots: glob: 11.1.0 package-json-from-dist: 1.0.1 - rollup-plugin-import-css@3.5.8(rollup@4.55.1): + rollup-plugin-import-css@3.5.8(rollup@4.57.1): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) - rollup: 4.55.1 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + rollup: 4.57.1 - rollup-plugin-peer-deps-external@2.2.4(rollup@4.55.1): + rollup-plugin-peer-deps-external@2.2.4(rollup@4.57.1): dependencies: - rollup: 4.55.1 + rollup: 4.57.1 - rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): + rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -50096,7 +49476,7 @@ snapshots: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) postcss-modules: 4.3.1(postcss@8.5.6) promise.series: 0.2.0 resolve: 1.22.11 @@ -50124,7 +49504,7 @@ snapshots: rollup-plugin-terser@5.3.1(rollup@1.32.1): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 jest-worker: 24.9.0 rollup: 1.32.1 rollup-pluginutils: 2.8.2 @@ -50141,12 +49521,12 @@ snapshots: tslib: 2.0.1 typescript: 3.9.10 - rollup-plugin-typescript2@0.36.0(rollup@4.55.1)(typescript@5.8.3): + rollup-plugin-typescript2@0.36.0(rollup@4.57.1)(typescript@5.8.3): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 4.55.1 + rollup: 4.57.1 semver: 7.7.3 tslib: 2.8.1 typescript: 5.8.3 @@ -50166,35 +49546,35 @@ snapshots: '@types/node': 22.15.35 acorn: 7.4.1 - rollup@4.55.1: + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.1 - '@rollup/rollup-android-arm64': 4.55.1 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-freebsd-arm64': 4.55.1 - '@rollup/rollup-freebsd-x64': 4.55.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-arm64-musl': 4.55.1 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 - '@rollup/rollup-linux-loong64-musl': 4.55.1 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-musl': 4.55.1 - '@rollup/rollup-openbsd-x64': 4.55.1 - '@rollup/rollup-openharmony-arm64': 4.55.1 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 - '@rollup/rollup-win32-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -50215,6 +49595,13 @@ snapshots: run-async@2.4.1: {} + run-jxa@3.0.0: + dependencies: + execa: 5.1.1 + macos-version: 6.0.0 + subsume: 4.0.0 + type-fest: 2.19.0 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -50229,10 +49616,6 @@ snapshots: rx-lite@4.0.8: {} - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 - rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -50296,27 +49679,27 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@13.3.3(sass@1.97.2)(webpack@5.104.1): + sass-loader@13.3.3(sass@1.97.3)(webpack@5.104.1): dependencies: neo-async: 2.6.2 webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - sass: 1.97.2 + sass: 1.97.3 - sass-loader@16.0.6(sass@1.97.2)(webpack@5.104.1): + sass-loader@16.0.6(sass@1.97.3)(webpack@5.104.1): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.97.2 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + sass: 1.97.3 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - sass@1.97.2: + sass@1.97.3: dependencies: chokidar: 4.0.3 immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.4 + '@parcel/watcher': 2.5.6 sax@1.2.4: {} @@ -50386,7 +49769,7 @@ snapshots: select-hose@2.0.0: {} - selenium-webdriver@4.39.0: + selenium-webdriver@4.40.0: dependencies: '@bazel/runfiles': 6.5.0 jszip: 3.10.1 @@ -50481,13 +49864,13 @@ snapshots: path-to-regexp: 3.3.0 range-parser: 1.2.0 - serve-index@1.9.1: + serve-index@1.9.2: dependencies: accepts: 1.3.8 batch: 0.6.1 debug: 2.6.9 escape-html: 1.0.3 - http-errors: 1.6.3 + http-errors: 1.8.1 mime-types: 2.1.35 parseurl: 1.3.3 @@ -50540,8 +49923,6 @@ snapshots: setimmediate@1.0.5: {} - setprototypeof@1.1.0: {} - setprototypeof@1.2.0: {} sha.js@2.4.12: @@ -50653,12 +50034,6 @@ snapshots: slash@5.1.0: {} - slice-ansi@2.1.0: - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 @@ -50959,12 +50334,6 @@ snapshots: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 - string-width@3.1.0: - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -50983,7 +50352,7 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 - string-width@8.1.0: + string-width@8.1.1: dependencies: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -51144,11 +50513,11 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + style-loader@1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) style-loader@1.3.0(webpack@5.104.1): dependencies: @@ -51160,15 +50529,15 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)): + style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) style-loader@3.3.4(webpack@5.104.1): dependencies: @@ -51176,7 +50545,7 @@ snapshots: style-loader@4.0.0(webpack@5.104.1): dependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) style-mod@4.1.3: {} @@ -51215,7 +50584,7 @@ snapshots: stylelint@16.26.1(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-syntax-patches-for-csstree': 1.0.25 + '@csstools/css-syntax-patches-for-csstree': 1.0.26 '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) @@ -51228,7 +50597,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 11.1.1 + file-entry-cache: 11.1.2 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -51263,6 +50632,11 @@ snapshots: dependencies: minimist: 1.2.8 + subsume@4.0.0: + dependencies: + escape-string-regexp: 5.0.0 + unique-string: 3.0.0 + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -51318,7 +50692,7 @@ snapshots: svg-url-loader@8.0.0(webpack@5.104.1): dependencies: file-loader: 6.2.0(webpack@5.104.1) - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: @@ -51382,7 +50756,7 @@ snapshots: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -51402,15 +50776,15 @@ snapshots: path-to-regexp: 1.9.0 serviceworker-cache-polyfill: 4.0.0 - swagger-client@3.36.0: + swagger-client@3.36.1: dependencies: - '@babel/runtime-corejs3': 7.28.6 + '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.2.0 - '@swagger-api/apidom-error': 1.2.0 - '@swagger-api/apidom-json-pointer': 1.2.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.2.0 - '@swagger-api/apidom-reference': 1.2.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-json-pointer': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-reference': 1.3.0 '@swaggerexpert/cookie': 2.0.2 deepmerge: 4.3.1 fast-json-patch: 3.1.1 @@ -51427,7 +50801,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.6 + '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -51457,7 +50831,7 @@ snapshots: reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.36.0 + swagger-client: 3.36.1 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 @@ -51468,7 +50842,7 @@ snapshots: swagger-ui-react@5.22.0(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime-corejs3': 7.28.6 + '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -51498,7 +50872,7 @@ snapshots: reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.36.0 + swagger-client: 3.36.1 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 @@ -51507,15 +50881,15 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.7(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - swc-loader@0.2.7(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1): dependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 webpack: 5.104.1(webpack-cli@5.1.4) @@ -51543,13 +50917,6 @@ snapshots: tabbable@6.4.0: {} - table@5.4.6: - dependencies: - ajv: 6.12.6 - lodash: 4.17.23 - slice-ansi: 2.1.0 - string-width: 3.1.0 - table@6.9.0: dependencies: ajv: 8.17.1 @@ -51558,7 +50925,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwind-merge@2.6.0: {} + tailwind-merge@2.6.1: {} tailwindcss@3.4.19(yaml@2.8.2): dependencies: @@ -51601,7 +50968,7 @@ snapshots: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.5.2 + bare-fs: 4.5.3 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller @@ -51690,7 +51057,7 @@ snapshots: ansi-escapes: 7.2.0 supports-hyperlinks: 3.2.0 - terser-webpack-plugin@4.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + terser-webpack-plugin@4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -51699,8 +51066,8 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.44.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-sources: 1.4.3 terser-webpack-plugin@4.2.3(webpack@5.104.1): @@ -51712,43 +51079,43 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.44.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) esbuild: 0.25.12 - terser-webpack-plugin@5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) - terser-webpack-plugin@5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.1 + terser: 5.46.0 webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) terser@4.8.1: dependencies: @@ -51756,7 +51123,7 @@ snapshots: source-map: 0.6.1 source-map-support: 0.5.21 - terser@5.44.1: + terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -52022,12 +51389,12 @@ snapshots: typescript: 3.9.10 yargs-parser: 18.1.3 - ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -52042,12 +51409,12 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.27.7) - ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) + jest: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -52092,7 +51459,7 @@ snapshots: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 - ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.18)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -52110,9 +51477,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) - ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -52130,7 +51497,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.8(@swc/helpers@0.5.18) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) optional: true ts-pnp@1.2.0(typescript@4.9.5): @@ -52161,25 +51528,25 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdx@0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35): + tsdx@0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35)(jiti@2.6.1): dependencies: '@babel/core': 7.27.7 '@babel/helper-module-imports': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.7)(@types/babel__core@7.20.5)(rollup@1.32.1) '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) '@rollup/plugin-json': 4.1.0(rollup@1.32.1) '@rollup/plugin-node-resolve': 9.0.0(rollup@1.32.1) '@rollup/plugin-replace': 2.4.2(rollup@1.32.1) '@types/jest': 25.2.3 - '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) ansi-escapes: 4.3.2 asyncro: 3.0.0 - babel-eslint: 10.1.0(eslint@6.8.0) + babel-eslint: 10.1.0(eslint@9.27.0(jiti@2.6.1)) babel-plugin-annotate-pure-calls: 0.4.0(@babel/core@7.27.7) babel-plugin-dev-expression: 0.2.3(@babel/core@7.27.7) babel-plugin-macros: 2.8.0 @@ -52188,15 +51555,15 @@ snapshots: camelcase: 6.3.0 chalk: 4.1.2 enquirer: 2.4.1 - eslint: 6.8.0 - eslint-config-prettier: 6.15.0(eslint@6.8.0) - eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@6.8.0))(eslint-plugin-flowtype@3.13.0(eslint@6.8.0))(eslint-plugin-import@2.32.0(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@6.8.0))(eslint@6.8.0) - eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) - eslint-plugin-import: 2.32.0(eslint@6.8.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) - eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0(eslint@6.8.0))(eslint@6.8.0)(prettier@1.19.1) - eslint-plugin-react: 7.37.5(eslint@6.8.0) - eslint-plugin-react-hooks: 2.5.1(eslint@6.8.0) + eslint: 9.27.0(jiti@2.6.1) + eslint-config-prettier: 6.15.0(eslint@9.27.0(jiti@2.6.1)) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-flowtype: 3.13.0(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1))(prettier@1.19.1) + eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 2.5.1(eslint@9.27.0(jiti@2.6.1)) execa: 4.1.0 fs-extra: 9.1.0 jest: 25.5.4 @@ -52224,6 +51591,7 @@ snapshots: - '@types/node' - bufferutil - canvas + - jiti - supports-color - utf-8-validate @@ -52271,7 +51639,7 @@ snapshots: tslint@5.20.1(typescript@5.8.3): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -52288,7 +51656,7 @@ snapshots: tslint@6.1.3(typescript@4.9.5): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -52305,7 +51673,7 @@ snapshots: tslint@6.1.3(typescript@5.8.3): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -52362,14 +51730,14 @@ snapshots: dependencies: bindings: 1.5.0 bufferstreams: 1.1.3 - nan: 2.24.0 + nan: 2.25.0 node-gyp: 3.8.0 ttf2woff2@5.0.0: dependencies: bindings: 1.5.0 bufferstreams: 3.0.0 - nan: 2.24.0 + nan: 2.25.0 node-gyp: 9.4.1 transitivePeerDependencies: - supports-color @@ -52517,7 +51885,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -52534,7 +51902,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.18.2: {} + undici@7.20.0: {} unfetch@4.2.0: {} @@ -52623,6 +51991,10 @@ snapshots: dependencies: crypto-random-string: 2.0.0 + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + unist-builder@2.0.3: {} unist-util-generated@1.1.6: {} @@ -52690,7 +52062,7 @@ snapshots: unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - unist-util-visit@5.0.0: + unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.1 @@ -52809,21 +52181,21 @@ snapshots: mime: 1.6.0 schema-utils: 0.3.0 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: file-loader: 6.2.0(webpack@5.104.1) @@ -52962,8 +52334,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-compile-cache@2.4.0: {} - v8-to-istanbul@4.1.4: dependencies: '@types/istanbul-lib-coverage': 2.0.6 @@ -53019,20 +52389,20 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.2)(terser@5.44.1)(yaml@2.8.2): + vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.55.1 + rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.15.35 fsevents: 2.3.3 jiti: 2.6.1 - sass: 1.97.2 - terser: 5.44.1 + sass: 1.97.3 + terser: 5.46.0 yaml: 2.8.2 vscode-debugadapter-testsupport@1.51.0: @@ -53050,10 +52420,10 @@ snapshots: dependencies: applicationinsights: 1.7.4 - vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.39.0)(typescript@5.8.3))(selenium-webdriver@4.39.0): + vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0): dependencies: - monaco-page-objects: 3.14.1(selenium-webdriver@4.39.0)(typescript@5.8.3) - selenium-webdriver: 4.39.0 + monaco-page-objects: 3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3) + selenium-webdriver: 4.40.0 vscode-extension-tester@5.10.0(mocha@10.8.2)(typescript@5.8.3): dependencies: @@ -53067,13 +52437,13 @@ snapshots: hpagent: 1.2.0 js-yaml: 4.1.1 mocha: 10.8.2 - monaco-page-objects: 3.14.1(selenium-webdriver@4.39.0)(typescript@5.8.3) + monaco-page-objects: 3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3) sanitize-filename: 1.6.3 - selenium-webdriver: 4.39.0 + selenium-webdriver: 4.40.0 targz: 1.0.1 typescript: 5.8.3 unzipper: 0.10.14 - vscode-extension-tester-locators: 3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.39.0)(typescript@5.8.3))(selenium-webdriver@4.39.0) + vscode-extension-tester-locators: 3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -53084,8 +52454,8 @@ snapshots: vscode-extension-tester@8.14.1(mocha@11.7.5)(typescript@5.8.3): dependencies: - '@redhat-developer/locators': 1.18.1(@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.39.0)(typescript@5.8.3))(selenium-webdriver@4.39.0) - '@redhat-developer/page-objects': 1.18.1(selenium-webdriver@4.39.0)(typescript@5.8.3) + '@redhat-developer/locators': 1.18.1(@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0) + '@redhat-developer/page-objects': 1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3) '@types/selenium-webdriver': 4.35.5 '@vscode/vsce': 3.7.1 c8: 10.1.3 @@ -53099,7 +52469,7 @@ snapshots: js-yaml: 4.1.1 mocha: 11.7.5 sanitize-filename: 1.6.3 - selenium-webdriver: 4.39.0 + selenium-webdriver: 4.40.0 targz: 1.0.1 typescript: 5.8.3 unzipper: 0.12.3 @@ -53224,7 +52594,7 @@ snapshots: watch@0.10.0: {} - watchpack@2.5.0: + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -53349,7 +52719,7 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) @@ -53371,13 +52741,13 @@ snapshots: webpack: 5.104.1(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + webpack-dev-middleware@3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-log: 2.0.0 webpack-dev-middleware@3.7.3(webpack@5.104.1): @@ -53386,7 +52756,7 @@ snapshots: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-log: 2.0.0 webpack-dev-middleware@4.3.0(webpack@5.104.1): @@ -53397,9 +52767,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)): + webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -53407,9 +52777,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -53417,7 +52787,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-dev-middleware@6.1.3(webpack@5.104.1): dependencies: @@ -53429,22 +52799,22 @@ snapshots: optionalDependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.5(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + webpack-dev-middleware@7.4.5(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 - memfs: 4.51.1 + memfs: 4.56.10 mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optional: true webpack-dev-middleware@7.4.5(webpack@5.104.1): dependencies: colorette: 2.0.20 - memfs: 4.51.1 + memfs: 4.56.10 mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 @@ -53477,7 +52847,7 @@ snapshots: p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 5.5.0 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) @@ -53517,7 +52887,7 @@ snapshots: p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 5.5.0 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) @@ -53556,13 +52926,13 @@ snapshots: p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 5.5.0 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil @@ -53570,7 +52940,7 @@ snapshots: - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -53595,13 +52965,13 @@ snapshots: p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 5.5.0 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) + webpack-dev-middleware: 7.4.5(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - bufferutil - debug @@ -53634,7 +53004,7 @@ snapshots: p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 5.5.0 - serve-index: 1.9.1 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) @@ -53647,13 +53017,13 @@ snapshots: - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))): + webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1): dependencies: - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -53670,7 +53040,7 @@ snapshots: dependencies: fs-extra: 0.30.0 lodash: 4.17.23 - webpack: 5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -53705,7 +53075,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18)): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53729,15 +53099,15 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53761,15 +53131,15 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.25.12)) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@5.1.4): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53793,8 +53163,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 5.1.4(webpack@5.104.1) @@ -53803,7 +53173,7 @@ snapshots: - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack-cli@6.0.1): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53827,8 +53197,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) @@ -53861,8 +53231,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) @@ -53895,8 +53265,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 5.1.4(webpack@5.104.1) @@ -53929,8 +53299,8 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.8(@swc/helpers@0.5.18))(webpack@5.104.1) - watchpack: 2.5.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 6.0.1(webpack@5.104.1) @@ -54162,10 +53532,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - write@1.0.3: - dependencies: - mkdirp: 0.5.6 - ws@5.2.4: dependencies: async-limiter: 1.0.1 @@ -54380,13 +53746,13 @@ snapshots: zod@4.1.11: {} - zustand@5.0.10(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)): + zustand@5.0.11(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)): optionalDependencies: '@types/react': 18.2.0 react: 18.2.0 use-sync-external-store: 1.6.0(react@18.2.0) - zustand@5.0.10(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): + zustand@5.0.11(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): optionalDependencies: '@types/react': 18.2.0 react: 19.1.0 diff --git a/workspaces/ballerina/overview-view/package.json b/workspaces/ballerina/overview-view/package.json index 530fd88882d..2f7a406e84b 100644 --- a/workspaces/ballerina/overview-view/package.json +++ b/workspaces/ballerina/overview-view/package.json @@ -28,7 +28,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "copyfiles": "^2.4.1", - "eslint": "^8.57.1", + "eslint": "^9.26.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "typescript": "5.8.3" diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 5c777e1bc92..c54128c4132 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -188,7 +188,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^8.32.1", "@vscode/test-electron": "^2.5.2", - "eslint": "^8.57.1", + "eslint": "^9.26.0", "glob": "^11.1.0", "mocha": "^11.2.2", "typescript": "5.8.3", diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index 7ec4e229c3b..92be9e87fbb 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -56,7 +56,7 @@ "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", "copyfiles": "~2.4.1", - "eslint": "^8.57.1", + "eslint": "^9.26.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-storybook": "^0.8.0", diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/package.json b/workspaces/mcp-inspector/mcp-inspector-extension/package.json index b410d3ac893..6fce5621092 100644 --- a/workspaces/mcp-inspector/mcp-inspector-extension/package.json +++ b/workspaces/mcp-inspector/mcp-inspector-extension/package.json @@ -75,7 +75,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^8.32.1", "@vscode/test-electron": "^2.5.2", - "eslint": "^8.57.1", + "eslint": "^9.26.0", "mocha": "^11.2.2", "typescript": "5.8.3", "copyfiles": "^2.4.1", diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index cdaf2eece52..90efdacb6f3 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -1060,7 +1060,7 @@ "copyfiles": "^2.4.1", "cors-anywhere": "^0.4.4", "dotenv": "~16.5.0", - "fast-xml-parser": "~5.2.3", + "fast-xml-parser": "5.3.4", "find-process": "~1.4.10", "fs-extra": "~11.3.0", "handlebars": "^4.7.8", diff --git a/workspaces/mi/mi-visualizer/package.json b/workspaces/mi/mi-visualizer/package.json index 9a576eb5488..8302c93c107 100644 --- a/workspaces/mi/mi-visualizer/package.json +++ b/workspaces/mi/mi-visualizer/package.json @@ -48,7 +48,7 @@ "react-hook-form": "7.56.4", "@tanstack/react-query": "5.76.1", "@tanstack/query-core": "^5.76.0", - "fast-xml-parser": "~5.2.3", + "fast-xml-parser": "5.3.4", "xmlbuilder2": "~3.1.1", "@types/swagger-ui-react": "^5.18.0", "swagger-ui-react": "5.21.0", From ff5b30a27adec759c13731f483416d98697ff7d2 Mon Sep 17 00:00:00 2001 From: gigara Date: Tue, 3 Feb 2026 07:40:14 +0530 Subject: [PATCH 066/247] Add ESLint configuration for ballerina overview-view and update dependencies - Created a new ESLint configuration file for the ballerina overview-view workspace. - Updated ESLint and TypeScript ESLint plugin versions in package.json files across multiple workspaces. - Refactored code in ComponentListView, ComponentView, Overview, and other components to improve code quality and adhere to ESLint rules. - Removed unnecessary eslint-disable comments and improved code readability. - Added utility functions for file path extraction and comparison in project-component-processor. - Deleted obsolete package-lock.json from font-wso2-vscode workspace. - Updated ESLint configurations in common-libs/ui-toolkit and bi-extension workspaces. --- .../autoinstallers/rush-plugins/package.json | 3 +- .../rush-plugins/pnpm-lock.yaml | 53 +- common/config/rush/.pnpmfile.cjs | 4 +- common/config/rush/pnpm-lock.yaml | 1447 +++++------------ .../api-designer-core/eslint.config.cjs | 19 + .../api-designer-core/package.json | 6 +- .../api-designer-extension/package.json | 6 +- .../api-designer-rpc-client/eslint.config.cjs | 31 + .../api-designer-rpc-client/package.json | 6 +- workspaces/apk/apk-extension/package.json | 6 +- .../ballerina/ballerina-core/package.json | 6 +- .../ballerina-rpc-client/package.json | 6 +- .../ballerina-visualizer/package.json | 6 +- workspaces/ballerina/data-mapper/package.json | 6 +- .../ballerina/overview-view/eslint.config.cjs | 81 + .../ballerina/overview-view/package.json | 6 +- .../overview-view/src/ComponentListView.tsx | 5 +- .../overview-view/src/ComponentView.tsx | 77 +- .../ballerina/overview-view/src/Overview.tsx | 55 +- .../src/components/ConstructorPanel/index.tsx | 1 - .../src/components/TitleBar/index.tsx | 2 +- .../src/util/project-component-processor.ts | 81 +- .../ballerina/record-creator/package.json | 2 +- .../ballerina/sequence-diagram/package.json | 4 +- .../syntax-tree/generator/package.json | 2 +- workspaces/ballerina/type-editor/package.json | 2 +- workspaces/bi/bi-extension/.eslintrc.json | 4 +- workspaces/bi/bi-extension/eslint.config.cjs | 30 + workspaces/bi/bi-extension/package.json | 6 +- .../font-wso2-vscode/package-lock.json | 125 -- .../playwright-vscode-tester/package.json | 4 +- .../common-libs/service-designer/package.json | 6 +- .../common-libs/ui-toolkit/.eslintrc.js | 42 - .../common-libs/ui-toolkit/eslint.config.cjs | 81 + .../common-libs/ui-toolkit/package.json | 6 +- .../components/Common/types/helperPane.ts | 1 - .../mcp-inspector-extension/package.json | 6 +- workspaces/mi/mi-core/package.json | 6 +- workspaces/mi/mi-data-mapper/package.json | 6 +- workspaces/mi/mi-diagram/package.json | 2 +- workspaces/mi/mi-extension/package.json | 6 +- workspaces/mi/mi-rpc-client/package.json | 6 +- workspaces/mi/syntax-tree/package.json | 4 +- 43 files changed, 826 insertions(+), 1438 deletions(-) create mode 100644 workspaces/api-designer/api-designer-core/eslint.config.cjs create mode 100644 workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs create mode 100644 workspaces/ballerina/overview-view/eslint.config.cjs create mode 100644 workspaces/bi/bi-extension/eslint.config.cjs delete mode 100644 workspaces/common-libs/font-wso2-vscode/package-lock.json delete mode 100644 workspaces/common-libs/ui-toolkit/.eslintrc.js create mode 100644 workspaces/common-libs/ui-toolkit/eslint.config.cjs diff --git a/common/autoinstallers/rush-plugins/package.json b/common/autoinstallers/rush-plugins/package.json index edcf1c25360..49e6696f870 100644 --- a/common/autoinstallers/rush-plugins/package.json +++ b/common/autoinstallers/rush-plugins/package.json @@ -4,10 +4,9 @@ "private": true, "pnpm": { "overrides": { - "undici": "^7.18.2" } }, "dependencies": { - "@gigara/rush-github-action-build-cache-plugin": "^1.1.3" + "@gigara/rush-github-action-build-cache-plugin": "^1.1.4" } } diff --git a/common/autoinstallers/rush-plugins/pnpm-lock.yaml b/common/autoinstallers/rush-plugins/pnpm-lock.yaml index 7327120f7e5..165f3ae8d89 100644 --- a/common/autoinstallers/rush-plugins/pnpm-lock.yaml +++ b/common/autoinstallers/rush-plugins/pnpm-lock.yaml @@ -4,16 +4,13 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - undici: ^7.18.2 - importers: .: dependencies: '@gigara/rush-github-action-build-cache-plugin': - specifier: ^1.1.3 - version: 1.1.3 + specifier: ^1.1.4 + version: 1.1.4 packages: @@ -23,30 +20,18 @@ packages: '@actions/core@2.0.3': resolution: {integrity: sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==} - '@actions/core@3.0.0': - resolution: {integrity: sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==} - '@actions/exec@2.0.0': resolution: {integrity: sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==} - '@actions/exec@3.0.0': - resolution: {integrity: sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==} - '@actions/glob@0.5.1': resolution: {integrity: sha512-+dv/t2aKQdKp9WWSp+1yIXVJzH5Q38M0Mta26pzIbeec14EcIleMB7UU6N7sNgbEuYfyuVGpE5pOKjl6j1WXkA==} '@actions/http-client@3.0.2': resolution: {integrity: sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==} - '@actions/http-client@4.0.0': - resolution: {integrity: sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==} - '@actions/io@2.0.0': resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} - '@actions/io@3.0.2': - resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@azure/abort-controller@1.1.0': resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} engines: {node: '>=12.0.0'} @@ -103,8 +88,8 @@ packages: resolution: {integrity: sha512-YZLxiJ3vBAAnFbG3TFuAMUlxZRexjQX5JDQxOkFGb6e2TpoxH3xyHI6idsMe/QrWtj41U/KoqBxlayzhS+LlwA==} engines: {node: '>=20.0.0'} - '@gigara/rush-github-action-build-cache-plugin@1.1.3': - resolution: {integrity: sha512-nTxC8UmNEN2AO7K2pcdOVmERvo+IYZVHe1IpMiAvAk7x+2hnduW/LmC59kz7YbGfKHhiIwrzu/c8vH1om6IZOg==} + '@gigara/rush-github-action-build-cache-plugin@1.1.4': + resolution: {integrity: sha512-KL87XJSiKwXEXtAj9g1CSOSFa02URE+PHZy/hnbLQNQuL/yGr3gvC+ZEhiYC5GL7/a+ZD+yaGJmU/KMX7NatOg==} '@protobuf-ts/runtime-rpc@2.11.1': resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} @@ -174,9 +159,9 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - undici@7.20.0: - resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} - engines: {node: '>=20.18.1'} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + engines: {node: '>=18.17'} snapshots: @@ -200,19 +185,10 @@ snapshots: '@actions/exec': 2.0.0 '@actions/http-client': 3.0.2 - '@actions/core@3.0.0': - dependencies: - '@actions/exec': 3.0.0 - '@actions/http-client': 4.0.0 - '@actions/exec@2.0.0': dependencies: '@actions/io': 2.0.0 - '@actions/exec@3.0.0': - dependencies: - '@actions/io': 3.0.2 - '@actions/glob@0.5.1': dependencies: '@actions/core': 2.0.3 @@ -221,17 +197,10 @@ snapshots: '@actions/http-client@3.0.2': dependencies: tunnel: 0.0.6 - undici: 7.20.0 - - '@actions/http-client@4.0.0': - dependencies: - tunnel: 0.0.6 - undici: 7.20.0 + undici: 6.23.0 '@actions/io@2.0.0': {} - '@actions/io@3.0.2': {} - '@azure/abort-controller@1.1.0': dependencies: tslib: 2.8.1 @@ -350,10 +319,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@gigara/rush-github-action-build-cache-plugin@1.1.3': + '@gigara/rush-github-action-build-cache-plugin@1.1.4': dependencies: '@actions/cache': 5.0.5 - '@actions/core': 3.0.0 + '@actions/core': 2.0.3 transitivePeerDependencies: - supports-color @@ -420,4 +389,4 @@ snapshots: tunnel@0.0.6: {} - undici@7.20.0: {} + undici@6.23.0: {} diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index dc450d8b274..d586654bfc3 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -67,7 +67,7 @@ module.exports = { pkg.dependencies['diff'] = '^8.0.3'; } if (pkg.dependencies['eslint']) { - pkg.dependencies['eslint'] = '^9.26.0'; + pkg.dependencies['eslint'] = '^9.27.0'; } if (pkg.dependencies['fast-xml-parser']) { pkg.dependencies['fast-xml-parser'] = '5.3.4'; @@ -119,7 +119,7 @@ module.exports = { pkg.devDependencies['diff'] = '^8.0.3'; } if (pkg.devDependencies['eslint']) { - pkg.devDependencies['eslint'] = '^9.26.0'; + pkg.devDependencies['eslint'] = '^9.27.0'; } if (pkg.devDependencies['fast-xml-parser']) { pkg.devDependencies['fast-xml-parser'] = '5.3.4'; diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 947deff5fc6..216d032fa48 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -29,14 +29,14 @@ importers: version: 0.4.5 devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -129,17 +129,17 @@ importers: specifier: ^1.81.0 version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.4.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.4.1 - version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.3.4 version: 2.5.2 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) rimraf: specifier: ~5.0.5 version: 5.0.10 @@ -184,14 +184,14 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -350,11 +350,11 @@ importers: specifier: ^1.63.0 version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ~5.48.2 - version: 5.48.2(@typescript-eslint/parser@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~5.48.2 - version: 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.3.2 version: 2.5.2 @@ -365,8 +365,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -435,17 +435,17 @@ importers: specifier: ^1.83.1 version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -774,19 +774,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.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) '@storybook/addon-links': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.16 - version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -957,23 +957,23 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1085,7 +1085,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -1253,11 +1253,11 @@ importers: specifier: ^5.28.5 version: 5.28.5(webpack-cli@5.1.4) '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -1268,14 +1268,14 @@ importers: specifier: ^7.1.2 version: 7.1.3(webpack@5.104.1) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 version: 16.0.6(sass@1.97.3)(webpack@5.104.1) @@ -1369,7 +1369,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1487,7 +1487,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1637,11 +1637,11 @@ importers: specifier: 17.0.26 version: 17.0.26(@types/react@18.2.0) '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -1649,14 +1649,14 @@ importers: specifier: ^7.1.2 version: 7.1.3(webpack@5.104.1) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.104.1) @@ -1708,19 +1708,19 @@ importers: version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-essentials': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) '@storybook/addon-links': specifier: ^6.5.9 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.9 - version: 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + version: 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + version: 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -1871,23 +1871,23 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2080,8 +2080,8 @@ importers: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2139,7 +2139,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2153,20 +2153,20 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)) prettier: specifier: ~3.5.3 version: 3.5.3 @@ -2239,7 +2239,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2565,8 +2565,8 @@ importers: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2602,11 +2602,11 @@ importers: specifier: ^1.84.0 version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -2623,8 +2623,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -2975,11 +2975,11 @@ importers: specifier: ~0.10.11 version: 0.10.11 '@typescript-eslint/eslint-plugin': - specifier: ~8.33.0 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~8.33.0 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3036,26 +3036,26 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react: specifier: ^7.33.1 - version: 7.37.5(eslint@9.27.0(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.2(eslint@9.27.0(jiti@2.6.1)) + version: 4.6.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3142,26 +3142,26 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.27.0(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + version: 0.8.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -3200,11 +3200,11 @@ importers: specifier: ^1.84.0 version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3218,8 +3218,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) mocha: specifier: ^11.2.2 version: 11.7.5 @@ -3286,7 +3286,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3328,14 +3328,14 @@ importers: specifier: ~9.27.0 version: 9.27.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3437,11 +3437,11 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3449,14 +3449,14 @@ importers: specifier: ^7.1.2 version: 7.1.3(webpack@5.104.1) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.26(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.104.1) @@ -3551,10 +3551,10 @@ importers: version: 2.4.1 eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)) html-to-image: specifier: 1.11.11 version: 1.11.11 @@ -3662,8 +3662,8 @@ importers: specifier: ~0.4.14 version: 0.4.14 '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) babel-jest: specifier: ^30.0.0 version: 30.2.0(@babel/core@7.27.7) @@ -3888,11 +3888,11 @@ importers: specifier: ^1.100.0 version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3909,8 +3909,8 @@ importers: specifier: ^1.0.1 version: 1.0.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) glob: specifier: ^11.0.2 version: 11.1.0 @@ -3973,14 +3973,14 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4214,8 +4214,8 @@ importers: specifier: ~22.15.21 version: 22.15.35 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) jsonix: specifier: ~3.0.0 version: 3.0.0 @@ -4230,14 +4230,14 @@ importers: specifier: ^11.2.0 version: 11.2.0(size-limit@11.2.0) '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -6080,22 +6080,22 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.1': - resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.3': - resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.15.2': resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.3.3': resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6104,6 +6104,10 @@ packages: resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10419,39 +10423,6 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@5.48.2': - resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/eslint-plugin@8.32.1': resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10460,14 +10431,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@8.33.1': - resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.33.1 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/experimental-utils@2.34.0': resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -10484,36 +10447,6 @@ packages: typescript: optional: true - '@typescript-eslint/parser@5.48.2': - resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.32.1': resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10521,79 +10454,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.33.1': - resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/project-service@8.33.1': - resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/scope-manager@5.48.2': - resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.32.1': resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.33.1': - resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.33.1': - resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/type-utils@5.48.2': - resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/type-utils@8.32.1': resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10601,37 +10469,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.33.1': - resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/types@5.48.2': - resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.32.1': resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.33.1': - resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@2.34.0': resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -10641,15 +10486,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@5.48.2': - resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10659,60 +10495,18 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.32.1': resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.33.1': - resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/utils@5.48.2': - resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - '@typescript-eslint/utils@8.32.1': resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10720,37 +10514,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.33.1': - resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/visitor-keys@5.48.2': - resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.32.1': resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.33.1': - resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typespec/ts-http-runtime@0.3.2': resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==} engines: {node: '>=20.0.0'} @@ -14140,20 +13911,10 @@ packages: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} - eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -14162,8 +13923,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.27.0: - resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -17817,10 +17578,6 @@ packages: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -17993,9 +17750,6 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -21827,12 +21581,6 @@ packages: ts-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-api-utils@2.4.0: resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} @@ -25700,14 +25448,14 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.27.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.20.1': + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@8.1.1) @@ -25715,13 +25463,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.3': {} + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 - '@eslint/core@0.14.0': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.15.2': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -25741,6 +25491,8 @@ snapshots: '@eslint/js@9.27.0': {} + '@eslint/js@9.39.2': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.3.5': @@ -30174,13 +29926,13 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/addon-controls@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30201,13 +29953,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/addon-controls@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30281,7 +30033,7 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30290,7 +30042,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30326,7 +30078,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30335,7 +30087,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.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30455,26 +30207,26 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/addon-controls': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 core-js: 3.48.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) @@ -30489,26 +30241,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.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + '@storybook/addon-controls': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 core-js: 3.48.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) webpack: 5.104.1(webpack-cli@4.10.0) @@ -31081,7 +30833,7 @@ snapshots: ts-dedent: 2.2.0 vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) - '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31091,7 +30843,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@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) @@ -31143,7 +30895,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31153,7 +30905,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31205,7 +30957,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31215,7 +30967,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31267,7 +31019,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack4@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31277,7 +31029,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31329,7 +31081,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/builder-webpack4@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -31339,7 +31091,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -31391,7 +31143,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31401,7 +31153,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31416,7 +31168,7 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 css-loader: 5.2.7(webpack@5.104.1) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) html-webpack-plugin: 5.6.6(webpack@5.104.1) @@ -31445,7 +31197,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31455,7 +31207,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31470,7 +31222,7 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 css-loader: 5.2.7(webpack@5.104.1) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) html-webpack-plugin: 5.6.6(webpack@5.104.1) @@ -32078,7 +31830,7 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -32114,7 +31866,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32143,7 +31895,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -32179,7 +31931,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32208,7 +31960,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -32244,7 +31996,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32273,7 +32025,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/core-common@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@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) @@ -32309,7 +32061,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32338,7 +32090,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/core-common@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -32374,7 +32126,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32473,20 +32225,20 @@ snapshots: dependencies: ts-dedent: 2.2.0 - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32523,8 +32275,8 @@ snapshots: ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32539,20 +32291,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32589,8 +32341,8 @@ snapshots: ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32605,20 +32357,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32669,20 +32421,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@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.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32733,20 +32485,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@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.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32861,16 +32613,16 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32885,16 +32637,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) webpack: 5.104.1(webpack-cli@4.10.0) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32909,10 +32661,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) @@ -32931,10 +32683,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1)': dependencies: '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@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.104.1(webpack-cli@5.1.4) @@ -32953,10 +32705,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1)': dependencies: '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) webpack: 5.104.1(webpack-cli@5.1.4) @@ -33182,14 +32934,14 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.5.3) - '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@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) @@ -33233,14 +32985,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@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) @@ -33284,14 +33036,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': 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.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/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) @@ -33335,14 +33087,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@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) @@ -33386,14 +33138,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/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) @@ -33437,14 +33189,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@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) @@ -33486,14 +33238,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@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) @@ -33998,15 +33750,15 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 @@ -34040,8 +33792,8 @@ snapshots: webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -34062,15 +33814,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.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 @@ -34104,8 +33856,8 @@ snapshots: webpack: 5.104.1(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -34126,15 +33878,15 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 @@ -34188,15 +33940,15 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 @@ -34250,15 +34002,15 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/node-logger': 6.5.16 @@ -34505,10 +34257,10 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 core-js: 3.48.0 detect-package-manager: 2.0.1 @@ -34532,10 +34284,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) chalk: 4.1.2 core-js: 3.48.0 detect-package-manager: 2.0.1 @@ -34559,10 +34311,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 core-js: 3.48.0 detect-package-manager: 2.0.1 @@ -34586,10 +34338,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) chalk: 4.1.2 core-js: 3.48.0 detect-package-manager: 2.0.1 @@ -34613,10 +34365,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) chalk: 4.1.2 core-js: 3.48.0 detect-package-manager: 2.0.1 @@ -35998,11 +35750,11 @@ snapshots: 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.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10)': + '@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10)': dependencies: - '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) - eslint: 9.27.0(jiti@2.6.1) + '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + eslint: 9.39.2(jiti@2.6.1) functional-red-black-tree: 1.0.1 regexpp: 3.2.0 tsutils: 3.21.0(typescript@3.9.10) @@ -36011,125 +35763,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.48.2(@typescript-eslint/parser@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/parser': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/type-utils': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.7.3 - tsutils: 3.21.0(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -36138,204 +35780,66 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10)': + '@typescript-eslint/experimental-utils@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10)': dependencies: '@types/json-schema': 7.0.15 '@typescript-eslint/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-scope: 5.1.1 eslint-utils: 2.1.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10)': + '@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10)': dependencies: '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) '@typescript-eslint/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 1.3.0 optionalDependencies: typescript: 3.9.10 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) - '@typescript-eslint/types': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@5.48.2': - dependencies: - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/visitor-keys': 5.48.2 - '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.32.1': dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - '@typescript-eslint/scope-manager@8.33.1': - dependencies: - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/visitor-keys': 8.33.1 - - '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - - '@typescript-eslint/type-utils@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - '@typescript-eslint/utils': 5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - tsutils: 3.21.0(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.48.2': {} - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.32.1': {} - '@typescript-eslint/types@8.33.1': {} - '@typescript-eslint/typescript-estree@2.34.0(typescript@3.9.10)': dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -36350,20 +35854,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.48.2(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/visitor-keys': 5.48.2 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.3 - tsutils: 3.21.0(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -36378,36 +35868,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.32.1 @@ -36422,129 +35882,42 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.4.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.48.2(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@9.27.0(jiti@2.6.1)) - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@5.62.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/utils@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-scope: 5.1.1 semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.18.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.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: 9.27.0(jiti@2.6.1) - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@5.48.2': - dependencies: - '@typescript-eslint/types': 5.48.2 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.32.1': dependencies: '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.33.1': - dependencies: - '@typescript-eslint/types': 8.33.1 - eslint-visitor-keys: 4.2.1 - '@typespec/ts-http-runtime@0.3.2': dependencies: http-proxy-agent: 7.0.2 @@ -37605,13 +36978,13 @@ snapshots: dependencies: '@babel/core': 7.27.7 - babel-eslint@10.1.0(eslint@9.27.0(jiti@2.6.1)): + babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@babel/code-frame': 7.29.0 '@babel/parser': 7.29.0 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 1.3.0 resolve: 1.22.11 transitivePeerDependencies: @@ -40633,23 +40006,23 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@6.15.0(eslint@9.27.0(jiti@2.6.1)): + eslint-config-prettier@6.15.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) 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.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)): + eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) - babel-eslint: 10.1.0(eslint@9.27.0(jiti@2.6.1)) + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + babel-eslint: 10.1.0(eslint@9.39.2(jiti@2.6.1)) confusing-browser-globals: 1.0.11 - eslint: 9.27.0(jiti@2.6.1) - eslint-plugin-flowtype: 3.13.0(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 2.5.1(eslint@9.27.0(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-flowtype: 3.13.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: 2.5.1(eslint@9.39.2(jiti@2.6.1)) eslint-import-resolver-node@0.3.9: dependencies: @@ -40657,18 +40030,18 @@ snapshots: is-core-module: 2.16.1 resolve: 1.22.11 - eslint-module-utils@2.12.1(eslint@9.27.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-flowtype@3.13.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) lodash: 4.17.23 - eslint-plugin-import@2.32.0(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -40677,9 +40050,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint@9.27.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -40691,7 +40064,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -40701,7 +40074,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -40710,31 +40083,31 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1))(prettier@1.19.1): + eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@1.19.1): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) prettier: 1.19.1 prettier-linter-helpers: 1.0.1 optionalDependencies: - eslint-config-prettier: 6.15.0(eslint@9.27.0(jiti@2.6.1)) + eslint-config-prettier: 6.15.0(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react-hooks@2.5.1(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react-hooks@2.5.1(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-hooks@4.6.2(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react-hooks@4.6.2(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.26(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -40742,7 +40115,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.2 - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -40756,22 +40129,22 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.8.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3): + eslint-plugin-storybook@0.8.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3): dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.39.2(jiti@2.6.1) requireindex: 1.2.0 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint-scope@5.1.1: dependencies: @@ -40787,34 +40160,26 @@ snapshots: dependencies: eslint-visitor-keys: 1.3.0 - eslint-utils@3.0.0(eslint@9.27.0(jiti@2.6.1)): - dependencies: - eslint: 9.27.0(jiti@2.6.1) - eslint-visitor-keys: 2.1.0 - eslint-visitor-keys@1.3.0: {} - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} - eslint@9.27.0(jiti@2.6.1): + eslint@9.39.2(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.27.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.14.0 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.27.0 + '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -41568,7 +40933,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -41586,9 +40951,9 @@ snapshots: typescript: 4.9.5 webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -41606,9 +40971,9 @@ snapshots: typescript: 5.8.3 webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -41626,7 +40991,7 @@ snapshots: typescript: 5.8.3 webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: @@ -46234,10 +45599,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -46446,8 +45807,6 @@ snapshots: napi-postinstall@0.3.4: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} neatequal@1.0.0: @@ -51347,10 +50706,6 @@ snapshots: ts-algebra@2.0.0: {} - ts-api-utils@1.4.3(typescript@5.8.3): - dependencies: - typescript: 5.8.3 - ts-api-utils@2.4.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -51542,11 +50897,11 @@ snapshots: '@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.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) ansi-escapes: 4.3.2 asyncro: 3.0.0 - babel-eslint: 10.1.0(eslint@9.27.0(jiti@2.6.1)) + babel-eslint: 10.1.0(eslint@9.39.2(jiti@2.6.1)) babel-plugin-annotate-pure-calls: 0.4.0(@babel/core@7.27.7) babel-plugin-dev-expression: 0.2.3(@babel/core@7.27.7) babel-plugin-macros: 2.8.0 @@ -51555,15 +50910,15 @@ snapshots: camelcase: 6.3.0 chalk: 4.1.2 enquirer: 2.4.1 - eslint: 9.27.0(jiti@2.6.1) - eslint-config-prettier: 6.15.0(eslint@9.27.0(jiti@2.6.1)) - eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.27.0(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-flowtype: 3.13.0(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0(eslint@9.27.0(jiti@2.6.1)))(eslint@9.27.0(jiti@2.6.1))(prettier@1.19.1) - eslint-plugin-react: 7.37.5(eslint@9.27.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 2.5.1(eslint@9.27.0(jiti@2.6.1)) + eslint: 9.39.2(jiti@2.6.1) + eslint-config-prettier: 6.15.0(eslint@9.39.2(jiti@2.6.1)) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-flowtype: 3.13.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@1.19.1) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: 2.5.1(eslint@9.39.2(jiti@2.6.1)) execa: 4.1.0 fs-extra: 9.1.0 jest: 25.5.4 diff --git a/workspaces/api-designer/api-designer-core/eslint.config.cjs b/workspaces/api-designer/api-designer-core/eslint.config.cjs new file mode 100644 index 00000000000..f4716d3d34f --- /dev/null +++ b/workspaces/api-designer/api-designer-core/eslint.config.cjs @@ -0,0 +1,19 @@ +/* eslint-disable */ +const { FlatCompat } = require("@eslint/eslintrc"); +const { defineConfig } = require("eslint/config"); +const js = require("@eslint/js"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +module.exports = defineConfig([ + ...compat.config(require("./.eslintrc.js")), + { + rules: { + "@typescript-eslint/no-unsafe-declaration-merging": "off", + }, + }, +]); diff --git a/workspaces/api-designer/api-designer-core/package.json b/workspaces/api-designer/api-designer-core/package.json index 3f3c282f7e2..ae549f7b49f 100644 --- a/workspaces/api-designer/api-designer-core/package.json +++ b/workspaces/api-designer/api-designer-core/package.json @@ -13,9 +13,9 @@ "author": "WSO2", "devDependencies": { "typescript": "5.8.3", - "@typescript-eslint/parser": "^6.9.1", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "eslint": "^8.52.0" + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "eslint": "9.27.0" }, "dependencies": { "@types/vscode-webview": "^1.57.3", diff --git a/workspaces/api-designer/api-designer-extension/package.json b/workspaces/api-designer/api-designer-extension/package.json index 3c598997238..8913558fba7 100644 --- a/workspaces/api-designer/api-designer-extension/package.json +++ b/workspaces/api-designer/api-designer-extension/package.json @@ -100,9 +100,9 @@ "devDependencies": { "@types/vscode": "^1.81.0", "@types/node": "16.x", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", - "eslint": "^8.47.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", + "eslint": "9.27.0", "typescript": "5.8.3", "ts-loader": "^9.4.4", "webpack": "^5.88.2", diff --git a/workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs b/workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs new file mode 100644 index 00000000000..91c2f84c5b6 --- /dev/null +++ b/workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs @@ -0,0 +1,31 @@ +/* eslint-disable @typescript-eslint/no-require-imports, no-undef */ +const { + defineConfig, + globalIgnores, +} = require("eslint/config"); + +const tsParser = require("@typescript-eslint/parser"); +const typescriptEslint = require("@typescript-eslint/eslint-plugin"); +const js = require("@eslint/js"); + +const { + FlatCompat, +} = require("@eslint/eslintrc"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +module.exports = defineConfig([{ + extends: compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), + + languageOptions: { + parser: tsParser, + }, + + plugins: { + "@typescript-eslint": typescriptEslint, + }, +}, globalIgnores(["**/lib", "**/.eslintrc.js", "**/*.d.ts"])]); diff --git a/workspaces/api-designer/api-designer-rpc-client/package.json b/workspaces/api-designer/api-designer-rpc-client/package.json index 06c68013b32..e89db7812a1 100644 --- a/workspaces/api-designer/api-designer-rpc-client/package.json +++ b/workspaces/api-designer/api-designer-rpc-client/package.json @@ -15,9 +15,9 @@ "@types/react": "18.2.0", "@types/react-dom": "18.2.0", "typescript": "5.8.3", - "@typescript-eslint/parser": "^6.9.1", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "eslint": "^8.52.0" + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "eslint": "9.27.0" }, "dependencies": { "@types/vscode-webview": "^1.57.3", diff --git a/workspaces/apk/apk-extension/package.json b/workspaces/apk/apk-extension/package.json index f08b7fffdf4..970d889c9a1 100644 --- a/workspaces/apk/apk-extension/package.json +++ b/workspaces/apk/apk-extension/package.json @@ -61,10 +61,10 @@ "@types/mocha": "^10.0.1", "@types/node": "^18.11.19", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "~5.48.2", - "@typescript-eslint/parser": "~5.48.2", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@vscode/test-electron": "^2.3.2", - "eslint": "^8.32.0", + "eslint": "9.27.0", "glob": "^11.1.0", "mocha": "^10.2.0", "typescript": "5.8.3", diff --git a/workspaces/ballerina/ballerina-core/package.json b/workspaces/ballerina/ballerina-core/package.json index bdec8603660..e57eb2e1ec9 100644 --- a/workspaces/ballerina/ballerina-core/package.json +++ b/workspaces/ballerina/ballerina-core/package.json @@ -32,11 +32,11 @@ "devDependencies": { "@types/node": "^22.15.21", "@types/vscode": "^1.83.1", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@types/react": "18.2.0", "copyfiles": "^2.4.1", - "eslint": "^9.26.0", + "eslint": "9.27.0", "typescript": "5.8.3" }, "files": [ diff --git a/workspaces/ballerina/ballerina-rpc-client/package.json b/workspaces/ballerina/ballerina-rpc-client/package.json index 9f0c2f0ec52..43fbe5103cf 100644 --- a/workspaces/ballerina/ballerina-rpc-client/package.json +++ b/workspaces/ballerina/ballerina-rpc-client/package.json @@ -26,10 +26,10 @@ "devDependencies": { "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "copyfiles": "^2.4.1", - "eslint": "^9.27.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "typescript": "5.8.3" diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index c9579aabb91..598c99ddb08 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -65,12 +65,12 @@ "@types/react-syntax-highlighter": "~15.5.13", "@types/vscode-webview": "~1.57.5", "@types/webpack": "^5.28.5", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "buffer": "^6.0.3", "copyfiles": "^2.4.1", "css-loader": "^7.1.2", - "eslint": "^9.26.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "sass-loader": "^16.0.5", diff --git a/workspaces/ballerina/data-mapper/package.json b/workspaces/ballerina/data-mapper/package.json index bbe6f7a1fa7..319c4b3bf42 100644 --- a/workspaces/ballerina/data-mapper/package.json +++ b/workspaces/ballerina/data-mapper/package.json @@ -45,8 +45,8 @@ "@types/lodash": "4.17.16", "@types/react": "^18.2.0", "@types/react-dom": "17.0.26", - "@typescript-eslint/eslint-plugin": "~8.32.1", - "@typescript-eslint/parser": "~8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@types/blueimp-md5": "^2.18.2", "typescript": "^5.8.3", "css-loader": "^7.1.2", @@ -57,7 +57,7 @@ "tslint-react": "^5.0.0", "tslint-react-hooks": "^2.2.2", "copyfiles": "^2.4.1", - "eslint": "^9.26.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.4", "react-hook-form": "~7.56.3" diff --git a/workspaces/ballerina/overview-view/eslint.config.cjs b/workspaces/ballerina/overview-view/eslint.config.cjs new file mode 100644 index 00000000000..3fc136b969e --- /dev/null +++ b/workspaces/ballerina/overview-view/eslint.config.cjs @@ -0,0 +1,81 @@ +const { defineConfig, globalIgnores } = require('eslint/config'); + +const tsParser = require('@typescript-eslint/parser'); +const typescriptEslint = require('@typescript-eslint/eslint-plugin'); +const reactPlugin = require('eslint-plugin-react'); +const reactHooksPlugin = require('eslint-plugin-react-hooks'); +const storybookPlugin = require('eslint-plugin-storybook'); + +module.exports = defineConfig([ + { + files: ['src/**/*.{ts,tsx,js,jsx}'], + + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + }, + + plugins: { + '@typescript-eslint': typescriptEslint, + react: reactPlugin, + 'react-hooks': reactHooksPlugin, + storybook: storybookPlugin, + }, + + settings: { + react: { + version: 'detect', + }, + }, + + rules: { + // Best Practices + 'no-use-before-define': 'error', + 'no-redeclare': 'error', + 'no-else-return': 'error', + 'eqeqeq': 'error', + + // Stylistic Issues + 'indent': ['error', 4, { SwitchCase: 1 }], + + // ES6 Rules + 'arrow-parens': ['error', 'as-needed'], + 'prefer-const': 'error', + 'no-var': 'error', + + // React Rules + 'react/jsx-uses-vars': 'error', + 'react/jsx-uses-react': 'error', + 'react/jsx-indent': ['error', 4], + 'react/jsx-indent-props': ['error', 4], + 'react/self-closing-comp': 'error', + + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'react-hooks/exhaustive-deps': 'error', + }, + }, + globalIgnores(['**/lib', '**/.eslintrc.js', '**/*.d.ts', '**/dist/**', '**/build/**', '.storybook/**']), + // Use full parser services only for our source files (these are in tsconfig) + { + files: ["src/**/*.ts", "src/**/*.tsx"], + languageOptions: { + parser: tsParser, + parserOptions: { + project: ["./tsconfig.json"], + tsconfigRootDir: __dirname, + }, + }, + }, + // For Storybook and generated/dist files that are outside tsconfig, do not provide `project`. + { + files: [".storybook/**", ".storybook/*", "**/dist/**", "**/build/**"], + languageOptions: { + parser: tsParser, + }, + }, +]); + diff --git a/workspaces/ballerina/overview-view/package.json b/workspaces/ballerina/overview-view/package.json index 2f7a406e84b..8995b1fd9e4 100644 --- a/workspaces/ballerina/overview-view/package.json +++ b/workspaces/ballerina/overview-view/package.json @@ -25,10 +25,10 @@ }, "devDependencies": { "@types/react": "18.2.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "copyfiles": "^2.4.1", - "eslint": "^9.26.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "typescript": "5.8.3" diff --git a/workspaces/ballerina/overview-view/src/ComponentListView.tsx b/workspaces/ballerina/overview-view/src/ComponentListView.tsx index 9564cc9e0ab..04ba7bfbda6 100644 --- a/workspaces/ballerina/overview-view/src/ComponentListView.tsx +++ b/workspaces/ballerina/overview-view/src/ComponentListView.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ /** * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * @@ -94,8 +93,8 @@ export function ComponentListView(props: { currentComponents: ComponentCollectio if (currentComponents) { Object.keys(currentComponents) - .filter((key) => currentComponents[key].length) - .forEach((key) => { + .filter(key => currentComponents[key].length) + .forEach(key => { const filteredComponents = currentComponents[key]; const components = filteredComponents.map((comp: ComponentViewInfo, compIndex: number) => { diff --git a/workspaces/ballerina/overview-view/src/ComponentView.tsx b/workspaces/ballerina/overview-view/src/ComponentView.tsx index 1d45c4c6972..2ee8e76dd09 100644 --- a/workspaces/ballerina/overview-view/src/ComponentView.tsx +++ b/workspaces/ballerina/overview-view/src/ComponentView.tsx @@ -27,6 +27,33 @@ interface ComponentViewProps { } +function iconNameTranslator(type: string) { + switch (type) { + case 'functions': + return 'function-icon'; + case 'services': + return 'service-icon'; + case 'records': + return 'record-icon'; + case 'objects': + return 'record-icon'; + case 'classes': + return 'class-icon'; + case 'types': + return 'record-icon'; + case 'constants': + return 'constant-icon'; + case 'enums': + return 'enum-icon'; + case 'listeners': + return 'listener-icon'; + case 'moduleVariables': + return 'variable-icon'; + default: + return 'record-icon'; + } +} + export function ComponentView(props: ComponentViewProps) { const { info, type, updateSelection } = props; @@ -57,17 +84,17 @@ export function ComponentView(props: ComponentViewProps) { // `; return ( - // - //
- // Icon XX - //
- //

- // {info.name.length ? info.name : '/'} - //

- //
+ // + //
+ // Icon XX + //
+ //

+ // {info.name.length ? info.name : '/'} + //

+ //
{ - try { - const workspaceResponse = await rpcClient.getCommonRpcClient().getWorkspaceFiles({}); - setWorkspaceInfo(workspaceResponse); - const componentResponse = await rpcClient.getLangClientRpcClient().getBallerinaProjectComponents(undefined); - setComponents(componentResponse as Data); - } catch (error) { - console.error('Error fetching data:', error); - } finally { - setLoading(false); - } - }; - useEffect(() => { + const fetchData = async () => { + try { + const workspaceResponse = await rpcClient.getCommonRpcClient().getWorkspaceFiles({}); + setWorkspaceInfo(workspaceResponse); + const componentResponse = await rpcClient.getLangClientRpcClient().getBallerinaProjectComponents(undefined); + setComponents(componentResponse as Data); + } catch (error) { + console.error('Error fetching data:', error); + } finally { + setLoading(false); + } + }; + fetchData(); - }, [syntaxTree]); + }, [syntaxTree, rpcClient]); if (loading) { // Render a loading indicator @@ -103,54 +100,54 @@ export function Overview(props: { visualizerLocation: VisualizerLocation }) { } // Filter the components based on the search query - const filteredComponents = components?.packages.map((pkg) => { - const modules = pkg.modules.map((module) => { - const services = module.services.filter((service) => { + const filteredComponents = components?.packages.map(pkg => { + const modules = pkg.modules.map(module => { + const services = module.services.filter(service => { if (selectedFile === SELECT_ALL_FILES || service.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return service.name.toLowerCase().includes(query.toLowerCase()); } }); - const types = module.types.filter((type) => { + const types = module.types.filter(type => { if (selectedFile === SELECT_ALL_FILES || type.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return type.name.toLowerCase().includes(query.toLowerCase()); } }); - const functions = module.functions.filter((func) => { + const functions = module.functions.filter(func => { if (selectedFile === SELECT_ALL_FILES || func.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return func.name.toLowerCase().includes(query.toLowerCase()); } }); - const records = module.records.filter((record) => { + const records = module.records.filter(record => { if (selectedFile === SELECT_ALL_FILES || record.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return record.name.toLowerCase().includes(query.toLowerCase()); } }); - const objects = module.objects.filter((object) => { + const objects = module.objects.filter(object => { if (selectedFile === SELECT_ALL_FILES || object.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return object.name.toLowerCase().includes(query.toLowerCase()); } }); - const classes = module.classes.filter((cls) => { + const classes = module.classes.filter(cls => { if (selectedFile === SELECT_ALL_FILES || cls.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return cls.name.toLowerCase().includes(query.toLowerCase()); } }); - const constants = module.constants.filter((constant) => { + const constants = module.constants.filter(constant => { if (selectedFile === SELECT_ALL_FILES || constant.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return constant.name.toLowerCase().includes(query.toLowerCase()); } }); - const enums = module.enums.filter((enumType) => { + const enums = module.enums.filter(enumType => { if (selectedFile === SELECT_ALL_FILES || enumType.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return enumType.name.toLowerCase().includes(query.toLowerCase()); } }); - const listeners = module.listeners.filter((listener) => { + const listeners = module.listeners.filter(listener => { if (selectedFile === SELECT_ALL_FILES || listener.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return listener.name.toLowerCase().includes(query.toLowerCase()); } }); - const moduleVariables = module.moduleVariables.filter((variable) => { + const moduleVariables = module.moduleVariables.filter(variable => { if (selectedFile === SELECT_ALL_FILES || variable.filePath === selectedFile.replace(workspaceInfo?.workspaceRoot, '').substring(1)) { return variable.name.toLowerCase().includes(query.toLowerCase()); } diff --git a/workspaces/ballerina/overview-view/src/components/ConstructorPanel/index.tsx b/workspaces/ballerina/overview-view/src/components/ConstructorPanel/index.tsx index a40f7afe93d..1ec0e7e06d0 100644 --- a/workspaces/ballerina/overview-view/src/components/ConstructorPanel/index.tsx +++ b/workspaces/ballerina/overview-view/src/components/ConstructorPanel/index.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import React from "react"; import styled from "@emotion/styled"; diff --git a/workspaces/ballerina/overview-view/src/components/TitleBar/index.tsx b/workspaces/ballerina/overview-view/src/components/TitleBar/index.tsx index ca0ea528d03..775f704e885 100644 --- a/workspaces/ballerina/overview-view/src/components/TitleBar/index.tsx +++ b/workspaces/ballerina/overview-view/src/components/TitleBar/index.tsx @@ -65,7 +65,7 @@ export function TitleBar(props: TitleBarProps) { }; const workspaceFiles = [{ value: SELECT_ALL_FILES, content: SELECT_ALL_FILES }]; - workspacesFileResponse?.files.map((file) => { + workspacesFileResponse?.files.map(file => { workspaceFiles.push({ value: file.path, content: file.relativePath }); }); diff --git a/workspaces/ballerina/overview-view/src/util/project-component-processor.ts b/workspaces/ballerina/overview-view/src/util/project-component-processor.ts index b046f8ef8c0..e79604692ec 100644 --- a/workspaces/ballerina/overview-view/src/util/project-component-processor.ts +++ b/workspaces/ballerina/overview-view/src/util/project-component-processor.ts @@ -21,6 +21,45 @@ import { BallerinaProjectComponents, ComponentInfo, ComponentViewInfo, FileListE import { ComponentCollection } from "../ComponentListView"; import { URI } from "vscode-uri" +export function extractFilePath(uri: string): string | null { + let filePath = uri; + if (uri.startsWith('file://')) { + const url = new URL(uri); + filePath = url.pathname; + } + + if (filePath && filePath.match(/^\/[a-zA-Z]:/g)) { + filePath = filePath.replace('/', ''); + } + + if (filePath && filePath.match(/^[A-Z]:\//g)) { + const firstCharacter = filePath.charAt(0).toLowerCase(); + const remaining = filePath.slice(1); + filePath = `${firstCharacter}${remaining}`; + } + + return filePath; +} + +export function genFilePath(packageInfo: PackageSummary, module: ModuleSummary, element: ComponentInfo) { + let filePath: string; + if (packageInfo.filePath.endsWith('.bal')) { + filePath = packageInfo.filePath.replace('file://', ''); + } else { + filePath = `${packageInfo.filePath}${module.name ? `modules/${module.name}/` : ''}${element.filePath}` + .replace('file://', ''); + } + + filePath = extractFilePath(filePath); + + return filePath; +} + +export function isPathEqual(uri1: string, uri2: string): boolean { + const filePath1 = extractFilePath(uri1); + const filePath2 = extractFilePath(uri2); + return filePath1 === filePath2; +} export class ProjectComponentProcessor { private projectComponents: BallerinaProjectComponents; @@ -132,45 +171,3 @@ export class ProjectComponentProcessor { return this.fileMap; } } - -export function genFilePath(packageInfo: PackageSummary, module: ModuleSummary, element: ComponentInfo) { - let filePath: string; - if (packageInfo.filePath.endsWith('.bal')) { - filePath = packageInfo.filePath.replace('file://', ''); - } else { - filePath = `${packageInfo.filePath}${module.name ? `modules/${module.name}/` : ''}${element.filePath}` - .replace('file://', ''); - } - - filePath = extractFilePath(filePath); - - return filePath; -} - - -export function extractFilePath(uri: string): string | null { - let filePath = uri; - if (uri.startsWith('file://')) { - const url = new URL(uri); - filePath = url.pathname; - } - - if (filePath && filePath.match(/^\/[a-zA-Z]:/g)) { - filePath = filePath.replace('/', ''); - } - - if (filePath && filePath.match(/^[A-Z]:\//g)) { - const firstCharacter = filePath.charAt(0).toLowerCase(); - const remaining = filePath.slice(1); - filePath = `${firstCharacter}${remaining}`; - } - - return filePath; -} - - -export function isPathEqual(uri1: string, uri2: string): boolean { - const filePath1 = extractFilePath(uri1); - const filePath2 = extractFilePath(uri2); - return filePath1 === filePath2; -} diff --git a/workspaces/ballerina/record-creator/package.json b/workspaces/ballerina/record-creator/package.json index 443f6e1be68..c4eed01bebb 100644 --- a/workspaces/ballerina/record-creator/package.json +++ b/workspaces/ballerina/record-creator/package.json @@ -42,7 +42,7 @@ "react-scripts-ts": "3.1.0", "typescript": "5.8.3", "copyfiles": "~2.4.1", - "eslint": "~9.26.0" + "eslint": "9.27.0" }, "author": "wso2", "license": "UNLICENSED", diff --git a/workspaces/ballerina/sequence-diagram/package.json b/workspaces/ballerina/sequence-diagram/package.json index c00a765250a..13034d7dd9c 100644 --- a/workspaces/ballerina/sequence-diagram/package.json +++ b/workspaces/ballerina/sequence-diagram/package.json @@ -48,8 +48,8 @@ "@types/lodash": "~4.17.16", "copyfiles": "^2.4.1", "prettier": "~3.5.3", - "eslint": "~9.26.0", - "@typescript-eslint/eslint-plugin": "~8.32.1", + "eslint": "9.27.0", + "@typescript-eslint/eslint-plugin": "8.32.1", "eslint-plugin-react-hooks": "~5.2.0", "eslint-plugin-unused-imports": "~4.1.4" } diff --git a/workspaces/ballerina/syntax-tree/generator/package.json b/workspaces/ballerina/syntax-tree/generator/package.json index c9b96f4e961..93870dce87c 100644 --- a/workspaces/ballerina/syntax-tree/generator/package.json +++ b/workspaces/ballerina/syntax-tree/generator/package.json @@ -28,7 +28,7 @@ "@typescript-eslint/eslint-plugin": "^5.46.1", "@typescript-eslint/parser": "^5.46.1", "copyfiles": "^2.1.0", - "eslint": "^8.30.0", + "eslint": "^9.27.0", "eslint-plugin-react": "^7.31.11", "rimraf": "^3.0.2", "tslint": "^6.1.3", diff --git a/workspaces/ballerina/type-editor/package.json b/workspaces/ballerina/type-editor/package.json index 01fc12755f7..db102a6de26 100644 --- a/workspaces/ballerina/type-editor/package.json +++ b/workspaces/ballerina/type-editor/package.json @@ -42,7 +42,7 @@ "@types/lodash.debounce": "^4.0.9", "typescript": "5.8.3", "copyfiles": "~2.4.1", - "eslint": "~9.26.0", + "eslint": "9.27.0", "@types/lodash": "~4.17.15" }, "author": "wso2", diff --git a/workspaces/bi/bi-extension/.eslintrc.json b/workspaces/bi/bi-extension/.eslintrc.json index 86c86f379da..1314ad17b72 100644 --- a/workspaces/bi/bi-extension/.eslintrc.json +++ b/workspaces/bi/bi-extension/.eslintrc.json @@ -16,11 +16,11 @@ "format": [ "camelCase", "PascalCase" ] } ], - "@typescript-eslint/semi": "warn", + "curly": "warn", "eqeqeq": "warn", "no-throw-literal": "warn", - "semi": "off" + "semi": ["warn", "always"] }, "ignorePatterns": [ "out", diff --git a/workspaces/bi/bi-extension/eslint.config.cjs b/workspaces/bi/bi-extension/eslint.config.cjs new file mode 100644 index 00000000000..c377fe573fa --- /dev/null +++ b/workspaces/bi/bi-extension/eslint.config.cjs @@ -0,0 +1,30 @@ +/* eslint-disable */ +const { FlatCompat } = require("@eslint/eslintrc"); +const { defineConfig } = require("eslint/config"); +const tsParser = require("@typescript-eslint/parser"); +const js = require("@eslint/js"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +module.exports = defineConfig([ + ...compat.config(require("./.eslintrc.json")), + { + files: ["**/*.ts", "**/*.tsx"], + languageOptions: { + parser: tsParser, + parserOptions: { + project: ["./tsconfig.json"], + tsconfigRootDir: __dirname, + }, + }, + }, + { + rules: { + "@typescript-eslint/naming-convention": "off", + }, + }, +]); diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index c54128c4132..93c2a3ca81c 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -185,10 +185,10 @@ "@types/vscode": "^1.84.0", "@types/mocha": "^10.0.3", "@types/node": "22.15.18", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@vscode/test-electron": "^2.5.2", - "eslint": "^9.26.0", + "eslint": "9.27.0", "glob": "^11.1.0", "mocha": "^11.2.2", "typescript": "5.8.3", diff --git a/workspaces/common-libs/font-wso2-vscode/package-lock.json b/workspaces/common-libs/font-wso2-vscode/package-lock.json deleted file mode 100644 index 26a3705ccc4..00000000000 --- a/workspaces/common-libs/font-wso2-vscode/package-lock.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "name": "@wso2/font-wso2-vscode", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@wso2/font-wso2-vscode", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@vscode/codicons": "0.0.36", - "fantasticon": "^1.2.3", - "icon-font-generator": "^2.1.11", - "jsonc-parser": "^3.3.1" - } - }, - "../../../common/temp/node_modules/.pnpm/@vscode+codicons@0.0.36/node_modules/@vscode/codicons": { - "version": "0.0.36", - "dev": true, - "license": "CC-BY-4.0", - "devDependencies": { - "ansi-regex": ">=5.0.1", - "fantasticon": "^1.2.3", - "opentype.js": "^1.3.3", - "release-it": "15.10.1", - "svg-sprite": "^1.5.2", - "svgo": "2.7.0" - } - }, - "../../../common/temp/node_modules/.pnpm/fantasticon@1.2.3/node_modules/fantasticon": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "change-case": "^4.1.2", - "cli-color": "^2.0.0", - "commander": "^7.2.0", - "glob": "^7.2.0", - "handlebars": "^4.7.7", - "slugify": "^1.6.0", - "svg2ttf": "^6.0.3", - "svgicons2svgfont": "^10.0.3", - "ttf2eot": "^2.0.0", - "ttf2woff": "^3.0.0", - "ttf2woff2": "^4.0.4" - }, - "bin": { - "fantasticon": "bin/fantasticon" - }, - "devDependencies": { - "@types/cli-color": "^2.0.0", - "@types/glob": "^7.1.3", - "@types/jest": "^27.0.2", - "@types/node": "^16.10.2", - "@types/svg2ttf": "^5.0.1", - "@types/svgicons2svgfont": "^10.0.1", - "@types/ttf2eot": "^2.0.0", - "@types/ttf2woff": "^2.0.2", - "@types/ttf2woff2": "^2.0.0", - "jest": "^26.6.3", - "prettier": "^2.4.1", - "rimraf": "^3.0.2", - "semantic-release": "^18.0.0", - "ts-jest": "^26.5.6", - "typescript": "^4.4.3" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "../../../common/temp/node_modules/.pnpm/icon-font-generator@2.1.11/node_modules/icon-font-generator": { - "version": "2.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "colors": "^1.2.1", - "glob": "^7.1.2", - "minimist": "^1.2.0", - "webfonts-generator": "^0.4.0" - }, - "bin": { - "icon-font-generator": "bin/icon-font-generator" - }, - "devDependencies": { - "eslint": "^4.19.1", - "eslint-config-recommended": "^2.0.0" - }, - "engines": { - "node": ">=v8.1.0" - } - }, - "../../../common/temp/node_modules/.pnpm/jsonc-parser@3.3.1/node_modules/jsonc-parser": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^18.x", - "@typescript-eslint/eslint-plugin": "^7.13.1", - "@typescript-eslint/parser": "^7.13.1", - "eslint": "^8.57.0", - "mocha": "^10.4.0", - "rimraf": "^5.0.7", - "typescript": "^5.4.2" - } - }, - "node_modules/@vscode/codicons": { - "resolved": "../../../common/temp/node_modules/.pnpm/@vscode+codicons@0.0.36/node_modules/@vscode/codicons", - "link": true - }, - "node_modules/fantasticon": { - "resolved": "../../../common/temp/node_modules/.pnpm/fantasticon@1.2.3/node_modules/fantasticon", - "link": true - }, - "node_modules/icon-font-generator": { - "resolved": "../../../common/temp/node_modules/.pnpm/icon-font-generator@2.1.11/node_modules/icon-font-generator", - "link": true - }, - "node_modules/jsonc-parser": { - "resolved": "../../../common/temp/node_modules/.pnpm/jsonc-parser@3.3.1/node_modules/jsonc-parser", - "link": true - } - } -} diff --git a/workspaces/common-libs/playwright-vscode-tester/package.json b/workspaces/common-libs/playwright-vscode-tester/package.json index 29d4917f6c3..b200942cbc4 100644 --- a/workspaces/common-libs/playwright-vscode-tester/package.json +++ b/workspaces/common-libs/playwright-vscode-tester/package.json @@ -12,8 +12,8 @@ "@types/fs-extra": "~11.0.1", "@types/node": "~22.15.24", "@types/unzipper": "~0.10.11", - "@typescript-eslint/eslint-plugin": "~8.33.0", - "@typescript-eslint/parser": "~8.33.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "typescript": "5.8.3" }, "repository": { diff --git a/workspaces/common-libs/service-designer/package.json b/workspaces/common-libs/service-designer/package.json index ffa0ed7012f..09ff2a75d14 100644 --- a/workspaces/common-libs/service-designer/package.json +++ b/workspaces/common-libs/service-designer/package.json @@ -43,10 +43,10 @@ "@storybook/react-webpack5": "~7.4.0", "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "copyfiles": "^2.4.1", - "eslint": "^8.52.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.4", "eslint-plugin-react": "^7.33.1", diff --git a/workspaces/common-libs/ui-toolkit/.eslintrc.js b/workspaces/common-libs/ui-toolkit/.eslintrc.js deleted file mode 100644 index 22a2305835e..00000000000 --- a/workspaces/common-libs/ui-toolkit/.eslintrc.js +++ /dev/null @@ -1,42 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'react', 'react-hooks'], - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react/recommended', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended', 'plugin:storybook/recommended'], - settings: { - react: { - version: 'detect', - }, - }, - ignorePatterns: [ - "lib", - ".eslintrc.js", - "**/*.d.ts" - ], - rules: { - // Best Practices - 'no-use-before-define': 'error', - 'no-redeclare': 'error', - 'no-else-return': 'error', - 'eqeqeq': 'error', - - // Stylistic Issues - 'indent': ['error', 4, { 'SwitchCase': 1 }], - - // ES6 Rules - 'arrow-parens': ['error', 'as-needed'], - 'prefer-const': 'error', - 'no-var': 'error', - - // React Rules - 'react/jsx-uses-vars': 'error', - 'react/jsx-uses-react': 'error', - 'react/jsx-indent': ['error', 4], - 'react/jsx-indent-props': ['error', 4], - 'react/self-closing-comp': 'error', - - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-explicit-any': 'off', - 'react-hooks/exhaustive-deps': 'error', - }, -}; diff --git a/workspaces/common-libs/ui-toolkit/eslint.config.cjs b/workspaces/common-libs/ui-toolkit/eslint.config.cjs new file mode 100644 index 00000000000..3fc136b969e --- /dev/null +++ b/workspaces/common-libs/ui-toolkit/eslint.config.cjs @@ -0,0 +1,81 @@ +const { defineConfig, globalIgnores } = require('eslint/config'); + +const tsParser = require('@typescript-eslint/parser'); +const typescriptEslint = require('@typescript-eslint/eslint-plugin'); +const reactPlugin = require('eslint-plugin-react'); +const reactHooksPlugin = require('eslint-plugin-react-hooks'); +const storybookPlugin = require('eslint-plugin-storybook'); + +module.exports = defineConfig([ + { + files: ['src/**/*.{ts,tsx,js,jsx}'], + + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + }, + + plugins: { + '@typescript-eslint': typescriptEslint, + react: reactPlugin, + 'react-hooks': reactHooksPlugin, + storybook: storybookPlugin, + }, + + settings: { + react: { + version: 'detect', + }, + }, + + rules: { + // Best Practices + 'no-use-before-define': 'error', + 'no-redeclare': 'error', + 'no-else-return': 'error', + 'eqeqeq': 'error', + + // Stylistic Issues + 'indent': ['error', 4, { SwitchCase: 1 }], + + // ES6 Rules + 'arrow-parens': ['error', 'as-needed'], + 'prefer-const': 'error', + 'no-var': 'error', + + // React Rules + 'react/jsx-uses-vars': 'error', + 'react/jsx-uses-react': 'error', + 'react/jsx-indent': ['error', 4], + 'react/jsx-indent-props': ['error', 4], + 'react/self-closing-comp': 'error', + + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'react-hooks/exhaustive-deps': 'error', + }, + }, + globalIgnores(['**/lib', '**/.eslintrc.js', '**/*.d.ts', '**/dist/**', '**/build/**', '.storybook/**']), + // Use full parser services only for our source files (these are in tsconfig) + { + files: ["src/**/*.ts", "src/**/*.tsx"], + languageOptions: { + parser: tsParser, + parserOptions: { + project: ["./tsconfig.json"], + tsconfigRootDir: __dirname, + }, + }, + }, + // For Storybook and generated/dist files that are outside tsconfig, do not provide `project`. + { + files: [".storybook/**", ".storybook/*", "**/dist/**", "**/build/**"], + languageOptions: { + parser: tsParser, + }, + }, +]); + diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index 92be9e87fbb..e3ecb7c9535 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -53,10 +53,10 @@ "@storybook/react-vite": "^8.6.14", "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "copyfiles": "~2.4.1", - "eslint": "^9.26.0", + "eslint": "9.27.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-storybook": "^0.8.0", 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 8931578157d..68d19804040 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 @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/ban-types */ /** * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/package.json b/workspaces/mcp-inspector/mcp-inspector-extension/package.json index 6fce5621092..81f70d138eb 100644 --- a/workspaces/mcp-inspector/mcp-inspector-extension/package.json +++ b/workspaces/mcp-inspector/mcp-inspector-extension/package.json @@ -72,10 +72,10 @@ "@types/vscode": "^1.84.0", "@types/mocha": "^10.0.3", "@types/node": "22.15.18", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@vscode/test-electron": "^2.5.2", - "eslint": "^9.26.0", + "eslint": "9.27.0", "mocha": "^11.2.2", "typescript": "5.8.3", "copyfiles": "^2.4.1", diff --git a/workspaces/mi/mi-core/package.json b/workspaces/mi/mi-core/package.json index 58eb8989672..aae49911e7b 100644 --- a/workspaces/mi/mi-core/package.json +++ b/workspaces/mi/mi-core/package.json @@ -13,9 +13,9 @@ "author": "WSO2", "devDependencies": { "typescript": "5.8.3", - "@typescript-eslint/parser": "^8.32.1", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "eslint": "^9.27.0", + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "eslint": "9.27.0", "@eslint/eslintrc": "~3.3.1", "@eslint/js": "~9.27.0" }, diff --git a/workspaces/mi/mi-data-mapper/package.json b/workspaces/mi/mi-data-mapper/package.json index b6095685c91..6d1e01ecf7b 100644 --- a/workspaces/mi/mi-data-mapper/package.json +++ b/workspaces/mi/mi-data-mapper/package.json @@ -46,8 +46,8 @@ "@types/lodash": "4.17.17", "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@typescript-eslint/eslint-plugin": "~8.32.1", - "@typescript-eslint/parser": "~8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@types/blueimp-md5": "^2.18.2", "typescript": "5.8.3", "css-loader": "^7.1.2", @@ -58,7 +58,7 @@ "tslint-react": "^5.0.0", "tslint-react-hooks": "^2.2.2", "copyfiles": "^2.4.1", - "eslint": "^9.27.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "ts-morph": "^22.0.0", diff --git a/workspaces/mi/mi-diagram/package.json b/workspaces/mi/mi-diagram/package.json index b48b693bfe7..ad30ac32df1 100644 --- a/workspaces/mi/mi-diagram/package.json +++ b/workspaces/mi/mi-diagram/package.json @@ -66,7 +66,7 @@ "@storybook/test": "^8.6.14", "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@typescript-eslint/eslint-plugin": "~8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", "storybook": "^8.6.14", "typescript": "5.8.3", "jest": "^30.0.0", diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 90efdacb6f3..d2b73723e08 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -1013,8 +1013,8 @@ "@types/mocha": "^10.0.1", "@types/node": "22.15.21", "@types/vscode": "^1.100.0", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@vscode/test-electron": "^2.5.2", "@wso2/mi-data-mapper-utils": "workspace:*", "@wso2/mi-diagram": "workspace:*", @@ -1022,7 +1022,7 @@ "@wso2/mi-visualizer": "workspace:*", "@wso2/wso2-platform-core": "workspace:*", "await-notify": "^1.0.1", - "eslint": "^9.27.0", + "eslint": "9.27.0", "glob": "^11.0.2", "mocha": "^11.4.0", "playwright-core": "~1.55.1", diff --git a/workspaces/mi/mi-rpc-client/package.json b/workspaces/mi/mi-rpc-client/package.json index 029b6ae0676..01899c3a95c 100644 --- a/workspaces/mi/mi-rpc-client/package.json +++ b/workspaces/mi/mi-rpc-client/package.json @@ -15,9 +15,9 @@ "@types/react": "18.2.0", "@types/react-dom": "18.2.0", "typescript": "5.8.3", - "@typescript-eslint/parser": "^8.32.1", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "eslint": "^9.27.0" + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "eslint": "9.27.0" }, "dependencies": { "@types/vscode-webview": "^1.57.5", diff --git a/workspaces/mi/syntax-tree/package.json b/workspaces/mi/syntax-tree/package.json index 41f65d061b5..1fc2cb1833f 100644 --- a/workspaces/mi/syntax-tree/package.json +++ b/workspaces/mi/syntax-tree/package.json @@ -56,7 +56,7 @@ "tslib": "^2.5.0", "typescript": "5.8.3", "rimraf": "^6.0.1", - "@typescript-eslint/eslint-plugin": "~8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", "eslint-plugin-react-hooks": "~5.2.0", "eslint-plugin-unused-imports": "~4.1.4" }, @@ -64,7 +64,7 @@ "tslint": "~6.1.3", "@types/node": "~22.15.21", "jsonix": "~3.0.0", - "eslint": "~9.27.0", + "eslint": "9.27.0", "vscode-languageserver-types": "~3.17.5" } } From 651e7042bdca3562e61c2e9207ab089d8800acba Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 14:29:17 +0530 Subject: [PATCH 067/247] Update ESLint ignore patterns to include test resources --- workspaces/bi/bi-extension/.eslintrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/bi/bi-extension/.eslintrc.json b/workspaces/bi/bi-extension/.eslintrc.json index 1314ad17b72..07e3300d275 100644 --- a/workspaces/bi/bi-extension/.eslintrc.json +++ b/workspaces/bi/bi-extension/.eslintrc.json @@ -25,6 +25,7 @@ "ignorePatterns": [ "out", "dist", - "**/*.d.ts" + "**/*.d.ts", + "src/test/test-resources/**" ] } \ No newline at end of file From 9ef494d51aae3a7fa6570bae6dde320d76aaebbc Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 16:07:28 +0530 Subject: [PATCH 068/247] Apply suggestion from @coderabbitai[bot] Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../src/views/BI/Forms/FormGenerator/index.tsx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 a6041c50007..e815e93bf6e 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 @@ -1087,11 +1087,18 @@ export const FormGenerator = forwardRef(func const newStack = [...stack] const currentTop = newStack[newStack.length - 1]; const newTop = newStack[newStack.length - 2]; - if (newTop.type.codedata.node === "CLASS") { - newTop.type.functions[newTop.fieldIndex!].returnType = currentTop!.type.name; + const fieldIndex = newTop.fieldIndex; + if (fieldIndex === undefined) { + return; } - else { - newTop.type.members[newTop.fieldIndex!].type = currentTop!.type.name; + if (newTop.type.codedata.node === "CLASS") { + const fn = newTop.type.functions?.[fieldIndex]; + if (!fn) { return; } + fn.returnType = currentTop!.type.name; + } else { + const member = newTop.type.members?.[fieldIndex]; + if (!member) { return; } + member.type = currentTop!.type.name; } newStack[newStack.length - 2] = newTop; newStack.pop(); From 23a34dbf537d3a33a21a9d2688472f716d1a6b94 Mon Sep 17 00:00:00 2001 From: gayaldassanayake Date: Mon, 19 Jan 2026 12:07:18 +0530 Subject: [PATCH 069/247] Add cdc for postgres --- .../ballerina-extension/src/utils/project-artifacts.ts | 2 ++ .../src/views/BI/ComponentListView/EventIntegrationPanel.tsx | 2 ++ .../ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx | 2 +- .../src/components/nodes/EntryNode/components/GeneralWidget.tsx | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index ccc711aae9e..b509a08303b 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -493,6 +493,8 @@ function getCustomEntryNodeIcon(type: string) { return "bi-solace"; case "mssql": return "bi-mssql"; + case "postgresql": + return "bi-postgresql"; default: return "bi-globe"; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx index 11a257157c4..182b2205cfc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx @@ -119,6 +119,8 @@ export function getCustomEntryNodeIcon(type: string) { return ; case "mssql": return ; + case "postgresql": + return ; default: return null; } 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 01e1affa042..506a1f61a47 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -324,7 +324,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { setIsFtpService(service.moduleName === "ftp"); setIsHttpService(service.moduleName === "http"); setIsMcpService(service.moduleName === "mcp"); - setIsCdcService(service.moduleName === "mssql"); + setIsCdcService(service.moduleName === "mssql" || service.moduleName === "postgresql"); } // Extract object methods if available (for service classes) diff --git a/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/components/GeneralWidget.tsx b/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/components/GeneralWidget.tsx index c85bce7ba89..18b82470b4c 100644 --- a/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/components/GeneralWidget.tsx +++ b/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/components/GeneralWidget.tsx @@ -126,6 +126,8 @@ function getCustomEntryNodeIcon(type: string) { return ; case "mssql": return ; + case "postgresql": + return ; default: return null; } From 37fbe536bcba2d455eca69b8b7ac073bc0b9fa2b Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 17:01:04 +0530 Subject: [PATCH 070/247] Fix handleArgChange function to start key index at 1 instead of 2 --- .../src/components/ParamManager/ArgManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx index c2cc5bbe103..f6194ff3172 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ArgManager.tsx @@ -327,7 +327,7 @@ function handleArgChange(param: Parameter, allParams: Parameter[]) { const name = arg.split('.').pop(); let key = name; - let i = 2; + let i = 1; while (allParams.some(p => p.key === key && p.id !== param.id)) { key = name + (i++); } From 4f5d56c4910c2f8e4cd5ef7bc328c1a5369c0888 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Tue, 3 Feb 2026 17:12:37 +0530 Subject: [PATCH 071/247] Enhance BIFlowDiagram to handle data mapper creation --- .../ballerina-visualizer/src/utils/bi.tsx | 5 ++++ .../src/views/BI/FlowDiagram/index.tsx | 29 ++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 88fafda780d..02e10b5c5e8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -247,6 +247,11 @@ export function convertNodePropertiesToFormFields( const expression = nodeProperties[key as NodePropertyKey]; if (expression) { const formField: FormField = convertNodePropertyToFormField(key, expression, connections, clientName); + + if (getPrimaryInputType(expression.types)?.fieldType === "REPEATABLE_PROPERTY") { + handleRepeatableProperty(expression, formField); + } + formFields.push(formField); } } 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 60ca86db666..2f882a5b9c9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -1687,14 +1687,27 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }; const handleOnAddDataMapper = () => { - rpcClient.getVisualizerRpcClient().openView({ - type: EVENT_TYPE.OPEN_VIEW, - location: { - view: MACHINE_VIEW.BIDataMapperForm, - artifactType: DIRECTORY_MAP.DATA_MAPPER, - }, - isPopup: true, - }); + + setShowProgressIndicator(true); + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + + rpcClient + .getBIDiagramRpcClient() + .getNodeTemplate({ + position: targetRef.current.startLine, + filePath: model?.fileName, + id: { node: "DATA_MAPPER_CREATION" }, + }) + .then((response) => { + selectedNodeRef.current = response.flowNode; + nodeTemplateRef.current = response.flowNode; + showEditForm.current = false; + setSidePanelView(SidePanelView.FORM); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); }; // Common function to handle progress message with timeout From fc1afcb79511651f792cce13fd391db5fbbca20e Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 21:34:52 +0530 Subject: [PATCH 072/247] Ensure Form validates before LS --- .../src/components/Form/index.tsx | 54 +++++++++++-------- .../components/ParamManager/ParamManager.tsx | 9 ++-- .../components/editors/ActionTypeEditor.tsx | 7 +-- .../components/editors/AutoCompleteEditor.tsx | 7 ++- .../editors/CustomDropdownEditor.tsx | 12 +++-- .../components/editors/DropdownChoiceForm.tsx | 9 ++-- .../src/components/editors/DropdownEditor.tsx | 7 ++- .../components/editors/ExpressionEditor.tsx | 8 ++- .../src/components/editors/FileSelect.tsx | 4 +- .../src/components/editors/FormMapEditor.tsx | 9 ++-- .../components/editors/IdentifierEditor.tsx | 7 ++- .../components/editors/IdentifierField.tsx | 7 ++- .../components/editors/MultiSelectEditor.tsx | 7 ++- .../src/components/editors/PathEditor.tsx | 7 ++- .../src/components/editors/TextAreaEditor.tsx | 6 +-- .../src/components/editors/TextEditor.tsx | 4 +- .../src/components/editors/TypeEditor.tsx | 7 +-- .../src/components/editors/utils.ts | 17 ++++++ 18 files changed, 119 insertions(+), 69 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 c0c95b4c22c..72ec975c1e0 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -564,24 +564,26 @@ export const Form = forwardRef((props: FormProps) => { onSubmit && onSubmit(data, dirtyFields); }; - const handleFormValidation = async (): Promise => { + const handleFormValidation = async (formData?: FormValues): Promise => { + if (!onFormValidation) { + return true; + } + setIsValidatingForm(true); - const data = getValues(); - const validationResult = await onFormValidation(data, dirtyFields); - setIsValidatingForm(false); - return validationResult; + const data = formData ?? getValues(); + + try { + const validationResult = await onFormValidation(data, dirtyFields); + return validationResult; + } finally { + setIsValidatingForm(false); + } } const handleOnBlur = async () => { onBlur?.(getValues(), dirtyFields); }; - // 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, newType?: string | NodeProperties) => { openRecordEditor?.(open, getValues(), typeField, newType); }; @@ -901,19 +903,27 @@ export const Form = forwardRef((props: FormProps) => { })(); }; - const handleOnSaveClick = async () => { + const handleOnSaveClick = () => { setSavingButton('save'); - // Check for existing form errors (including pattern validation errors) - if (Object.keys(errors).length > 0) { - setSavingButton(null); - return; - } - - const isValidForm = onFormValidation ? await handleFormValidation() : true; - if (isValidForm) { - handleSubmit(handleOnSave)(); - } + handleSubmit( + async (data) => { + try { + const isValidForm = await handleFormValidation(data); + if (!isValidForm) { + setSavingButton(null); + return; + } + handleOnSave(data); + } catch (error) { + console.error(">>> Error validating form before save", error); + setSavingButton(null); + } + }, + () => { + setSavingButton(null); + } + )(); }; const formContent = ( diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx index 99b0b61d179..75ac7dfc3b3 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamManager.tsx @@ -28,7 +28,7 @@ import { useFormContext } from '../../context'; import { Imports, NodeKind } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { EditorFactory } from '../editors/EditorFactory'; -import { getFieldKeyForAdvanceProp } from '../editors/utils'; +import { buildRequiredRule, getFieldKeyForAdvanceProp } from '../editors/utils'; export interface Parameter { id: number; @@ -145,10 +145,11 @@ export function ParamManagerEditor(props: ParamManagerEditorProps) { control={control} name={field.key} rules={{ - required: { - value: !field.optional && !field.placeholder, + required: buildRequiredRule({ + isRequired: !field.optional, + label: field.label, message: `${selectedNode === "DATA_MAPPER_DEFINITION" ? 'Input type' : field.label} is required` - } + }) }} render={({ field: { onChange }, fieldState: { error } }) => ( <> diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx index 957fda6a5da..f26dcd93a9e 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx @@ -39,7 +39,7 @@ import { FormField } from "../Form/types"; import { useFormContext } from "../../context"; import { Controller } from "react-hook-form"; import { S } from "./ExpressionEditor"; -import { getPropertyFromFormField, sanitizeType } from "./utils"; +import { buildRequiredRule, getPropertyFromFormField, sanitizeType } from "./utils"; import { debounce } from "lodash"; import styled from "@emotion/styled"; import ReactMarkdown from "react-markdown"; @@ -604,10 +604,7 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { name={field.key} defaultValue={field.value} rules={{ - required: { - value: !field.optional, - message: `${field.label} is required` - } + required: buildRequiredRule({ isRequired: !field.optional, label: field.label }) }} render={({ field: { name, value, onChange }, fieldState: { error } }) => { onChangeRef.current = onChange; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/AutoCompleteEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/AutoCompleteEditor.tsx index 7d7238fcad7..0b09d7d07cd 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/AutoCompleteEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/AutoCompleteEditor.tsx @@ -21,7 +21,7 @@ import React, { useEffect } from "react"; import { AutoComplete } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; -import { capitalize, getValueForDropdown } from "./utils"; +import { buildRequiredRule, capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; @@ -42,7 +42,10 @@ export function AutoCompleteEditor(props: AutoCompleteEditorProps) { id={field.key} description={field.documentation} value={value as string} - {...register(field.key, { required: !field.optional, value: getValueForDropdown(field) })} + {...register(field.key, { + required: buildRequiredRule({ isRequired: !field.optional, label: field.label }), + value: getValueForDropdown(field) + })} label={capitalize(field.label)} items={field.items} allowItemCreate={true} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx index 2150283ec37..e960f9ddccc 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx @@ -26,7 +26,7 @@ import styled from "@emotion/styled"; import { Dropdown } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; -import { capitalize, getValueForDropdown } from "./utils"; +import { buildRequiredRule, capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; @@ -63,7 +63,10 @@ export function CustomDropdownEditor(props: CustomDropdownEditorProps) { ({ id: item, content: item, value: item }))} required={!field.optional} @@ -85,7 +88,10 @@ export function CustomDropdownEditor(props: CustomDropdownEditorProps) { ({ id: item, content: item, value: item }))} required={!field.optional} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownChoiceForm.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownChoiceForm.tsx index 06b2dac7101..f5e950c25fa 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownChoiceForm.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownChoiceForm.tsx @@ -21,7 +21,7 @@ import React, { useEffect, useState } from "react"; import { Dropdown, LocationSelector, RadioButtonGroup } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; -import { capitalize, getValueForDropdown } from "./utils"; +import { buildRequiredRule, capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import styled from "@emotion/styled"; import { EditorFactory } from "./EditorFactory"; @@ -74,7 +74,10 @@ export function DropdownChoiceForm(props: DropdownChoiceFormProps) { ({ id: item, content: item, value: item }))} @@ -104,5 +107,3 @@ export function DropdownChoiceForm(props: DropdownChoiceFormProps) { ); } - - 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 f0d82ea0705..9b10212770c 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -21,7 +21,7 @@ import React, { useEffect } from "react"; import { Dropdown } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; -import { capitalize, getValueForDropdown } from "./utils"; +import { buildRequiredRule, capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; @@ -67,7 +67,10 @@ export function DropdownEditor(props: DropdownEditorProps) { { // Only use 'required' if there's no pattern validation (pattern will handle empty values) if (!patternType?.pattern && !expressionSetType?.pattern) { - rules.required = required ?? (!field.optional && !field.placeholder); + const effectiveRequired = required ?? !field.optional; + rules.required = buildRequiredRule({ + isRequired: !!effectiveRequired, + label: field.label + }); } if (expressionSetType?.pattern) { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/FileSelect.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/FileSelect.tsx index 53c95c38ddf..54f49fc3520 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/FileSelect.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/FileSelect.tsx @@ -22,7 +22,7 @@ import { Dropdown, LocationSelector } from "@wso2/ui-toolkit"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { FormField } from "../Form/types"; -import { capitalize, getValueForDropdown } from "./utils"; +import { buildRequiredRule } from "./utils"; import { useFormContext } from "../../context"; import { Controller } from "react-hook-form"; @@ -48,7 +48,7 @@ export function FileSelect(props: DropdownEditorProps) { (
Expression - ( diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextEditor.tsx index 41b55da6ab4..d0f969ba095 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextEditor.tsx @@ -20,7 +20,7 @@ import React from "react"; import { FormField } from "../Form/types"; import { TextField } from "@wso2/ui-toolkit"; import { useFormContext } from "../../context"; -import { capitalize } from "./utils"; +import { buildRequiredRule, capitalize } from "./utils"; interface TextEditorProps { field: FormField; @@ -40,7 +40,7 @@ export function TextEditor(props: TextEditorProps) { // Build validation rules const validationRules: any = { - required: !field.optional && !field.placeholder, + required: buildRequiredRule({ isRequired: !field.optional, label: field.label }), value: field.value }; 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 06ef0a91f53..259354d4402 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx @@ -34,7 +34,7 @@ import { FormField } from "../Form/types"; import { useFormContext } from "../../context"; import { Controller } from "react-hook-form"; import { S } from "./ExpressionEditor"; -import { sanitizeType } from "./utils"; +import { buildRequiredRule, sanitizeType } from "./utils"; import { debounce } from "lodash"; import styled from "@emotion/styled"; import ReactMarkdown from "react-markdown"; @@ -291,10 +291,7 @@ export function TypeEditor(props: TypeEditorProps) { name={field.key} defaultValue={field.value} rules={{ - required: { - value: !field.optional, - message: `${field.label} is required` - } + required: buildRequiredRule({ isRequired: !field.optional, label: field.label }) }} render={({ field: { name, value, onChange }, fieldState: { error } }) => (
diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/utils.ts b/workspaces/ballerina/ballerina-side-panel/src/components/editors/utils.ts index e520c82540e..49d87f4aee1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/utils.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/utils.ts @@ -57,6 +57,23 @@ export function capitalize(str: string) { return startCase(str); } +type RequiredRuleOptions = { + isRequired: boolean; + label?: string; + message?: string; +}; + +export const buildRequiredRule = ({ isRequired, label, message }: RequiredRuleOptions) => { + if (!isRequired) { + return false; + } + + return { + value: true, + message: message ?? `${label ?? "This field"} is required`, + }; +}; + export function sanitizeType(type: string) { if (type.includes('{') || type.includes('}') || (type.match(/:/g) || []).length > 1) { return type; From a05c18c032ea960fbc2f0e5a1f246ab6b90fbb1b Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Thu, 5 Feb 2026 12:55:28 +0530 Subject: [PATCH 073/247] Fix CVE-2026-25547: Update @isaacs/brace-expansion to 5.0.1 - Updated @isaacs/brace-expansion from 5.0.0 to 5.0.1 to resolve high-severity vulnerability - Added version overrides in package.json pnpm.overrides section - Updated common/config/rush/.pnpmfile.cjs to enforce version across all dependencies - Added overrides section to workspaces/common-libs/rpc-generator/package.json - Regenerated lock files with rush update --full - Verified with Trivy scan: 0 vulnerabilities detected --- common/config/rush/.pnpmfile.cjs | 6 + common/config/rush/pnpm-lock.yaml | 2651 +++++++++-------- package.json | 1 + .../rpc-generator/package-lock.json | 6 +- .../common-libs/rpc-generator/package.json | 3 + 5 files changed, 1347 insertions(+), 1320 deletions(-) diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index d586654bfc3..973889d99a4 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -21,6 +21,9 @@ module.exports = { } // Security vulnerability fixes + if (pkg.dependencies['@isaacs/brace-expansion']) { + pkg.dependencies['@isaacs/brace-expansion'] = '^5.0.1'; + } if (pkg.dependencies['brace-expansion']) { pkg.dependencies['brace-expansion'] = '^2.0.2'; } @@ -76,6 +79,9 @@ module.exports = { if (pkg.devDependencies) { // Security vulnerability fixes for dev dependencies + if (pkg.devDependencies['@isaacs/brace-expansion']) { + pkg.devDependencies['@isaacs/brace-expansion'] = '^5.0.1'; + } if (pkg.devDependencies['brace-expansion']) { pkg.devDependencies['brace-expansion'] = '^2.0.2'; } diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 216d032fa48..710963c6cec 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -102,7 +102,7 @@ importers: version: 2.6.13(encoding@0.1.13) node-loader: specifier: ~2.0.0 - version: 2.0.0(webpack@5.104.1) + version: 2.0.0(webpack@5.105.0) portfinder: specifier: ^1.0.32 version: 1.0.38 @@ -127,7 +127,7 @@ importers: version: 16.18.126 '@types/vscode': specifier: ^1.81.0 - version: 1.108.1 + version: 1.109.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -145,16 +145,16 @@ importers: version: 5.0.10 ts-loader: specifier: ^9.4.4 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@5.1.4) + version: 5.105.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.104.1) + version: 5.1.4(webpack@5.105.0) ../../workspaces/api-designer/api-designer-rpc-client: dependencies: @@ -291,7 +291,7 @@ importers: version: 4.14.202 '@types/node': specifier: ^20.10.6 - version: 20.19.30 + version: 20.19.31 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -309,31 +309,31 @@ importers: version: 2.4.1 css-loader: specifier: ^5.2.7 - version: 5.2.7(webpack@5.104.1) + version: 5.2.7(webpack@5.105.0) sass-loader: specifier: ^13.2.0 - version: 13.3.3(sass@1.97.3)(webpack@5.104.1) + version: 13.3.3(sass@1.97.3)(webpack@5.105.0) source-map-loader: specifier: ^4.0.1 - version: 4.0.2(webpack@5.104.1) + version: 4.0.2(webpack@5.105.0) style-loader: specifier: ^1.3.0 - version: 1.3.0(webpack@5.104.1) + version: 1.3.0(webpack@5.105.0) ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@5.1.4) + version: 5.105.0(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) ../../workspaces/apk/apk-extension: devDependencies: @@ -348,7 +348,7 @@ importers: version: 18.19.130 '@types/vscode': specifier: ^1.63.0 - version: 1.108.1 + version: 1.109.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -433,7 +433,7 @@ importers: version: 18.2.0 '@types/vscode': specifier: ^1.83.1 - version: 1.108.1 + version: 1.109.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -454,10 +454,10 @@ importers: dependencies: '@ai-sdk/amazon-bedrock': specifier: ^4.0.4 - version: 4.0.46(zod@4.1.11) + version: 4.0.48(zod@4.1.11) '@ai-sdk/anthropic': specifier: ^3.0.2 - version: 3.0.35(zod@4.1.11) + version: 3.0.36(zod@4.1.11) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -490,7 +490,7 @@ importers: version: link:../../wso2-platform/wso2-platform-core ai: specifier: ^6.0.7 - version: 6.0.67(zod@4.1.11) + version: 6.0.70(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -596,7 +596,7 @@ importers: version: 1.0.4 '@types/vscode': specifier: ^1.83.1 - version: 1.108.1 + version: 1.109.0 '@types/vscode-notebook-renderer': specifier: ~1.72.2 version: 1.72.4 @@ -653,7 +653,7 @@ importers: version: 1.0.2 ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.3) @@ -668,10 +668,10 @@ importers: version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.104.1) + version: 6.0.1(webpack@5.105.0) yarn: specifier: ^1.22.19 version: 1.22.22 @@ -774,7 +774,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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) @@ -819,25 +819,25 @@ importers: version: 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.104.1) + version: 13.0.1(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) express: specifier: ^4.22.1 version: 4.22.1 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.0) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.104.1) + version: 9.1.0(typescript@5.8.3)(webpack@5.105.0) glob: specifier: ^11.1.0 version: 11.1.0 @@ -876,13 +876,13 @@ importers: version: 1.97.3 sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.105.0) storybook: specifier: ^8.6.14 version: 8.6.15(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) stylelint: specifier: ^16.19.1 version: 16.26.1(typescript@5.8.3) @@ -891,10 +891,10 @@ importers: version: 38.0.0(stylelint@16.26.1(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.104.1) + version: 8.0.0(webpack@5.105.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -912,13 +912,13 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + version: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -1048,7 +1048,7 @@ importers: version: 1.2.3 prosemirror-markdown: specifier: ~1.13.2 - version: 1.13.3 + version: 1.13.4 prosemirror-model: specifier: ~1.25.4 version: 1.25.4 @@ -1085,7 +1085,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -1266,7 +1266,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -1278,28 +1278,28 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@5.1.4) + version: 5.105.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -1369,7 +1369,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1487,7 +1487,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1647,7 +1647,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -1659,13 +1659,13 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.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.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1708,7 +1708,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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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) @@ -1729,34 +1729,34 @@ importers: version: 18.2.0 babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) graphql: specifier: ^16.11.0 version: 16.12.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.10.0(webpack@5.104.1) + version: 2.10.0(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@4.10.0) + version: 5.105.0(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1935,7 +1935,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.0) html-to-image: specifier: ^1.10.8 version: 1.11.11 @@ -1978,31 +1978,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) ../../workspaces/ballerina/record-creator: dependencies: @@ -2139,7 +2139,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2239,7 +2239,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2342,31 +2342,31 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@5.1.4) + version: 5.105.0(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) ../../workspaces/ballerina/type-diagram: dependencies: @@ -2411,7 +2411,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.0) html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -2460,31 +2460,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) ../../workspaces/ballerina/type-editor: dependencies: @@ -2600,7 +2600,7 @@ importers: version: 22.15.18 '@types/vscode': specifier: ^1.84.0 - version: 1.108.1 + version: 1.109.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -2618,7 +2618,7 @@ importers: version: link:../../common-libs/playwright-vscode-tester copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.104.1) + version: 13.0.1(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2636,16 +2636,16 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.104.1) + version: 6.0.1(webpack@5.105.0) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2746,7 +2746,7 @@ importers: version: 22.15.35 '@types/vscode': specifier: ^1.100.0 - version: 1.108.1 + version: 1.109.0 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -2761,7 +2761,7 @@ importers: version: 1.12.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.104.1) + version: 13.0.1(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2773,10 +2773,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2785,10 +2785,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.104.1) + version: 6.0.1(webpack@5.105.0) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2879,10 +2879,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.0) path: specifier: ^0.12.7 version: 0.12.7 @@ -2891,34 +2891,34 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.0) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) tailwindcss: specifier: ^3.4.3 version: 3.4.19(yaml@2.8.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: @@ -3198,7 +3198,7 @@ importers: version: 22.15.18 '@types/vscode': specifier: ^1.84.0 - version: 1.108.1 + version: 1.109.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -3213,7 +3213,7 @@ importers: version: 3.7.1 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.104.1) + version: 13.0.1(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3231,16 +3231,16 @@ importers: version: 6.1.6 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + version: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.104.1) + version: 5.1.4(webpack@5.105.0) ../../workspaces/mi/mi-component-diagram: dependencies: @@ -3286,7 +3286,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3447,7 +3447,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -3459,13 +3459,13 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.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.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) ts-morph: specifier: ^22.0.0 version: 22.0.0 @@ -3771,7 +3771,7 @@ importers: version: 0.5.16 ai: specifier: ^5.0.76 - version: 5.0.124(zod@3.25.76) + version: 5.0.126(zod@3.25.76) axios: specifier: ~1.12.0 version: 1.12.2 @@ -3819,7 +3819,7 @@ importers: version: 3.3.2 node-loader: specifier: ~2.1.0 - version: 2.1.0(webpack@5.104.1) + version: 2.1.0(webpack@5.105.0) portfinder: specifier: ^1.0.37 version: 1.0.38 @@ -3886,7 +3886,7 @@ importers: version: 22.15.21 '@types/vscode': specifier: ^1.100.0 - version: 1.108.1 + version: 1.109.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -3925,7 +3925,7 @@ importers: version: 6.0.1 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -3934,10 +3934,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@4.10.0) + version: 5.105.0(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.104.1) + version: 4.10.0(webpack@5.105.0) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4016,7 +4016,7 @@ importers: version: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 - version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0) '@tanstack/query-core': specifier: ^5.76.0 version: 5.90.20 @@ -4176,19 +4176,19 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4197,13 +4197,13 @@ importers: version: 3.17.5 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@5.1.4) + version: 5.105.0(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4277,7 +4277,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.980.0 + version: 3.983.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -4362,7 +4362,7 @@ importers: version: 22.15.35 '@types/vscode': specifier: ^1.100.0 - version: 1.108.1 + version: 1.109.0 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -4377,7 +4377,7 @@ importers: version: 1.12.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.104.1) + version: 13.0.1(webpack@5.105.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -4389,10 +4389,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -4401,10 +4401,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.104.1) + version: 6.0.1(webpack@5.105.0) webpack-permissions-plugin: specifier: ^1.0.10 version: 1.0.10 @@ -4516,10 +4516,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.104.1) + version: 7.1.3(webpack@5.105.0) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.104.1) + version: 6.2.0(webpack@5.105.0) path: specifier: ^0.12.7 version: 0.12.7 @@ -4528,42 +4528,42 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.0) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.104.1) + version: 16.0.6(sass@1.97.3)(webpack@5.105.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.104.1) + version: 5.0.0(webpack@5.105.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.104.1) + version: 4.0.0(webpack@5.105.0) tailwindcss: specifier: ^4.1.7 version: 4.1.18 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.104.1(webpack-cli@6.0.1) + version: 5.105.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/amazon-bedrock@4.0.46': - resolution: {integrity: sha512-Hm6yeK8ABvh+TvIYnJzGO6IOVS0/xk96FbtWHSZ8d0MYuxVgbXmEEyC71E+RsxwXVI4RZr9VuoUSA78nz5VX8g==} + '@ai-sdk/amazon-bedrock@4.0.48': + resolution: {integrity: sha512-eo4f+RGWnj4LAJRtqOl3nkEz27e6L5LYCesa7cTyzmuC0fKbGgcveK8/6u8Cbl6GYahpRzEdV+YsaCGRjBADcg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4574,20 +4574,20 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.35': - resolution: {integrity: sha512-Y3g/5uVj621XSB9lGF7WrD7qR+orhV5xpaYkRF8kfj2j4W7e7BBGIvxcdsCf85FjJbc6tKQdNTZ84ZEqT3Y5TQ==} + '@ai-sdk/anthropic@3.0.36': + resolution: {integrity: sha512-GHQccfwC0j1JltN9M47RSlBpOyHoUam0mvbYMf8zpE0UD1tzIX5sDw2m/8nRlrTz6wGuKfaDxmoC3XH7uhTrXg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.30': - resolution: {integrity: sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw==} + '@ai-sdk/gateway@2.0.32': + resolution: {integrity: sha512-FT24EjSPOm+esohJO1KGFMfcKQJS2cbxSEL6GlAojlcty5CAmzpDCTU2AQb8lK2szKwGOKAnMhtBnWk/QWajPQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.32': - resolution: {integrity: sha512-7clZRr07P9rpur39t1RrbIe7x8jmwnwUWI8tZs+BvAfX3NFgdSVGGIaT7bTz2pb08jmLXzTSDbrOTqAQ7uBkBQ==} + '@ai-sdk/gateway@3.0.33': + resolution: {integrity: sha512-elnzKRxkC8ZL3IvOdklavkYTBgJhjP9l8b5MO6WYz1MBoT/0WdJoG3Jp31Olwpzk4hIac7z27S6a4q7DkhzsZg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4655,52 +4655,52 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.980.0': - resolution: {integrity: sha512-ch8QqKehyn1WOYbd8LyDbWjv84Z9OEj9qUxz8q3IOCU3ftAVkVR0wAuN96a1xCHnpOJcQZo3rOB08RlyKdkGxQ==} + '@aws-sdk/client-s3@3.983.0': + resolution: {integrity: sha512-V40PT2irPh3lj+Z95tZI6batVrjaTrWEOXRNVBuoZSgpM3Ak1jiE9ZXwVLkMcbb9/GH4xVpB3EsGM7gbxmgFLQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.980.0': - resolution: {integrity: sha512-AhNXQaJ46C1I+lQ+6Kj+L24il5K9lqqIanJd8lMszPmP7bLnmX0wTKK0dxywcvrLdij3zhWttjAKEBNgLtS8/A==} + '@aws-sdk/client-sso@3.982.0': + resolution: {integrity: sha512-qJrIiivmvujdGqJ0ldSUvhN3k3N7GtPesoOI1BSt0fNXovVnMz4C/JmnkhZihU7hJhDvxJaBROLYTU+lpild4w==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.5': - resolution: {integrity: sha512-IMM7xGfLGW6lMvubsA4j6BHU5FPgGAxoQ/NA63KqNLMwTS+PeMBcx8DPHL12Vg6yqOZnqok9Mu4H2BdQyq7gSA==} + '@aws-sdk/core@3.973.6': + resolution: {integrity: sha512-pz4ZOw3BLG0NdF25HoB9ymSYyPbMiIjwQJ2aROXRhAzt+b+EOxStfFv8s5iZyP6Kiw7aYhyWxj5G3NhmkoOTKw==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.0': resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.3': - resolution: {integrity: sha512-OBYNY4xQPq7Rx+oOhtyuyO0AQvdJSpXRg7JuPNBJH4a1XXIzJQl4UHQTPKZKwfJXmYLpv4+OkcFen4LYmDPd3g==} + '@aws-sdk/credential-provider-env@3.972.4': + resolution: {integrity: sha512-/8dnc7+XNMmViEom2xsNdArQxQPSgy4Z/lm6qaFPTrMFesT1bV3PsBhb19n09nmxHdrtQskYmViddUIjUQElXg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.5': - resolution: {integrity: sha512-GpvBgEmSZPvlDekd26Zi+XsI27Qz7y0utUx0g2fSTSiDzhnd1FSa1owuodxR0BcUKNL7U2cOVhhDxgZ4iSoPVg==} + '@aws-sdk/credential-provider-http@3.972.6': + resolution: {integrity: sha512-5ERWqRljiZv44AIdvIRQ3k+EAV0Sq2WeJHvXuK7gL7bovSxOf8Al7MLH7Eh3rdovH4KHFnlIty7J71mzvQBl5Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.3': - resolution: {integrity: sha512-rMQAIxstP7cLgYfsRGrGOlpyMl0l8JL2mcke3dsIPLWke05zKOFyR7yoJzWCsI/QiIxjRbxpvPiAeKEA6CoYkg==} + '@aws-sdk/credential-provider-ini@3.972.4': + resolution: {integrity: sha512-eRUg+3HaUKuXWn/lEMirdiA5HOKmEl8hEHVuszIDt2MMBUKgVX5XNGmb3XmbgU17h6DZ+RtjbxQpjhz3SbTjZg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.3': - resolution: {integrity: sha512-Gc3O91iVvA47kp2CLIXOwuo5ffo1cIpmmyIewcYjAcvurdFHQ8YdcBe1KHidnbbBO4/ZtywGBACsAX5vr3UdoA==} + '@aws-sdk/credential-provider-login@3.972.4': + resolution: {integrity: sha512-nLGjXuvWWDlQAp505xIONI7Gam0vw2p7Qu3P6on/W2q7rjJXtYjtpHbcsaOjJ/pAju3eTvEQuSuRedcRHVQIAQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.4': - resolution: {integrity: sha512-UwerdzosMSY7V5oIZm3NsMDZPv2aSVzSkZxYxIOWHBeKTZlUqW7XpHtJMZ4PZpJ+HMRhgP+MDGQx4THndgqJfQ==} + '@aws-sdk/credential-provider-node@3.972.5': + resolution: {integrity: sha512-VWXKgSISQCI2GKN3zakTNHSiZ0+mux7v6YHmmbLQp/o3fvYUQJmKGcLZZzg2GFA+tGGBStplra9VFNf/WwxpYg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.3': - resolution: {integrity: sha512-xkSY7zjRqeVc6TXK2xr3z1bTLm0wD8cj3lAkproRGaO4Ku7dPlKy843YKnHrUOUzOnMezdZ4xtmFc0eKIDTo2w==} + '@aws-sdk/credential-provider-process@3.972.4': + resolution: {integrity: sha512-TCZpWUnBQN1YPk6grvd5x419OfXjHvhj5Oj44GYb84dOVChpg/+2VoEj+YVA4F4E/6huQPNnX7UYbTtxJqgihw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.3': - resolution: {integrity: sha512-8Ww3F5Ngk8dZ6JPL/V5LhCU1BwMfQd3tLdoEuzaewX8FdnT633tPr+KTHySz9FK7fFPcz5qG3R5edVEhWQD4AA==} + '@aws-sdk/credential-provider-sso@3.972.4': + resolution: {integrity: sha512-wzsGwv9mKlwJ3vHLyembBvGE/5nPUIwRR2I51B1cBV4Cb4ql9nIIfpmHzm050XYTY5fqTOKJQnhLj7zj89VG8g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.3': - resolution: {integrity: sha512-62VufdcH5rRfiRKZRcf1wVbbt/1jAntMj1+J0qAd+r5pQRg2t0/P9/Rz16B1o5/0Se9lVL506LRjrhIJAhYBfA==} + '@aws-sdk/credential-provider-web-identity@3.972.4': + resolution: {integrity: sha512-hIzw2XzrG8jzsUSEatehmpkd5rWzASg5IHUfA+m01k/RtvfAML7ZJVVohuKdhAYx+wV2AThLiQJVzqn7F0khrw==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.972.3': @@ -4711,8 +4711,8 @@ packages: resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.3': - resolution: {integrity: sha512-MkNGJ6qB9kpsLwL18kC/ZXppsJbftHVGCisqpEVbTQsum8CLYDX1Bmp/IvhRGNxsqCO2w9/4PwhDKBjG3Uvr4Q==} + '@aws-sdk/middleware-flexible-checksums@3.972.4': + resolution: {integrity: sha512-xOxsUkF3O3BtIe3tf54OpPo94eZepjFm3z0Dd2TZKbsPxMiRTFXurC04wJ58o/wPW9YHVO9VqZik3MfoPfrKlw==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.972.3': @@ -4731,32 +4731,32 @@ packages: resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.5': - resolution: {integrity: sha512-3IgeIDiQ15tmMBFIdJ1cTy3A9rXHGo+b9p22V38vA3MozeMyVC8VmCYdDLA0iMWo4VHA9LDJTgCM0+xU3wjBOg==} + '@aws-sdk/middleware-sdk-s3@3.972.6': + resolution: {integrity: sha512-Xq7wM6kbgJN1UO++8dvH/efPb1nTwWqFCpZCR7RCLOETP7xAUAhVo7JmsCnML5Di/iC4Oo5VrJ4QmkYcMZniLw==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.3': resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.5': - resolution: {integrity: sha512-TVZQ6PWPwQbahUI8V+Er+gS41ctIawcI/uMNmQtQ7RMcg3JYn6gyKAFKUb3HFYx2OjYlx1u11sETSwwEUxVHTg==} + '@aws-sdk/middleware-user-agent@3.972.6': + resolution: {integrity: sha512-TehLN8W/kivl0U9HcS+keryElEWORROpghDXZBLfnb40DXM7hx/i+7OOjkogXQOF3QtUraJVRkHQ07bPhrWKlw==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.980.0': - resolution: {integrity: sha512-/dONY5xc5/CCKzOqHZCTidtAR4lJXWkGefXvTRKdSKMGaYbbKsxDckisd6GfnvPSLxWtvQzwgRGRutMRoYUApQ==} + '@aws-sdk/nested-clients@3.982.0': + resolution: {integrity: sha512-VVkaH27digrJfdVrT64rjkllvOp4oRiZuuJvrylLXAKl18ujToJR7AqpDldL/LS63RVne3QWIpkygIymxFtliQ==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.972.3': resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.980.0': - resolution: {integrity: sha512-tO2jBj+ZIVM0nEgi1SyxWtaYGpuAJdsrugmWcI3/U2MPWCYsrvKasUo0026NvJJao38wyUq9B8XTG8Xu53j/VA==} + '@aws-sdk/signature-v4-multi-region@3.983.0': + resolution: {integrity: sha512-11FCcxI/WKRufKDdPgKPXtrhjDArhkOPb4mf66rICZUnPHlD8Cb7cjZZS/eFC+iuwoHBosrxo0hYsvK3s7DxGw==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.980.0': - resolution: {integrity: sha512-1nFileg1wAgDmieRoj9dOawgr2hhlh7xdvcH57b1NnqfPaVlcqVJyPc6k3TLDUFPY69eEwNxdGue/0wIz58vjA==} + '@aws-sdk/token-providers@3.982.0': + resolution: {integrity: sha512-v3M0KYp2TVHYHNBT7jHD9lLTWAdS9CaWJ2jboRKt0WAB65bA7iUEpR+k4VqKYtpQN4+8kKSc4w+K6kUNZkHKQw==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.1': @@ -4767,8 +4767,12 @@ packages: resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.980.0': - resolution: {integrity: sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==} + '@aws-sdk/util-endpoints@3.982.0': + resolution: {integrity: sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.983.0': + resolution: {integrity: sha512-t/VbL2X3gvDEjC4gdySOeFFOZGQEBKwa23pRHeB7hBLBZ119BB/2OEFtTFWKyp3bnMQgxpeVeGS7/hxk6wpKJw==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.4': @@ -4778,8 +4782,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.3': resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} - '@aws-sdk/util-user-agent-node@3.972.3': - resolution: {integrity: sha512-gqG+02/lXQtO0j3US6EVnxtwwoXQC5l2qkhLCrqUrqdtcQxV7FDMbm9wLjKqoronSHyELGTjbFKK/xV5q1bZNA==} + '@aws-sdk/util-user-agent-node@3.972.4': + resolution: {integrity: sha512-3WFCBLiM8QiHDfosQq3Py+lIMgWlFWwFQliUHUqwEiRqLnKyhgbU3AKa7AWJF7lW2Oc/2kFNY4MlAYVnVc0i8A==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -4787,8 +4791,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.2': - resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} + '@aws-sdk/xml-builder@3.972.4': + resolution: {integrity: sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.3': @@ -4861,8 +4865,8 @@ packages: resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.0': - resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -6257,8 +6261,8 @@ packages: resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': @@ -6710,8 +6714,8 @@ packages: peerDependencies: yjs: '>=13.5.22' - '@lezer/common@1.5.0': - resolution: {integrity: sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==} + '@lezer/common@1.5.1': + resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} '@lezer/cpp@1.1.5': resolution: {integrity: sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==} @@ -6863,8 +6867,8 @@ packages: engines: {node: '>=22.7.5'} hasBin: true - '@modelcontextprotocol/sdk@1.25.3': - resolution: {integrity: sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==} + '@modelcontextprotocol/sdk@1.26.0': + resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -6917,8 +6921,8 @@ packages: '@nevware21/ts-async@0.5.5': resolution: {integrity: sha512-vwqaL05iJPjLeh5igPi8MeeAu10i+Aq7xko1fbo9F5Si6MnVN5505qaV7AhSdk5MCBJVT/UYMk3kgInNjDb4Ig==} - '@nevware21/ts-utils@0.12.5': - resolution: {integrity: sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==} + '@nevware21/ts-utils@0.12.6': + resolution: {integrity: sha512-UsS1hbgr/V/x8dT7hVHvr/PwHzASi8/Itis1+L8ykLiqsUXdfzrB1maL0vMmKbDEJpmGARsoC/7RIswi+n248Q==} '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} @@ -7991,14 +7995,14 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-aria/focus@3.21.3': - resolution: {integrity: sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==} + '@react-aria/focus@3.21.4': + resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==} 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.26.0': - resolution: {integrity: sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==} + '@react-aria/interactions@3.27.0': + resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==} 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 @@ -8009,8 +8013,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.32.0': - resolution: {integrity: sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==} + '@react-aria/utils@3.33.0': + resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==} 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 @@ -8042,8 +8046,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.32.1': - resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} + '@react-types/shared@3.33.0': + resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -8335,8 +8339,8 @@ packages: '@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==} + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} '@sinclair/typebox@0.34.48': resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} @@ -8402,8 +8406,8 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.22.0': - resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} + '@smithy/core@3.22.1': + resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.8': @@ -8466,12 +8470,12 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.12': - resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} + '@smithy/middleware-endpoint@4.4.13': + resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.29': - resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} + '@smithy/middleware-retry@4.4.30': + resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -8486,8 +8490,8 @@ packages: resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.8': - resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} + '@smithy/node-http-handler@4.4.9': + resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==} engines: {node: '>=18.0.0'} '@smithy/property-provider@4.2.8': @@ -8518,8 +8522,8 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.11.1': - resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} + '@smithy/smithy-client@4.11.2': + resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -8554,12 +8558,12 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.28': - resolution: {integrity: sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==} + '@smithy/util-defaults-mode-browser@4.3.29': + resolution: {integrity: sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.31': - resolution: {integrity: sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==} + '@smithy/util-defaults-mode-node@4.2.32': + resolution: {integrity: sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -8578,8 +8582,8 @@ packages: resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.10': - resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} + '@smithy/util-stream@4.5.11': + resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': @@ -9574,104 +9578,104 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@swagger-api/apidom-ast@1.3.0': - resolution: {integrity: sha512-CfaqcwdkWoJ8RAmmhp3fJVz+weyZ5ByKtGSlBgAlUMhfuo6qOsNIMYbSDiPZilUEbR3aXMdtqqXCpgOgZ6dMjg==} + '@swagger-api/apidom-ast@1.4.0': + resolution: {integrity: sha512-vaN7kA/okd3dWn45BRdsPHgGfMQdjL3TqRcxTmb41q6SLRJezINTE5nyJ8qVmH9bverOTAfn5IjYziwhV0lh7A==} - '@swagger-api/apidom-core@1.3.0': - resolution: {integrity: sha512-xm98bBpZbaqzsednoVZ51itqby3jVZdHZSOqtucGVixcI+1mXzkUMSOrgyw/XIFeXJUevCBx56v5ihSxAdM8+w==} + '@swagger-api/apidom-core@1.4.0': + resolution: {integrity: sha512-otHtWG8J/0bvaKThUfbSuYG9ega1jAM4ugIcxQRRozOMS7r1+pTwntbY0my5MJwZ+TeBJfVA39NRjMPiPdGttg==} - '@swagger-api/apidom-error@1.3.0': - resolution: {integrity: sha512-UX+2W4+kpK53666CxapjnNZyFse5nRO4fVltcFdaqWtUKcsQVoryxlcpmZJA7R/c7djROc3FesoawjAArdZYlw==} + '@swagger-api/apidom-error@1.4.0': + resolution: {integrity: sha512-oYVvGSE/y7g2mNnfNPq1IrEhhEQ0Faz1YWZWpaLF786iT0lunzzph9JG1Q9YSl+Z5yZ6XsmbKSOdvql+gK9xCw==} - '@swagger-api/apidom-json-pointer@1.3.0': - resolution: {integrity: sha512-yj2ViZkBla11sRcfxzmXJjv9LSXjYVuHsMy1nqjzWeHHMHsEedVIu9PUWT7QWqTAWXsNEt5BBOU/pY5L1dLkOw==} + '@swagger-api/apidom-json-pointer@1.4.0': + resolution: {integrity: sha512-LAMOgJaKy2id2zTmMmQzSEh4HahXYfWoR6pBsdNIKaLWx6sirznFnpKHa2+shfjksAkm0Gng5/eKO1jcdySOrw==} - '@swagger-api/apidom-ns-api-design-systems@1.3.0': - resolution: {integrity: sha512-iNPagRcxfDn9mdpfm6SXMDZjcKfV/LfTokRfp3uPlDD0DKzrJn66me8E1De3uOy7veK8NGsniR7j0GbNg6mMCg==} + '@swagger-api/apidom-ns-api-design-systems@1.4.0': + resolution: {integrity: sha512-uRTqvqSUdQwkiNlO9QMPcpI5ZF7PbwnavFwIkupbkZDb5r+kSdgu4bepXY9BjzvVeiOWqyvviIfTeccVcVOCeA==} - '@swagger-api/apidom-ns-arazzo-1@1.3.0': - resolution: {integrity: sha512-9xgNd6smc46HZxFdnfWTvogFgVusaDl4/XQI2b/cK2i1M2+nxSD8akJaf9Fdjz982YBAsVkagUzl4VBTVdgZZA==} + '@swagger-api/apidom-ns-arazzo-1@1.4.0': + resolution: {integrity: sha512-gUWldcU8cCN4zYfpGdgK+rXFkcmNCv/g9eXOvQaAzYHp+N8mccRl5E0weEDRVvn9kUOA0bew7NjEEZhMulblWQ==} - '@swagger-api/apidom-ns-asyncapi-2@1.3.0': - resolution: {integrity: sha512-gUYMHXh8CQZSIwhLf0IyLF2vApLilr/tmtHDs/rwxN7ZTA+k3jALVZ/EfP4Oq7TcsfHe4lw4vIkS0vAGRUhq4g==} + '@swagger-api/apidom-ns-asyncapi-2@1.4.0': + resolution: {integrity: sha512-QCzE1Dio18x/1oyElrMzwCOjnpQxlWErhcd4EIJCC61cblkHQC7feuhuZHVhH7dYqBehNH3lvJC/rBnUz8Fmlg==} - '@swagger-api/apidom-ns-asyncapi-3@1.3.0': - resolution: {integrity: sha512-A5ZB2N++Kd9sfP7sxQq4wIuVOTh4ZuLAmOYvfqgefMHE8SLZfxDYIIERs7p20NhlsxedWVj9kBNW2aIs4cIIpQ==} + '@swagger-api/apidom-ns-asyncapi-3@1.4.0': + resolution: {integrity: sha512-XcPsuGVKO8ed8WDvA56UAUR6b8YgsL+JB/pQrSnUm2KRajg6+736c8L83a2EZB0ulaZOY2+Ex/bkuYNak0ceJA==} - '@swagger-api/apidom-ns-json-schema-2019-09@1.3.0': - resolution: {integrity: sha512-ZWKwv5XGsOmrfKPAl+YdbVFi+WjiGhAe4JjPdwpBmIYtzk/QrfmUKcpJPuNGrEphwYxkM1dzI53kkZ7eZvyFRQ==} + '@swagger-api/apidom-ns-json-schema-2019-09@1.4.0': + resolution: {integrity: sha512-xvsYdcfk00vcDYAK+qA2PBQs/uyuYUc3Bubv19s8rRd+gykdzm+7vZjYEMXIZuqn4ao+DDe7kIFipx31Cz4zTw==} - '@swagger-api/apidom-ns-json-schema-2020-12@1.3.0': - resolution: {integrity: sha512-Wayw8aPAOT/oYy4gMx5pyIgVOQrQg3p6XH6lxjGo63ODEmVJDrk5aj1XCoLMxwPXrECQI33jYxnqpG0ej2xsNQ==} + '@swagger-api/apidom-ns-json-schema-2020-12@1.4.0': + resolution: {integrity: sha512-FOadSRcNmKmXDi71DpOaNyXIvIY13FSFzCVLoMrIJfAVMmuuWN+hgBjedjnp8mkRjzTW96XRjAuCQ1WUT2OCFA==} - '@swagger-api/apidom-ns-json-schema-draft-4@1.3.0': - resolution: {integrity: sha512-55Ua8EuNRRLKj6zRw38GruRUmfdlyGSfM/rXyWdCHMh59IXXdRnNERYmXIcMUhU45opTeEr53hCORRFcVnMTow==} + '@swagger-api/apidom-ns-json-schema-draft-4@1.4.0': + resolution: {integrity: sha512-LKzAUqHEAgm4WmuYbhPCDycr1nO/G14NwNG35RQJHVZi+FRrvzFgD80h5yNNzYjXYtNQrRGtKPTR6LXImZjWag==} - '@swagger-api/apidom-ns-json-schema-draft-6@1.3.0': - resolution: {integrity: sha512-ZC6RBv5GQMy5Dcq6aFKt9SkEXMagRPMDstkWc80MKeO7L3i5MRyGiTeo3lN2euDZGwofdEHRcO1jpzJbPUpU5A==} + '@swagger-api/apidom-ns-json-schema-draft-6@1.4.0': + resolution: {integrity: sha512-QoxxQw0xDpFe2SYeX96Gt2rp1MSQcvSoiiV9yR6G9j0Jbr3bipFiI6rK4OFSXq3Wcalfccjz77aiG42K9QDWUQ==} - '@swagger-api/apidom-ns-json-schema-draft-7@1.3.0': - resolution: {integrity: sha512-DLEjKKz9y7ht4iat8HeN2o9bHo84iSxKPS1cPmJMq5BavSN3yDYDqPks8Vni+LZI9SeWpzrPA1s9FbgqmDjCEQ==} + '@swagger-api/apidom-ns-json-schema-draft-7@1.4.0': + resolution: {integrity: sha512-jnjuj4n26FhS2ZXwA6n86PlRi2sZ5GIP18JBRLGwDxTRCEqguX7Ar1NgKDn9VCoCmSZQ04ebLoipFGafvlA3VA==} - '@swagger-api/apidom-ns-openapi-2@1.3.0': - resolution: {integrity: sha512-aRx8PBOQ2Xc3+fkJ6asODjuJk/0/uECrLc1b4X5T2m3eJk1/YGjAjZHcSBYO/isRSLcRgzgqCZG6iFn3mtHakw==} + '@swagger-api/apidom-ns-openapi-2@1.4.0': + resolution: {integrity: sha512-2Uxy+dv4oU5Zw03Twkoxz1FWz4117Sz6UEWUmRaFsijGpaxWkauy6tBpp/U43D86eMRpkR6Jb6OA+UTaENYxxQ==} - '@swagger-api/apidom-ns-openapi-3-0@1.3.0': - resolution: {integrity: sha512-H9l72st2q8mUOVVftoexIDNJPD6jz6wxfVkJWcrPYsHcnpMdWDKeHxqMZAsoZozAZxM1hMG3p40BzPi/8ZBJhQ==} + '@swagger-api/apidom-ns-openapi-3-0@1.4.0': + resolution: {integrity: sha512-012Zx/r6ncajjc98AzZNDUpt1ShXwutUtrvCuBoz8dwQzpJfPc2HNGMM6tOvYX/isqzeCG7+zlKEG8tEv0X1RA==} - '@swagger-api/apidom-ns-openapi-3-1@1.3.0': - resolution: {integrity: sha512-g9Wzq4Wv7P1tYf1Eo1AQjXwQWjCt47QUOzrIsPDvd6J0BFbNkAZRns1xSwhh9wblFOmAqBioRTcurlMWibR4lQ==} + '@swagger-api/apidom-ns-openapi-3-1@1.4.0': + resolution: {integrity: sha512-ZW91r56RyalrNdxB4vnJNOXLNi/iQZSyvUjNDkJAO5e8/z3Hf7evU1ftCpgvsQVwiVXOG+b5KfgOw3Lwbc+a2w==} - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.3.0': - resolution: {integrity: sha512-ICxejvaXXujP0igfZ3Ielf9/FxBe+lbAlROU/NIYt2eJUWpG7TnG/RzDKuqv2OIgosWm6iqhe5EIZwptCjMpMA==} + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.4.0': + resolution: {integrity: sha512-XtLjh4dHQZwLkqhYSA2Uizu33/MrJsnk2KYXujokMJN4BkfGa6thzzvjTUCC7ZFQW6hV2aMm6tmwm51UdWCCMQ==} - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.3.0': - resolution: {integrity: sha512-wysRnFKThjD/BfVXDxrXH8HtGe0dyjwKyH6WUltE97MyY3NqJjICCEJxfjWlp1DpH4p8ngYM8S6GYDqKlFBLuQ==} + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.4.0': + resolution: {integrity: sha512-1adlUHS7X1FAFVFb/3XnLh/D8PLcbBcf40OXmIpdQW92fIUdhhUJfuthTD6i4no0bEplkFATyO6Yd6LYNAGSCw==} - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.3.0': - resolution: {integrity: sha512-S1RR3Ma7h98PQt6gnxi63Ya/826FPIcoa5uJqYBV4y4xO0OId0BWq9JkmKBxxhmrmlmZr+Ztxa7EaGtpvUZ/nA==} + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.4.0': + resolution: {integrity: sha512-Xqzi8ciYxNaMIXLtWh/80xQAh6ulqd/yOxDXJKdQqAQSExGwRI3bXHo0ynIvMJIkO049VKDhvqmTv1vEmZwQUA==} - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.3.0': - resolution: {integrity: sha512-MLpTLMyFgp2BpIpMB5vPf2riW4CsqW5oKL7SuYAkwmpM8GnFxG1x6+4T1YHaZrRjj6l4/6JFpPx+gjJP293OOw==} + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.4.0': + resolution: {integrity: sha512-HkWOuNjKnzgaa/ZCSLT1v+kqBof1dou6m3dXUfWw/hTpXk4Pp/kwKtqz9n+LCvG2bNfVEZFvwgGF3N6ZSujdog==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.3.0': - resolution: {integrity: sha512-JIFDUmEsTkEneRdeBhSsHSaPd8/F8hkeSp9ePAvWbruI40iCC8gQLbiVs1SgEtaMjU/SNEl2X1yVJqYNKfwWHw==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.4.0': + resolution: {integrity: sha512-i0WWw0xPZvPf3jTET0YzE8INu7PyNTyypD09WCKhhKgmFpNmZ2SHbHTP6+/OTTRu4nId9+icD6cHKCma0/W2tQ==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.3.0': - resolution: {integrity: sha512-MYXkj2VJcp7b0wT5rzJDseNkWr8KzjmlxD9yWj9T+RDG76BmZBQSU0Xb1HDmW9TBk3vEWNrNfY7hk/8iD7QbTA==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.4.0': + resolution: {integrity: sha512-zKklrdThBa9yqmYeZYyX5zd0NKCLIUOIkV1HtMXsCg2f9ceTHldtenn3RvqYMY0EDd6IpVRfLfOhUNPpttTLOg==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.3.0': - resolution: {integrity: sha512-jGg0JF9Y5K7hpRS0Bghl/iJcy14fUye8rMzM62aZlUm6pla/Gc3oIX/UF3WS9mPCTMtY0KLMhExFPs4VgPW7iA==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.4.0': + resolution: {integrity: sha512-+hzzfCSJ8KaoApYmI22aYKoXi0La0/696FaOnCloPloKZwcPvjR5S7WxleZTMuAcXzeM4R/92LbD5BTUein4Ow==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.3.0': - resolution: {integrity: sha512-/xLKCYbjy3pTIIIbviFs3Zbud8BAS4OU8NhERYf2uoubfzCbxjJge0XyoiwSue0u7cGcponFOZtvxuFIwIRoMg==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.4.0': + resolution: {integrity: sha512-R7cbEbFYTJ8hCV04VkaRap54T0t4Q+v9gXvxVf+Kn1csRXoR0O/yJBakCcmv7taswzv+1dCWbjJOJSHDJFIB0w==} - '@swagger-api/apidom-parser-adapter-json@1.3.0': - resolution: {integrity: sha512-tAJ2sKfv5nPDYHXaoXMPE+yBoNF7ribMlMCx5raw9u1CC76wTC65uG1VvmL6DdqlDuyD3hxdlOSMIXLQ3/CLaQ==} + '@swagger-api/apidom-parser-adapter-json@1.4.0': + resolution: {integrity: sha512-QfwjuG1UaEYGf+tpPfN6GAZTJezhq2uy5Dgxmxe1f9Z/0V3mZmmdFck+NEXU698tAvFsf+qMeFmeR22EB4mzSg==} - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.3.0': - resolution: {integrity: sha512-ncfY8UThDhYA/CfsogLLVeUtUWvQJ0UIN2BKxyfIRkExPSFxinOZRo4rLlice6cpEVuQUh0BWVlwC0x3+sd58w==} + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.4.0': + resolution: {integrity: sha512-1crFQpjzGod/wdW8BE1C8j/qMe02EaUlXt8ZWePns3GzEWSEdxRuiiNh/b0EzXVlAUStcRigzaajNsn+KT3tUA==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.3.0': - resolution: {integrity: sha512-Oy29Pw7F5BLjhmCVUHsjcQizbnNBYj1Hm0nc/XWlu7D/V2lutaLUGE7Z7fankvC5chVhnuOdOOpiY23w/616XQ==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.4.0': + resolution: {integrity: sha512-K7r2qZ3wNu+ql4yUsTILbMCTZ5BY0deEi+ig+9KskRqjJ/0TZeeqq3rj8GCgHw7ocQh2WnMBeGGX1YO8bWBAUQ==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.3.0': - resolution: {integrity: sha512-NIhIQ+l4adbbXuawZ1VGw5iesBCfFDosd2cxU+H+Q4iEazKm+IXF/gxKEWWJCsw5s9umzt1+oCwzLutSufz4lA==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.4.0': + resolution: {integrity: sha512-oECL5TrqbYzVRv17Jco1G3KruZkh7N7iKhfqgBcb1irZ4ozXNlv1FtZ8bZxpczXxvGhSkSLFKbEd0pHZaO0iPA==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.3.0': - resolution: {integrity: sha512-tmNaZaVEgDuHOray+xV23rD88bvQtDp0k+9uiUhg4Xl/DtA451r47ai/wEduEXmjCSCe+dpdCnR17nhe2FD+CA==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.4.0': + resolution: {integrity: sha512-Ai0j0oInutDAb0Lvpb/UBhatc0QOLgdYpAPupafvjCEFt6fTpomO2HjNA+4Z+0cqH69ggKgQ/ldJ5G8FgqKcrw==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.3.0': - resolution: {integrity: sha512-I1BTjMo8HODyeIbwE9ZG7uyc5yfPCL3QvkBGi8N+er26POTBTN/g+n+/IovtT7XlymKSrfnOnTtqCxEBA5+X8g==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.4.0': + resolution: {integrity: sha512-DD6JwfHcywPxZl7e3UqeAU4qdzjQaVudUnnFHWH83m6qWEHldN1+vSfQTzn4DQgi9dz88XfIakUJ1HFHIfEBhg==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.3.0': - resolution: {integrity: sha512-ZaPsg7yH/2p/kp2VrwAxOQEVsNe57zN5h8vOQAfikLQ2Qpek/B77Y99wnPIl2YscuFKPdn3Vw+tcEGbHe9wmhw==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.4.0': + resolution: {integrity: sha512-FWGMgP1iJGIXISLSyz0j/Pthux11H712gPYzaL7DRZz8wevQvgc4TrYF4hHZwSvN8xpEkJLURBclfwsLDKzIXQ==} - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.3.0': - resolution: {integrity: sha512-iGTkPgLQ/gT9jodwierviRbqAQzU8odHNXS8/XG6UbiOALOpbXyd1KhInXNGy54EMFHa3BgvIXNswBGhTRGIzw==} + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.4.0': + resolution: {integrity: sha512-rqVxBEiuCyBbNhnFUsBxPEewFjKDBYkiFqJGmwNo79G51wJOK9GnSjT1AyMZ+fW3RDlDZ+HR8IojQCykhYoAGg==} - '@swagger-api/apidom-reference@1.3.0': - resolution: {integrity: sha512-SnSOWLX+dCBJvs6oeNy2BmO1PBpW1x+jQupfETE323tEjf9uemxFo0/gj0hiNB/IAKHRqXQtsYlGM6ciSgyIWw==} + '@swagger-api/apidom-reference@1.4.0': + resolution: {integrity: sha512-MRqShsNMzigiJxFNYWF4YyPfzVNyEAm1E4DngYENuZxV+Hf+2Zri+DEk3FL6JPoDLLx/UYO1EB9S8VuPZeNT6g==} '@swaggerexpert/cookie@2.0.2': resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} @@ -10193,8 +10197,8 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@20.19.30': - resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} + '@types/node@20.19.31': + resolution: {integrity: sha512-5jsi0wpncvTD33Sh1UCgacK37FFwDn+EG7wCmEvs62fCvBL+n8/76cAYDok21NF6+jaVWIqKwCZyX7Vbu8eB3A==} '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -10379,8 +10383,8 @@ packages: '@types/vscode-webview@1.57.5': resolution: {integrity: sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==} - '@types/vscode@1.108.1': - resolution: {integrity: sha512-DerV0BbSzt87TbrqmZ7lRDIYaMiqvP8tmJTzW2p49ZBVtGUnGAu2RGQd1Wv4XMzEVUpaHbsemVM5nfuQJj7H6w==} + '@types/vscode@1.109.0': + resolution: {integrity: sha512-0Pf95rnwEIwDbmXGC08r0B4TQhAbsHQ5UyTIgVgoieDe4cOnf92usuR5dEczb6bTKEp7ziZH4TV1TRGPPCExtw==} '@types/webpack-env@1.18.8': resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} @@ -11009,14 +11013,14 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@5.0.124: - resolution: {integrity: sha512-Li6Jw9F9qsvFJXZPBfxj38ddP2iURCnMs96f9Q3OeQzrDVcl1hvtwSEAuxA/qmfh6SDV2ERqFUOFzigvr0697g==} + ai@5.0.126: + resolution: {integrity: sha512-eXR9ZuyojCGLf1JNj3iwyrABTEjX9pJd/SQ0OOLzcotrXoTjQ/2CJ5JwcUbRu0jzWlKCsXDH4kv57D1jOAQR8w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - ai@6.0.67: - resolution: {integrity: sha512-xBnTcByHCj3OcG6V8G1s6zvSEqK0Bdiu+IEXYcpGrve1iGFFRgcrKeZtr/WAW/7gupnSvBbDF24BEv1OOfqi1g==} + ai@6.0.70: + resolution: {integrity: sha512-1Osgqs/HSCqKNQt+u5THWI4sBpHZefiQWZIPv+MRJfIx7tGX34IMtXBDs05tZ6yW2P06fmB03w94UkPXWfdieA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -11098,8 +11102,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} ansi-html-community@0.0.8: @@ -12247,11 +12251,11 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001767: - resolution: {integrity: sha512-7tm2xRGN747GhoKBdUYRLdr4QbhOxEvj/I4jx7FWHO5sTaepFgNBIgxNv7IWdv9xLUIlnTIsQc9bD+qE1QOzSg==} + caniuse-db@1.0.30001768: + resolution: {integrity: sha512-hbETk3toYOs+9qGqR0x4Bz4lKFRs6UD9zc4iUtRNwWJ3tRGkFcBxGM/UocIhPFMwA15s1zmtQMgyjo6auN+OTw==} - caniuse-lite@1.0.30001767: - resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + caniuse-lite@1.0.30001768: + resolution: {integrity: sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==} canvas@3.2.1: resolution: {integrity: sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==} @@ -12491,8 +12495,8 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - clipboardy@5.2.0: - resolution: {integrity: sha512-qlXzpbPfFtMKUMeLRkKDe42uRfhRVGTv86VOy7vDVjFh5cHhkCrxPlXfgiJdL65X/Lr+iJtl1haUtq7dMfEilA==} + clipboardy@5.2.1: + resolution: {integrity: sha512-RWp4E/ivQAzgF4QSWA9sjeW+Bjo+U2SvebkDhNIfO7y65eGdXPUxMTdIKYsn+bxM3ItPHGm3e68Bv3fgQ3mARw==} engines: {node: '>=20'} cliui@3.2.0: @@ -13256,8 +13260,8 @@ packages: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.4.0: - resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} default-require-extensions@1.0.0: @@ -13562,8 +13566,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.283: - resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} + electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -13615,8 +13619,8 @@ packages: resolution: {integrity: sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -14107,8 +14111,8 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - express-rate-limit@7.5.1: - resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + express-rate-limit@8.2.1: + resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -14261,10 +14265,6 @@ packages: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -14784,25 +14784,27 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} @@ -15091,6 +15093,10 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hono@4.11.7: + resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} + engines: {node: '>=16.9.0'} + hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} @@ -15454,6 +15460,10 @@ packages: resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} engines: {node: '>=0.10.0'} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} + ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -17560,8 +17570,8 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + minimatch@10.1.2: + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} minimatch@3.0.3: @@ -19218,8 +19228,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.3: - resolution: {integrity: sha512-3E+Et6cdXIH0EgN2tGYQ+EBT7N4kMiZFsW+hzx+aPtOmADDHWCdd2uUQb7yklJrfUYUOjEEu22BiN6UFgPe4cQ==} + prosemirror-markdown@1.13.4: + resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} prosemirror-model@1.25.4: resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} @@ -21280,12 +21290,12 @@ packages: tar@2.2.2: resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==} - deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me targz@1.0.1: resolution: {integrity: sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==} @@ -22700,8 +22710,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.104.1: - resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} + webpack@5.105.0: + resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -23119,9 +23129,9 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/amazon-bedrock@4.0.46(zod@4.1.11)': + '@ai-sdk/amazon-bedrock@4.0.48(zod@4.1.11)': dependencies: - '@ai-sdk/anthropic': 3.0.35(zod@4.1.11) + '@ai-sdk/anthropic': 3.0.36(zod@4.1.11) '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) '@smithy/eventstream-codec': 4.2.8 @@ -23135,20 +23145,20 @@ snapshots: '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/anthropic@3.0.35(zod@4.1.11)': + '@ai-sdk/anthropic@3.0.36(zod@4.1.11)': dependencies: '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/gateway@2.0.30(zod@3.25.76)': + '@ai-sdk/gateway@2.0.32(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@vercel/oidc': 3.1.0 zod: 3.25.76 - '@ai-sdk/gateway@3.0.32(zod@4.1.11)': + '@ai-sdk/gateway@3.0.33(zod@4.1.11)': dependencies: '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) @@ -23247,31 +23257,31 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.980.0': + '@aws-sdk/client-s3@3.983.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.973.5 - '@aws-sdk/credential-provider-node': 3.972.4 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/credential-provider-node': 3.972.5 '@aws-sdk/middleware-bucket-endpoint': 3.972.3 '@aws-sdk/middleware-expect-continue': 3.972.3 - '@aws-sdk/middleware-flexible-checksums': 3.972.3 + '@aws-sdk/middleware-flexible-checksums': 3.972.4 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-location-constraint': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/middleware-sdk-s3': 3.972.6 '@aws-sdk/middleware-ssec': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/middleware-user-agent': 3.972.6 '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/signature-v4-multi-region': 3.980.0 + '@aws-sdk/signature-v4-multi-region': 3.983.0 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-endpoints': 3.983.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.4 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.0 + '@smithy/core': 3.22.1 '@smithy/eventstream-serde-browser': 4.2.8 '@smithy/eventstream-serde-config-resolver': 4.3.8 '@smithy/eventstream-serde-node': 4.2.8 @@ -23282,66 +23292,66 @@ snapshots: '@smithy/invalid-dependency': 4.2.8 '@smithy/md5-js': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.12 - '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 + '@smithy/node-http-handler': 4.4.9 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.28 - '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 '@smithy/util-utf8': 4.2.0 '@smithy/util-waiter': 4.2.8 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.980.0': + '@aws-sdk/client-sso@3.982.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/middleware-user-agent': 3.972.6 '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-endpoints': 3.982.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.4 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.0 + '@smithy/core': 3.22.1 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.12 - '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 + '@smithy/node-http-handler': 4.4.9 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.28 - '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23350,16 +23360,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.5': + '@aws-sdk/core@3.973.6': dependencies: '@aws-sdk/types': 3.973.1 - '@aws-sdk/xml-builder': 3.972.2 - '@smithy/core': 3.22.0 + '@aws-sdk/xml-builder': 3.972.4 + '@smithy/core': 3.22.1 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.8 @@ -23371,37 +23381,37 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.3': + '@aws-sdk/credential-provider-env@3.972.4': dependencies: - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.5': + '@aws-sdk/credential-provider-http@3.972.6': dependencies: - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/types': 3.973.1 '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.8 + '@smithy/node-http-handler': 4.4.9 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.3': + '@aws-sdk/credential-provider-ini@3.972.4': dependencies: - '@aws-sdk/core': 3.973.5 - '@aws-sdk/credential-provider-env': 3.972.3 - '@aws-sdk/credential-provider-http': 3.972.5 - '@aws-sdk/credential-provider-login': 3.972.3 - '@aws-sdk/credential-provider-process': 3.972.3 - '@aws-sdk/credential-provider-sso': 3.972.3 - '@aws-sdk/credential-provider-web-identity': 3.972.3 - '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/credential-provider-env': 3.972.4 + '@aws-sdk/credential-provider-http': 3.972.6 + '@aws-sdk/credential-provider-login': 3.972.4 + '@aws-sdk/credential-provider-process': 3.972.4 + '@aws-sdk/credential-provider-sso': 3.972.4 + '@aws-sdk/credential-provider-web-identity': 3.972.4 + '@aws-sdk/nested-clients': 3.982.0 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -23411,10 +23421,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.3': + '@aws-sdk/credential-provider-login@3.972.4': dependencies: - '@aws-sdk/core': 3.973.5 - '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/nested-clients': 3.982.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -23424,14 +23434,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.4': + '@aws-sdk/credential-provider-node@3.972.5': dependencies: - '@aws-sdk/credential-provider-env': 3.972.3 - '@aws-sdk/credential-provider-http': 3.972.5 - '@aws-sdk/credential-provider-ini': 3.972.3 - '@aws-sdk/credential-provider-process': 3.972.3 - '@aws-sdk/credential-provider-sso': 3.972.3 - '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/credential-provider-env': 3.972.4 + '@aws-sdk/credential-provider-http': 3.972.6 + '@aws-sdk/credential-provider-ini': 3.972.4 + '@aws-sdk/credential-provider-process': 3.972.4 + '@aws-sdk/credential-provider-sso': 3.972.4 + '@aws-sdk/credential-provider-web-identity': 3.972.4 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -23441,20 +23451,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.3': + '@aws-sdk/credential-provider-process@3.972.4': dependencies: - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.3': + '@aws-sdk/credential-provider-sso@3.972.4': dependencies: - '@aws-sdk/client-sso': 3.980.0 - '@aws-sdk/core': 3.973.5 - '@aws-sdk/token-providers': 3.980.0 + '@aws-sdk/client-sso': 3.982.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/token-providers': 3.982.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23463,10 +23473,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.3': + '@aws-sdk/credential-provider-web-identity@3.972.4': dependencies: - '@aws-sdk/core': 3.973.5 - '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/nested-clients': 3.982.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23492,12 +23502,12 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.972.3': + '@aws-sdk/middleware-flexible-checksums@3.972.4': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/crc64-nvme': 3.972.0 '@aws-sdk/types': 3.973.1 '@smithy/is-array-buffer': 4.2.0 @@ -23505,7 +23515,7 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 @@ -23536,20 +23546,20 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.5': + '@aws-sdk/middleware-sdk-s3@3.972.6': dependencies: - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/types': 3.973.1 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/core': 3.22.0 + '@smithy/core': 3.22.1 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 @@ -23559,51 +23569,51 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.5': + '@aws-sdk/middleware-user-agent@3.972.6': dependencies: - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.980.0 - '@smithy/core': 3.22.0 + '@aws-sdk/util-endpoints': 3.982.0 + '@smithy/core': 3.22.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.980.0': + '@aws-sdk/nested-clients@3.982.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.5 + '@aws-sdk/core': 3.973.6 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/middleware-user-agent': 3.972.6 '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-endpoints': 3.982.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.4 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.0 + '@smithy/core': 3.22.1 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.12 - '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 + '@smithy/node-http-handler': 4.4.9 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.28 - '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23620,19 +23630,19 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.980.0': + '@aws-sdk/signature-v4-multi-region@3.983.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/middleware-sdk-s3': 3.972.6 '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.980.0': + '@aws-sdk/token-providers@3.982.0': dependencies: - '@aws-sdk/core': 3.973.5 - '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/nested-clients': 3.982.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23650,7 +23660,15 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.980.0': + '@aws-sdk/util-endpoints@3.982.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.983.0': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 @@ -23669,15 +23687,15 @@ snapshots: bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.972.3': + '@aws-sdk/util-user-agent-node@3.972.4': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/middleware-user-agent': 3.972.6 '@aws-sdk/types': 3.973.1 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.2': + '@aws-sdk/xml-builder@3.972.4': dependencies: '@smithy/types': 4.12.0 fast-xml-parser: 5.3.4 @@ -23785,7 +23803,7 @@ snapshots: '@babel/core@7.12.9': dependencies: '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.12.9) '@babel/helpers': 7.28.6 '@babel/parser': 7.29.0 @@ -23807,7 +23825,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) '@babel/helpers': 7.28.6 @@ -23823,7 +23841,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.0': + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 @@ -24751,7 +24769,7 @@ snapshots: '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.29.0 '@babel/template': 7.28.6 @@ -24830,21 +24848,21 @@ snapshots: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@codemirror/commands@6.10.1': dependencies: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@codemirror/lang-angular@0.1.4': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.3 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -24858,7 +24876,7 @@ snapshots: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/css': 1.3.0 '@codemirror/lang-go@6.0.1': @@ -24866,7 +24884,7 @@ snapshots: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/go': 1.0.1 '@codemirror/lang-html@6.4.11': @@ -24877,7 +24895,7 @@ snapshots: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/css': 1.3.0 '@lezer/html': 1.3.13 @@ -24893,14 +24911,14 @@ snapshots: '@codemirror/lint': 6.8.5 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/javascript': 1.5.4 '@codemirror/lang-jinja@6.0.0': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.3 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -24913,7 +24931,7 @@ snapshots: dependencies: '@codemirror/lang-css': 6.3.1 '@codemirror/language': 6.11.3 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -24924,7 +24942,7 @@ snapshots: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -24935,7 +24953,7 @@ snapshots: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/markdown': 1.6.3 '@codemirror/lang-php@6.0.2': @@ -24943,7 +24961,7 @@ snapshots: '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/php': 1.0.5 '@codemirror/lang-python@6.2.1': @@ -24951,7 +24969,7 @@ snapshots: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/python': 1.1.18 '@codemirror/lang-rust@6.0.2': @@ -24964,7 +24982,7 @@ snapshots: '@codemirror/lang-css': 6.3.1 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/sass': 1.1.0 '@codemirror/lang-sql@6.10.0': @@ -24972,7 +24990,7 @@ snapshots: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -24981,14 +24999,14 @@ snapshots: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.3 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@codemirror/lang-wast@6.0.2': dependencies: '@codemirror/language': 6.11.3 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -24998,7 +25016,7 @@ snapshots: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/xml': 1.0.6 '@codemirror/lang-yaml@6.1.2': @@ -25006,7 +25024,7 @@ snapshots: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/yaml': 1.0.4 @@ -25041,7 +25059,7 @@ snapshots: dependencies: '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 style-mod: 4.1.3 @@ -25650,14 +25668,16 @@ snapshots: '@headlessui/react@2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/focus': 3.21.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/interactions': 3.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/focus': 3.21.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/interactions': 3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/react-virtual': 3.13.18(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.6.0(react@18.2.0) - '@hono/node-server@1.19.9': {} + '@hono/node-server@1.19.9(hono@4.11.7)': + dependencies: + hono: 4.11.7 '@hookform/resolvers@2.9.11(react-hook-form@7.56.4(react@18.2.0))': dependencies: @@ -25697,7 +25717,7 @@ snapshots: '@isaacs/balanced-match@4.0.1': {} - '@isaacs/brace-expansion@5.0.0': + '@isaacs/brace-expansion@5.0.1': dependencies: '@isaacs/balanced-match': 4.0.1 @@ -26044,7 +26064,7 @@ snapshots: '@jest/schemas@29.6.3': dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.27.10 '@jest/schemas@30.0.5': dependencies: @@ -26556,96 +26576,96 @@ snapshots: '@lexical/offset': 0.17.1 lexical: 0.17.1 - '@lezer/common@1.5.0': {} + '@lezer/common@1.5.1': {} '@lezer/cpp@1.1.5': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/css@1.3.0': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/go@1.0.1': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/highlight@1.2.3': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/html@1.3.13': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/java@1.1.3': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/javascript@1.5.4': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/json@1.0.3': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/lr@1.4.8': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/markdown@1.6.3': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/php@1.0.5': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/python@1.1.18': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/rust@1.0.2': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/sass@1.1.0': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/xml@1.0.6': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/yaml@1.0.4': dependencies: - '@lezer/common': 1.5.0 + '@lezer/common': 1.5.1 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 @@ -26774,7 +26794,7 @@ snapshots: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.5 - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 transitivePeerDependencies: - tslib @@ -26784,7 +26804,7 @@ snapshots: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.5 - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 transitivePeerDependencies: - tslib @@ -26795,7 +26815,7 @@ snapshots: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.5 - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 tslib: 2.8.1 '@microsoft/applicationinsights-common@3.3.11(tslib@2.8.1)': @@ -26803,7 +26823,7 @@ snapshots: '@microsoft/applicationinsights-core-js': 3.3.11(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 tslib: 2.8.1 '@microsoft/applicationinsights-core-js@3.3.11(tslib@2.8.1)': @@ -26811,12 +26831,12 @@ snapshots: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.5 - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 tslib: 2.8.1 '@microsoft/applicationinsights-shims@3.0.1': dependencies: - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 '@microsoft/applicationinsights-web-basic@3.3.11(tslib@2.8.1)': dependencies: @@ -26826,12 +26846,12 @@ snapshots: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.5 - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 tslib: 2.8.1 '@microsoft/dynamicproto-js@2.0.3': dependencies: - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 '@microsoft/fast-element@1.14.0': {} @@ -26860,17 +26880,16 @@ snapshots: '@modelcontextprotocol/inspector-cli@0.17.5': dependencies: - '@modelcontextprotocol/sdk': 1.25.3 + '@modelcontextprotocol/sdk': 1.26.0 commander: 13.1.0 spawn-rx: 5.1.2 transitivePeerDependencies: - '@cfworker/json-schema' - - hono - supports-color '@modelcontextprotocol/inspector-client@0.17.5(@types/react-dom@18.2.0)(@types/react@18.2.0)': dependencies: - '@modelcontextprotocol/sdk': 1.25.3 + '@modelcontextprotocol/sdk': 1.26.0 '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': 1.3.2(react@18.3.1) @@ -26899,12 +26918,11 @@ snapshots: - '@cfworker/json-schema' - '@types/react' - '@types/react-dom' - - hono - supports-color '@modelcontextprotocol/inspector-server@0.17.5': dependencies: - '@modelcontextprotocol/sdk': 1.25.3 + '@modelcontextprotocol/sdk': 1.26.0 cors: 2.8.6 express: 5.2.1 shell-quote: 1.8.3 @@ -26914,7 +26932,6 @@ snapshots: transitivePeerDependencies: - '@cfworker/json-schema' - bufferutil - - hono - supports-color - utf-8-validate @@ -26923,7 +26940,7 @@ snapshots: '@modelcontextprotocol/inspector-cli': 0.17.5 '@modelcontextprotocol/inspector-client': 0.17.5(@types/react-dom@18.2.0)(@types/react@18.2.0) '@modelcontextprotocol/inspector-server': 0.17.5 - '@modelcontextprotocol/sdk': 1.25.3 + '@modelcontextprotocol/sdk': 1.26.0 concurrently: 9.2.1 node-fetch: 3.3.2 open: 10.2.0 @@ -26939,14 +26956,13 @@ snapshots: - '@types/react' - '@types/react-dom' - bufferutil - - hono - supports-color - typescript - utf-8-validate - '@modelcontextprotocol/sdk@1.25.3': + '@modelcontextprotocol/sdk@1.26.0': dependencies: - '@hono/node-server': 1.19.9 + '@hono/node-server': 1.19.9(hono@4.11.7) ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -26955,7 +26971,8 @@ snapshots: eventsource: 3.0.7 eventsource-parser: 3.0.6 express: 5.2.1 - express-rate-limit: 7.5.1(express@5.2.1) + express-rate-limit: 8.2.1(express@5.2.1) + hono: 4.11.7 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -26963,7 +26980,6 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - - hono - supports-color '@monaco-editor/loader@1.7.0': @@ -27045,9 +27061,9 @@ snapshots: '@nevware21/ts-async@0.5.5': dependencies: - '@nevware21/ts-utils': 0.12.5 + '@nevware21/ts-utils': 0.12.6 - '@nevware21/ts-utils@0.12.5': {} + '@nevware21/ts-utils@0.12.6': {} '@noble/hashes@1.4.0': {} @@ -27266,7 +27282,7 @@ snapshots: dependencies: playwright: 1.55.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27276,14 +27292,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27293,14 +27309,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-server: 5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27310,14 +27326,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.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.3(webpack-cli@4.10.0)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.0) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27327,14 +27343,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.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.3(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.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.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27344,14 +27360,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack@5.105.0) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': dependencies: anser: 2.3.5 core-js-pure: 3.48.0 @@ -27360,11 +27376,11 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.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.3(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) webpack-hot-middleware: 2.26.1 '@projectstorm/geometry@6.7.4': {} @@ -29022,22 +29038,22 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@react-aria/focus@3.21.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/focus@3.21.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@react-aria/interactions': 3.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/utils': 3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-types/shared': 3.32.1(react@18.2.0) + '@react-aria/interactions': 3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.33.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-types/shared': 3.33.0(react@18.2.0) '@swc/helpers': 0.5.18 clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-aria/interactions@3.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/interactions@3.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.10(react@18.2.0) - '@react-aria/utils': 3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.33.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.1(react@18.2.0) + '@react-types/shared': 3.33.0(react@18.2.0) '@swc/helpers': 0.5.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -29047,12 +29063,12 @@ snapshots: '@swc/helpers': 0.5.18 react: 18.2.0 - '@react-aria/utils@3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/utils@3.33.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.10(react@18.2.0) '@react-stately/flags': 3.1.2 '@react-stately/utils': 3.11.0(react@18.2.0) - '@react-types/shared': 3.32.1(react@18.2.0) + '@react-types/shared': 3.33.0(react@18.2.0) '@swc/helpers': 0.5.18 clsx: 2.1.1 react: 18.2.0 @@ -29083,7 +29099,7 @@ snapshots: '@swc/helpers': 0.5.18 react: 18.2.0 - '@react-types/shared@3.32.1(react@18.2.0)': + '@react-types/shared@3.33.0(react@18.2.0)': dependencies: react: 18.2.0 @@ -29094,7 +29110,7 @@ snapshots: '@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3)': dependencies: - clipboardy: 5.2.0 + clipboardy: 5.2.1 clone-deep: 4.0.1 compare-versions: 6.1.1 fs-extra: 11.3.3 @@ -29376,7 +29392,7 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.27.10': {} '@sinclair/typebox@0.34.48': {} @@ -29443,7 +29459,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.22.0': + '@smithy/core@3.22.1': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -29451,7 +29467,7 @@ snapshots: '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 @@ -29547,9 +29563,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.12': + '@smithy/middleware-endpoint@4.4.13': dependencies: - '@smithy/core': 3.22.0 + '@smithy/core': 3.22.1 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -29558,12 +29574,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.29': + '@smithy/middleware-retry@4.4.30': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -29588,7 +29604,7 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.8': + '@smithy/node-http-handler@4.4.9': dependencies: '@smithy/abort-controller': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -29637,14 +29653,14 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.11.1': + '@smithy/smithy-client@4.11.2': dependencies: - '@smithy/core': 3.22.0 - '@smithy/middleware-endpoint': 4.4.12 + '@smithy/core': 3.22.1 + '@smithy/middleware-endpoint': 4.4.13 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 tslib: 2.8.1 '@smithy/types@4.12.0': @@ -29685,20 +29701,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.28': + '@smithy/util-defaults-mode-browser@4.3.29': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.31': + '@smithy/util-defaults-mode-node@4.2.32': dependencies: '@smithy/config-resolver': 4.4.6 '@smithy/credential-provider-imds': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -29723,10 +29739,10 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.10': + '@smithy/util-stream@4.5.11': dependencies: '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.8 + '@smithy/node-http-handler': 4.4.9 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-buffer-from': 4.2.0 @@ -30033,7 +30049,7 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30053,7 +30069,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -30078,7 +30094,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30098,7 +30114,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -30207,13 +30223,13 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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) @@ -30229,7 +30245,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30241,13 +30257,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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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) @@ -30263,7 +30279,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30855,33 +30871,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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 3.6.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - raw-loader: 4.0.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + raw-loader: 4.0.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30917,33 +30933,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) - file-loader: 6.2.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.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.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.104.1) - raw-loader: 4.0.2(webpack@5.104.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) + raw-loader: 4.0.2(webpack@5.105.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.104.1) - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + style-loader: 1.3.0(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30979,33 +30995,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) - file-loader: 6.2.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.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.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.104.1) - raw-loader: 4.0.2(webpack@5.104.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) + raw-loader: 4.0.2(webpack@5.105.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.104.1) - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + style-loader: 1.3.0(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31041,33 +31057,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) - file-loader: 6.2.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.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.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.104.1) - raw-loader: 4.0.2(webpack@5.104.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) + raw-loader: 4.0.2(webpack@5.105.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.104.1) - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + style-loader: 1.3.0(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31103,33 +31119,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) - file-loader: 6.2.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.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.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.104.1) - raw-loader: 4.0.2(webpack@5.104.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) + raw-loader: 4.0.2(webpack@5.105.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.104.1) - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + style-loader: 1.3.0(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31162,27 +31178,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.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.48.0 - css-loader: 5.2.7(webpack@5.104.1) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + css-loader: 5.2.7(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.6(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.105.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.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + style-loader: 2.0.0(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31216,27 +31232,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.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.48.0 - css-loader: 5.2.7(webpack@5.104.1) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + css-loader: 5.2.7(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.6(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.105.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.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + style-loader: 2.0.0(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31273,30 +31289,30 @@ snapshots: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.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.104.1) + css-loader: 6.11.0(webpack@5.105.0) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.6(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.105.0) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) semver: 7.7.3 - style-loader: 3.3.4(webpack@5.104.1) - swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + style-loader: 3.3.4(webpack@5.105.0) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31334,30 +31350,30 @@ snapshots: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) path-browserify: 1.0.1 process: 0.11.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) semver: 7.7.3 - style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31381,23 +31397,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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + css-loader: 6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) - html-webpack-plugin: 5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + html-webpack-plugin: 5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + style-loader: 3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack-dev-middleware: 6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31417,23 +31433,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.104.1) + css-loader: 6.11.0(webpack@5.105.0) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1) - html-webpack-plugin: 5.6.6(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0) + html-webpack-plugin: 5.6.6(webpack@5.105.0) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.104.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + style-loader: 3.3.4(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.105.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31741,7 +31757,7 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.5.3) - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31765,11 +31781,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.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.105.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 @@ -31793,11 +31809,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1)': + '@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.105.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 @@ -31821,7 +31837,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 @@ -31858,7 +31874,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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31866,7 +31882,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31883,7 +31899,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31923,7 +31939,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31931,7 +31947,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31948,7 +31964,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31988,7 +32004,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31996,7 +32012,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32013,7 +32029,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32053,7 +32069,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32061,7 +32077,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32078,7 +32094,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32118,7 +32134,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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32126,7 +32142,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32143,7 +32159,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32229,7 +32245,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32271,7 +32287,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32295,7 +32311,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32337,7 +32353,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32361,7 +32377,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32403,7 +32419,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32425,7 +32441,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32467,7 +32483,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32489,7 +32505,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32531,7 +32547,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32613,13 +32629,13 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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.104.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.105.0) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -32637,13 +32653,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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.104.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.105.0) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -32661,13 +32677,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32683,13 +32699,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.104.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.105.0) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32705,13 +32721,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.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.104.1) + '@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.105.0) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32768,7 +32784,7 @@ snapshots: '@storybook/csf-tools@6.5.16': dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -32786,7 +32802,7 @@ snapshots: '@storybook/csf-tools@7.4.6': dependencies: - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -32800,7 +32816,7 @@ snapshots: '@storybook/csf-tools@7.6.21': dependencies: - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -32940,23 +32956,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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 3.6.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32964,14 +32980,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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -32991,23 +33007,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.104.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.105.0) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.105.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.0) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33015,14 +33031,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.104.1) + style-loader: 1.3.0(webpack@5.105.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33042,23 +33058,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.104.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.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.105.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.0) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33066,14 +33082,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.104.1) + style-loader: 1.3.0(webpack@5.105.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33093,23 +33109,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.104.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.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.105.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.0) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33117,14 +33133,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.104.1) + style-loader: 1.3.0(webpack@5.105.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33144,23 +33160,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.104.1) + '@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.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.104.1) + css-loader: 3.6.0(webpack@5.105.0) express: 4.22.1 - file-loader: 6.2.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.105.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.104.1) + html-webpack-plugin: 4.5.2(webpack@5.105.0) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) react: 19.1.0 @@ -33168,14 +33184,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.104.1) + style-loader: 1.3.0(webpack@5.105.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 4.9.5 @@ -33195,21 +33211,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.104.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.105.0) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.104.1) + css-loader: 5.2.7(webpack@5.105.0) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.6(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.105.0) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33217,13 +33233,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.104.1) + style-loader: 2.0.0(webpack@5.105.0) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.105.0) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33244,21 +33260,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.104.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.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@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.104.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.104.1) + css-loader: 5.2.7(webpack@5.105.0) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.6(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.105.0) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33266,13 +33282,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.104.1) + style-loader: 2.0.0(webpack@5.105.0) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.105.0) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33291,7 +33307,7 @@ snapshots: '@storybook/mdx1-csf@0.0.1(@babel/core@7.27.7)': dependencies: - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/types': 7.29.0 @@ -33330,12 +33346,12 @@ 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@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.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@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.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 @@ -33345,7 +33361,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-refresh: 0.11.0 semver: 7.7.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33367,12 +33383,12 @@ snapshots: dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 @@ -33382,7 +33398,7 @@ snapshots: react-dom: 19.1.0(react@19.1.0) react-refresh: 0.11.0 semver: 7.7.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33404,7 +33420,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33415,7 +33431,7 @@ snapshots: semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33430,7 +33446,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33441,7 +33457,7 @@ snapshots: semver: 7.7.3 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33534,7 +33550,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.104.1)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.0)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33544,11 +33560,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33558,11 +33574,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33572,11 +33588,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33586,11 +33602,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33600,7 +33616,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -33754,15 +33770,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.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 @@ -33789,7 +33805,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -33818,15 +33834,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.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/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.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.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 @@ -33853,7 +33869,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -33878,19 +33894,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33917,7 +33933,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33940,19 +33956,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@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.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.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 @@ -33979,7 +33995,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -34002,19 +34018,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.0) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@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.104.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.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 @@ -34041,7 +34057,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 4.9.5 @@ -34520,20 +34536,20 @@ snapshots: regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - '@swagger-api/apidom-ast@1.3.0': + '@swagger-api/apidom-ast@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-error': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) unraw: 3.0.0 - '@swagger-api/apidom-core@1.3.0': + '@swagger-api/apidom-core@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-ast': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ast': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 '@types/ramda': 0.30.2 minim: 0.23.8 ramda: 0.30.1 @@ -34541,246 +34557,246 @@ snapshots: short-unique-id: 5.3.2 ts-mixer: 6.0.4 - '@swagger-api/apidom-error@1.3.0': + '@swagger-api/apidom-error@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-json-pointer@1.3.0': + '@swagger-api/apidom-json-pointer@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 '@swaggerexpert/json-pointer': 2.10.2 - '@swagger-api/apidom-ns-api-design-systems@1.3.0': + '@swagger-api/apidom-ns-api-design-systems@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-arazzo-1@1.3.0': + '@swagger-api/apidom-ns-arazzo-1@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-2@1.3.0': + '@swagger-api/apidom-ns-asyncapi-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-3@1.3.0': + '@swagger-api/apidom-ns-asyncapi-3@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-json-schema-2019-09@1.3.0': + '@swagger-api/apidom-ns-json-schema-2019-09@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-2020-12@1.3.0': + '@swagger-api/apidom-ns-json-schema-2020-12@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-json-schema-2019-09': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-4@1.3.0': + '@swagger-api/apidom-ns-json-schema-draft-4@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-ast': 1.3.0 - '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ast': 1.4.0 + '@swagger-api/apidom-core': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-6@1.3.0': + '@swagger-api/apidom-ns-json-schema-draft-6@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-7@1.3.0': + '@swagger-api/apidom-ns-json-schema-draft-7@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-json-schema-draft-6': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-2@1.3.0': + '@swagger-api/apidom-ns-openapi-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-openapi-3-0@1.3.0': + '@swagger-api/apidom-ns-openapi-3-0@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-3-1@1.3.0': + '@swagger-api/apidom-ns-openapi-3-1@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-ast': 1.3.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-json-pointer': 1.3.0 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-ast': 1.4.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-json-pointer': 1.4.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.3.0': + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-api-design-systems': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-api-design-systems': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.3.0': + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-api-design-systems': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-api-design-systems': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.3.0': + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-arazzo-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-arazzo-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.3.0': + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-arazzo-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-arazzo-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.3.0': + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.3.0': + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-asyncapi-3': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.3.0': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.3.0': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-asyncapi-3': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-json@1.3.0': + '@swagger-api/apidom-parser-adapter-json@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-ast': 1.3.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ast': 1.4.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) @@ -34789,78 +34805,78 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.3.0': + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-openapi-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-openapi-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.3.0': + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.3.0': + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.3.0': + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-openapi-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-openapi-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.3.0': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.3.0': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.3.0': + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-ast': 1.3.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ast': 1.4.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -34869,11 +34885,11 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-reference@1.3.0': + '@swagger-api/apidom-reference@1.4.0': dependencies: '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 '@types/ramda': 0.30.2 axios: 1.12.2 minimatch: 7.4.6 @@ -34881,28 +34897,28 @@ snapshots: ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.3.0 - '@swagger-api/apidom-ns-arazzo-1': 1.3.0 - '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 - '@swagger-api/apidom-ns-openapi-2': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.3.0 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.3.0 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.3.0 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.3.0 - '@swagger-api/apidom-parser-adapter-json': 1.3.0 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.3.0 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.3.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.3.0 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.3.0 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 + '@swagger-api/apidom-json-pointer': 1.4.0 + '@swagger-api/apidom-ns-arazzo-1': 1.4.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.4.0 + '@swagger-api/apidom-ns-openapi-2': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.4.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.4.0 + '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.4.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.4.0 + '@swagger-api/apidom-parser-adapter-json': 1.4.0 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.4.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.4.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.4.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.4.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.4.0 transitivePeerDependencies: - debug @@ -35162,7 +35178,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.1.1 + minimatch: 10.1.2 path-browserify: 1.0.1 '@tsconfig/node10@1.0.12': {} @@ -35442,7 +35458,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.1.1 + minimatch: 10.1.2 '@types/minimist@1.2.5': {} @@ -35465,7 +35481,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.19.30': + '@types/node@20.19.31': dependencies: undici-types: 6.21.0 @@ -35653,7 +35669,7 @@ snapshots: '@types/vscode-webview@1.57.5': {} - '@types/vscode@1.108.1': {} + '@types/vscode@1.109.0': {} '@types/webpack-env@1.18.8': {} @@ -35676,7 +35692,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35688,7 +35704,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35700,7 +35716,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35711,7 +35727,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35723,7 +35739,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -36294,69 +36310,69 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.104.1)': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.0) - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.0) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.21.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.0) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.0) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: - webpack-cli: 4.10.0(webpack@5.104.1) + webpack-cli: 4.10.0(webpack@5.105.0) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.104.1)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.0) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.0) '@xmldom/xmldom@0.7.13': {} @@ -36477,17 +36493,17 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.124(zod@3.25.76): + ai@5.0.126(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 2.0.30(zod@3.25.76) + '@ai-sdk/gateway': 2.0.32(zod@3.25.76) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ai@6.0.67(zod@4.1.11): + ai@6.0.70(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 3.0.32(zod@4.1.11) + '@ai-sdk/gateway': 3.0.33(zod@4.1.11) '@ai-sdk/provider': 3.0.7 '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) '@opentelemetry/api': 1.9.0 @@ -36584,7 +36600,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.2.0: + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -36881,7 +36897,7 @@ snapshots: autoprefixer@10.4.24(postcss@8.5.6): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001767 + caniuse-lite: 1.0.30001768 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -36890,7 +36906,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001767 + caniuse-db: 1.0.30001768 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -36899,7 +36915,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001767 + caniuse-lite: 1.0.30001768 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -36908,7 +36924,7 @@ snapshots: autoprefixer@9.8.8: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001767 + caniuse-lite: 1.0.30001768 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -37130,51 +37146,51 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.104.1): + babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.105.0): dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.104.1): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.0): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) babel-messages@6.23.0: dependencies: @@ -37899,19 +37915,19 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001767 - electron-to-chromium: 1.5.283 + caniuse-db: 1.0.30001768 + electron-to-chromium: 1.5.286 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001767 - electron-to-chromium: 1.5.283 + caniuse-lite: 1.0.30001768 + electron-to-chromium: 1.5.286 browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001767 - electron-to-chromium: 1.5.283 + caniuse-lite: 1.0.30001768 + electron-to-chromium: 1.5.286 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -38152,20 +38168,20 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001767 + caniuse-db: 1.0.30001768 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001767 + caniuse-lite: 1.0.30001768 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001767: {} + caniuse-db@1.0.30001768: {} - caniuse-lite@1.0.30001767: {} + caniuse-lite@1.0.30001768: {} canvas@3.2.1: dependencies: @@ -38422,7 +38438,7 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 - clipboardy@5.2.0: + clipboardy@5.2.1: dependencies: clipboard-image: 0.1.0 execa: 9.6.1 @@ -38732,14 +38748,14 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.1(webpack@5.104.1): + copy-webpack-plugin@13.0.1(webpack@5.105.0): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -38957,7 +38973,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + css-loader@3.6.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -38972,9 +38988,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@3.6.0(webpack@5.104.1): + css-loader@3.6.0(webpack@5.105.0): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -38989,9 +39005,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - css-loader@5.2.7(webpack@5.104.1): + css-loader@5.2.7(webpack@5.105.0): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -39003,9 +39019,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + css-loader@6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39016,9 +39032,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + css-loader@6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39029,9 +39045,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@6.11.0(webpack@5.104.1): + css-loader@6.11.0(webpack@5.105.0): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39042,9 +39058,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - css-loader@7.1.3(webpack@5.104.1): + css-loader@7.1.3(webpack@5.105.0): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39055,7 +39071,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -39366,7 +39382,7 @@ snapshots: default-browser-id@5.0.1: {} - default-browser@5.4.0: + default-browser@5.5.0: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.1 @@ -39683,7 +39699,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.283: {} + electron-to-chromium@1.5.286: {} email-addresses@5.0.0: {} @@ -39734,7 +39750,7 @@ snapshots: object-assign: 4.1.1 tapable: 0.2.9 - enhanced-resolve@5.18.4: + enhanced-resolve@5.19.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -40437,9 +40453,10 @@ snapshots: exponential-backoff@3.1.3: {} - express-rate-limit@7.5.1(express@5.2.1): + express-rate-limit@8.2.1(express@5.2.1): dependencies: express: 5.2.1 + ip-address: 10.0.1 express@4.22.1: dependencies: @@ -40525,12 +40542,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-text-webpack-plugin@3.0.2(webpack@5.104.1): + extract-text-webpack-plugin@3.0.2(webpack@5.105.0): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -40672,10 +40689,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -40694,23 +40707,23 @@ snapshots: minimatch: 3.1.2 proper-lockfile: 1.2.0 - file-loader@1.1.5(webpack@5.104.1): + file-loader@1.1.5(webpack@5.105.0): dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - file-loader@6.2.0(webpack@5.104.1): + file-loader@6.2.0(webpack@5.105.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -40910,7 +40923,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.105.0): dependencies: babel-code-frame: 6.26.0 chalk: 1.1.3 @@ -40921,7 +40934,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: @@ -40933,7 +40946,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.0): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40949,11 +40962,11 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40969,11 +40982,11 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40989,11 +41002,11 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41008,9 +41021,9 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41025,9 +41038,9 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.0): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41042,9 +41055,9 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.104.1): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.105.0): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41059,7 +41072,7 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -41401,7 +41414,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.1.1 + minimatch: 10.1.2 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.1 @@ -41877,6 +41890,8 @@ snapshots: dependencies: parse-passwd: 1.0.0 + hono@4.11.7: {} + hookified@1.15.1: {} hosted-git-info@2.8.9: {} @@ -41954,7 +41969,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@2.29.0(webpack@5.104.1): + html-webpack-plugin@2.29.0(webpack@5.105.0): dependencies: bluebird: 3.7.2 html-minifier: 3.5.21 @@ -41962,9 +41977,9 @@ snapshots: lodash: 4.17.23 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + html-webpack-plugin@4.5.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -41975,9 +41990,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@4.5.2(webpack@5.104.1): + html-webpack-plugin@4.5.2(webpack@5.105.0): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -41988,9 +42003,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + html-webpack-plugin@5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -41998,9 +42013,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - html-webpack-plugin@5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + html-webpack-plugin@5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42008,9 +42023,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@5.6.6(webpack@5.104.1): + html-webpack-plugin@5.6.6(webpack@5.105.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42018,7 +42033,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) htmlparser2@10.1.0: dependencies: @@ -42316,6 +42331,8 @@ snapshots: invert-kv@1.0.0: {} + ip-address@10.0.1: {} + ip-address@10.1.0: {} ip-regex@2.1.0: {} @@ -43876,7 +43893,7 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) '@babel/types': 7.29.0 @@ -43901,7 +43918,7 @@ snapshots: jest-snapshot@30.2.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) '@babel/types': 7.29.0 @@ -44708,7 +44725,7 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.2.0 + ansi-escapes: 7.3.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 strip-ansi: 7.1.2 @@ -45567,11 +45584,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.104.1): + mini-css-extract-plugin@2.10.0(webpack@5.105.0): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) minim@0.23.8: dependencies: @@ -45579,9 +45596,9 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.1.1: + minimatch@10.1.2: dependencies: - '@isaacs/brace-expansion': 5.0.0 + '@isaacs/brace-expansion': 5.0.1 minimatch@3.0.3: dependencies: @@ -45919,15 +45936,15 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.104.1): + node-loader@2.0.0(webpack@5.105.0): dependencies: loader-utils: 2.0.4 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - node-loader@2.1.0(webpack@5.104.1): + node-loader@2.1.0(webpack@5.105.0): dependencies: loader-utils: 2.0.4 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) node-notifier@5.4.5: dependencies: @@ -46169,7 +46186,7 @@ snapshots: open@10.2.0: dependencies: - default-browser: 5.4.0 + default-browser: 5.5.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 wsl-utils: 0.1.0 @@ -46853,7 +46870,7 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -46861,9 +46878,9 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.0): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -46871,16 +46888,16 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.0): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.6.1 postcss: 8.5.6 semver: 7.7.3 optionalDependencies: - webpack: 5.104.1(webpack-cli@6.0.1) + webpack: 5.105.0(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -47430,7 +47447,7 @@ snapshots: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.3: + prosemirror-markdown@1.13.4: dependencies: '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 @@ -47611,17 +47628,17 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + raw-loader@4.0.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - raw-loader@4.0.2(webpack@5.104.1): + raw-loader@4.0.2(webpack@5.105.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -47725,7 +47742,7 @@ snapshots: react-docgen@5.4.3: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/runtime': 7.28.6 ast-types: 0.14.2 commander: 2.20.3 @@ -48086,18 +48103,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.104.1) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.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.104.1) - file-loader: 1.1.5(webpack@5.104.1) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.104.1) + extract-text-webpack-plugin: 3.0.2(webpack@5.105.0) + file-loader: 1.1.5(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.0) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.104.1) + html-webpack-plugin: 2.29.0(webpack@5.105.0) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48108,7 +48125,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.104.1) + sw-precache-webpack-plugin: 0.11.4(webpack@5.105.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 @@ -48116,11 +48133,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.104.1) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.104.1)) - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) - webpack-manifest-plugin: 1.3.2(webpack@5.104.1) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.105.0) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.0)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + webpack-manifest-plugin: 1.3.2(webpack@5.105.0) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48140,18 +48157,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.104.1) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.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.104.1) - file-loader: 1.1.5(webpack@5.104.1) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.104.1) + extract-text-webpack-plugin: 3.0.2(webpack@5.105.0) + file-loader: 1.1.5(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.0) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.104.1) + html-webpack-plugin: 2.29.0(webpack@5.105.0) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48162,7 +48179,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.104.1) + sw-precache-webpack-plugin: 0.11.4(webpack@5.105.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 @@ -48170,11 +48187,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.104.1) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.104.1)) - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-server: 5.2.3(webpack@5.104.1) - webpack-manifest-plugin: 1.3.2(webpack@5.104.1) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.105.0) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.0)) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-dev-server: 5.2.3(webpack@5.105.0) + webpack-manifest-plugin: 1.3.2(webpack@5.105.0) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -49038,19 +49055,19 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@13.3.3(sass@1.97.3)(webpack@5.104.1): + sass-loader@13.3.3(sass@1.97.3)(webpack@5.105.0): dependencies: neo-async: 2.6.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: sass: 1.97.3 - sass-loader@16.0.6(sass@1.97.3)(webpack@5.104.1): + sass-loader@16.0.6(sass@1.97.3)(webpack@5.105.0): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.97.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sass@1.97.3: dependencies: @@ -49451,17 +49468,17 @@ snapshots: async: 2.6.4 loader-utils: 1.4.2 - source-map-loader@4.0.2(webpack@5.104.1): + source-map-loader@4.0.2(webpack@5.105.0): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - source-map-loader@5.0.0(webpack@5.104.1): + source-map-loader@5.0.0(webpack@5.105.0): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -49872,39 +49889,39 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + style-loader@1.3.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@1.3.0(webpack@5.104.1): + style-loader@1.3.0(webpack@5.105.0): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - style-loader@2.0.0(webpack@5.104.1): + style-loader@2.0.0(webpack@5.105.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + style-loader@3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + style-loader@3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@3.3.4(webpack@5.104.1): + style-loader@3.3.4(webpack@5.105.0): dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - style-loader@4.0.0(webpack@5.104.1): + style-loader@4.0.0(webpack@5.105.0): dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) style-mod@4.1.3: {} @@ -50048,10 +50065,10 @@ snapshots: svg-tags@1.0.0: {} - svg-url-loader@8.0.0(webpack@5.104.1): + svg-url-loader@8.0.0(webpack@5.105.0): dependencies: - file-loader: 6.2.0(webpack@5.104.1) - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + file-loader: 6.2.0(webpack@5.105.0) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: @@ -50110,12 +50127,12 @@ snapshots: svgpath@2.6.0: {} - sw-precache-webpack-plugin@0.11.4(webpack@5.104.1): + sw-precache-webpack-plugin@0.11.4(webpack@5.105.0): dependencies: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -50139,11 +50156,11 @@ snapshots: dependencies: '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.3.0 - '@swagger-api/apidom-error': 1.3.0 - '@swagger-api/apidom-json-pointer': 1.3.0 - '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 - '@swagger-api/apidom-reference': 1.3.0 + '@swagger-api/apidom-core': 1.4.0 + '@swagger-api/apidom-error': 1.4.0 + '@swagger-api/apidom-json-pointer': 1.4.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.4.0 + '@swagger-api/apidom-reference': 1.4.0 '@swaggerexpert/cookie': 2.0.2 deepmerge: 4.3.1 fast-json-patch: 3.1.1 @@ -50240,17 +50257,17 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0): dependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) symbol-tree@3.2.4: {} @@ -50413,10 +50430,10 @@ snapshots: terminal-link@4.0.0: dependencies: - ansi-escapes: 7.2.0 + ansi-escapes: 7.3.0 supports-hyperlinks: 3.2.0 - terser-webpack-plugin@4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + terser-webpack-plugin@4.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50426,10 +50443,10 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.46.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-sources: 1.4.3 - terser-webpack-plugin@4.2.3(webpack@5.104.1): + terser-webpack-plugin@4.2.3(webpack@5.105.0): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50439,40 +50456,40 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.46.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) esbuild: 0.25.12 - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) @@ -50792,15 +50809,15 @@ snapshots: loader-utils: 1.4.2 semver: 5.7.2 - ts-loader@9.5.4(typescript@5.8.3)(webpack@5.104.1): + ts-loader@9.5.4(typescript@5.8.3)(webpack@5.105.0): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.6 typescript: 5.8.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) ts-mixer@6.0.4: {} @@ -51232,7 +51249,7 @@ snapshots: commander: 2.19.0 source-map: 0.6.1 - uglifyjs-webpack-plugin@1.2.5(webpack@5.104.1): + uglifyjs-webpack-plugin@1.2.5(webpack@5.105.0): dependencies: cacache: 10.0.4 find-cache-dir: 1.0.0 @@ -51240,7 +51257,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -51529,30 +51546,30 @@ snapshots: url-join@4.0.1: {} - url-loader@0.6.2(file-loader@1.1.5(webpack@5.104.1)): + url-loader@0.6.2(file-loader@1.1.5(webpack@5.105.0)): dependencies: - file-loader: 1.1.5(webpack@5.104.1) + file-loader: 1.1.5(webpack@5.105.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.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - file-loader: 6.2.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.105.0) url-parse-lax@1.0.0: dependencies: @@ -51990,10 +52007,10 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1): + webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.104.1) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.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.3) colorette: 2.0.20 @@ -52003,15 +52020,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.0) - webpack-cli@4.10.0(webpack@5.104.1): + webpack-cli@4.10.0(webpack@5.105.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.104.1) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.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 @@ -52021,15 +52038,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.104.1(webpack-cli@4.10.0) + webpack: 5.105.0(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1): + webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52038,17 +52055,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) - webpack-cli@5.1.4(webpack@5.104.1): + webpack-cli@5.1.4(webpack@5.105.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.105.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52057,15 +52074,15 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1): + webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.0) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -52074,17 +52091,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) - webpack-cli@6.0.1(webpack@5.104.1): + webpack-cli@6.0.1(webpack@5.105.0): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -52093,28 +52110,28 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.104.1(webpack-cli@6.0.1) + webpack: 5.105.0(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@3.7.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-log: 2.0.0 - webpack-dev-middleware@3.7.3(webpack@5.104.1): + webpack-dev-middleware@3.7.3(webpack@5.105.0): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-log: 2.0.0 - webpack-dev-middleware@4.3.0(webpack@5.104.1): + webpack-dev-middleware@4.3.0(webpack@5.105.0): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -52122,9 +52139,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + webpack-dev-middleware@6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52132,9 +52149,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52142,9 +52159,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware@6.1.3(webpack@5.104.1): + webpack-dev-middleware@6.1.3(webpack@5.105.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52152,9 +52169,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.5(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@7.4.5(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 4.56.10 @@ -52163,10 +52180,10 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) optional: true - webpack-dev-middleware@7.4.5(webpack@5.104.1): + webpack-dev-middleware@7.4.5(webpack@5.105.0): dependencies: colorette: 2.0.20 memfs: 4.56.10 @@ -52175,9 +52192,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.105.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52205,11 +52222,11 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.0) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) transitivePeerDependencies: - bufferutil - debug @@ -52217,7 +52234,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.105.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52245,18 +52262,18 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.0) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.105.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.105.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52284,18 +52301,18 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.0) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52323,10 +52340,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-middleware: 7.4.5(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - bufferutil - debug @@ -52334,7 +52351,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.3(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack@5.105.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52362,23 +52379,23 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.0) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.105.0(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-filter-warnings-plugin@1.2.1(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1): + webpack-filter-warnings-plugin@1.2.1(webpack@5.105.0): dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -52391,11 +52408,11 @@ snapshots: ansi-colors: 3.2.4 uuid: 3.4.0 - webpack-manifest-plugin@1.3.2(webpack@5.104.1): + webpack-manifest-plugin@1.3.2(webpack@5.105.0): dependencies: fs-extra: 0.30.0 lodash: 4.17.23 - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -52430,7 +52447,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)): + webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52442,7 +52459,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52454,7 +52471,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52462,7 +52479,7 @@ snapshots: - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): + webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52474,7 +52491,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52486,7 +52503,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52494,7 +52511,7 @@ snapshots: - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): + webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52506,7 +52523,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52518,17 +52535,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.105.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): + webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52540,7 +52557,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52552,17 +52569,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.104.1(webpack-cli@4.10.0): + webpack@5.105.0(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52574,7 +52591,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52586,17 +52603,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.104.1(webpack-cli@5.1.4): + webpack@5.105.0(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52608,7 +52625,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52620,17 +52637,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.105.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.104.1(webpack-cli@6.0.1): + webpack@5.105.0(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52642,7 +52659,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -52654,11 +52671,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.104.1) + webpack-cli: 6.0.1(webpack@5.105.0) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/package.json b/package.json index 7025b879b46..b35aac73351 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "pnpm": { "overrides": { "@modelcontextprotocol/sdk": "^1.25.2", + "@isaacs/brace-expansion": "5.0.1", "brace-expansion": "^2.0.2", "http-proxy": "^1.18.1", "prismjs": "^1.30.0", diff --git a/workspaces/common-libs/rpc-generator/package-lock.json b/workspaces/common-libs/rpc-generator/package-lock.json index 91349143994..1f618683b8f 100644 --- a/workspaces/common-libs/rpc-generator/package-lock.json +++ b/workspaces/common-libs/rpc-generator/package-lock.json @@ -26,9 +26,9 @@ } }, "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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", "license": "MIT", "dependencies": { "@isaacs/balanced-match": "^4.0.1" diff --git a/workspaces/common-libs/rpc-generator/package.json b/workspaces/common-libs/rpc-generator/package.json index 6e2766b61dc..f699a919ce9 100644 --- a/workspaces/common-libs/rpc-generator/package.json +++ b/workspaces/common-libs/rpc-generator/package.json @@ -15,6 +15,9 @@ }, "author": "", "license": "ISC", + "overrides": { + "@isaacs/brace-expansion": "^5.0.1" + }, "devDependencies": { "@types/node": "^22.15.24" }, From cbe085d3a23040fc9fa55b428dbe511e3293c03f Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 08:02:59 +0530 Subject: [PATCH 074/247] Add DirectorySelector component and its Storybook stories --- .../DirectorySelector.stories.tsx | 127 ++++++++++++++ .../DirectorySelector/DirectorySelector.tsx | 166 ++++++++++++++++++ 2 files changed, 293 insertions(+) create mode 100644 workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.stories.tsx create mode 100644 workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.tsx diff --git a/workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.stories.tsx b/workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.stories.tsx new file mode 100644 index 00000000000..5a8b9e4c908 --- /dev/null +++ b/workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.stories.tsx @@ -0,0 +1,127 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState } from 'react'; +import { Meta, StoryObj } from '@storybook/react'; +import { DirectorySelector, DirectorySelectorProps } from './DirectorySelector'; + +const meta: Meta = { + title: 'Components/DirectorySelector', + component: DirectorySelector, + tags: ['autodocs'], + argTypes: { + label: { + control: 'text', + description: 'Label text for the directory selector', + }, + placeholder: { + control: 'text', + description: 'Placeholder text shown in the input field', + }, + selectedPath: { + control: 'text', + description: 'Currently selected directory path', + }, + required: { + control: 'boolean', + description: 'Whether the field is required', + }, + description: { + control: 'text', + description: 'Helper text shown below the label', + }, + errorMsg: { + control: 'text', + description: 'Error message to display', + }, + }, +}; + +export default meta; +type Story = StoryObj; + +const DirectorySelectorWithState = (args: DirectorySelectorProps) => { + const [selectedPath, setSelectedPath] = useState(args.selectedPath || ''); + + const handleSelect = () => { + // Simulating a directory selection + setSelectedPath('/Users/username/projects/my-project'); + }; + + return ( + + ); +}; + +export const Default: Story = { + render: (args: DirectorySelectorProps) => , + args: { + label: 'Select Path', + placeholder: 'Choose a folder for your project...', + }, +}; + +export const WithSelectedPath: Story = { + render: (args: DirectorySelectorProps) => , + args: { + label: 'Select Path', + placeholder: 'Choose a folder for your project...', + selectedPath: '/Users/username/projects/my-project', + }, +}; + +export const Required: Story = { + render: (args: DirectorySelectorProps) => , + args: { + label: 'Select Path', + placeholder: 'Choose a folder for your project...', + required: true, + }, +}; + +export const WithDescription: Story = { + render: (args: DirectorySelectorProps) => , + args: { + label: 'Select Path', + placeholder: 'Choose a folder for your project...', + description: 'Select the directory where you want to create your project', + }, +}; + +export const WithError: Story = { + render: (args: DirectorySelectorProps) => , + args: { + label: 'Select Path', + placeholder: 'Choose a folder for your project...', + errorMsg: 'This directory does not exist or you do not have permission to access it', + }, +}; + +export const Complete: Story = { + render: (args: DirectorySelectorProps) => , + args: { + label: 'Project Directory', + placeholder: 'Choose a folder for your project...', + selectedPath: '/Users/username/projects/my-project', + required: true, + description: 'Select the directory where you want to create your project', + }, +}; diff --git a/workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.tsx b/workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.tsx new file mode 100644 index 00000000000..06f0ee36f77 --- /dev/null +++ b/workspaces/common-libs/ui-toolkit/src/components/DirectorySelector/DirectorySelector.tsx @@ -0,0 +1,166 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import styled from '@emotion/styled'; +import { VSCodeButton } from '@vscode/webview-ui-toolkit/react'; +import { RequiredFormInput } from '../Commons/RequiredInput'; +import { ErrorBanner } from '../Commons/ErrorBanner'; + +export interface DirectorySelectorProps { + id?: string; + label?: string; + placeholder?: string; + selectedPath?: string; + required?: boolean; + description?: string; + errorMsg?: string; + sx?: any; + onSelect: () => void; +} + +interface ContainerProps { + sx?: any; +} + +const Container = styled.div` + display: flex; + flex-direction: column; + width: 100%; + ${(props: ContainerProps) => props.sx}; +`; + +const LabelContainer = styled.div` + display: flex; + flex-direction: row; + margin-bottom: 4px; +`; + +const Label = styled.label` + color: var(--vscode-editor-foreground); +`; + +const Description = styled.div` + color: var(--vscode-list-deemphasizedForeground); + font-size: 12px; + margin-bottom: 8px; + text-align: left; +`; + +const InputRow = styled.div` + display: flex; + flex-direction: row; + align-items: stretch; + gap: 8px; + width: 100%; +`; + +const InputWrapper = styled.div` + flex: 1; + position: relative; + display: flex; + align-items: center; +`; + +const Input = styled.input` + width: 100%; + height: 28px; + padding: 8px 12px; + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-dropdown-border); + border-radius: 2px; + font-family: var(--vscode-font-family); + font-size: 13px; + outline: none; + cursor: text; + box-sizing: border-box; + + &::placeholder { + color: var(--vscode-input-placeholderForeground); + } + + &:focus { + border-color: var(--vscode-focusBorder); + outline: 1px solid var(--vscode-focusBorder); + outline-offset: -1px; + } + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } +`; + +const BrowseButton = styled(VSCodeButton)` + height: 28px; + padding: 0 16px; + white-space: nowrap; + display: flex; + align-items: center; + gap: 6px; +`; + +export const DirectorySelector: React.FC = props => { + const { + id, + label, + placeholder = "Choose a folder for your project...", + selectedPath, + required, + description, + errorMsg, + sx, + onSelect + } = props; + + const handleInputClick = () => { + onSelect(); + }; + + return ( + + {label && ( + + + {required && } + + )} + {description && {description}} + + + + + + Browse + + + {errorMsg && } + + ); +}; From 6397a4c2396b843ffbed5aae0f43ecdc52f309fa Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 08:17:53 +0530 Subject: [PATCH 075/247] Refactor ImportIntegration and ProjectForm components to replace LocationSelector with DirectorySelector for improved folder selection functionality --- .../BI/ImportIntegration/ImportIntegrationForm.tsx | 9 ++++----- .../components/MultiProjectFormFields.tsx | 8 ++++---- .../src/views/BI/ProjectForm/ProjectFormFields.tsx | 13 +++++++------ .../src/views/BI/ProjectForm/index.tsx | 1 + workspaces/common-libs/ui-toolkit/src/index.ts | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx index 24a0de240f5..76ad59b9fbb 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx @@ -18,7 +18,7 @@ import { MigrationTool } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { ActionButtons, Icon, LocationSelector, Typography } from "@wso2/ui-toolkit"; +import { ActionButtons, Icon, DirectorySelector, Typography } from "@wso2/ui-toolkit"; import { useState } from "react"; import ButtonCard from "../../../components/ButtonCard"; import { DownloadProgress } from "../../../components/DownloadProgress"; @@ -123,11 +123,10 @@ export function ImportIntegrationForm({ Select Your Project Folder {selectedIntegration.description} - )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/components/MultiProjectFormFields.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/components/MultiProjectFormFields.tsx index 2cc6df93072..dd231a32f09 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/components/MultiProjectFormFields.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/components/MultiProjectFormFields.tsx @@ -17,7 +17,7 @@ */ import { useEffect } from "react"; -import { LocationSelector, TextField, CheckBox } from "@wso2/ui-toolkit"; +import { DirectorySelector, TextField, CheckBox } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; @@ -70,10 +70,10 @@ export function MultiProjectFormFields({ formData, onFormDataChange }: MultiProj return ( <> - diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx index 40452a76c50..58553ce81b4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx @@ -17,7 +17,7 @@ */ import { useEffect, useState } from "react"; -import { LocationSelector, TextField, CheckBox, LinkButton, ThemeColors, Codicon, FormCheckBox } from "@wso2/ui-toolkit"; +import { DirectorySelector, TextField, CheckBox, LinkButton, ThemeColors, Codicon, FormCheckBox } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { sanitizePackageName, validatePackageName } from "./utils"; @@ -27,7 +27,7 @@ const FieldGroup = styled.div` `; const CheckboxContainer = styled.div` - margin: 16px 0; + margin-top: 8px; `; const OptionalConfigRow = styled.div` @@ -159,17 +159,18 @@ export function ProjectFormFields({ formData, onFormDataChange, onValidationChan - onFormDataChange({ createDirectory: checked })} /> 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 2b6c2432923..be897253c74 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx @@ -61,6 +61,7 @@ const ScrollableContent = styled.div` const ButtonWrapper = styled.div` margin-top: 20px; + margin-right: 8px; padding-top: 16px; display: flex; justify-content: flex-end; diff --git a/workspaces/common-libs/ui-toolkit/src/index.ts b/workspaces/common-libs/ui-toolkit/src/index.ts index ea71ee68fbd..834d7d2bf30 100644 --- a/workspaces/common-libs/ui-toolkit/src/index.ts +++ b/workspaces/common-libs/ui-toolkit/src/index.ts @@ -49,6 +49,7 @@ export * from './components/Grid/GridItem'; export * from './components/SeachBox/SearchBox'; export * from './components/Swich/Swich'; export * from './components/LocationSelector/LocationSelector'; +export * from './components/DirectorySelector/DirectorySelector'; export * from './components/ClickAwayListener/ClickAwayListener'; export * from './components/Confirm/Confirm'; export * from './components/CheckBoxGroup/CheckBoxGroup'; From f4d0c0982ea5d8cdbd4ffd971c00489e577bb555 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 09:31:03 +0530 Subject: [PATCH 076/247] Update e2e test to support 'directory' typed form filed --- .../ImportIntegrationForm.tsx | 3 ++- .../utils/helpers/setup.ts | 2 +- .../src/components/Form.ts | 19 ++++++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx index 76ad59b9fbb..293c25f53dc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ImportIntegrationForm.tsx @@ -124,7 +124,8 @@ export function ImportIntegrationForm({ Select Your Project Folder {selectedIntegration.description} diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/helpers/setup.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/helpers/setup.ts index daaea4f135f..c8d7a3fb67f 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/helpers/setup.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils/helpers/setup.ts @@ -142,7 +142,7 @@ export async function createProject(page: ExtendedPage, projectName?: string) { value: projectName ?? 'sample', }, 'Select Path': { - type: 'file', + type: 'directory', value: newProjectPath } } diff --git a/workspaces/common-libs/playwright-vscode-tester/src/components/Form.ts b/workspaces/common-libs/playwright-vscode-tester/src/components/Form.ts index 1acfde8261a..8c5e5630c9e 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/components/Form.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/components/Form.ts @@ -23,7 +23,7 @@ export interface FormFillProps { values: { [key: string]: { value: string, - type: 'input' | 'dropdown' | 'checkbox' | 'combo' | 'expression' | 'file' | 'inlineExpression' | 'radio' | 'textarea', + type: 'input' | 'dropdown' | 'checkbox' | 'combo' | 'expression' | 'file' | 'directory' | 'inlineExpression' | 'radio' | 'textarea', additionalProps?: { [key: string]: any } @@ -176,6 +176,23 @@ export class Form { await okBtn?.click(); break; } + case 'directory': { + // Find the input field by label and set its value (readonly field) + const labelElement = this.container.locator(`label:has-text("${key}")`); + await labelElement.waitFor(); + // Find the parent container and then the input field + const parentContainer = labelElement.locator('../..'); + const input = parentContainer.locator('input[type="text"][readonly]'); + await input.waitFor(); + // Set value directly using JavaScript evaluation since input is readonly + await input.evaluate((el: any, value: string) => { + el.value = value; + // Trigger input and change events to ensure any listeners are notified + el.dispatchEvent(new Event('input', { bubbles: true })); + el.dispatchEvent(new Event('change', { bubbles: true })); + }, data.value); + break; + } case 'radio': { const checkbox = this.container.locator(`vscode-radio[aria-label="${key}"]`); await checkbox.waitFor(); From 0dbf4311cfa7807bd8abb1442902a0b016a33a50 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 3 Feb 2026 22:05:17 +0530 Subject: [PATCH 077/247] Enhance validation in ImportIntegration and ConfigureProject forms by adding error handling for project path and folder name. Update MultiProjectFormFields to display error messages. Improve user experience with validation feedback during project creation. --- .../ConfigureProjectForm.tsx | 129 ++++++++++++++---- .../ImportIntegrationForm.tsx | 61 ++++++--- .../components/MultiProjectFormFields.tsx | 6 +- 3 files changed, 154 insertions(+), 42 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ConfigureProjectForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ConfigureProjectForm.tsx index dd9f69b52e2..bb02500e872 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ConfigureProjectForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ImportIntegration/ConfigureProjectForm.tsx @@ -18,6 +18,8 @@ import { ActionButtons, Typography } from "@wso2/ui-toolkit"; import { useState } from "react"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { ValidateProjectFormErrorField } from "@wso2/ballerina-core"; import { BodyText } from "../../styles"; import { ProjectFormData, ProjectFormFields } from "../ProjectForm/ProjectFormFields"; import { isFormValid } from "../ProjectForm/utils"; @@ -26,6 +28,7 @@ import { ButtonWrapper } from "./styles"; import { ConfigureProjectFormProps } from "./types"; export function ConfigureProjectForm({ isMultiProject, onNext, onBack }: ConfigureProjectFormProps) { + const { rpcClient } = useRpcContext(); const [singleProjectData, setSingleProjectData] = useState({ integrationName: "", packageName: "", @@ -43,35 +46,111 @@ export function ConfigureProjectForm({ isMultiProject, onNext, onBack }: Configu createDirectory: true, }); + const [isValidating, setIsValidating] = useState(false); + const [pathError, setPathError] = useState(null); + const [folderNameError, setFolderNameError] = useState(null); + const [singleProjectPathError, setSingleProjectPathError] = useState(null); + const [singleProjectPackageNameError, setSingleProjectPackageNameError] = useState(null); + const handleSingleProjectFormChange = (data: Partial) => { setSingleProjectData(prev => ({ ...prev, ...data })); + // Clear validation errors when form data changes + if (singleProjectPathError) { + setSingleProjectPathError(null); + } + if (singleProjectPackageNameError) { + setSingleProjectPackageNameError(null); + } }; const handleMultiProjectFormChange = (data: Partial) => { setMultiProjectData(prev => ({ ...prev, ...data })); + // Clear validation errors when form data changes + if (pathError) { + setPathError(null); + } + if (folderNameError) { + setFolderNameError(null); + } }; - const handleCreateSingleProject = () => { - onNext({ - projectName: singleProjectData.integrationName, - packageName: singleProjectData.packageName, - projectPath: singleProjectData.path, - createDirectory: singleProjectData.createDirectory, - createAsWorkspace: singleProjectData.createAsWorkspace, - workspaceName: singleProjectData.workspaceName, - orgName: singleProjectData.orgName || undefined, - version: singleProjectData.version || undefined, - }); + const handleCreateSingleProject = async () => { + setIsValidating(true); + setSingleProjectPathError(null); + setSingleProjectPackageNameError(null); + + try { + // Validate the project path + const validationResult = await rpcClient.getBIDiagramRpcClient().validateProjectPath({ + projectPath: singleProjectData.path, + projectName: singleProjectData.createAsWorkspace ? singleProjectData.workspaceName : singleProjectData.packageName, + createDirectory: singleProjectData.createDirectory, + }); + + if (!validationResult.isValid) { + // Show error on the appropriate field + if (validationResult.errorField === ValidateProjectFormErrorField.PATH) { + setSingleProjectPathError(validationResult.errorMessage || "Invalid project path"); + } else if (validationResult.errorField === ValidateProjectFormErrorField.NAME) { + setSingleProjectPackageNameError(validationResult.errorMessage || "Invalid project name"); + } + setIsValidating(false); + return; + } + + // If validation passes, proceed + onNext({ + projectName: singleProjectData.integrationName, + packageName: singleProjectData.packageName, + projectPath: singleProjectData.path, + createDirectory: singleProjectData.createDirectory, + createAsWorkspace: singleProjectData.createAsWorkspace, + workspaceName: singleProjectData.workspaceName, + orgName: singleProjectData.orgName || undefined, + version: singleProjectData.version || undefined, + }); + } catch (error) { + setSingleProjectPathError("An error occurred during validation"); + setIsValidating(false); + } }; - const handleCreateMultiProject = () => { - onNext({ - projectName: multiProjectData.rootFolderName, - packageName: multiProjectData.rootFolderName, - projectPath: multiProjectData.path, - createDirectory: multiProjectData.createDirectory, - createAsWorkspace: false, - }); + const handleCreateMultiProject = async () => { + setIsValidating(true); + setPathError(null); + setFolderNameError(null); + + try { + // Validate the project path + const validationResult = await rpcClient.getBIDiagramRpcClient().validateProjectPath({ + projectPath: multiProjectData.path, + projectName: multiProjectData.rootFolderName, + createDirectory: multiProjectData.createDirectory, + }); + + if (!validationResult.isValid) { + // Show error on the appropriate field + if (validationResult.errorField === ValidateProjectFormErrorField.PATH) { + setPathError(validationResult.errorMessage || "Invalid project path"); + } else if (validationResult.errorField === ValidateProjectFormErrorField.NAME) { + setFolderNameError(validationResult.errorMessage || "Invalid folder name"); + } + setIsValidating(false); + return; + } + + // If validation passes, proceed + onNext({ + projectName: multiProjectData.rootFolderName, + packageName: multiProjectData.rootFolderName, + projectPath: multiProjectData.path, + createDirectory: multiProjectData.createDirectory, + createAsWorkspace: false, + }); + } catch (error) { + setPathError("An error occurred during validation"); + setIsValidating(false); + } }; const isMultiProjectFormValid = () => { @@ -96,14 +175,16 @@ export function ConfigureProjectForm({ isMultiProject, onNext, onBack }: Configu >({}); + const [sourcePathError, setSourcePathError] = useState(null); + const [isValidating, setIsValidating] = useState(false); const isImportDisabled = importSourcePath.length < 2 || !selectedIntegration; const handleIntegrationSelection = (integration: MigrationTool) => { // Reset state when a new integration is selected setImportSourcePath(""); + setSourcePathError(null); onSelectIntegration(integration); const defaultParams = integration.parameters.reduce((acc, param) => { acc[param.key] = param.defaultValue; @@ -66,23 +69,45 @@ export function ImportIntegrationForm({ const result = await rpcClient.getCommonRpcClient().selectFileOrFolderPath(); if (result?.path) { setImportSourcePath(result.path); + setSourcePathError(null); } }; - const handleImportIntegration = () => { + const handleImportIntegration = async () => { if (!selectedIntegration || !importSourcePath) return; - const finalParams: FinalIntegrationParams = { - importSourcePath, - type: selectedIntegration.title, - parameters: integrationParams, - }; - - setImportParams(finalParams); - if (selectedIntegration.needToPull) { - pullIntegrationTool(selectedIntegration.commandName, selectedIntegration.requiredVersion); - } else { - handleStartImport(finalParams, selectedIntegration, toolPullProgress); + setIsValidating(true); + setSourcePathError(null); + + try { + // Simple validation: check if the source path exists + const validationResult = await rpcClient.getBIDiagramRpcClient().validateProjectPath({ + projectPath: importSourcePath, + projectName: "", + createDirectory: false, + }); + + if (!validationResult.isValid) { + setSourcePathError(validationResult.errorMessage || "Invalid source path"); + setIsValidating(false); + return; + } + + const finalParams: FinalIntegrationParams = { + importSourcePath, + type: selectedIntegration.title, + parameters: integrationParams, + }; + + setImportParams(finalParams); + if (selectedIntegration.needToPull) { + pullIntegrationTool(selectedIntegration.commandName, selectedIntegration.requiredVersion); + } else { + handleStartImport(finalParams, selectedIntegration, toolPullProgress); + } + } catch (error) { + setSourcePathError("An error occurred during validation"); + setIsValidating(false); } }; @@ -99,7 +124,7 @@ export function ImportIntegrationForm({ This wizard converts an external integration project from MuleSoft or TIBCO into a ready-to-use BI project. - + Choose the source platform Select the integration platform that your current project uses: @@ -121,13 +146,13 @@ export function ImportIntegrationForm({ {selectedIntegration && ( - Select Your Project Folder + Select Your Project Folder {selectedIntegration.description} )} @@ -149,9 +174,9 @@ export function ImportIntegrationForm({ ) => void; + pathError?: string; + folderNameError?: string; } -export function MultiProjectFormFields({ formData, onFormDataChange }: MultiProjectFormFieldsProps) { +export function MultiProjectFormFields({ formData, onFormDataChange, pathError, folderNameError }: MultiProjectFormFieldsProps) { const { rpcClient } = useRpcContext(); const handleIntegrationName = (value: string) => { @@ -75,6 +77,7 @@ export function MultiProjectFormFields({ formData, onFormDataChange }: MultiProj placeholder="Choose a folder for your packages..." selectedPath={formData.path} onSelect={handleProjectDirSelection} + errorMsg={pathError} /> @@ -97,6 +100,7 @@ export function MultiProjectFormFields({ formData, onFormDataChange }: MultiProj placeholder="Enter folder name" autoFocus={true} required={true} + errorMsg={folderNameError || ""} /> This folder will contain all migrated packages from this integration. From 783d7d4790f72d161a78b8815a91736b8d750925 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 4 Feb 2026 14:43:16 +0530 Subject: [PATCH 078/247] Refactor ProjectFormFields to improve validation handling by introducing integrationNameError prop. Update ProjectForm to validate integration name and package name, providing user feedback for errors. Clean up unused state and validation logic. --- .../BI/ProjectForm/ProjectFormFields.tsx | 19 ++------- .../src/views/BI/ProjectForm/index.tsx | 39 ++++++++++++++++++- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx index 58553ce81b4..0ee34e07a7b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/ProjectFormFields.tsx @@ -70,16 +70,15 @@ export interface ProjectFormData { export interface ProjectFormFieldsProps { formData: ProjectFormData; onFormDataChange: (data: Partial) => void; - onValidationChange?: (isValid: boolean) => void; + integrationNameError?: string; pathError?: string; packageNameValidationError?: string; } -export function ProjectFormFields({ formData, onFormDataChange, onValidationChange, pathError, packageNameValidationError }: ProjectFormFieldsProps) { +export function ProjectFormFields({ formData, onFormDataChange, integrationNameError, pathError, packageNameValidationError }: ProjectFormFieldsProps) { const { rpcClient } = useRpcContext(); const [packageNameTouched, setPackageNameTouched] = useState(false); const [showOptionalConfigurations, setShowOptionalConfigurations] = useState(false); - const [packageNameError, setPackageNameError] = useState(null); const [isWorkspaceSupported, setIsWorkspaceSupported] = useState(false); const handleIntegrationName = (value: string) => { @@ -95,10 +94,6 @@ export function ProjectFormFields({ formData, onFormDataChange, onValidationChan const sanitized = sanitizePackageName(value); onFormDataChange({ packageName: sanitized }); setPackageNameTouched(value.length > 0); - // Clear error while typing - if (packageNameError) { - setPackageNameError(null); - } }; const handleProjectDirSelection = async () => { @@ -128,13 +123,6 @@ export function ProjectFormFields({ formData, onFormDataChange, onValidationChan })(); }, []); - // Effect to trigger validation when requested by parent - useEffect(() => { - const error = validatePackageName(formData.packageName, formData.integrationName); - setPackageNameError(error); - onValidationChange?.(error === null); - }, [formData.packageName, onValidationChange]); - return ( <> @@ -145,6 +133,7 @@ export function ProjectFormFields({ formData, onFormDataChange, onValidationChan placeholder="Enter an integration name" autoFocus={true} required={true} + errorMsg={integrationNameError || ""} /> @@ -154,7 +143,7 @@ export function ProjectFormFields({ formData, onFormDataChange, onValidationChan value={formData.packageName} label="Package Name" description="This will be used as the Ballerina package name for the integration." - errorMsg={packageNameValidationError || packageNameError || ""} + errorMsg={packageNameValidationError || ""} /> 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 be897253c74..6d09325d69d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx @@ -26,7 +26,7 @@ import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { EVENT_TYPE, MACHINE_VIEW, ValidateProjectFormErrorField } from "@wso2/ballerina-core"; import { ProjectFormFields, ProjectFormData } from "./ProjectFormFields"; -import { isFormValid } from "./utils"; +import { validatePackageName } from "./utils"; const PageWrapper = styled.div` display: flex; @@ -92,12 +92,16 @@ export function ProjectForm() { version: "", }); const [isValidating, setIsValidating] = useState(false); + const [integrationNameError, setIntegrationNameError] = useState(null); const [pathError, setPathError] = useState(null); const [packageNameValidationError, setPackageNameValidationError] = useState(null); const handleFormDataChange = (data: Partial) => { setFormData(prev => ({ ...prev, ...data })); // Clear validation errors when form data changes + if (integrationNameError) { + setIntegrationNameError(null); + } if (pathError) { setPathError(null); } @@ -108,9 +112,39 @@ export function ProjectForm() { const handleCreateProject = async () => { setIsValidating(true); + setIntegrationNameError(null); setPathError(null); setPackageNameValidationError(null); + // Validate required fields first + let hasError = false; + + if (formData.integrationName.length < 2) { + setIntegrationNameError("Integration name must be at least 2 characters"); + hasError = true; + } + + if (formData.packageName.length < 2) { + setPackageNameValidationError("Package name must be at least 2 characters"); + hasError = true; + } else { + const packageNameError = validatePackageName(formData.packageName, formData.integrationName); + if (packageNameError) { + setPackageNameValidationError(packageNameError); + hasError = true; + } + } + + if (formData.path.length < 2) { + setPathError("Please select a path for your project"); + hasError = true; + } + + if (hasError) { + setIsValidating(false); + return; + } + try { // Validate the project path const validationResult = await rpcClient.getBIDiagramRpcClient().validateProjectPath({ @@ -181,6 +215,7 @@ export function ProjectForm() { @@ -188,7 +223,7 @@ export function ProjectForm() { + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx new file mode 100644 index 00000000000..656de249dcc --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -0,0 +1,416 @@ +/** + * 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 { useState, useMemo, ReactNode, useEffect } from "react"; +import styled from "@emotion/styled"; +import { Codicon } from "@wso2/ui-toolkit"; +import { CopyButton } from "./CopyButton"; + +// Configurable auto-expand depth +export const DEFAULT_AUTO_EXPAND_DEPTH = 2; + +interface JsonTreeViewerProps { + data: unknown; + searchQuery?: string; + maxAutoExpandDepth?: number; + collapseAll?: boolean; + expandAll?: boolean; +} + +const Container = styled.div` + font-size: 13px; + line-height: 1.6; +`; + +const TreeNode = styled.div` + margin-left: 16px; + margin-top: 4px; + border-left: 2px solid var(--vscode-editorIndentGuide-background, rgba(128, 128, 128, 0.2)); + padding-left: 12px; +`; + +const NodeRow = styled.div` + display: flex; + align-items: flex-start; + gap: 4px; + padding: 1px 0; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + + & > span:last-child { + opacity: 1; + } + } +`; + +const ExpandableRow = styled.div` + display: flex; + align-items: flex-start; + gap: 4px; + padding: 1px 0; + width: 100%; + cursor: pointer; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + + & > span:last-child { + opacity: 1; + } + } +`; + +const ExpandIcon = styled.span` + display: flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + padding: 0; + color: var(--vscode-descriptionForeground); + flex-shrink: 0; + margin-top: 2px; +`; + +const Spacer = styled.span` + width: 16px; + flex-shrink: 0; +`; + +const KeyBadge = styled.span<{ isArrayIndex?: boolean }>` + display: inline-flex; + align-items: center; + font-size: 12px; + padding: 2px 6px; + border-radius: 3px; + min-height: 18px; + background-color: ${(props: { isArrayIndex?: boolean }) => props.isArrayIndex + ? 'var(--vscode-list-hoverBackground)' + : 'var(--vscode-badge-background)'}; + color: ${(props: { isArrayIndex?: boolean }) => props.isArrayIndex + ? 'var(--vscode-editor-foreground)' + : 'var(--vscode-badge-foreground)'}; + flex-shrink: 0; +`; + +const ValueText = styled.span` + color: var(--vscode-editor-foreground); + word-break: break-word; + flex: 1; + margin-left: 6px; +`; + +const TypeIndicator = styled.span` + font-size: 11px; + color: var(--vscode-descriptionForeground); + margin-left: 4px; + display: flex; + align-self: center; +`; + +const Highlight = styled.mark` + background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); + color: inherit; + padding: 0 1px; + border-radius: 2px; +`; + +const CopyWrapper = styled.span` + opacity: 0; + transition: opacity 0.15s ease; +`; + +// Helper function to fix invalid JSON escape sequences +function fixJSONEscapes(str: string): string { + // Strategy: First escape all backslashes, then unescape valid JSON sequences + // This handles cases like \times where \t would be interpreted as tab + + // Step 1: Escape all backslashes + let result = str.replace(/\\/g, '\\\\'); + + // Step 2: Unescape valid JSON escape sequences + // Valid: \", \\, \/, \b, \f, \n, \r, \t, \uXXXX + result = result.replace(/\\\\\\(["\\/@bfnrt])/g, '\\$1'); + result = result.replace(/\\\\\\u([0-9a-fA-F]{4})/g, '\\u$1'); + + return result; +} + +// Helper function to check if a string is valid JSON +function isJSONString(str: string): boolean { + if (!str || typeof str !== 'string') return false; + const trimmed = str.trim(); + if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return false; + try { + const fixed = fixJSONEscapes(trimmed); + JSON.parse(fixed); + return true; + } catch (e) { + console.log('JSON parse failed:', e, 'Input:', trimmed.substring(0, 100)); + return false; + } +} + +// Parse nested JSON strings recursively +function parseNestedJSON(value: unknown): unknown { + if (typeof value === 'string') { + const trimmed = value.trim(); + if (isJSONString(trimmed)) { + try { + const parsed = JSON.parse(fixJSONEscapes(trimmed)); + return parseNestedJSON(parsed); + } catch (e) { + console.log('Failed to parse nested JSON:', e, 'Value:', trimmed.substring(0, 100)); + return value; + } + } + } + if (Array.isArray(value)) { + return value.map(item => parseNestedJSON(item)); + } + if (value !== null && typeof value === 'object') { + const result: Record = {}; + for (const [key, val] of Object.entries(value)) { + result[key] = parseNestedJSON(val); + } + return result; + } + return value; +} + +// Highlight search matches in text +function highlightText(text: string, searchQuery: string): ReactNode { + if (!searchQuery) return text; + + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + const parts = text.split(regex); + + return parts.map((part, i) => + regex.test(part) ? {part} : part + ); +} + +// Generate initial expanded state based on depth +function generateInitialExpanded(data: unknown, maxDepth: number, path: string = ''): Set { + const expanded = new Set(); + + const traverse = (obj: unknown, currentPath: string, depth: number) => { + if (depth >= maxDepth) return; + + if (Array.isArray(obj)) { + expanded.add(currentPath); + obj.forEach((item, index) => { + if (typeof item === 'object' && item !== null) { + traverse(item, `${currentPath}[${index}]`, depth + 1); + } + }); + } else if (obj !== null && typeof obj === 'object') { + expanded.add(currentPath); + Object.entries(obj).forEach(([key, val]) => { + if (typeof val === 'object' && val !== null) { + traverse(val, `${currentPath}.${key}`, depth + 1); + } + }); + } + }; + + traverse(data, path || 'root', 0); + return expanded; +} + +// Collect all paths in the data structure +function collectAllPaths(data: unknown, path: string = ''): Set { + const paths = new Set(); + + const traverse = (obj: unknown, currentPath: string) => { + if (Array.isArray(obj)) { + paths.add(currentPath); + obj.forEach((item, index) => { + if (typeof item === 'object' && item !== null) { + traverse(item, `${currentPath}[${index}]`); + } + }); + } else if (obj !== null && typeof obj === 'object') { + paths.add(currentPath); + Object.entries(obj).forEach(([key, val]) => { + if (typeof val === 'object' && val !== null) { + traverse(val, `${currentPath}.${key}`); + } + }); + } + }; + + traverse(data, path || 'root'); + return paths; +} + +export function JsonTreeViewer({ + data, + searchQuery = '', + maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH, + collapseAll = false, + expandAll = false +}: JsonTreeViewerProps) { + // Parse nested JSON strings + const parsedData = useMemo(() => parseNestedJSON(data), [data]); + + // Initialize expanded state + const [expandedPaths, setExpandedPaths] = useState>(() => + generateInitialExpanded(parsedData, maxAutoExpandDepth) + ); + + // Handle collapse/expand all + useEffect(() => { + if (collapseAll) { + setExpandedPaths(new Set()); + } + }, [collapseAll]); + + useEffect(() => { + if (expandAll) { + setExpandedPaths(collectAllPaths(parsedData)); + } + }, [expandAll, parsedData]); + + const toggleExpanded = (path: string) => { + setExpandedPaths(prev => { + const next = new Set(prev); + if (next.has(path)) { + next.delete(path); + } else { + next.add(path); + } + return next; + }); + }; + + const renderValue = ( + value: unknown, + key: string, + path: string, + isArrayIndex: boolean = false + ): ReactNode => { + const isExpanded = expandedPaths.has(path); + + // Handle arrays + if (Array.isArray(value)) { + return ( +
+ toggleExpanded(path)}> + + + + + {highlightText(key, searchQuery)} + + [{value.length} {value.length === 1 ? 'item' : 'items'}] + + + + + {isExpanded && ( + + {value.map((item, index) => ( +
+ {renderValue(item, String(index), `${path}[${index}]`, true)} +
+ ))} +
+ )} +
+ ); + } + + // Handle objects + if (value !== null && typeof value === 'object') { + const keys = Object.keys(value); + return ( +
+ toggleExpanded(path)}> + + + + + {highlightText(key, searchQuery)} + + {`{${keys.length} ${keys.length === 1 ? 'property' : 'properties'}}`} + + + + + {isExpanded && ( + + {Object.entries(value).map(([k, v]) => ( +
+ {renderValue(v, k, `${path}.${k}`, false)} +
+ ))} +
+ )} +
+ ); + } + + // Handle primitives + return ( + + + + {highlightText(key, searchQuery)} + + {highlightText(String(value), searchQuery)} + + + + + ); + }; + + // Render based on data type + if (Array.isArray(parsedData)) { + return ( + + {parsedData.map((item, index) => ( +
+ {renderValue(item, String(index), `root[${index}]`, true)} +
+ ))} +
+ ); + } + + if (parsedData !== null && typeof parsedData === 'object') { + return ( + + {Object.entries(parsedData).map(([key, value]) => ( +
+ {renderValue(value, key, `root.${key}`, false)} +
+ ))} +
+ ); + } + + // Primitive value at root + return ( + + {highlightText(String(parsedData), searchQuery)} + + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx new file mode 100644 index 00000000000..4933f3cd0b2 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -0,0 +1,466 @@ +/** + * 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 { useState, useMemo, ReactNode } from "react"; +import styled from "@emotion/styled"; +import { Icon } from "@wso2/ui-toolkit"; +import { JsonTreeViewer, DEFAULT_AUTO_EXPAND_DEPTH } from "./JsonTreeViewer"; +import { CopyButton } from "./CopyButton"; + +type ViewMode = 'formatted' | 'raw'; + +interface JsonViewerProps { + value: string; + title?: string; + searchQuery?: string; + maxAutoExpandDepth?: number; +} + +const Container = styled.div``; + +const Header = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; +`; + +const TitleContainer = styled.div` + display: flex; + align-items: center; + gap: 6px; +`; + +const ActionButtons = styled.div` + display: flex; + align-items: center; + gap: 4px; +`; + +const Title = styled.h4` + margin: 0; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + color: var(--vscode-descriptionForeground); + letter-spacing: 0.5px; +`; + +const ToggleGroup = styled.div` + display: flex; + gap: 2px; +`; + +const IconButton = styled.button` + display: inline-flex; + align-items: center; + justify-content: center; + padding: 4px; + background: transparent; + border: none; + border-radius: 3px; + cursor: pointer; + color: var(--vscode-descriptionForeground); + transition: opacity 0.15s ease, background-color 0.15s ease; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); + } +`; + +interface ToggleButtonProps { + active: boolean; +} + +const ToggleButton = styled.button` + padding: 4px 10px; + font-size: 11px; + font-family: var(--vscode-font-family); + border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); + cursor: pointer; + transition: all 0.15s ease; + + background-color: ${(props: ToggleButtonProps) => + props.active + ? 'var(--vscode-button-background)' + : 'var(--vscode-input-background)'}; + color: ${(props: ToggleButtonProps) => + props.active + ? 'var(--vscode-button-foreground)' + : 'var(--vscode-foreground)'}; + + &:first-of-type { + border-radius: 3px 0 0 3px; + } + + &:last-of-type { + border-radius: 0 3px 3px 0; + } + + &:hover { + background-color: ${(props: ToggleButtonProps) => + props.active + ? 'var(--vscode-button-hoverBackground)' + : 'var(--vscode-list-hoverBackground)'}; + } +`; + +const ContentWrapper = styled.div` + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 12px; + max-height: 500px; + overflow-y: auto; +`; + +const RawContent = styled.pre` + margin: 0; + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; + color: var(--vscode-editor-foreground); +`; + +const PlainText = styled.div` + font-family: var(--vscode-font-family); + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; + color: var(--vscode-editor-foreground); +`; + +const Highlight = styled.mark` + background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); + color: inherit; + padding: 0 1px; + border-radius: 2px; +`; + +// Syntax highlighting for JSON +const JsonKey = styled.span` + color: var(--vscode-symbolIcon-propertyForeground, #9cdcfe); +`; + +const JsonString = styled.span` + color: var(--vscode-debugTokenExpression-string, #ce9178); +`; + +const JsonNumber = styled.span` + color: var(--vscode-debugTokenExpression-number, #b5cea8); +`; + +const JsonBoolean = styled.span` + color: var(--vscode-debugTokenExpression-boolean, #569cd6); +`; + +const JsonNull = styled.span` + color: var(--vscode-debugTokenExpression-boolean, #569cd6); +`; + +const JsonPunctuation = styled.span` + color: var(--vscode-foreground); +`; + +// Helper function to fix invalid JSON escape sequences +function fixJSONEscapes(str: string): string { + // Strategy: First escape all backslashes, then unescape valid JSON sequences + // This handles cases like \times where \t would be interpreted as tab + + // Step 1: Escape all backslashes + let result = str.replace(/\\/g, '\\\\'); + + // Step 2: Unescape valid JSON escape sequences + // Valid: \", \\, \/, \b, \f, \n, \r, \t, \uXXXX + result = result.replace(/\\\\\\(["\\/@bfnrt])/g, '\\$1'); + result = result.replace(/\\\\\\u([0-9a-fA-F]{4})/g, '\\u$1'); + + return result; +} + +// Helper function to check if a string is valid JSON +function isJSONString(str: string): boolean { + if (!str || typeof str !== 'string') return false; + const trimmed = str.trim(); + if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return false; + try { + const fixed = fixJSONEscapes(trimmed); + JSON.parse(fixed); + return true; + } catch (e) { + console.log('JSON parse failed:', e, 'Input:', trimmed.substring(0, 100)); + return false; + } +} + +// Parse nested JSON strings recursively for formatting +function parseNestedJSON(value: unknown): unknown { + if (typeof value === 'string') { + const trimmed = value.trim(); + if (isJSONString(trimmed)) { + try { + const parsed = JSON.parse(fixJSONEscapes(trimmed)); + return parseNestedJSON(parsed); + } catch (e) { + console.log('Failed to parse nested JSON:', e, 'Value:', trimmed.substring(0, 100)); + return value; + } + } + } + if (Array.isArray(value)) { + return value.map(item => parseNestedJSON(item)); + } + if (value !== null && typeof value === 'object') { + const result: Record = {}; + for (const [key, val] of Object.entries(value)) { + result[key] = parseNestedJSON(val); + } + return result; + } + return value; +} + +// Format JSON with nested parsing +function formatJSON(str: string): string { + try { + const trimmed = str.trim(); + const parsed = JSON.parse(fixJSONEscapes(trimmed)); + const deepParsed = parseNestedJSON(parsed); + return JSON.stringify(deepParsed, null, 2); + } catch (e) { + console.log('Failed to format JSON:', e); + return str; + } +} + +// Syntax highlight JSON string +function syntaxHighlightJSON(json: string, searchQuery: string): ReactNode[] { + const tokens: ReactNode[] = []; + let i = 0; + let tokenId = 0; + + const highlight = (text: string): ReactNode => { + if (!searchQuery) return text; + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + const parts = text.split(regex); + return parts.map((part, idx) => + regex.test(part) ? {part} : part + ); + }; + + while (i < json.length) { + const char = json[i]; + + // Strings + if (char === '"') { + let str = '"'; + i++; + while (i < json.length && (json[i] !== '"' || json[i - 1] === '\\')) { + str += json[i]; + i++; + } + str += '"'; + i++; + + // Check if this is a key (followed by :) + let j = i; + while (j < json.length && /\s/.test(json[j])) j++; + const isKey = json[j] === ':'; + + if (isKey) { + tokens.push({highlight(str)}); + } else { + tokens.push({highlight(str)}); + } + continue; + } + + // Numbers + if (/[\d-]/.test(char) && (i === 0 || /[\s,\[{:]/.test(json[i - 1]))) { + let num = ''; + while (i < json.length && /[\d.eE+-]/.test(json[i])) { + num += json[i]; + i++; + } + tokens.push({highlight(num)}); + continue; + } + + // Booleans + if (json.slice(i, i + 4) === 'true') { + tokens.push({highlight('true')}); + i += 4; + continue; + } + if (json.slice(i, i + 5) === 'false') { + tokens.push({highlight('false')}); + i += 5; + continue; + } + + // Null + if (json.slice(i, i + 4) === 'null') { + tokens.push({highlight('null')}); + i += 4; + continue; + } + + // Punctuation + if (/[{}\[\]:,]/.test(char)) { + tokens.push({char}); + i++; + continue; + } + + // Whitespace and other + tokens.push({char}); + i++; + } + + return tokens; +} + +// Highlight text for plain text display +function highlightText(text: string, searchQuery: string): ReactNode { + if (!searchQuery) return text; + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + const parts = text.split(regex); + return parts.map((part, i) => + regex.test(part) ? {part} : part + ); +} + +export function JsonViewer({ + value, + title, + searchQuery = '', + maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH +}: JsonViewerProps) { + const isJSON = useMemo(() => isJSONString(value), [value]); + const [viewMode, setViewMode] = useState('formatted'); + const [collapseAll, setCollapseAll] = useState(false); + const [expandAll, setExpandAll] = useState(false); + const [isCollapsed, setIsCollapsed] = useState(false); + + const parsedData = useMemo(() => { + if (!isJSON) return null; + try { + const trimmed = value.trim(); + return JSON.parse(fixJSONEscapes(trimmed)); + } catch { + return null; + } + }, [value, isJSON]); + + const formattedJSON = useMemo(() => { + if (!isJSON) return value; + return formatJSON(value); + }, [value, isJSON]); + + // If not JSON, just show plain text + if (!isJSON) { + return ( + + {title && ( +
+ + {title} + + +
+ )} + + {highlightText(value, searchQuery)}</PlainText> + </ContentWrapper> + </Container> + ); + } + + const handleCollapseExpandToggle = () => { + if (isCollapsed) { + setExpandAll(true); + setCollapseAll(false); + setIsCollapsed(false); + // Reset expandAll after a short delay + setTimeout(() => setExpandAll(false), 50); + } else { + setCollapseAll(true); + setExpandAll(false); + setIsCollapsed(true); + // Reset collapseAll after a short delay + setTimeout(() => setCollapseAll(false), 50); + } + }; + + return ( + <Container> + <Header> + <TitleContainer> + {title && <Title>{title}</Title>} + <CopyButton text={value} size="small" /> + </TitleContainer> + <ActionButtons> + {viewMode === 'formatted' && ( + <IconButton + onClick={handleCollapseExpandToggle} + title={isCollapsed ? 'Expand all' : 'Collapse all'} + > + <Icon + name={isCollapsed ? 'bi-expand' : 'bi-collapse'} + sx={{ fontSize: "12px", width: "12px", height: "12px" }} + iconSx={{ display: "flex" }} + /> + </IconButton> + )} + <ToggleGroup> + <ToggleButton + active={viewMode === 'formatted'} + onClick={() => setViewMode('formatted')} + > + Formatted + </ToggleButton> + <ToggleButton + active={viewMode === 'raw'} + onClick={() => setViewMode('raw')} + > + JSON + </ToggleButton> + </ToggleGroup> + </ActionButtons> + </Header> + <ContentWrapper> + {viewMode === 'formatted' ? ( + <JsonTreeViewer + data={parsedData} + searchQuery={searchQuery} + maxAutoExpandDepth={maxAutoExpandDepth} + collapseAll={collapseAll} + expandAll={expandAll} + /> + ) : ( + <RawContent> + {syntaxHighlightJSON(formattedJSON, searchQuery)} + </RawContent> + )} + </ContentWrapper> + </Container> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx new file mode 100644 index 00000000000..0104c695ede --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx @@ -0,0 +1,101 @@ +/** + * 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 styled from "@emotion/styled"; +import { Codicon } from "@wso2/ui-toolkit"; + +interface SearchInputProps { + value: string; + onChange: (value: string) => void; + placeholder?: string; +} + +const Container = styled.div` + position: relative; + display: flex; + align-items: center; +`; + +const SearchIcon = styled.span` + position: absolute; + left: 10px; + display: flex; + align-items: center; + color: var(--vscode-input-placeholderForeground); + pointer-events: none; +`; + +const Input = styled.input` + width: 100%; + padding: 6px 32px 6px 32px; + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border, var(--vscode-panel-border)); + border-radius: 4px; + color: var(--vscode-input-foreground); + font-family: var(--vscode-font-family); + font-size: 13px; + outline: none; + + &::placeholder { + color: var(--vscode-input-placeholderForeground); + } + + &:focus { + border-color: var(--vscode-focusBorder); + } +`; + +const ClearButton = styled.button` + position: absolute; + right: 6px; + display: flex; + align-items: center; + justify-content: center; + padding: 2px; + background: transparent; + border: none; + border-radius: 3px; + cursor: pointer; + color: var(--vscode-input-placeholderForeground); + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); + } +`; + +export function SearchInput({ value, onChange, placeholder = "Search..." }: SearchInputProps) { + return ( + <Container> + <SearchIcon> + <Codicon name="search" /> + </SearchIcon> + <Input + type="text" + value={value} + onChange={(e) => onChange(e.target.value)} + placeholder={placeholder} + /> + {value && ( + <ClearButton onClick={() => onChange("")} title="Clear search"> + <Codicon name="close" /> + </ClearButton> + )} + </Container> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx new file mode 100644 index 00000000000..e12648b7f9b --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -0,0 +1,857 @@ +/** + * 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 { useState, useMemo, ReactNode, useRef, useEffect } from "react"; +import styled from "@emotion/styled"; +import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { SearchInput } from "./SearchInput"; +import { CollapsibleSection } from "./CollapsibleSection"; +import { JsonViewer } from "./JsonViewer"; +import { CopyButton } from "./CopyButton"; +import { SpanData } from "../index"; + +interface SpanInputOutputProps { + spanData: SpanData; + spanName?: string; +} + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 16px; +`; + +const SpanHeader = styled.div` + display: flex; + align-items: center; + gap: 8px; + padding-bottom: 12px; + border-bottom: 1px solid var(--vscode-panel-border); + position: relative; +`; + +const SpanIcon = styled.span<{ type: string }>` + display: flex; + align-items: center; + justify-content: center; + color: ${(props: { type: string }) => { + switch (props.type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-foreground)'; + } + }}; +`; + +const SpanTitle = styled.h2` + margin: 0; + font-size: 16px; + font-weight: 600; + color: var(--vscode-foreground); + flex: 1; +`; + +const IdButton = styled.button` + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 4px 8px; + cursor: pointer; + color: var(--vscode-foreground); + transition: all 0.15s ease; + gap: 4px; + font-size: 12px; + margin-left: auto; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + +const IdPopup = styled.div` + position: absolute; + top: calc(100% - 8px); + right: 0; + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-dropdown-border); + border-radius: 4px; + padding: 12px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + z-index: 1000; + min-width: 300px; + max-width: 400px; + animation: popupFadeIn 0.1s ease-out; + transform-origin: top right; + + @keyframes popupFadeIn { + from { + opacity: 0; + transform: scale(0.95); + } + to { + opacity: 1; + transform: scale(1); + } + } +`; + +const IdPopupTitle = styled.div` + font-size: 12px; + font-weight: 600; + color: var(--vscode-foreground); + margin-bottom: 12px; + display: flex; + align-items: center; + gap: 6px; +`; + +const IdRow = styled.div` + display: flex; + flex-direction: column; + gap: 6px; + margin-bottom: 12px; + + &:last-child { + margin-bottom: 0; + } +`; + +const IdLabel = styled.div` + font-size: 11px; + font-weight: 500; + color: var(--vscode-descriptionForeground); + text-transform: uppercase; + letter-spacing: 0.5px; +`; + +const IdValueContainer = styled.div` + display: flex; + align-items: center; + gap: 8px; + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 8px 10px; +`; + +const IdValue = styled.div` + font-family: var(--vscode-editor-font-family); + font-size: 12px; + color: var(--vscode-foreground); + word-break: break-all; + flex: 1; +`; + +const MetricsPills = styled.div` + display: flex; + flex-wrap: wrap; + gap: 8px; +`; + +const MetricPill = styled.div` + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + font-size: 11px; + font-weight: 500; + background-color: var(--vscode-list-hoverBackground); + color: var(--vscode-badge-foreground); + border-radius: 4px; +`; + +const SectionContent = styled.div` + display: flex; + flex-direction: column; + gap: 16px; +`; + +const InputOutputGrid = styled.div` + display: grid; + grid-template-columns: 1fr; + gap: 16px; + + @media (min-width: 800px) { + grid-template-columns: 1fr 1fr; + } +`; + +const SubSection = styled.div``; + +const SubSectionTitle = styled.h4` + margin: 0 0 8px 0; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + color: var(--vscode-descriptionForeground); + letter-spacing: 0.5px; + display: flex; + align-items: center; + gap: 6px; +`; + +const TextContent = styled.div` + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 12px; + font-family: var(--vscode-font-family); + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; + color: var(--vscode-editor-foreground); +`; + +const ErrorContent = styled.div` + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-errorForeground); + border-radius: 4px; + padding: 12px; + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; + color: var(--vscode-editor-foreground); +`; + +const ErrorHeader = styled.div` + display: flex; + align-items: center; + gap: 6px; + margin-bottom: 8px; + color: var(--vscode-errorForeground); +`; + +const Highlight = styled.mark` + background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); + color: inherit; + padding: 0 1px; + border-radius: 2px; +`; + +const NoMatchMessage = styled.div` + text-align: center; + padding: 24px; + color: var(--vscode-descriptionForeground); + font-size: 13px; +`; + +// Advanced Details styles +const AdvancedDetailsContainer = styled.div` + display: flex; + flex-direction: column; + gap: 16px; +`; + +const TechnicalIdsGrid = styled.div` + display: flex; + flex-direction: column; + gap: 6px; +`; + +const TechnicalRow = styled.div` + display: flex; + gap: 8px; + font-size: 13px; + line-height: 1.4; + + &:hover { + & > span:last-child { + opacity: 1; + } + } +`; + +const TechnicalLabel = styled.span` + color: var(--vscode-descriptionForeground); + white-space: nowrap; + flex-shrink: 0; + width: 120px; +`; + +const TechnicalValue = styled.span` + color: var(--vscode-foreground); + word-break: break-all; +`; + +const AttributesList = styled.div` + display: flex; + flex-direction: column; + gap: 6px; +`; + +const AttributeRow = styled.div` + display: flex; + gap: 8px; + font-size: 13px; + line-height: 1.4; + + &:hover { + & > span:last-child { + opacity: 1; + } + } +`; + +const AttributeKey = styled.span` + color: var(--vscode-textLink-foreground); + white-space: nowrap; + flex-shrink: 0; +`; + +const AttributeValue = styled.span` + color: var(--vscode-foreground); + word-break: break-all; +`; + +const CopyWrapper = styled.span` + opacity: 0; + transition: opacity 0.15s ease; + flex-shrink: 0; +`; + +// Helper functions +function getAttributeValue(attributes: Array<{ key: string; value: string }> | undefined, key: string): string | undefined { + return attributes?.find(a => a.key === key)?.value; +} + +function highlightText(text: string, searchQuery: string): ReactNode { + if (!searchQuery) return text; + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + const parts = text.split(regex); + return parts.map((part, i) => + regex.test(part) ? <Highlight key={i}>{part}</Highlight> : part + ); +} + +function textContainsSearch(text: string | undefined, searchQuery: string): boolean { + if (!searchQuery || !text) return true; + return text.toLowerCase().includes(searchQuery.toLowerCase()); +} + +function formatDate(isoString: string): string { + const date = new Date(isoString); + return date.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + fractionalSecondDigits: 3 + }); +} + +// Attributes to exclude from "Other Attributes" (shown elsewhere) +const EXCLUDED_ATTRIBUTE_KEYS = [ + 'gen_ai.input.messages', + 'gen_ai.output.messages', + 'gen_ai.tool.arguments', + 'gen_ai.tool.output', + 'gen_ai.system_instructions', + 'gen_ai.input.tools', + 'error.message' +]; + +// Remove common prefixes from span names +function stripSpanPrefix(spanName: string): string { + const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; + for (const prefix of prefixes) { + if (spanName.startsWith(prefix)) { + return spanName.substring(prefix.length); + } + } + return spanName; +} + +export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { + const [searchQuery, setSearchQuery] = useState(''); + const [isIdPopupOpen, setIsIdPopupOpen] = useState(false); + const popupRef = useRef<HTMLDivElement>(null); + const buttonRef = useRef<HTMLButtonElement>(null); + + // Extract operation type + const operationName = getAttributeValue(spanData.attributes, 'gen_ai.operation.name') || ''; + const spanType = useMemo(() => { + if (operationName.startsWith('invoke_agent')) return 'invoke'; + if (operationName.startsWith('chat') || spanName?.toLowerCase().startsWith('chat')) return 'chat'; + if (operationName.startsWith('execute_tool') || spanName?.toLowerCase().startsWith('execute_tool')) return 'tool'; + return 'other'; + }, [operationName, spanName]); + + // Extract metrics + const metrics = useMemo(() => { + const latencyMs = spanData.startTime && spanData.endTime + ? new Date(spanData.endTime).getTime() - new Date(spanData.startTime).getTime() + : null; + + const inputTokens = parseInt(getAttributeValue(spanData.attributes, 'gen_ai.usage.input_tokens') || '0'); + const outputTokens = parseInt(getAttributeValue(spanData.attributes, 'gen_ai.usage.output_tokens') || '0'); + const temperature = getAttributeValue(spanData.attributes, 'gen_ai.request.temperature'); + const provider = getAttributeValue(spanData.attributes, 'gen_ai.provider.name'); + const model = getAttributeValue(spanData.attributes, 'gen_ai.request.model'); + const toolDescription = getAttributeValue(spanData.attributes, 'gen_ai.tool.description'); + + return { + latency: latencyMs !== null ? (latencyMs >= 1000 ? `${(latencyMs / 1000).toFixed(2)}s` : `${latencyMs}ms`) : null, + inputTokens, + outputTokens, + totalTokens: inputTokens + outputTokens, + temperature, + provider, + model, + toolDescription + }; + }, [spanData]); + + // Extract input/output data + const inputData = useMemo(() => { + const systemInstructions = getAttributeValue(spanData.attributes, 'gen_ai.system_instructions'); + const inputMessages = getAttributeValue(spanData.attributes, 'gen_ai.input.messages'); + const toolArguments = getAttributeValue(spanData.attributes, 'gen_ai.tool.arguments'); + const inputTools = getAttributeValue(spanData.attributes, 'gen_ai.input.tools'); + + return { + systemInstructions, + messages: inputMessages || toolArguments, + messagesLabel: toolArguments ? 'Tool Arguments' : (operationName === 'invoke_agent' ? 'User' : 'Messages'), + tools: inputTools + }; + }, [spanData.attributes, operationName]); + + const outputData = useMemo(() => { + const outputMessages = getAttributeValue(spanData.attributes, 'gen_ai.output.messages'); + const toolOutput = getAttributeValue(spanData.attributes, 'gen_ai.tool.output'); + const errorMessage = getAttributeValue(spanData.attributes, 'error.message'); + + return { + messages: outputMessages || toolOutput, + messagesLabel: toolOutput ? 'Tool Output' : 'Messages', + error: errorMessage + }; + }, [spanData.attributes]); + + // Check if sections match search + const inputMatches = useMemo(() => { + if (!searchQuery) return true; + return textContainsSearch(inputData.systemInstructions, searchQuery) || + textContainsSearch(inputData.messages, searchQuery) || + textContainsSearch(inputData.tools, searchQuery); + }, [searchQuery, inputData]); + + const outputMatches = useMemo(() => { + if (!searchQuery) return true; + return textContainsSearch(outputData.messages, searchQuery) || + textContainsSearch(outputData.error, searchQuery); + }, [searchQuery, outputData]); + + const metricsMatch = useMemo(() => { + if (!searchQuery) return true; + return textContainsSearch(metrics.latency, searchQuery) || + textContainsSearch(metrics.temperature, searchQuery) || + textContainsSearch(metrics.provider, searchQuery) || + textContainsSearch(metrics.model, searchQuery) || + textContainsSearch(metrics.toolDescription, searchQuery) || + textContainsSearch(String(metrics.inputTokens), searchQuery) || + textContainsSearch(String(metrics.outputTokens), searchQuery); + }, [searchQuery, metrics]); + + // Advanced attributes (not shown in input/output) + const advancedAttributes = useMemo(() => { + return spanData.attributes?.filter(attr => !EXCLUDED_ATTRIBUTE_KEYS.includes(attr.key)) || []; + }, [spanData.attributes]); + + // Filter advanced attributes based on search + const filteredAdvancedAttributes = useMemo(() => { + if (!searchQuery) return advancedAttributes; + return advancedAttributes.filter(attr => + textContainsSearch(attr.key, searchQuery) || + textContainsSearch(attr.value, searchQuery) + ); + }, [advancedAttributes, searchQuery]); + + // Check if technical IDs match search + const technicalIdsMatch = useMemo(() => { + if (!searchQuery) return true; + return textContainsSearch(spanData.spanId, searchQuery) || + textContainsSearch(spanData.traceId, searchQuery) || + textContainsSearch(spanData.parentSpanId, searchQuery) || + textContainsSearch(spanData.startTime, searchQuery) || + textContainsSearch(spanData.endTime, searchQuery); + }, [searchQuery, spanData]); + + // Check if advanced section has any matches + const advancedMatches = useMemo(() => { + if (!searchQuery) return true; + return technicalIdsMatch || filteredAdvancedAttributes.length > 0; + }, [searchQuery, technicalIdsMatch, filteredAdvancedAttributes]); + + const hasInput = inputData.systemInstructions || inputData.messages || inputData.tools; + const hasOutput = outputData.messages || outputData.error; + const noMatches = searchQuery && !inputMatches && !outputMatches && !metricsMatch && !advancedMatches; + + // Close popup when clicking outside + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if (isIdPopupOpen && + popupRef.current && + buttonRef.current && + !popupRef.current.contains(event.target as Node) && + !buttonRef.current.contains(event.target as Node)) { + setIsIdPopupOpen(false); + } + } + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [isIdPopupOpen]); + + return ( + <Container> + {/* Span Header */} + {spanName && ( + <SpanHeader> + <SpanIcon type={spanType}> + <Icon + name={spanType === 'invoke' ? 'bi-ai-agent' : spanType === 'chat' ? 'bi-chat' : spanType === 'tool' ? 'bi-wrench' : 'bi-action'} + sx={{ + fontSize: '24px', + width: '24px', + height: '24px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "24px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </SpanIcon> + + <SpanTitle> + <span> + {spanType === 'invoke' && 'Invoke Agent - '} + {spanType === 'chat' && 'Chat - '} + {spanType === 'tool' && 'Execute Tool - '} + </span> + {stripSpanPrefix(spanName)} + </SpanTitle> + + <IdButton + ref={buttonRef} + onClick={() => setIsIdPopupOpen(!isIdPopupOpen)} + title="View technical IDs" + > + <Icon + name="bi-link" + sx={{ fontSize: "16px", width: "16px", height: "16px" }} + iconSx={{ display: "flex" }} + /> + ID + </IdButton> + + {isIdPopupOpen && ( + <IdPopup ref={popupRef}> + <IdPopupTitle> + <Icon + name="bi-link" + sx={{ fontSize: "16px", width: "16px", height: "16px" }} + iconSx={{ display: "flex" }} + /> + Technical IDs + </IdPopupTitle> + + <IdRow> + <IdLabel>Trace ID</IdLabel> + <IdValueContainer> + <IdValue>{spanData.traceId}</IdValue> + <CopyButton text={spanData.traceId} size="small" /> + </IdValueContainer> + </IdRow> + + <IdRow> + <IdLabel>Span ID</IdLabel> + <IdValueContainer> + <IdValue>{spanData.spanId}</IdValue> + <CopyButton text={spanData.spanId} size="small" /> + </IdValueContainer> + </IdRow> + + {spanData.parentSpanId && spanData.parentSpanId !== '0000000000000000' && ( + <IdRow> + <IdLabel>Parent Span ID</IdLabel> + <IdValueContainer> + <IdValue>{spanData.parentSpanId}</IdValue> + <CopyButton text={spanData.parentSpanId} size="small" /> + </IdValueContainer> + </IdRow> + )} + </IdPopup> + )} + </SpanHeader> + )} + + {/* Search Input */} + <SearchInput + value={searchQuery} + onChange={setSearchQuery} + placeholder="Search all sections..." + /> + + {/* Metrics Pills */} + {metricsMatch && ( + <MetricsPills> + {metrics.latency && ( + <MetricPill> + <Icon name="bi-clock" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + {highlightText(`Latency: ${metrics.latency}`, searchQuery)} + </MetricPill> + )} + {metrics.inputTokens > 0 && ( + <MetricPill> + {highlightText(`Input Tokens: ${metrics.inputTokens}`, searchQuery)} + </MetricPill> + )} + {metrics.outputTokens > 0 && ( + <MetricPill> + {highlightText(`Output Tokens: ${metrics.outputTokens}`, searchQuery)} + </MetricPill> + )} + {metrics.temperature && ( + <MetricPill> + <Icon name="bi-thermostat" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + {highlightText(`Temperature: ${metrics.temperature}`, searchQuery)} + </MetricPill> + )} + {metrics.provider && ( + <MetricPill> + {highlightText(`Provider: ${metrics.provider}`, searchQuery)} + </MetricPill> + )} + {metrics.model && ( + <MetricPill> + {highlightText(`Model: ${metrics.model}`, searchQuery)} + </MetricPill> + )} + {metrics.toolDescription && ( + <MetricPill> + {highlightText(`Tool Description: ${metrics.toolDescription}`, searchQuery)} + </MetricPill> + )} + </MetricsPills> + )} + + {/* No Matches Message */} + {noMatches && ( + <NoMatchMessage> + No results found for "{searchQuery}" + </NoMatchMessage> + )} + + {/* Input and Output Sections in Responsive Grid */} + {(hasInput && inputMatches) || (hasOutput && outputMatches) ? ( + <InputOutputGrid> + {/* Input Section */} + {hasInput && inputMatches && ( + <CollapsibleSection + title="Input" + icon="bi-input" + defaultOpen={true} + > + <SectionContent> + {inputData.systemInstructions && textContainsSearch(inputData.systemInstructions, searchQuery) && ( + <SubSection> + <SubSectionTitle> + System Instructions + <CopyButton text={inputData.systemInstructions} size="small" /> + </SubSectionTitle> + <TextContent> + {highlightText(inputData.systemInstructions, searchQuery)} + </TextContent> + </SubSection> + )} + {inputData.messages && textContainsSearch(inputData.messages, searchQuery) && ( + <SubSection> + <JsonViewer + value={inputData.messages} + title={inputData.messagesLabel} + searchQuery={searchQuery} + /> + </SubSection> + )} + {inputData.tools && textContainsSearch(inputData.tools, searchQuery) && ( + <SubSection> + <JsonViewer + value={inputData.tools} + title="Available Tools" + searchQuery={searchQuery} + maxAutoExpandDepth={0} + /> + </SubSection> + )} + </SectionContent> + </CollapsibleSection> + )} + + {/* Output Section */} + {hasOutput && outputMatches && ( + <CollapsibleSection + title="Output" + icon="bi-output" + defaultOpen={true} + > + <SectionContent> + {outputData.error && textContainsSearch(outputData.error, searchQuery) && ( + <SubSection> + <ErrorHeader> + <Icon name="bi-error" sx={{ fontSize: "16px", width: "16px", height: "16px" }} iconSx={{ display: "flex" }} /> + <SubSectionTitle style={{ margin: 0, color: 'var(--vscode-errorForeground)' }}> + Error + </SubSectionTitle> + <CopyButton text={outputData.error} size="small" /> + </ErrorHeader> + <ErrorContent> + {highlightText(outputData.error, searchQuery)} + </ErrorContent> + </SubSection> + )} + {outputData.messages && textContainsSearch(outputData.messages, searchQuery) && ( + <SubSection> + <JsonViewer + value={outputData.messages} + title={outputData.messagesLabel} + searchQuery={searchQuery} + /> + </SubSection> + )} + </SectionContent> + </CollapsibleSection> + )} + </InputOutputGrid> + ) : null} + + {/* Advanced Details Section */} + {advancedMatches && ( + <CollapsibleSection + title="Advanced Details" + defaultOpen={spanType === 'other' || (!hasInput && !hasOutput)} + > + <AdvancedDetailsContainer> + {/* Technical IDs */} + {technicalIdsMatch && ( + <SubSection> + <SubSectionTitle>Technical IDs</SubSectionTitle> + <TechnicalIdsGrid> + <TechnicalRow> + <TechnicalLabel>Span ID:</TechnicalLabel> + <TechnicalValue>{highlightText(spanData.spanId, searchQuery)}</TechnicalValue> + <CopyWrapper> + <CopyButton text={spanData.spanId} size="small" /> + </CopyWrapper> + </TechnicalRow> + + <TechnicalRow> + <TechnicalLabel>Trace ID:</TechnicalLabel> + <TechnicalValue>{highlightText(spanData.traceId, searchQuery)}</TechnicalValue> + <CopyWrapper> + <CopyButton text={spanData.traceId} size="small" /> + </CopyWrapper> + </TechnicalRow> + + <TechnicalRow> + <TechnicalLabel>Parent Span ID:</TechnicalLabel> + <TechnicalValue> + {spanData.parentSpanId && spanData.parentSpanId !== '0000000000000000' + ? highlightText(spanData.parentSpanId, searchQuery) + : 'Root Span'} + </TechnicalValue> + {spanData.parentSpanId && spanData.parentSpanId !== '0000000000000000' && ( + <CopyWrapper> + <CopyButton text={spanData.parentSpanId} size="small" /> + </CopyWrapper> + )} + </TechnicalRow> + + {spanData.startTime && ( + <TechnicalRow> + <TechnicalLabel>Start Time:</TechnicalLabel> + <TechnicalValue>{highlightText(formatDate(spanData.startTime), searchQuery)}</TechnicalValue> + <CopyWrapper> + <CopyButton text={formatDate(spanData.startTime)} size="small" /> + </CopyWrapper> + </TechnicalRow> + )} + + {spanData.endTime && ( + <TechnicalRow> + <TechnicalLabel>End Time:</TechnicalLabel> + <TechnicalValue>{highlightText(formatDate(spanData.endTime), searchQuery)}</TechnicalValue> + <CopyWrapper> + <CopyButton text={formatDate(spanData.endTime)} size="small" /> + </CopyWrapper> + </TechnicalRow> + )} + </TechnicalIdsGrid> + </SubSection> + )} + + {/* Other Attributes */} + {filteredAdvancedAttributes.length > 0 && ( + <SubSection> + <SubSectionTitle> + Other Attributes ({searchQuery ? `${filteredAdvancedAttributes.length} of ${advancedAttributes.length}` : advancedAttributes.length}) + </SubSectionTitle> + <AttributesList> + {filteredAdvancedAttributes.map((attr, index) => ( + <AttributeRow key={index}> + <AttributeKey>{highlightText(attr.key, searchQuery)}:</AttributeKey> + <AttributeValue>{highlightText(attr.value, searchQuery)}</AttributeValue> + <CopyWrapper> + <CopyButton text={`${attr.key}: ${attr.value}`} size="small" /> + </CopyWrapper> + </AttributeRow> + ))} + </AttributesList> + </SubSection> + )} + + {searchQuery && filteredAdvancedAttributes.length === 0 && !technicalIdsMatch && ( + <NoMatchMessage> + No attributes match your search + </NoMatchMessage> + )} + </AdvancedDetailsContainer> + </CollapsibleSection> + )} + </Container> + ); +} diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-action.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-action.svg new file mode 100644 index 00000000000..6e5c39fc614 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-action.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M5 12q0 2.65 1.725 4.625t4.35 2.325q.4.05.663.35T12 20q0 .425-.363.7t-.812.225q-3.375-.425-5.6-2.963T3 12q0-3.4 2.213-5.937T10.8 3.075q.475-.05.838.213T12 4q0 .4-.262.7t-.663.35q-2.625.35-4.35 2.325T5 12m12.175 1H10q-.425 0-.712-.288T9 12t.288-.712T10 11h7.175L15.3 9.125q-.3-.3-.3-.712t.3-.713t.7-.3t.7.3l3.6 3.6q.3.3.3.7t-.3.7l-3.6 3.6q-.3.3-.7.288t-.7-.313t-.3-.7t.3-.7z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-chat.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-chat.svg new file mode 100644 index 00000000000..9cf9e4d5a51 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-chat.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m6 18l-2.3 2.3q-.475.475-1.088.213T2 19.575V4q0-.825.588-1.412T4 2h16q.825 0 1.413.588T22 4v12q0 .825-.587 1.413T20 18zm-.85-2H20V4H4v13.125zM4 16V4zm3-2h6q.425 0 .713-.288T14 13t-.288-.712T13 12H7q-.425 0-.712.288T6 13t.288.713T7 14m0-3h10q.425 0 .713-.288T18 10t-.288-.712T17 9H7q-.425 0-.712.288T6 10t.288.713T7 11m0-3h10q.425 0 .713-.288T18 7t-.288-.712T17 6H7q-.425 0-.712.288T6 7t.288.713T7 8" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-check.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-check.svg new file mode 100644 index 00000000000..5b7b6c275f4 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-check.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m9.55 15.15l8.475-8.475q.3-.3.7-.3t.7.3t.3.713t-.3.712l-9.175 9.2q-.3.3-.7.3t-.7-.3L4.55 13q-.3-.3-.288-.712t.313-.713t.713-.3t.712.3z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-clock.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-clock.svg new file mode 100644 index 00000000000..d58f543a1a9 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-clock.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m13 12.175l2.25 2.25q.275.275.275.688t-.275.712q-.3.3-.712.3t-.713-.3L11.3 13.3q-.15-.15-.225-.337T11 12.575V9q0-.425.288-.712T12 8t.713.288T13 9zM12 6q-.425 0-.712-.288T11 5V4h2v1q0 .425-.288.713T12 6m6 6q0-.425.288-.712T19 11h1v2h-1q-.425 0-.712-.288T18 12m-6 6q.425 0 .713.288T13 19v1h-2v-1q0-.425.288-.712T12 18m-6-6q0 .425-.288.713T5 13H4v-2h1q.425 0 .713.288T6 12m6 10q-2.075 0-3.9-.788t-3.175-2.137T2.788 15.9T2 12t.788-3.9t2.137-3.175T8.1 2.788T12 2t3.9.788t3.175 2.137T21.213 8.1T22 12t-.788 3.9t-2.137 3.175t-3.175 2.138T12 22m8-10q0-3.35-2.325-5.675T12 4T6.325 6.325T4 12t2.325 5.675T12 20t5.675-2.325T20 12m-8 0" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse.svg new file mode 100644 index 00000000000..94ee71f9ff5 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m12 17.4l-3.9 3.9q-.275.275-.7.275t-.7-.275t-.275-.7t.275-.7l3.875-3.875q.575-.575 1.425-.575t1.425.575L17.3 19.9q.275.275.275.7t-.275.7t-.7.275t-.7-.275zm0-10.8l3.9-3.9q.275-.275.7-.275t.7.275t.275.7t-.275.7l-3.875 3.875Q12.85 8.55 12 8.55t-1.425-.575L6.7 4.1q-.275-.275-.275-.7t.275-.7t.7-.275t.7.275z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-copy.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-copy.svg new file mode 100644 index 00000000000..c48187d6484 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-copy.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M9 18q-.825 0-1.412-.587T7 16V4q0-.825.588-1.412T9 2h9q.825 0 1.413.588T20 4v12q0 .825-.587 1.413T18 18zm0-2h9V4H9zm-4 6q-.825 0-1.412-.587T3 20V7q0-.425.288-.712T4 6t.713.288T5 7v13h10q.425 0 .713.288T16 21t-.288.713T15 22zm4-6V4z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-output.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-output.svg new file mode 100644 index 00000000000..4400eeb1737 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-output.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m13 18.175l1.9-1.875q.275-.275.7-.275t.7.275t.275.7t-.275.7l-3.6 3.6q-.275.275-.7.275t-.7-.275l-3.6-3.6q-.275-.275-.275-.7t.275-.7t.7-.275t.7.275l1.9 1.875V9q0-.425.288-.712T12 8t.713.288T13 9zM12 4Q8.65 4 6.325 6.325T4 12q0 .825.162 1.625t.488 1.55q.175.425.112.85t-.387.75q-.3.3-.737.138t-.663-.638Q2.5 15.25 2.25 14.188T2 12q0-2.075.788-3.9t2.137-3.175T8.1 2.788T12 2t3.9.788t3.175 2.137T21.213 8.1T22 12q0 1.125-.238 2.213t-.737 2.112q-.225.45-.662.6t-.738-.15t-.387-.725t.087-.825q.35-.775.513-1.587T20 12q0-3.35-2.325-5.675T12 4" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-thermostat.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-thermostat.svg new file mode 100644 index 00000000000..1ba48f5955e --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-thermostat.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M12 22q-2.075 0-3.537-1.463T7 17q0-1.2.525-2.238T9 13V5q0-1.25.875-2.125T12 2t2.125.875T15 5v8q.95.725 1.475 1.763T17 17q0 2.075-1.463 3.538T12 22m-1-11h2v-1h-1V9h1V7h-1V6h1V5q0-.425-.288-.712T12 4t-.712.288T11 5z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-wrench.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-wrench.svg new file mode 100644 index 00000000000..bdf3b73c3f5 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-wrench.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 32 32"> + <path fill="currentColor" d="M21 3a1 1 0 0 0-.928.629l-1 2.5a1 1 0 0 0 0 .742L20 9.193V16h-1a1 1 0 0 0-1 1v6.5a5.5 5.5 0 1 0 11 0V17a1 1 0 0 0-1-1h-1V9.193l.928-2.322a1 1 0 0 0 0-.742l-1-2.5A1 1 0 0 0 26 3zm4 13h-3V9a1 1 0 0 0-.072-.371l-.85-2.129l.6-1.5h3.646l.6 1.5l-.851 2.129A1 1 0 0 0 25 9zm-5 2h7v2h-7zM8.577 3.525A1 1 0 0 1 9 4.341V9a1 1 0 0 0 2 0V4.341a1 1 0 0 1 1.333-.942A7.002 7.002 0 0 1 13 16.326V26a3 3 0 1 1-6 0v-9.674a7.002 7.002 0 0 1 .667-12.928a1 1 0 0 1 .91.127M7 5.999a5.003 5.003 0 0 0 1.333 8.716A1 1 0 0 1 9 15.66V26a1 1 0 1 0 2 0V15.659a1 1 0 0 1 .667-.943A5.003 5.003 0 0 0 13 5.999V9a3 3 0 1 1-6 0zM20 22h7v1.5a3.5 3.5 0 1 1-7 0z" stroke-width="1" stroke="currentColor" /> +</svg> \ No newline at end of file From 76c5f17ccf5f02a6c4de3852d5febe93d33e0c7f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 16 Jan 2026 13:10:33 +0530 Subject: [PATCH 095/247] Add timeline view for chat agent logs --- .../trace-visualizer/src/TraceDetails.tsx | 249 +++++-- .../src/components/WaterfallView.tsx | 679 ++++++++++++++++++ .../src/icons/bi-list-tree.svg | 3 + .../src/icons/bi-timeline.svg | 3 + 4 files changed, 859 insertions(+), 75 deletions(-) create mode 100644 workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-list-tree.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-timeline.svg diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 0579aa8089f..0de8f70a2f8 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -21,6 +21,7 @@ import styled from "@emotion/styled"; import { TraceData, SpanData } from "./index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; import { SpanInputOutput } from "./components/SpanInputOutput"; +import { WaterfallView } from "./components/WaterfallView"; interface TraceDetailsProps { traceData: TraceData; @@ -156,6 +157,39 @@ const ModeToggleButton = styled.button` } `; +const ViewModeToggle = styled.div` + display: flex; + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + overflow: hidden; +`; + +const ViewModeButton = styled.button<{ isActive: boolean }>` + display: flex; + align-items: center; + justify-content: center; + padding: 4px 8px; + background: ${(props: { isActive: boolean }) => props.isActive + ? 'var(--vscode-button-background)' + : 'transparent'}; + color: ${(props: { isActive: boolean }) => props.isActive + ? 'var(--vscode-button-foreground)' + : 'var(--vscode-foreground)'}; + border: none; + cursor: pointer; + transition: background-color 0.15s ease; + + &:hover { + background: ${(props: { isActive: boolean }) => props.isActive + ? 'var(--vscode-button-hoverBackground)' + : 'var(--vscode-list-hoverBackground)'}; + } + + &:first-of-type { + border-right: 1px solid var(--vscode-panel-border); + } +`; + // Agent Chat Logs Styles const AgentChatLogsContainer = styled.div` display: flex; @@ -248,6 +282,10 @@ const AISpanBadge = styled.span<{ type: string }>` const AISpanLabel = styled.span` flex: 1; font-size: 13px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 6px; `; const AISpanDuration = styled.span` @@ -349,7 +387,7 @@ const AdvancedSpanKind = styled.span` font-size: 10px; padding: 2px 6px; border-radius: 3px; - background-color: var(--vscode-badge-background); + background-color: var(--vscode-list-hoverBackground); color: var(--vscode-badge-foreground); flex-shrink: 0; `; @@ -429,28 +467,28 @@ const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null const timeContainsSpan = (parentSpan: SpanData, childSpan: SpanData): boolean => { const parentRange = getSpanTimeRange(parentSpan); const childRange = getSpanTimeRange(childSpan); - + if (!parentRange || !childRange) return false; - + // Parent contains child if it starts before/at and ends after/at, but they're not identical - return parentRange.start <= childRange.start && - parentRange.end >= childRange.end && - (parentRange.start < childRange.start || parentRange.end > childRange.end); + return parentRange.start <= childRange.start && + parentRange.end >= childRange.end && + (parentRange.start < childRange.start || parentRange.end > childRange.end); }; const sortSpansByUmbrellaFirst = (spans: SpanData[]): SpanData[] => { return [...spans].sort((a, b) => { const aRange = getSpanTimeRange(a); const bRange = getSpanTimeRange(b); - + if (!aRange || !bRange) return 0; - + const aContainsB = timeContainsSpan(a, b); const bContainsA = timeContainsSpan(b, a); - + if (aContainsB) return -1; // a comes first (umbrella) if (bContainsA) return 1; // b comes first (umbrella) - + // Neither contains the other, sort by start time return aRange.start - bRange.start; }); @@ -538,6 +576,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const [selectedSpanId, setSelectedSpanId] = useState<string | null>(null); const [showFullTrace, setShowFullTrace] = useState<boolean>(false); const [isAdvancedMode, setIsAdvancedMode] = useState<boolean>(false); + const [viewMode, setViewMode] = useState<'tree' | 'timeline'>('tree'); const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); const [containerWidth, setContainerWidth] = useState<number>(window.innerWidth); const [aiSpanTreeDimensions, setAISpanTreeDimensions] = useState({ height: 180, maxHeight: 600, minHeight: 50 }); @@ -778,7 +817,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const aiSpans = traceData.spans.filter(span => span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') ); - + const aiCount = aiSpans.length; const nonAiCount = 0; @@ -1142,28 +1181,30 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { {badgeType === 'other' && 'Operation'} </span> </AISpanBadge> - <AISpanLabel>{stripSpanPrefix(span.name)}</AISpanLabel> - {spanHasError(span) && ( - <AISpanErrorIcon> - <Icon - name="bi-error" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </AISpanErrorIcon> - )} + <AISpanLabel> + {stripSpanPrefix(span.name)} + {spanHasError(span) && ( + <AISpanErrorIcon> + <Icon + name="bi-error" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </AISpanErrorIcon> + )} + </AISpanLabel> </div> <AISpanMetadataGroup> {!isNarrow && ( @@ -1263,28 +1304,31 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { onClick={() => setSelectedSpanId(span.spanId)} > <AIBadge type={badgeType} /> - <AISpanLabel>{stripSpanPrefix(span.name)}</AISpanLabel> - {spanHasError(span) && ( - <AISpanErrorIcon> - <Icon - name="bi-error" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </AISpanErrorIcon> - )} + <AISpanLabel> + {stripSpanPrefix(span.name)} + {spanHasError(span) && ( + <AISpanErrorIcon> + <Icon + name="bi-error" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </AISpanErrorIcon> + )} + </AISpanLabel> + <AISpanMetadataGroup> {!isNarrow && ( <AISpanStartTime> @@ -1306,29 +1350,29 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { </AISpanDuration> </AISpanMetadataGroup> </AISpanTreeItem> - + {/* Render advanced mode spans if enabled */} {isAdvancedMode && groupedNonAISpans.size > 0 && ( <AdvancedSpanGroup level={level}> {Array.from(groupedNonAISpans.entries()).map(([category, spans]) => { const categoryKey = `${groupKey}-${category}`; const isExpanded = expandedAdvancedSpanGroups.has(categoryKey); - + // Find root spans in this category (spans without parent in the list) const spanIdsInCategory = new Set(spans.map((s: SpanData) => s.spanId)); - const rootSpansInCategory = spans.filter((s: SpanData) => - !s.parentSpanId || - s.parentSpanId === '0000000000000000' || + const rootSpansInCategory = spans.filter((s: SpanData) => + !s.parentSpanId || + s.parentSpanId === '0000000000000000' || !spanIdsInCategory.has(s.parentSpanId) ); - + // Sort root spans by start time rootSpansInCategory.sort((a: SpanData, b: SpanData) => { const aStart = a.startTime ? new Date(a.startTime).getTime() : 0; const bStart = b.startTime ? new Date(b.startTime).getTime() : 0; return aStart - bStart; }); - + return ( <div key={categoryKey}> <AdvancedSpanGroupHeader @@ -1348,7 +1392,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { </AdvancedSpanGroupHeader> {isExpanded && ( <AdvancedSpanGroupContent> - {rootSpansInCategory.map((rootSpan: SpanData) => + {rootSpansInCategory.map((rootSpan: SpanData) => renderNonAISpanTreeItem(rootSpan, spans, 0) )} </AdvancedSpanGroupContent> @@ -1358,7 +1402,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { })} </AdvancedSpanGroup> )} - + {/* Render AI children */} {children.length > 0 && ( <> @@ -1373,7 +1417,50 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const renderAgentChatLogs = () => ( <> <NavigationBar> - <div /> + <ViewModeToggle> + <ViewModeButton + isActive={viewMode === 'tree'} + onClick={() => setViewMode('tree')} + title="Tree View" + > + <Icon name="bi-list-tree" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} /> + </ViewModeButton> + <ViewModeButton + isActive={viewMode === 'timeline'} + onClick={() => setViewMode('timeline')} + title="Timeline View" + > + <Icon name="bi-timeline" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} /> + </ViewModeButton> + </ViewModeToggle> <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> {isAdvancedMode ? 'Simplified View' : 'Advanced View'} @@ -1472,16 +1559,28 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { </EmptyState> ) : ( <AgentChatLogsContainer> - <AISpanTreeContainer - height={aiSpanTreeDimensions.height} - maxHeight={aiSpanTreeDimensions.maxHeight} - minHeight={aiSpanTreeDimensions.minHeight} - > - {isAdvancedMode - ? sortedRootSpans.map(span => renderMixedSpanTreeItem(span, 0)) - : rootAISpans.map(span => renderAISpanTreeItem(span, 0)) - } - </AISpanTreeContainer> + {viewMode === 'tree' ? ( + <AISpanTreeContainer + height={aiSpanTreeDimensions.height} + maxHeight={aiSpanTreeDimensions.maxHeight} + minHeight={aiSpanTreeDimensions.minHeight} + > + {isAdvancedMode + ? sortedRootSpans.map(span => renderMixedSpanTreeItem(span, 0)) + : rootAISpans.map(span => renderAISpanTreeItem(span, 0)) + } + </AISpanTreeContainer> + ) : ( + <WaterfallView + spans={isAdvancedMode ? traceData.spans : rootAISpans} + selectedSpanId={selectedSpanId} + onSpanSelect={selectSpan} + isAdvancedMode={isAdvancedMode} + getChildSpans={isAdvancedMode ? getChildSpans : getAIChildSpans} + traceStartTime={traceData.firstSeen} + traceDuration={duration} + /> + )} {selectedSpan && ( <DetailsPanel> <SpanInputOutput diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx new file mode 100644 index 00000000000..a8afa820dcc --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -0,0 +1,679 @@ +/** + * 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, useMemo } from 'react'; +import styled from '@emotion/styled'; +import { SpanData } from '../index'; +import { Codicon, Icon } from '@wso2/ui-toolkit'; + +interface WaterfallViewProps { + spans: SpanData[]; + selectedSpanId: string | null; + onSpanSelect: (spanId: string) => void; + isAdvancedMode: boolean; + getChildSpans: (spanId: string) => SpanData[]; + traceStartTime: string; + traceDuration: number; +} + +interface FlatSpan extends SpanData { + level: number; + startOffsetMs: number; + durationMs: number; +} + +// Styled Components +const WaterfallContainer = styled.div` + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + overflow: hidden; +`; + +const ZoomControlsBar = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + border-bottom: 1px solid var(--vscode-panel-border); + background-color: var(--vscode-editorWidget-background); +`; + +const ZoomControlsLabel = styled.span` + font-size: 13px; + font-weight: 500; + color: var(--vscode-foreground); +`; + +const ZoomControlsGroup = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const ZoomButton = styled.button` + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + background: var(--vscode-button-secondaryBackground); + border: 1px solid var(--vscode-panel-border); + border-radius: 3px; + cursor: pointer; + color: var(--vscode-foreground); + + &:hover { + background: var(--vscode-button-secondaryHoverBackground); + } +`; + +const ZoomSlider = styled.input` + width: 100px; + height: 4px; + appearance: none; + background: var(--vscode-scrollbarSlider-background); + border-radius: 2px; + cursor: pointer; + outline: none; + + &::-webkit-slider-thumb { + appearance: none; + width: 12px; + height: 12px; + border-radius: 50%; + background: var(--vscode-button-background); + cursor: pointer; + } +`; + +const ZoomLabel = styled.span` + font-size: 11px; + color: var(--vscode-descriptionForeground); + min-width: 35px; +`; + +const TimelineContent = styled.div` + overflow-x: auto; + overflow-y: auto; + max-height: 400px; +`; + +const TimelineInner = styled.div<{ width: number }>` + min-width: ${(props: { width: number }) => props.width}%; +`; + +const TimeAxis = styled.div` + position: relative; + height: 28px; + width: 100%; + border-bottom: 1px solid var(--vscode-panel-border); + background-color: var(--vscode-editorWidget-background); +`; + +const TimeMarker = styled.div<{ position: number }>` + position: absolute; + left: ${(props: { position: number }) => props.position}%; + display: flex; + flex-direction: column; + align-items: center; +`; + +const TimeMarkerTick = styled.div` + width: 1px; + height: 8px; + background-color: var(--vscode-panel-border); +`; + +const TimeMarkerLabel = styled.span` + font-size: 11px; + color: var(--vscode-descriptionForeground); + margin-top: 2px; +`; + +const SpansContainer = styled.div` + position: relative; + width: 100%; +`; + +const SpanRow = styled.div<{ isSelected: boolean; level: number }>` + position: relative; + height: 36px; + width: 100%; + border-bottom: 1px solid var(--vscode-panel-border); + padding-left: ${(props: { isSelected: boolean; level: number }) => props.level * 20}px; + background-color: ${(props: { isSelected: boolean; level: number }) => props.isSelected + ? 'var(--vscode-list-inactiveSelectionBackground)' + : 'transparent'}; + + &:hover { + background-color: ${(props: { isSelected: boolean; level: number }) => props.isSelected + ? 'var(--vscode-list-inactiveSelectionBackground)' + : 'var(--vscode-list-hoverBackground)'}; + } +`; + +const GridLine = styled.div<{ position: number }>` + position: absolute; + left: ${(props: { position: number }) => props.position}%; + top: 0; + bottom: 0; + width: 1px; + background-color: var(--vscode-panel-border); + opacity: 0.3; + pointer-events: none; +`; + +interface SpanBarProps { + type: string; + left: number; + width: number; + isSelected: boolean; +} + +interface SpanBarIconProps { + type: string; +} + +const SpanBar = styled.div<SpanBarProps>` + position: absolute; + top: 6px; + height: 24px; + left: ${(props: SpanBarProps) => props.left}%; + width: ${(props: SpanBarProps) => props.width}%; + min-width: 2px; + border-radius: 3px; + cursor: pointer; + display: flex; + align-items: center; + padding: 0 8px; + gap: 6px; + overflow: hidden; + transition: box-shadow 0.15s ease; + + background-color: ${(props: SpanBarProps) => { + switch (props.type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-charts-yellow)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-background)'; + } + }}; + + &:before { + content: ""; + position: absolute; + inset: 0; + background-color: ${(props: SpanBarIconProps) => { + switch (props.type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-background)'; + } + }}; + opacity: 0.1; + border-radius: inherit; + z-index: -1; + } +`; + +const SpanBarIcon = styled.span` + display: flex; + align-items: center; + flex-shrink: 0; + opacity: 0.9; +`; + +const SpanBarLabel = styled.span` + font-size: 12px; + color: var(--vscode-editor-background); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; + font-weight: 500; +`; + +const SpanBarDuration = styled.span` + font-size: 11px; + color: var(--vscode-editor-background); + opacity: 0.85; + flex-shrink: 0; + margin-left: auto; +`; + +const Tooltip = styled.div<{ x: number; y: number }>` + position: fixed; + left: ${(props: { x: number; y: number }) => props.x}px; + top: ${(props: { x: number; y: number }) => props.y}px; + background-color: var(--vscode-editorHoverWidget-background); + border: 1px solid var(--vscode-editorHoverWidget-border); + border-radius: 4px; + padding: 8px 12px; + z-index: 1000; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + max-width: 300px; + pointer-events: none; +`; + +const TooltipHeader = styled.div` + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; +`; + +const TooltipBadge = styled.span<{ type: string }>` + font-size: 10px; + padding: 2px 6px; + border-radius: 3px; + font-weight: 500; + background-color: ${(props: { type: string }) => { + switch (props.type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-charts-yellow)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-background)'; + } + }}; + color: var(--vscode-editor-background); +`; + +const TooltipName = styled.span` + font-size: 13px; + font-weight: 500; + color: var(--vscode-foreground); +`; + +const TooltipDetails = styled.div` + display: flex; + flex-direction: column; + gap: 4px; +`; + +const TooltipRow = styled.div` + font-size: 12px; + color: var(--vscode-descriptionForeground); + display: flex; + align-items: center; + gap: 4px; + + span.value { + color: var(--vscode-foreground); + font-weight: 500; + } +`; + +// Helper functions +const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { + if (!span.startTime || !span.endTime) return null; + return { + start: new Date(span.startTime).getTime(), + end: new Date(span.endTime).getTime() + }; +}; + +const formatDuration = (durationMs: number): string => { + return durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`; +}; + +const getSpanType = (span: SpanData): 'invoke' | 'chat' | 'tool' | 'other' => { + const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; + if (operationName.includes('invoke')) return 'invoke'; + if (operationName.includes('chat') || span.name.toLowerCase().includes('chat')) return 'chat'; + if (operationName.includes('tool') || span.name.toLowerCase().includes('tool')) return 'tool'; + return 'other'; +}; + +const getTypeLabel = (type: string): string => { + switch (type) { + case 'invoke': return 'Agent'; + case 'chat': return 'Model'; + case 'tool': return 'Tool'; + default: return 'Operation'; + } +}; + +const getTypeIcon = (type: string): string => { + switch (type) { + case 'invoke': return 'bi-ai-agent'; + case 'chat': return 'bi-chat'; + case 'tool': return 'bi-wrench'; + default: return 'bi-wrench'; + } +}; + +const stripSpanPrefix = (spanName: string): string => { + const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; + for (const prefix of prefixes) { + if (spanName.startsWith(prefix)) { + return spanName.substring(prefix.length); + } + } + return spanName; +}; + +const getSpanTokens = (span: SpanData): number => { + const inputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); + const outputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); + return inputTokens + outputTokens; +}; + +export function WaterfallView({ + spans, + selectedSpanId, + onSpanSelect, + getChildSpans, + traceStartTime, + traceDuration +}: WaterfallViewProps) { + const [zoom, setZoom] = useState(0.8); + const [hoveredSpan, setHoveredSpan] = useState<{ span: FlatSpan; x: number; y: number } | null>(null); + + const traceStartMs = useMemo(() => new Date(traceStartTime).getTime(), [traceStartTime]); + + // Calculate the actual earliest start time from all spans + const actualTraceStartMs = useMemo(() => { + if (spans.length === 0) return traceStartMs; + + let earliestStart = Infinity; + + const findEarliestStart = (span: SpanData) => { + const range = getSpanTimeRange(span); + if (range) { + earliestStart = Math.min(earliestStart, range.start); + } + const children = getChildSpans(span.spanId); + children.forEach(findEarliestStart); + }; + + // Find root spans + const spanIds = new Set(spans.map(s => s.spanId)); + const roots = spans.filter(span => + !span.parentSpanId || + span.parentSpanId === '0000000000000000' || + !spanIds.has(span.parentSpanId) + ); + + roots.forEach(findEarliestStart); + + const calculatedStart = earliestStart !== Infinity ? earliestStart : traceStartMs; + console.log(`[WaterfallView] traceStartTime prop: ${traceStartTime} (${traceStartMs})`); + console.log(`[WaterfallView] calculated earliest start: ${calculatedStart}, difference: ${traceStartMs - calculatedStart}ms`); + + return calculatedStart; + }, [spans, traceStartMs, traceStartTime, getChildSpans]); + + // Calculate actual duration based on spans to ensure all spans are visible + const actualTraceDuration = useMemo(() => { + if (spans.length === 0) return traceDuration; + + let maxEndOffset = 0; + + // Recursively process all spans including children + const processSpan = (span: SpanData) => { + const range = getSpanTimeRange(span); + if (range) { + const endOffset = range.end - actualTraceStartMs; + console.log(`[WaterfallView] Span: ${span.name}`); + console.log(` - startTime: ${span.startTime} (${range.start})`); + console.log(` - endTime: ${span.endTime} (${range.end})`); + console.log(` - actualTraceStartMs: ${actualTraceStartMs}`); + console.log(` - endOffset: ${endOffset}ms`); + maxEndOffset = Math.max(maxEndOffset, endOffset); + } + const children = getChildSpans(span.spanId); + children.forEach(processSpan); + }; + + // Find root spans and process their hierarchies + const spanIds = new Set(spans.map(s => s.spanId)); + const roots = spans.filter(span => + !span.parentSpanId || + span.parentSpanId === '0000000000000000' || + !spanIds.has(span.parentSpanId) + ); + roots.forEach(processSpan); + + const finalDuration = Math.max(maxEndOffset, traceDuration); + console.log(`[WaterfallView] maxEndOffset: ${maxEndOffset}ms, traceDuration: ${traceDuration}ms, finalDuration: ${finalDuration}ms`); + + // Use the maximum of the calculated duration and the provided traceDuration + return finalDuration; + }, [spans, actualTraceStartMs, traceDuration, getChildSpans]); + + // Find root spans (no parent or parent not in our span list) + const rootSpans = useMemo(() => { + const spanIds = new Set(spans.map(s => s.spanId)); + return spans.filter(span => + !span.parentSpanId || + span.parentSpanId === '0000000000000000' || + !spanIds.has(span.parentSpanId) + ).sort((a, b) => { + const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; + const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; + return aTime - bTime; + }); + }, [spans]); + + // Flatten span hierarchy for rendering + const flatSpans = useMemo(() => { + const result: FlatSpan[] = []; + + const processSpan = (span: SpanData, level: number) => { + const range = getSpanTimeRange(span); + const startOffsetMs = range ? Math.max(0, range.start - actualTraceStartMs) : 0; + const durationMs = range ? range.end - range.start : 0; + + result.push({ + ...span, + level, + startOffsetMs, + durationMs + }); + + const children = getChildSpans(span.spanId); + children.forEach(child => processSpan(child, level + 1)); + }; + + rootSpans.forEach(span => processSpan(span, 0)); + return result; + }, [rootSpans, getChildSpans, actualTraceStartMs]); + + // Calculate time markers based on total duration + const timeMarkers = useMemo(() => { + const markers: number[] = []; + if (actualTraceDuration <= 0) return markers; + + // Dynamic interval calculation for better scaling + const intervalMs = actualTraceDuration <= 1000 ? 200 : + actualTraceDuration <= 2000 ? 500 : + actualTraceDuration <= 5000 ? 1000 : + actualTraceDuration <= 10000 ? 2000 : + actualTraceDuration <= 30000 ? 5000 : + actualTraceDuration <= 60000 ? 10000 : 15000; + + console.log(`[WaterfallView] actualTraceDuration: ${actualTraceDuration}ms, intervalMs: ${intervalMs}ms`); + + for (let t = 0; t <= actualTraceDuration; t += intervalMs) { + markers.push(t); + } + + // Ensure we have a marker at or very close to the end + const lastMarker = markers[markers.length - 1]; + if (lastMarker < actualTraceDuration && actualTraceDuration - lastMarker > intervalMs * 0.1) { + markers.push(actualTraceDuration); + } + + console.log(`[WaterfallView] Generated ${markers.length} time markers:`, markers); + + return markers; + }, [actualTraceDuration]); + + const formatTimeMarker = (ms: number): string => { + return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(ms % 1000 === 0 ? 0 : 1)}s`; + }; + + const handleSpanMouseEnter = (span: FlatSpan, event: React.MouseEvent) => { + const rect = event.currentTarget.getBoundingClientRect(); + setHoveredSpan({ + span, + x: rect.left + rect.width / 2, + y: rect.top - 10 + }); + }; + + const handleSpanMouseLeave = () => { + setHoveredSpan(null); + }; + + const timelineWidth = 100 * zoom; + + return ( + <WaterfallContainer> + {/* Zoom Controls */} + <ZoomControlsBar> + <ZoomControlsLabel>Timeline</ZoomControlsLabel> + <ZoomControlsGroup> + <ZoomButton + onClick={() => setZoom(Math.max(0.5, zoom - 0.25))} + title="Zoom out" + > + <Codicon name="zoom-out" /> + </ZoomButton> + <ZoomSlider + type="range" + min="0.2" + max="1" + step="0.1" + value={zoom} + onChange={(e) => setZoom(parseFloat(e.target.value))} + /> + <ZoomLabel>{Math.round(zoom * 100)}%</ZoomLabel> + <ZoomButton + onClick={() => setZoom(Math.min(3, zoom + 0.25))} + title="Zoom in" + > + <Codicon name="zoom-in" /> + </ZoomButton> + </ZoomControlsGroup> + </ZoomControlsBar> + + {/* Timeline Content */} + <TimelineContent> + <TimelineInner width={timelineWidth}> + {/* Time Axis */} + <TimeAxis> + {timeMarkers.map((ms) => ( + <TimeMarker key={ms} position={(ms / actualTraceDuration) * 100}> + <TimeMarkerTick /> + <TimeMarkerLabel>{formatTimeMarker(ms)}</TimeMarkerLabel> + </TimeMarker> + ))} + </TimeAxis> + + {/* Spans */} + <SpansContainer> + {flatSpans.map((span) => { + // Calculate percentages relative to the trace duration + const leftPercent = actualTraceDuration > 0 + ? (span.startOffsetMs / actualTraceDuration) * 100 + : 0; + const widthPercent = actualTraceDuration > 0 + ? Math.max(0.1, (span.durationMs / actualTraceDuration) * 100) + : 0; + const spanType = getSpanType(span); + const isSelected = selectedSpanId === span.spanId; + + return ( + <SpanRow key={span.spanId} isSelected={isSelected} level={span.level}> + {/* Grid lines */} + {timeMarkers.map((ms) => ( + <GridLine + key={ms} + position={(ms / actualTraceDuration) * 100} + /> + ))} + + {/* Span bar */} + <SpanBar + type={spanType} + left={leftPercent} + width={widthPercent} + isSelected={isSelected} + onClick={() => onSpanSelect(span.spanId)} + onMouseEnter={(e) => handleSpanMouseEnter(span, e)} + onMouseLeave={handleSpanMouseLeave} + > + <SpanBarIcon> + <Icon + name={getTypeIcon(spanType)} + sx={{ + fontSize: '14px', + width: '14px', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + color: 'var(--vscode-editor-background)' + }} + iconSx={{ + fontSize: '14px', + display: 'flex', + color: 'var(--vscode-editor-background)' + }} + /> + </SpanBarIcon> + <SpanBarLabel>{stripSpanPrefix(span.name)}</SpanBarLabel> + <SpanBarDuration>{formatDuration(span.durationMs)}</SpanBarDuration> + </SpanBar> + </SpanRow> + ); + })} + </SpansContainer> + </TimelineInner> + </TimelineContent> + + {/* Tooltip */} + {hoveredSpan && ( + <Tooltip x={hoveredSpan.x} y={hoveredSpan.y - 80}> + <TooltipHeader> + <TooltipBadge type={getSpanType(hoveredSpan.span)}> + {getTypeLabel(getSpanType(hoveredSpan.span))} + </TooltipBadge> + <TooltipName>{stripSpanPrefix(hoveredSpan.span.name)}</TooltipName> + </TooltipHeader> + <TooltipDetails> + <TooltipRow> + Duration: <span className="value">{formatDuration(hoveredSpan.span.durationMs)}</span> + </TooltipRow> + {getSpanTokens(hoveredSpan.span) > 0 && ( + <TooltipRow> + Tokens: <span className="value">{getSpanTokens(hoveredSpan.span).toLocaleString()}</span> + </TooltipRow> + )} + <TooltipRow> + Offset: <span className="value">{formatDuration(hoveredSpan.span.startOffsetMs)}</span> + </TooltipRow> + </TooltipDetails> + </Tooltip> + )} + </WaterfallContainer> + ); +} diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-list-tree.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-list-tree.svg new file mode 100644 index 00000000000..5a8a8845172 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-list-tree.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M15 19v-1h-2q-.825 0-1.412-.587T11 16V8H9v1q0 .825-.587 1.413T7 11H4q-.825 0-1.412-.587T2 9V5q0-.825.588-1.412T4 3h3q.825 0 1.413.588T9 5v1h6V5q0-.825.588-1.412T17 3h3q.825 0 1.413.588T22 5v4q0 .825-.587 1.413T20 11h-3q-.825 0-1.412-.587T15 9V8h-2v8h2v-1q0-.825.588-1.412T17 13h3q.825 0 1.413.588T22 15v4q0 .825-.587 1.413T20 21h-3q-.825 0-1.412-.587T15 19M4 5v4zm13 10v4zm0-10v4zm0 4h3V5h-3zm0 10h3v-4h-3zM4 9h3V5H4z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-timeline.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-timeline.svg new file mode 100644 index 00000000000..b1974ee144a --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-timeline.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M7 17h4q.425 0 .713-.288T12 16t-.288-.712T11 15H7q-.425 0-.712.288T6 16t.288.713T7 17m3-4h4q.425 0 .713-.288T15 12t-.288-.712T14 11h-4q-.425 0-.712.288T9 12t.288.713T10 13m3-4h4q.425 0 .713-.288T18 8t-.288-.712T17 7h-4q-.425 0-.712.288T12 8t.288.713T13 9M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm0-2h14V5H5zM5 5v14z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file From 9a535458a09138ba3e81972574560ca555839040 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 09:27:50 +0530 Subject: [PATCH 096/247] Add support for latex in chat window interface --- common/config/rush/pnpm-lock.yaml | 160 +++++++++++++++++- .../ballerina-visualizer/package.json | 8 +- .../Components/ChatInterface.tsx | 26 ++- 3 files changed, 182 insertions(+), 12 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index cd5b75c8039..e5de3ee6993 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1182,6 +1182,9 @@ importers: highlight.js: specifier: 11.11.1 version: 11.11.1 + katex: + specifier: ^0.16.27 + version: 0.16.27 lodash: specifier: 4.17.23 version: 4.17.23 @@ -1209,12 +1212,21 @@ importers: react-syntax-highlighter: specifier: 15.6.1 version: 15.6.1(react@18.2.0) + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 rehype-raw: - specifier: 7.0.0 + specifier: ^7.0.0 version: 7.0.0 remark-breaks: - specifier: 4.0.0 + specifier: ~4.0.0 version: 4.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 vscode-uri: specifier: 3.1.0 version: 3.1.0 @@ -11044,6 +11056,9 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -16474,6 +16489,15 @@ packages: hast-to-hyperscript@9.0.1: resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + hast-util-from-parse5@6.0.1: resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} @@ -16483,6 +16507,9 @@ packages: hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} @@ -16513,6 +16540,9 @@ packages: hast-util-to-parse5@8.0.1: resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -18280,6 +18310,10 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} + katex@0.16.27: + resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + hasBin: true + keytar@7.9.0: resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} @@ -18808,6 +18842,9 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -18972,6 +19009,9 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-extension-mdx-expression@3.0.1: resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} @@ -21685,6 +21725,9 @@ packages: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-raw@6.1.0: resolution: {integrity: sha512-12j2UiiYJgZFdjnHDny77NY5BF3eW4Jsl0vtgL1DWdTzcHjPpbhumU+GtPUdivEWwQc8x9OdEuO0oxaGz7Tvyg==} @@ -21711,6 +21754,9 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + remark-mdx@1.6.22: resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} @@ -23977,6 +24023,9 @@ packages: unist-builder@2.0.3: resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-generated@1.1.6: resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} @@ -24004,6 +24053,9 @@ packages: unist-util-remove-position@2.0.1: resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-remove@2.1.0: resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} @@ -35391,7 +35443,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 @@ -37502,7 +37554,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color @@ -39526,6 +39578,8 @@ snapshots: dependencies: '@types/node': 22.15.24 + '@types/katex@0.16.8': {} + '@types/linkify-it@5.0.0': {} '@types/lodash.camelcase@4.3.0': @@ -40761,8 +40815,8 @@ snapshots: '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: @@ -40776,8 +40830,8 @@ snapshots: '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: @@ -46888,6 +46942,28 @@ snapshots: unist-util-is: 4.1.0 web-namespaces: 1.1.4 + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + hast-util-from-parse5@6.0.1: dependencies: '@types/parse5': 5.0.3 @@ -46918,6 +46994,10 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-parse-selector@2.2.5: {} hast-util-parse-selector@3.1.1: @@ -47018,6 +47098,13 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -49801,6 +49888,10 @@ snapshots: jwt-decode@4.0.0: {} + katex@0.16.27: + dependencies: + commander: 8.3.0 + keytar@7.9.0: dependencies: node-addon-api: 4.3.0 @@ -50416,6 +50507,18 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -50720,6 +50823,16 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.27 + 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-mdx-expression@3.0.1: dependencies: '@types/estree': 1.0.8 @@ -54241,6 +54354,16 @@ snapshots: dependencies: jsesc: 3.1.0 + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.8 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.27 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + rehype-raw@6.1.0: dependencies: '@types/hast': 2.3.10 @@ -54290,6 +54413,15 @@ snapshots: transitivePeerDependencies: - supports-color + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-mdx@1.6.22: dependencies: '@babel/core': 7.12.9 @@ -57397,6 +57529,11 @@ snapshots: unist-builder@2.0.3: {} + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-generated@1.1.6: {} unist-util-is@4.1.0: {} @@ -57427,6 +57564,11 @@ snapshots: dependencies: unist-util-visit: 2.0.3 + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + unist-util-remove@2.1.0: dependencies: unist-util-is: 4.1.0 @@ -58913,7 +59055,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.104.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index da33d333c83..4dccd70f7d6 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -55,8 +55,12 @@ "yup": "1.6.1", "@hookform/resolvers": "5.0.1", "highlight.js": "11.11.1", - "rehype-raw": "7.0.0", - "remark-breaks": "4.0.0" + "rehype-raw": "^7.0.0", + "remark-breaks": "~4.0.0", + "rehype-katex": "^7.0.1", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "katex": "^0.16.27" }, "devDependencies": { "@types/react": "18.2.0", diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index fcf341e0f78..aec97a04ba9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -25,6 +25,10 @@ import LoadingIndicator from "./LoadingIndicator"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Codicon, Icon, Button, ThemeColors } from "@wso2/ui-toolkit"; import ReactMarkdown from "react-markdown"; +import remarkMath from 'remark-math'; +import remarkGfm from 'remark-gfm'; +import rehypeKatex from 'rehype-katex'; +import 'katex/dist/katex.min.css'; enum ChatMessageType { MESSAGE = "message", @@ -131,6 +135,8 @@ const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading isUser ? "var(--vscode-button-background)" : "var(--vscode-tab-inactiveBackground)"}; opacity: ${({ isUser }: { isUser: boolean }) => (isUser ? "0.3" : "1")}; border-radius: inherit; + border: 1px solid ${({ isUser }: { isUser: boolean }) => + isUser ? "var(--vscode-peekView-border)" : "var(--vscode-panel-border)"};; z-index: -1; } @@ -280,6 +286,19 @@ const ClearChatWarningPopup: React.FC<ClearChatWarningPopupProps> = ({ isOpen, o ); }; +// Preprocess LaTeX delimiters to convert \(...\) and \[...\] to $...$ and $$...$$ +function preprocessLatex(text: string): string { + if (!text || typeof text !== 'string') return text; + + // Convert display math \[...\] to $$...$$ + let processed = text.replace(/\\\[(.*?)\\\]/gs, (_, math) => `$$${math}$$`); + + // Convert inline math \(...\) to $...$ + processed = processed.replace(/\\\((.*?)\\\)/gs, (_, math) => `$${math}$`); + + return processed; +} + const ChatInterface: React.FC = () => { const { rpcClient } = useRpcContext(); const [messages, setMessages] = useState<ChatMessage[]>([]); @@ -449,7 +468,12 @@ const ChatInterface: React.FC = () => { </ProfilePic> )} <MessageBubble isUser={msg.isUser} isError={msg.type === ChatMessageType.ERROR}> - <ReactMarkdown>{msg.text}</ReactMarkdown> + <ReactMarkdown + remarkPlugins={[remarkMath, remarkGfm]} + rehypePlugins={[rehypeKatex]} + > + {preprocessLatex(msg.text)} + </ReactMarkdown> </MessageBubble> {msg.isUser && ( <ProfilePic> From fa82d782642f55e7a5df0ff1c5427db5ff3101e5 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 09:28:53 +0530 Subject: [PATCH 097/247] Add button to export entire trace as JSON --- .../features/tracing/trace-details-webview.ts | 59 ++++++++++++++++++- .../trace-visualizer/src/TraceDetails.tsx | 25 ++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 4d80bdb88fd..6224bbdc0d0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -18,6 +18,7 @@ import * as vscode from 'vscode'; import * as path from 'path'; +import * as os from 'os'; import { Uri, ViewColumn, Webview } from 'vscode'; import { extension } from '../../BalExtensionContext'; import { Trace } from './trace-server'; @@ -79,7 +80,7 @@ export class TraceDetailsWebview { } this._panel.webview.onDidReceiveMessage( - (message) => { + async (message) => { switch (message.command) { case 'requestTraceData': if (this._trace) { @@ -91,6 +92,11 @@ export class TraceDetailsWebview { }); } break; + case 'exportTrace': + if (message.data) { + await this.exportTrace(message.data); + } + break; } }, null, @@ -183,6 +189,46 @@ export class TraceDetailsWebview { }; } + private async exportTrace(traceData: TraceData): Promise<void> { + try { + const fileName = `trace-${traceData.traceId}.json`; + // Default to ./traces inside the first workspace folder; fallback to home directory + const wf = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; + let defaultUri: vscode.Uri; + + if (wf) { + const tracesDirPath = path.join(wf.uri.fsPath, 'traces'); + const tracesDirUri = vscode.Uri.file(tracesDirPath); + try { + // Ensure the traces directory exists (create if missing) + await vscode.workspace.fs.createDirectory(tracesDirUri); + } catch (e) { + // Ignore errors and fall back to workspace root below + } + + defaultUri = vscode.Uri.file(path.join(tracesDirPath, fileName)); + } else { + defaultUri = vscode.Uri.file(path.join(os.homedir(), fileName)); + } + + const fileUri = await vscode.window.showSaveDialog({ + defaultUri, + filters: { + 'JSON Files': ['json'], + 'All Files': ['*'] + } + }); + + if (fileUri) { + const jsonContent = JSON.stringify(traceData, null, 2); + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + vscode.window.showInformationMessage(`Trace exported to ${fileUri.fsPath}`); + } + } catch (error) { + vscode.window.showErrorMessage(`Failed to export trace: ${error}`); + } + } + private getWebviewContent(trace: Trace, webView: Webview): string { const body = `<div class="container" id="webview-container"></div>`; const bodyCss = ``; @@ -195,6 +241,7 @@ export class TraceDetailsWebview { `; const scripts = ` const vscode = acquireVsCodeApi(); + window.vscode = vscode; // Make vscode API available globally let traceData = null; let isAgentChat = false; @@ -225,6 +272,16 @@ export class TraceDetailsWebview { } }); + // Listen for export requests from React component + window.addEventListener('exportTrace', (event) => { + if (event.detail && event.detail.traceData) { + vscode.postMessage({ + command: 'exportTrace', + data: event.detail.traceData + }); + } + }); + function loadedScript() { // Request trace data when script is loaded vscode.postMessage({ command: 'requestTraceData' }); diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 0de8f70a2f8..e8a2589075b 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -1414,6 +1414,13 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { }; // Render Agent Chat Logs view + const handleExportTrace = () => { + // Dispatch custom event to communicate with webview script + window.dispatchEvent(new CustomEvent('exportTrace', { + detail: { traceData } + })); + }; + const renderAgentChatLogs = () => ( <> <NavigationBar> @@ -1461,6 +1468,24 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { }} /> </ViewModeButton> </ViewModeToggle> + <ButtonGroup> + <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> + <Icon name="bi-download" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} /> + </ModeToggleButton> <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> {isAdvancedMode ? 'Simplified View' : 'Advanced View'} From 0a3db39bb57d2765acb2867cdaf085d78ccbcd29 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 09:29:58 +0530 Subject: [PATCH 098/247] Add support for markdown+latex formating in json viewer in logs --- .../ballerina/trace-visualizer/package.json | 8 +- .../src/components/CollapsibleSection.tsx | 4 +- .../src/components/JsonViewer.tsx | 243 +++++++++++++++++- .../src/components/SpanInputOutput.tsx | 12 +- .../{bi-collapse.svg => bi-collapse-item.svg} | 0 .../src/icons/bi-expand-item.svg | 3 + 6 files changed, 246 insertions(+), 24 deletions(-) rename workspaces/common-libs/font-wso2-vscode/src/icons/{bi-collapse.svg => bi-collapse-item.svg} (100%) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-expand-item.svg diff --git a/workspaces/ballerina/trace-visualizer/package.json b/workspaces/ballerina/trace-visualizer/package.json index f8f262d3f15..d5d95f04dc1 100644 --- a/workspaces/ballerina/trace-visualizer/package.json +++ b/workspaces/ballerina/trace-visualizer/package.json @@ -18,8 +18,13 @@ "@emotion/styled": "11.14.0", "@vscode/webview-ui-toolkit": "1.4.0", "@wso2/ui-toolkit": "workspace:*", + "katex": "^0.16.27", "react": "18.2.0", - "react-dom": "18.2.0" + "react-dom": "18.2.0", + "react-markdown": "^10.1.0", + "rehype-katex": "^7.0.1", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0" }, "devDependencies": { "@types/react": "18.2.0", @@ -47,4 +52,3 @@ "registry": "https://npm.pkg.github.com/" } } - diff --git a/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx b/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx index fc71e9085f9..f59e988880a 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx @@ -54,11 +54,11 @@ const Header = styled.button` const HeaderLeft = styled.div` display: flex; align-items: center; - gap: 8px; + gap: 6px; `; const HeaderTitle = styled.span` - font-size: 13px; + font-size: 15px; font-weight: 500; color: var(--vscode-badge-foreground); `; diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 4933f3cd0b2..effd229fe00 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -16,13 +16,18 @@ * under the License. */ -import { useState, useMemo, ReactNode } from "react"; +import { useState, useMemo, ReactNode, useEffect } from "react"; import styled from "@emotion/styled"; import { Icon } from "@wso2/ui-toolkit"; import { JsonTreeViewer, DEFAULT_AUTO_EXPAND_DEPTH } from "./JsonTreeViewer"; import { CopyButton } from "./CopyButton"; +import ReactMarkdown from 'react-markdown'; +import remarkMath from 'remark-math'; +import remarkGfm from 'remark-gfm'; +import rehypeKatex from 'rehype-katex'; +import 'katex/dist/katex.min.css'; -type ViewMode = 'formatted' | 'raw'; +type ViewMode = 'formatted' | 'raw' | 'markdown'; interface JsonViewerProps { value: string; @@ -148,6 +153,137 @@ const PlainText = styled.div` color: var(--vscode-editor-foreground); `; +const MarkdownContent = styled.div` + font-family: var(--vscode-font-family); + font-size: 13px; + line-height: 1.6; + color: var(--vscode-editor-foreground); + + h1, h2, h3, h4, h5, h6 { + margin-top: 12px; + margin-bottom: 8px; + font-weight: 600; + line-height: 1.25; + color: var(--vscode-editor-foreground); + } + + h1 { font-size: 1.3em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 0.2em; } + h2 { font-size: 1.25em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 0.2em; } + h3 { font-size: 1.15em; } + h4 { font-size: 1em; } + h5 { font-size: 0.875em; } + h6 { font-size: 0.85em; color: var(--vscode-descriptionForeground); } + + p { + margin-top: 0; + margin-bottom: 10px; + } + + code { + padding: 2px 6px; + margin: 0; + font-size: 85%; + background-color: var(--vscode-textCodeBlock-background); + border-radius: 3px; + font-family: var(--vscode-editor-font-family, monospace); + } + + pre { + padding: 12px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: var(--vscode-textCodeBlock-background); + border-radius: 3px; + margin-bottom: 10px; + + code { + padding: 0; + background-color: transparent; + } + } + + blockquote { + margin: 0 0 10px 0; + padding: 0 1em; + color: var(--vscode-descriptionForeground); + border-left: 4px solid var(--vscode-panel-border); + } + + ul, ol { + margin-top: 0; + margin-bottom: 10px; + padding-left: 2em; + } + + li { + margin-bottom: 4px; + } + + table { + border-collapse: collapse; + margin-bottom: 10px; + width: 100%; + } + + table th, + table td { + padding: 6px 13px; + border: 1px solid var(--vscode-panel-border); + } + + table tr { + background-color: var(--vscode-editor-background); + } + + table tr:nth-of-type(2n) { + background-color: var(--vscode-list-hoverBackground); + } + + table th { + font-weight: 600; + background-color: var(--vscode-list-activeSelectionBackground); + } + + a { + color: var(--vscode-textLink-foreground); + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + + hr { + height: 1px; + border: 0; + background-color: var(--vscode-panel-border); + margin: 16px 0; + } + + img { + max-width: 100%; + border-radius: 3px; + } + + /* KaTeX math styling */ + .katex { + font-size: 1.1em; + color: var(--vscode-editor-foreground); + } + + .katex-display { + margin: 1em 0; + overflow-x: auto; + overflow-y: hidden; + text-align: center; + } + + .katex .base { + color: var(--vscode-editor-foreground); + } +`; + const Highlight = styled.mark` background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); color: inherit; @@ -338,6 +474,49 @@ function syntaxHighlightJSON(json: string, searchQuery: string): ReactNode[] { return tokens; } +// Preprocess LaTeX delimiters to convert \(...\) and \[...\] to $...$ and $$...$$ +function preprocessLatex(text: string): string { + if (!text || typeof text !== 'string') return text; + + // Convert display math \[...\] to $$...$$ + let processed = text.replace(/\\\[(.*?)\\\]/gs, (_, math) => `$$${math}$$`); + + // Convert inline math \(...\) to $...$ + processed = processed.replace(/\\\((.*?)\\\)/gs, (_, math) => `$${math}$`); + + return processed; +} + +// Check if text might contain markdown syntax +function mightContainMarkdown(text: string): boolean { + if (!text || typeof text !== 'string') return false; + + // Check for common markdown patterns with more lenient matching + const markdownPatterns = [ + /^#{1,6}\s+.+/m, // Headers (# Header) + /\*\*.+?\*\*/, // Bold (**text**) + /__.+?__/, // Bold (__text__) + /\*.+?\*/, // Italic (*text*) + /_.+?_/, // Italic (_text_) + /`[^`\n]+`/, // Inline code (`code`) + /```/, // Code blocks (```) + /^\s*[-*+]\s+.+/m, // Unordered lists (- item) + /^\s*\d+\.\s+.+/m, // Ordered lists (1. item) + /\[.+?\]\(.+?\)/, // Links ([text](url)) + /^>\s*.+/m, // Blockquotes (> quote) + /\$\$.+?\$\$/s, // Block LaTeX ($$...$$) + /\$.+?\$/, // Inline LaTeX ($...$) + /\\\[.*?\\\]/s, // LaTeX display math (\[...\]) + /\\\(.*?\\\)/s, // LaTeX inline math (\(...\)) + /\\[a-zA-Z]+\{/, // LaTeX commands (\command{) + /^\|.+\|.+\|/m, // Tables (| col | col |) + /!\[.*?\]\(.+?\)/, // Images (![alt](url)) + /^\s*[-*_]{3,}\s*$/m, // Horizontal rules (--- or ***) + ]; + + return markdownPatterns.some(pattern => pattern.test(text)); +} + // Highlight text for plain text display function highlightText(text: string, searchQuery: string): ReactNode { if (!searchQuery) return text; @@ -355,11 +534,22 @@ export function JsonViewer({ maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH }: JsonViewerProps) { const isJSON = useMemo(() => isJSONString(value), [value]); + const hasMarkdown = useMemo(() => { + const result = !isJSON && mightContainMarkdown(value); + return result; + }, [value, isJSON]); + const [viewMode, setViewMode] = useState<ViewMode>('formatted'); const [collapseAll, setCollapseAll] = useState(false); const [expandAll, setExpandAll] = useState(false); const [isCollapsed, setIsCollapsed] = useState(false); + // Reset view mode when value changes (new content) + useEffect(() => { + const newViewMode = isJSON ? 'formatted' : (hasMarkdown ? 'markdown' : 'raw'); + setViewMode(newViewMode); + }, [value, isJSON, hasMarkdown]); + const parsedData = useMemo(() => { if (!isJSON) return null; try { @@ -375,20 +565,47 @@ export function JsonViewer({ return formatJSON(value); }, [value, isJSON]); - // If not JSON, just show plain text + // If not JSON, show raw text or markdown if (!isJSON) { return ( <Container> - {title && ( - <Header> - <TitleContainer> - <Title>{title}</Title> - <CopyButton text={value} size="small" /> - </TitleContainer> - </Header> - )} + <Header> + <TitleContainer> + {title && <Title>{title}</Title>} + <CopyButton text={value} size="small" /> + </TitleContainer> + {hasMarkdown && ( + <ActionButtons> + <ToggleGroup> + <ToggleButton + active={viewMode === 'markdown'} + onClick={() => setViewMode('markdown')} + > + Formatted + </ToggleButton> + <ToggleButton + active={viewMode === 'raw'} + onClick={() => setViewMode('raw')} + > + Raw + </ToggleButton> + </ToggleGroup> + </ActionButtons> + )} + </Header> <ContentWrapper> - <PlainText>{highlightText(value, searchQuery)}</PlainText> + {viewMode === 'markdown' && hasMarkdown ? ( + <MarkdownContent> + <ReactMarkdown + remarkPlugins={[remarkMath, remarkGfm]} + rehypePlugins={[rehypeKatex]} + > + {preprocessLatex(value)} + </ReactMarkdown> + </MarkdownContent> + ) : ( + <PlainText>{highlightText(value, searchQuery)}</PlainText> + )} </ContentWrapper> </Container> ); @@ -424,7 +641,7 @@ export function JsonViewer({ title={isCollapsed ? 'Expand all' : 'Collapse all'} > <Icon - name={isCollapsed ? 'bi-expand' : 'bi-collapse'} + name={isCollapsed ? 'bi-expand-item' : 'bi-collapse-item'} sx={{ fontSize: "12px", width: "12px", height: "12px" }} iconSx={{ display: "flex" }} /> diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index e12648b7f9b..7175a9c8f55 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -690,13 +690,11 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { <SectionContent> {inputData.systemInstructions && textContainsSearch(inputData.systemInstructions, searchQuery) && ( <SubSection> - <SubSectionTitle> - System Instructions - <CopyButton text={inputData.systemInstructions} size="small" /> - </SubSectionTitle> - <TextContent> - {highlightText(inputData.systemInstructions, searchQuery)} - </TextContent> + <JsonViewer + value={inputData.systemInstructions} + title="System Instructions" + searchQuery={searchQuery} + /> </SubSection> )} {inputData.messages && textContainsSearch(inputData.messages, searchQuery) && ( diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse-item.svg similarity index 100% rename from workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse.svg rename to workspaces/common-libs/font-wso2-vscode/src/icons/bi-collapse-item.svg diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-expand-item.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-expand-item.svg new file mode 100644 index 00000000000..93215cb989a --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-expand-item.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m12 19.15l3.875-3.875q.3-.3.7-.3t.7.3t.3.713t-.3.712l-3.85 3.875q-.575.575-1.425.575t-1.425-.575L6.7 16.7q-.3-.3-.288-.712t.313-.713t.713-.3t.712.3zm0-14.3L8.15 8.7q-.3.3-.7.288t-.7-.288q-.3-.3-.312-.712t.287-.713l3.85-3.85Q11.15 2.85 12 2.85t1.425.575l3.85 3.85q.3.3.288.713t-.313.712q-.3.275-.7.288t-.7-.288z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file From 76fc70b1bd9b0e0a12b5d32fbbe6e57785935530 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 10:18:41 +0530 Subject: [PATCH 099/247] Add waterfall timeline view in logs --- .../trace-visualizer/src/TraceDetails.tsx | 117 +++++++++----- .../src/components/WaterfallView.tsx | 153 ++++++++++-------- 2 files changed, 162 insertions(+), 108 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index e8a2589075b..6b727eb01d6 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -48,33 +48,6 @@ const InfoGrid = styled.div` gap: 8px 12px; `; -const InfoLabel = styled.div` - color: var(--vscode-descriptionForeground); -`; - -const InfoValue = styled.div` - word-break: break-all; - color: var(--vscode-editor-foreground); -`; - -const AttributesContainer = styled.div` - margin-top: 10px; -`; - -const AttributeItem = styled.div` - padding: 4px 0; - margin-bottom: 5px; -`; - -const AttributeKey = styled.span` - color: var(--vscode-textLink-foreground); -`; - -const AttributeValue = styled.span` - margin-left: 10px; - color: var(--vscode-editor-foreground); -`; - const TreeItem = styled.div<{ level: number; isSelected: boolean }>` display: flex; align-items: center; @@ -157,6 +130,12 @@ const ModeToggleButton = styled.button` } `; +const ButtonGroup = styled.div` + display: flex; + gap: 4px; + align-items: center; +`; + const ViewModeToggle = styled.div` display: flex; border: 1px solid var(--vscode-panel-border); @@ -269,7 +248,7 @@ const AISpanBadge = styled.span<{ type: string }>` case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - default: return 'var(--vscode-badge-background)'; + default: return 'var(--vscode-badge-foreground)'; } }}; border: 1px solid var(--vscode-dropdown-border); @@ -531,7 +510,7 @@ const AIBadge: React.FC<AIBadgeProps> = ({ type }) => { case 'invoke': return 'bi-ai-agent'; case 'chat': return 'bi-chat'; case 'tool': return 'bi-wrench'; - default: return 'bi-wrench'; + default: return 'bi-action'; } }; @@ -580,7 +559,10 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); const [containerWidth, setContainerWidth] = useState<number>(window.innerWidth); const [aiSpanTreeDimensions, setAISpanTreeDimensions] = useState({ height: 180, maxHeight: 600, minHeight: 50 }); + const [waterfallDimensions, setWaterfallDimensions] = useState({ height: 300, maxHeight: 800, minHeight: 150 }); + const [totalSpanCounts, setTotalSpanCounts] = useState({ aiCount: 0, nonAiCount: 0 }); const containerRef = React.useRef<HTMLDivElement>(null); + const hasAutoExpandedRef = React.useRef<boolean>(false); // Track container width for responsive behavior useEffect(() => { @@ -690,6 +672,31 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { } }, [sortedRootSpans.length]); + // Auto-expand first 3 levels of spans in advanced mode (only once) + useEffect(() => { + if (!isAdvancedMode || hasAutoExpandedRef.current || sortedRootSpans.length === 0) return; + + const spansToExpand = new Set<string>(); + + const expandRecursively = (spanId: string, currentLevel: number) => { + if (currentLevel >= 3) return; + + const children = getChildSpans(spanId); + if (children.length > 0) { + spansToExpand.add(spanId); + children.forEach(child => expandRecursively(child.spanId, currentLevel + 1)); + } + }; + + // Start from root spans + sortedRootSpans.forEach(rootSpan => { + expandRecursively(rootSpan.spanId, 0); + }); + + setExpandedSpans(spansToExpand); + hasAutoExpandedRef.current = true; + }, [sortedRootSpans, isAdvancedMode]); + const formatDate = (dateString: string): string => { return new Date(dateString).toLocaleString(); }; @@ -824,12 +831,20 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { return { aiCount, nonAiCount }; }; + // Calculate total span counts once when spans change (for waterfall) + useEffect(() => { + const aiSpans = traceData.spans.filter(span => isAISpan(span)); + const aiCount = aiSpans.length; + const nonAiCount = traceData.spans.length - aiCount; + setTotalSpanCounts({ aiCount, nonAiCount }); + }, [traceData.spans]); + // Calculate container dimensions based on number of items useEffect(() => { const { aiCount, nonAiCount } = countTotalVisibleItems(); const aiItemHeight = 36; // Height per AI span item - const nonAiItemHeight = 27 + 8; // Height per non-AI span item - const calculatedHeight = (aiCount * aiItemHeight) + (nonAiCount * nonAiItemHeight); + const nonAiItemHeight = 27 + 4; // Height per non-AI span item + let calculatedHeight = (aiCount * aiItemHeight) + (nonAiCount * nonAiItemHeight); // Default height: content size up to 180px (or 400px in advanced mode) const maxDefaultHeight = isAdvancedMode ? 400 : 180; @@ -840,7 +855,21 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const minHeight = Math.min(calculatedHeight, 50); setAISpanTreeDimensions({ height, maxHeight, minHeight }); - }, [traceData.spans, isAgentChat, showFullTrace, isAdvancedMode, expandedAdvancedSpanGroups, expandedSpans]); + + // Calculate waterfall height + const spanBarHeight = 30; + const waterfallSpanCount = isAdvancedMode + ? (totalSpanCounts.aiCount + totalSpanCounts.nonAiCount) + : totalSpanCounts.aiCount; + const waterfallCalculatedHeight = (waterfallSpanCount * spanBarHeight) + 70; + + // Set waterfall dimensions (simpler, fixed heights) + const maxDefaultWaterfallHeight = isAdvancedMode ? 400 : 300; + const waterfallHeight = Math.min(waterfallCalculatedHeight, maxDefaultWaterfallHeight); + const waterfallMaxHeight = waterfallCalculatedHeight; + const waterfallMinHeight = Math.min(waterfallCalculatedHeight, 150); + setWaterfallDimensions({ height: waterfallHeight, maxHeight: waterfallMaxHeight, minHeight: waterfallMinHeight }); + }, [traceData.spans, isAgentChat, showFullTrace, isAdvancedMode, expandedAdvancedSpanGroups, expandedSpans, totalSpanCounts]); // Select first AI span when in agent chat view useEffect(() => { @@ -854,9 +883,9 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { // Get span type badge const getSpanTypeBadge = (span: SpanData): string => { const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; - if (operationName.includes('invoke')) return 'invoke'; - if (operationName.includes('chat') || span.name.toLowerCase().includes('chat')) return 'chat'; - if (operationName.includes('tool') || span.name.toLowerCase().includes('tool')) return 'tool'; + if (operationName.startsWith('invoke_agent')) return 'invoke'; + if (operationName.startsWith('chat') || span.name.toLowerCase().startsWith('chat')) return 'chat'; + if (operationName.startsWith('execute_tool') || span.name.toLowerCase().startsWith('execute_tool')) return 'tool'; return 'other'; }; @@ -1158,7 +1187,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { </span> <AISpanBadge type={badgeType}> <Icon - name={badgeType === 'invoke' ? 'bi-ai-agent' : badgeType === 'chat' ? 'bi-chat' : badgeType === 'tool' ? 'bi-wrench' : 'bi-wrench'} + name={badgeType === 'invoke' ? 'bi-ai-agent' : badgeType === 'chat' ? 'bi-chat' : badgeType === 'tool' ? 'bi-wrench' : 'bi-action'} sx={{ fontSize: '16px', width: '16px', @@ -1486,14 +1515,15 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { justifyContent: 'center' }} /> </ModeToggleButton> - <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> - <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> - {isAdvancedMode ? 'Simplified View' : 'Advanced View'} - </ModeToggleButton> + <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> + <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> + {isAdvancedMode ? 'Hide Advanced Spans' : 'Show Hidden Spans'} + </ModeToggleButton> + </ButtonGroup> </NavigationBar> {/* Advanced mode: Show trace information sections */} - {isAdvancedMode && ( + {/* {isAdvancedMode && ( <> <InfoSectionContainer> <InfoSectionHeader onClick={() => toggleSection('trace')}> @@ -1568,7 +1598,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { </InfoSectionContent> </InfoSectionContainer> </> - )} + )} */} {rootAISpans.length === 0 ? ( <EmptyState> @@ -1604,6 +1634,9 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { getChildSpans={isAdvancedMode ? getChildSpans : getAIChildSpans} traceStartTime={traceData.firstSeen} traceDuration={duration} + height={waterfallDimensions.height} + maxHeight={waterfallDimensions.maxHeight} + minHeight={waterfallDimensions.minHeight} /> )} {selectedSpan && ( diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index a8afa820dcc..a793ddc2ccc 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -29,6 +29,9 @@ interface WaterfallViewProps { getChildSpans: (spanId: string) => SpanData[]; traceStartTime: string; traceDuration: number; + height: number; + maxHeight: number; + minHeight: number; } interface FlatSpan extends SpanData { @@ -108,10 +111,13 @@ const ZoomLabel = styled.span` min-width: 35px; `; -const TimelineContent = styled.div` +const TimelineContent = styled.div<{ height: number; maxHeight: number; minHeight: number }>` overflow-x: auto; overflow-y: auto; - max-height: 400px; + height: ${(props: { height: number }) => props.height}px; + max-height: ${(props: { maxHeight: number }) => props.maxHeight}px; + min-height: ${(props: { minHeight: number }) => props.minHeight}px; + resize: vertical; `; const TimelineInner = styled.div<{ width: number }>` @@ -148,15 +154,34 @@ const TimeMarkerLabel = styled.span` const SpansContainer = styled.div` position: relative; - width: 100%; + width: 100%;\n`; + +const GridLinesContainer = styled.div` + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + z-index: 0; +`; + +const GridLineVertical = styled.div<{ position: number }>` + position: absolute; + left: ${(props: { position: number }) => props.position}%; + top: 0; + bottom: 0; + width: 1px; + background-color: var(--vscode-panel-border); + opacity: 0.3; `; const SpanRow = styled.div<{ isSelected: boolean; level: number }>` position: relative; height: 36px; width: 100%; + min-width: 100%; border-bottom: 1px solid var(--vscode-panel-border); - padding-left: ${(props: { isSelected: boolean; level: number }) => props.level * 20}px; background-color: ${(props: { isSelected: boolean; level: number }) => props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; @@ -168,22 +193,16 @@ const SpanRow = styled.div<{ isSelected: boolean; level: number }>` } `; -const GridLine = styled.div<{ position: number }>` - position: absolute; - left: ${(props: { position: number }) => props.position}%; - top: 0; - bottom: 0; - width: 1px; - background-color: var(--vscode-panel-border); - opacity: 0.3; - pointer-events: none; -`; - interface SpanBarProps { type: string; left: number; width: number; isSelected: boolean; + level: number; +} + +interface SpanBarIconProps { + type: string; } interface SpanBarIconProps { @@ -194,22 +213,24 @@ const SpanBar = styled.div<SpanBarProps>` position: absolute; top: 6px; height: 24px; - left: ${(props: SpanBarProps) => props.left}%; + left: calc(${(props: SpanBarProps) => props.left}% + ${(props: SpanBarProps) => props.level * 20}px); width: ${(props: SpanBarProps) => props.width}%; - min-width: 2px; + min-width: 1px; border-radius: 3px; cursor: pointer; display: flex; align-items: center; padding: 0 8px; gap: 6px; - overflow: hidden; + overflow: visible; transition: box-shadow 0.15s ease; + z-index: 1; - background-color: ${(props: SpanBarProps) => { + border: 1px solid; + border-color: ${(props: SpanBarIconProps) => { switch (props.type) { case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-charts-yellow)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; default: return 'var(--vscode-badge-background)'; } @@ -233,26 +254,30 @@ const SpanBar = styled.div<SpanBarProps>` } `; -const SpanBarIcon = styled.span` +const SpanBarIcon = styled.span<SpanBarIconProps>` display: flex; align-items: center; flex-shrink: 0; opacity: 0.9; + color: ${(props: SpanBarIconProps) => { + switch (props.type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-background)'; + } + }}; `; const SpanBarLabel = styled.span` font-size: 12px; - color: var(--vscode-editor-background); white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; flex: 1; font-weight: 500; `; const SpanBarDuration = styled.span` font-size: 11px; - color: var(--vscode-editor-background); opacity: 0.85; flex-shrink: 0; margin-left: auto; @@ -287,7 +312,7 @@ const TooltipBadge = styled.span<{ type: string }>` background-color: ${(props: { type: string }) => { switch (props.type) { case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-charts-yellow)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; default: return 'var(--vscode-badge-background)'; } @@ -335,9 +360,9 @@ const formatDuration = (durationMs: number): string => { const getSpanType = (span: SpanData): 'invoke' | 'chat' | 'tool' | 'other' => { const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; - if (operationName.includes('invoke')) return 'invoke'; - if (operationName.includes('chat') || span.name.toLowerCase().includes('chat')) return 'chat'; - if (operationName.includes('tool') || span.name.toLowerCase().includes('tool')) return 'tool'; + if (operationName.startsWith('invoke_agent')) return 'invoke'; + if (operationName.startsWith('chat') || span.name.toLowerCase().startsWith('chat')) return 'chat'; + if (operationName.startsWith('execute_tool') || span.name.toLowerCase().startsWith('execute_tool')) return 'tool'; return 'other'; }; @@ -355,7 +380,7 @@ const getTypeIcon = (type: string): string => { case 'invoke': return 'bi-ai-agent'; case 'chat': return 'bi-chat'; case 'tool': return 'bi-wrench'; - default: return 'bi-wrench'; + default: return 'bi-action'; } }; @@ -381,7 +406,10 @@ export function WaterfallView({ onSpanSelect, getChildSpans, traceStartTime, - traceDuration + traceDuration, + height, + maxHeight, + minHeight }: WaterfallViewProps) { const [zoom, setZoom] = useState(0.8); const [hoveredSpan, setHoveredSpan] = useState<{ span: FlatSpan; x: number; y: number } | null>(null); @@ -414,9 +442,7 @@ export function WaterfallView({ roots.forEach(findEarliestStart); const calculatedStart = earliestStart !== Infinity ? earliestStart : traceStartMs; - console.log(`[WaterfallView] traceStartTime prop: ${traceStartTime} (${traceStartMs})`); - console.log(`[WaterfallView] calculated earliest start: ${calculatedStart}, difference: ${traceStartMs - calculatedStart}ms`); - + return calculatedStart; }, [spans, traceStartMs, traceStartTime, getChildSpans]); @@ -431,11 +457,6 @@ export function WaterfallView({ const range = getSpanTimeRange(span); if (range) { const endOffset = range.end - actualTraceStartMs; - console.log(`[WaterfallView] Span: ${span.name}`); - console.log(` - startTime: ${span.startTime} (${range.start})`); - console.log(` - endTime: ${span.endTime} (${range.end})`); - console.log(` - actualTraceStartMs: ${actualTraceStartMs}`); - console.log(` - endOffset: ${endOffset}ms`); maxEndOffset = Math.max(maxEndOffset, endOffset); } const children = getChildSpans(span.spanId); @@ -452,8 +473,7 @@ export function WaterfallView({ roots.forEach(processSpan); const finalDuration = Math.max(maxEndOffset, traceDuration); - console.log(`[WaterfallView] maxEndOffset: ${maxEndOffset}ms, traceDuration: ${traceDuration}ms, finalDuration: ${finalDuration}ms`); - + // Use the maximum of the calculated duration and the provided traceDuration return finalDuration; }, [spans, actualTraceStartMs, traceDuration, getChildSpans]); @@ -509,8 +529,6 @@ export function WaterfallView({ actualTraceDuration <= 30000 ? 5000 : actualTraceDuration <= 60000 ? 10000 : 15000; - console.log(`[WaterfallView] actualTraceDuration: ${actualTraceDuration}ms, intervalMs: ${intervalMs}ms`); - for (let t = 0; t <= actualTraceDuration; t += intervalMs) { markers.push(t); } @@ -520,9 +538,7 @@ export function WaterfallView({ if (lastMarker < actualTraceDuration && actualTraceDuration - lastMarker > intervalMs * 0.1) { markers.push(actualTraceDuration); } - - console.log(`[WaterfallView] Generated ${markers.length} time markers:`, markers); - + return markers; }, [actualTraceDuration]); @@ -552,7 +568,7 @@ export function WaterfallView({ <ZoomControlsLabel>Timeline</ZoomControlsLabel> <ZoomControlsGroup> <ZoomButton - onClick={() => setZoom(Math.max(0.5, zoom - 0.25))} + onClick={() => setZoom(Math.max(0.2, zoom - 0.1))} title="Zoom out" > <Codicon name="zoom-out" /> @@ -567,7 +583,7 @@ export function WaterfallView({ /> <ZoomLabel>{Math.round(zoom * 100)}%</ZoomLabel> <ZoomButton - onClick={() => setZoom(Math.min(3, zoom + 0.25))} + onClick={() => setZoom(Math.min(1, zoom + 0.1))} title="Zoom in" > <Codicon name="zoom-in" /> @@ -576,12 +592,16 @@ export function WaterfallView({ </ZoomControlsBar> {/* Timeline Content */} - <TimelineContent> + <TimelineContent + height={height} + maxHeight={maxHeight} + minHeight={minHeight} + > <TimelineInner width={timelineWidth}> {/* Time Axis */} <TimeAxis> {timeMarkers.map((ms) => ( - <TimeMarker key={ms} position={(ms / actualTraceDuration) * 100}> + <TimeMarker key={ms} position={(ms / actualTraceDuration) * 100 * zoom}> <TimeMarkerTick /> <TimeMarkerLabel>{formatTimeMarker(ms)}</TimeMarkerLabel> </TimeMarker> @@ -590,38 +610,41 @@ export function WaterfallView({ {/* Spans */} <SpansContainer> + {/* Grid lines layer */} + <GridLinesContainer> + {timeMarkers.map((ms) => ( + <GridLineVertical + key={ms} + position={(ms / actualTraceDuration) * 100 * zoom} + /> + ))} + </GridLinesContainer> + {flatSpans.map((span) => { - // Calculate percentages relative to the trace duration + // Calculate percentages relative to the trace duration and apply zoom const leftPercent = actualTraceDuration > 0 - ? (span.startOffsetMs / actualTraceDuration) * 100 + ? (span.startOffsetMs / actualTraceDuration) * 100 * zoom : 0; const widthPercent = actualTraceDuration > 0 - ? Math.max(0.1, (span.durationMs / actualTraceDuration) * 100) + ? Math.max(0.1, (span.durationMs / actualTraceDuration) * 100 * zoom) : 0; const spanType = getSpanType(span); const isSelected = selectedSpanId === span.spanId; return ( <SpanRow key={span.spanId} isSelected={isSelected} level={span.level}> - {/* Grid lines */} - {timeMarkers.map((ms) => ( - <GridLine - key={ms} - position={(ms / actualTraceDuration) * 100} - /> - ))} - {/* Span bar */} <SpanBar type={spanType} left={leftPercent} width={widthPercent} isSelected={isSelected} + level={span.level} onClick={() => onSpanSelect(span.spanId)} onMouseEnter={(e) => handleSpanMouseEnter(span, e)} onMouseLeave={handleSpanMouseLeave} > - <SpanBarIcon> + <SpanBarIcon type={spanType}> <Icon name={getTypeIcon(spanType)} sx={{ @@ -630,13 +653,11 @@ export function WaterfallView({ height: '14px', display: 'flex', alignItems: 'center', - justifyContent: 'center', - color: 'var(--vscode-editor-background)' + justifyContent: 'center' }} iconSx={{ fontSize: '14px', - display: 'flex', - color: 'var(--vscode-editor-background)' + display: 'flex' }} /> </SpanBarIcon> From e05e0f9fe8679db0b417ab1c79b35df7267b4cf9 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 12:46:22 +0530 Subject: [PATCH 100/247] Adjust chat interface styles --- .../Components/ChatInterface.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index aec97a04ba9..f02bdbd5a46 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -131,12 +131,12 @@ const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading content: ""; position: absolute; inset: 0; - background-color: ${({ isUser }: { isUser: boolean }) => - isUser ? "var(--vscode-button-background)" : "var(--vscode-tab-inactiveBackground)"}; - opacity: ${({ isUser }: { isUser: boolean }) => (isUser ? "0.3" : "1")}; + background-color: ${({ isUser, isError }: { isUser: boolean; isError?: boolean }) => + isError ? "var(--vscode-errorForeground)" : isUser ? "var(--vscode-button-background)" : "var(--vscode-input-background)"}; + opacity: ${({ isUser, isError }: { isUser: boolean; isError?: boolean }) => (isUser ? "0.3" : isError ? "0.05" : "1")}; border-radius: inherit; border: 1px solid ${({ isUser }: { isUser: boolean }) => - isUser ? "var(--vscode-peekView-border)" : "var(--vscode-panel-border)"};; + isUser ? "var(--vscode-peekView-border)" : "var(--vscode-panel-border)"};; z-index: -1; } @@ -289,13 +289,13 @@ const ClearChatWarningPopup: React.FC<ClearChatWarningPopupProps> = ({ isOpen, o // Preprocess LaTeX delimiters to convert \(...\) and \[...\] to $...$ and $$...$$ function preprocessLatex(text: string): string { if (!text || typeof text !== 'string') return text; - + // Convert display math \[...\] to $$...$$ let processed = text.replace(/\\\[(.*?)\\\]/gs, (_, math) => `$$${math}$$`); - + // Convert inline math \(...\) to $...$ processed = processed.replace(/\\\((.*?)\\\)/gs, (_, math) => `$${math}$`); - + return processed; } @@ -477,8 +477,8 @@ const ChatInterface: React.FC = () => { </MessageBubble> {msg.isUser && ( <ProfilePic> - <Codicon - name="account" + <Icon + name="bi-user" sx={{ width: 18, height: 18 }} iconSx={{ fontSize: "18px", From ecb0c8c62c45ff96ec8be46a37ba9a05096ea420 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 12:48:13 +0530 Subject: [PATCH 101/247] Format error message in agent chat logs fix fix --- .../src/components/JsonTreeViewer.tsx | 45 +++++- .../src/components/JsonViewer.tsx | 11 +- .../src/components/SpanInputOutput.tsx | 147 +++++++++++++++--- .../ballerina/trace-visualizer/src/utils.ts | 46 ++++++ 4 files changed, 219 insertions(+), 30 deletions(-) create mode 100644 workspaces/ballerina/trace-visualizer/src/utils.ts diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 656de249dcc..616e8c6743d 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -30,6 +30,7 @@ interface JsonTreeViewerProps { maxAutoExpandDepth?: number; collapseAll?: boolean; expandAll?: boolean; + expandLastOnly?: boolean; } const Container = styled.div` @@ -234,6 +235,38 @@ function generateInitialExpanded(data: unknown, maxDepth: number, path: string = return expanded; } +// Generate expanded set that expands only the last item of root array (and its descendants up to depth) +function generateExpandedForLastItem(data: unknown, maxDepth: number): Set<string> { + const expanded = new Set<string>(); + if (!Array.isArray(data) || data.length === 0) return expanded; + + const lastIndex = data.length - 1; + const startPath = `root[${lastIndex}]`; + + const traverse = (obj: unknown, currentPath: string, depth: number) => { + if (depth >= maxDepth) return; + + if (Array.isArray(obj)) { + expanded.add(currentPath); + obj.forEach((item, index) => { + if (typeof item === 'object' && item !== null) { + traverse(item, `${currentPath}[${index}]`, depth + 1); + } + }); + } else if (obj !== null && typeof obj === 'object') { + expanded.add(currentPath); + Object.entries(obj).forEach(([key, val]) => { + if (typeof val === 'object' && val !== null) { + traverse(val, `${currentPath}.${key}`, depth + 1); + } + }); + } + }; + + traverse(data[lastIndex], startPath, 0); + return expanded; +} + // Collect all paths in the data structure function collectAllPaths(data: unknown, path: string = ''): Set<string> { const paths = new Set<string>(); @@ -265,15 +298,19 @@ export function JsonTreeViewer({ searchQuery = '', maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH, collapseAll = false, - expandAll = false + expandAll = false, + expandLastOnly = false }: JsonTreeViewerProps) { // Parse nested JSON strings const parsedData = useMemo(() => parseNestedJSON(data), [data]); // Initialize expanded state - const [expandedPaths, setExpandedPaths] = useState<Set<string>>(() => - generateInitialExpanded(parsedData, maxAutoExpandDepth) - ); + const initialExpanded = useMemo(() => { + if (expandLastOnly && Array.isArray(parsedData)) { + return generateExpandedForLastItem(parsedData, maxAutoExpandDepth); + } + return generateInitialExpanded(parsedData, maxAutoExpandDepth); + }, [parsedData, maxAutoExpandDepth, expandLastOnly]); // Handle collapse/expand all useEffect(() => { diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index effd229fe00..e5bca405854 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -34,6 +34,7 @@ interface JsonViewerProps { title?: string; searchQuery?: string; maxAutoExpandDepth?: number; + expandLastOnly?: boolean; } const Container = styled.div``; @@ -66,7 +67,7 @@ const Title = styled.h4` letter-spacing: 0.5px; `; -const ToggleGroup = styled.div` +export const ToggleGroup = styled.div` display: flex; gap: 2px; `; @@ -89,11 +90,11 @@ const IconButton = styled.button` } `; -interface ToggleButtonProps { +export interface ToggleButtonProps { active: boolean; } -const ToggleButton = styled.button<ToggleButtonProps>` +export const ToggleButton = styled.button<ToggleButtonProps>` padding: 4px 10px; font-size: 11px; font-family: var(--vscode-font-family); @@ -531,7 +532,8 @@ export function JsonViewer({ value, title, searchQuery = '', - maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH + maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH, + expandLastOnly = false }: JsonViewerProps) { const isJSON = useMemo(() => isJSONString(value), [value]); const hasMarkdown = useMemo(() => { @@ -671,6 +673,7 @@ export function JsonViewer({ maxAutoExpandDepth={maxAutoExpandDepth} collapseAll={collapseAll} expandAll={expandAll} + expandLastOnly={expandLastOnly} /> ) : ( <RawContent> diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 7175a9c8f55..3aa678c4127 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -18,12 +18,13 @@ import { useState, useMemo, ReactNode, useRef, useEffect } from "react"; import styled from "@emotion/styled"; -import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { Icon } from "@wso2/ui-toolkit"; import { SearchInput } from "./SearchInput"; import { CollapsibleSection } from "./CollapsibleSection"; -import { JsonViewer } from "./JsonViewer"; +import { JsonViewer, ToggleGroup, ToggleButton } from "./JsonViewer"; import { CopyButton } from "./CopyButton"; import { SpanData } from "../index"; +import { extractUserErrorDetails } from "../utils"; interface SpanInputOutputProps { spanData: SpanData; @@ -194,7 +195,7 @@ const InputOutputGrid = styled.div` grid-template-columns: 1fr; gap: 16px; - @media (min-width: 800px) { + @media (min-width: 900px) { grid-template-columns: 1fr 1fr; } `; @@ -213,19 +214,6 @@ const SubSectionTitle = styled.h4` gap: 6px; `; -const TextContent = styled.div` - background-color: var(--vscode-input-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - padding: 12px; - font-family: var(--vscode-font-family); - font-size: 13px; - line-height: 1.5; - white-space: pre-wrap; - word-break: break-word; - color: var(--vscode-editor-foreground); -`; - const ErrorContent = styled.div` background-color: var(--vscode-input-background); border: 1px solid var(--vscode-errorForeground); @@ -246,6 +234,19 @@ const ErrorHeader = styled.div` color: var(--vscode-errorForeground); `; +const ErrorHeaderLeft = styled.div` + display: flex; + align-items: center; + gap: 6px; + flex: 1; +`; + +const ErrorHeaderRight = styled.div` + display: flex; + align-items: center; + gap: 4px; +`; + const Highlight = styled.mark` background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); color: inherit; @@ -366,6 +367,85 @@ function formatDate(isoString: string): string { }); } +function formatErrorText(rawText: string): string { + if (typeof rawText !== "string") return rawText; + + const lines = rawText.split("\n"); + + // Find where stack trace starts (first line with "at ") + const stackTraceStartIndex = lines.findIndex(l => l.trim().startsWith("at ")); + + let stackTrace: string[] = []; + let nonStack: string; + + if (stackTraceStartIndex !== -1) { + // Everything before stack trace + nonStack = lines.slice(0, stackTraceStartIndex).join("\n"); + + // Stack trace: from "at " line onwards (includes all subsequent indented lines) + stackTrace = lines.slice(stackTraceStartIndex); + } else { + nonStack = lines.join("\n"); + } + + const output: string[] = []; + + output.push("Error Summary"); + output.push("============="); + + // Split summary and steps block + const stepsIndex = nonStack.indexOf('{"steps":['); + + if (stepsIndex === -1) { + output.push(nonStack.trim()); + } else { + const summary = nonStack.slice(0, stepsIndex).trim(); + const stepsBlock = nonStack.slice(stepsIndex).trim(); + + if (summary) output.push(summary); + + + // ---- Error Details (extracted from embedded body JSON) ---- + const errorDetails = extractUserErrorDetails(rawText); + + if (errorDetails?.length) { + output.push(""); + output.push("Error Details"); + output.push("============="); + + errorDetails.forEach((d, i) => { + if (i > 0) output.push(""); + + if (d.error_message) { + output.push(`Message: ${d.error_message}${d.code ? ` (${d.code})` : ""}`); + } + + if (d.error_description) { + output.push(`Description: ${d.error_description}`); + } + }); + } + + // ---- Steps (verbatim) ---- + if (stepsBlock) { + output.push(""); + output.push("Steps"); + output.push("====="); + output.push(stepsBlock); + } + } + + // ---- Stack trace ---- + if (stackTrace.length) { + output.push(""); + output.push("Stack Trace"); + output.push("==========="); + output.push(stackTrace.join("\n")); + } + + return output.join("\n"); +} + // Attributes to exclude from "Other Attributes" (shown elsewhere) const EXCLUDED_ATTRIBUTE_KEYS = [ 'gen_ai.input.messages', @@ -391,6 +471,7 @@ function stripSpanPrefix(spanName: string): string { export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { const [searchQuery, setSearchQuery] = useState(''); const [isIdPopupOpen, setIsIdPopupOpen] = useState(false); + const [showRawError, setShowRawError] = useState(false); const popupRef = useRef<HTMLDivElement>(null); const buttonRef = useRef<HTMLButtonElement>(null); @@ -703,6 +784,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { value={inputData.messages} title={inputData.messagesLabel} searchQuery={searchQuery} + expandLastOnly={true} /> </SubSection> )} @@ -731,14 +813,34 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { {outputData.error && textContainsSearch(outputData.error, searchQuery) && ( <SubSection> <ErrorHeader> - <Icon name="bi-error" sx={{ fontSize: "16px", width: "16px", height: "16px" }} iconSx={{ display: "flex" }} /> - <SubSectionTitle style={{ margin: 0, color: 'var(--vscode-errorForeground)' }}> - Error - </SubSectionTitle> - <CopyButton text={outputData.error} size="small" /> + <ErrorHeaderLeft> + <Icon name="bi-error" sx={{ fontSize: "16px", width: "16px", height: "16px" }} iconSx={{ display: "flex" }} /> + <SubSectionTitle style={{ margin: 0, color: 'var(--vscode-errorForeground)' }}> + Error + </SubSectionTitle> + <CopyButton text={outputData.error} size="small" /> + </ErrorHeaderLeft> + <ErrorHeaderRight> + <ToggleGroup> + <ToggleButton + active={!showRawError} + onClick={() => setShowRawError(false)} + title="Show formatted error" + > + Formatted + </ToggleButton> + <ToggleButton + active={showRawError} + onClick={() => setShowRawError(true)} + title="Show raw error" + > + Raw + </ToggleButton> + </ToggleGroup> + </ErrorHeaderRight> </ErrorHeader> <ErrorContent> - {highlightText(outputData.error, searchQuery)} + {highlightText(showRawError ? outputData.error : formatErrorText(outputData.error), searchQuery)} </ErrorContent> </SubSection> )} @@ -748,6 +850,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { value={outputData.messages} title={outputData.messagesLabel} searchQuery={searchQuery} + expandLastOnly={true} /> </SubSection> )} diff --git a/workspaces/ballerina/trace-visualizer/src/utils.ts b/workspaces/ballerina/trace-visualizer/src/utils.ts new file mode 100644 index 00000000000..84523f8f049 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/utils.ts @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export const extractUserErrorDetails = (text: string | null) => { + if (typeof text !== "string") return null; + + const results = []; + + // Match body="...json..." + const bodyRegex = /body="(\{[\s\S]*?\})"/g; + let match; + + while ((match = bodyRegex.exec(text)) !== null) { + try { + // Unescape embedded quotes + const jsonText = match[1].replace(/\\"/g, '"'); + const parsed = JSON.parse(jsonText); + + results.push({ + error_message: parsed.error_message, + code: parsed.code, + error_description: parsed.error_description, + raw: parsed + }); + } catch { + // Ignore malformed bodies + } + } + + return results.length ? results : null; +} From 09298b31197e8f4072d561ef2d03e7e4577598f1 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 19:13:17 +0530 Subject: [PATCH 102/247] Add execution steps to chat interface --- .../src/rpc-types/agent-chat/interfaces.ts | 12 +- .../features/tracing/trace-details-webview.ts | 10 +- .../rpc-managers/agent-chat/rpc-manager.ts | 102 +++++++++++- .../Components/ChatInterface.tsx | 55 +++++- .../Components/ExecutionSteps.tsx | 156 ++++++++++++++++++ .../Components/ExecutionStepsButton.tsx | 60 +++++++ .../Components/ExecutionStepsList.tsx | 123 ++++++++++++++ .../trace-visualizer/src/TraceDetails.tsx | 91 ++++++++-- .../ballerina/trace-visualizer/src/index.tsx | 6 +- 9 files changed, 580 insertions(+), 35 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index c6880ffae53..ced82259d37 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -22,6 +22,14 @@ export interface ChatReqMessage { export interface ChatRespMessage { message: string; + traceId?: string; + toolCalls?: ToolCallSummary[]; +} + +export interface ToolCallSummary { + spanId: string; + toolName: string; + output: string; } export interface TraceStatus { @@ -29,7 +37,9 @@ export interface TraceStatus { } export interface TraceInput { - message: string; + message?: string; + traceId?: string; + focusSpanId?: string; } export interface ChatHistoryMessage { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 6224bbdc0d0..03bc7fb5661 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -67,6 +67,7 @@ export class TraceDetailsWebview { private _disposables: vscode.Disposable[] = []; private _trace: Trace | undefined; private _isAgentChat: boolean = false; + private _focusSpanId: string | undefined; private constructor() { this._panel = TraceDetailsWebview.createWebview(); @@ -89,6 +90,7 @@ export class TraceDetailsWebview { command: 'traceData', data: traceData, isAgentChat: this._isAgentChat, + focusSpanId: this._focusSpanId, }); } break; @@ -125,7 +127,7 @@ export class TraceDetailsWebview { return panel; } - public static show(trace: Trace, isAgentChat: boolean = false): void { + public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string): void { if (!TraceDetailsWebview.instance || !TraceDetailsWebview.instance._panel) { // Create new instance if it doesn't exist or was disposed TraceDetailsWebview.instance = new TraceDetailsWebview(); @@ -135,6 +137,7 @@ export class TraceDetailsWebview { const instance = TraceDetailsWebview.instance; instance._trace = trace; instance._isAgentChat = isAgentChat; + instance._focusSpanId = focusSpanId; // Update title based on isAgentChat flag if (instance._panel) { @@ -159,6 +162,7 @@ export class TraceDetailsWebview { command: 'traceData', data: traceData, isAgentChat: this._isAgentChat, + focusSpanId: this._focusSpanId, }); } @@ -244,12 +248,13 @@ export class TraceDetailsWebview { window.vscode = vscode; // Make vscode API available globally let traceData = null; let isAgentChat = false; + let focusSpanId = undefined; function renderTraceDetails() { if (window.traceVisualizer && window.traceVisualizer.renderWebview && traceData) { const container = document.getElementById("webview-container"); if (container) { - window.traceVisualizer.renderWebview(traceData, isAgentChat, container); + window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId); } } else if (!traceData) { // Request trace data from extension @@ -267,6 +272,7 @@ export class TraceDetailsWebview { case 'traceData': traceData = message.data; isAgentChat = message.isAgentChat || false; + focusSpanId = message.focusSpanId; renderTraceDetails(); break; } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 031e10b92eb..ced4c9e0767 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -20,6 +20,7 @@ import { AgentChatAPI, ChatReqMessage, ChatRespMessage, + ToolCallSummary, TraceInput, TraceStatus, ChatHistoryMessage, @@ -74,13 +75,6 @@ export class AgentChatRpcManager implements AgentChatAPI { this.currentAbortController.signal ); if (response && response.message) { - // Find trace and extract tool calls and execution steps - const trace = this.findTraceForMessage(params.message); - - const chatResponse: ChatRespMessage = { - message: response.message - }; - // Store agent response in history this.addMessageToHistory(sessionId, { type: 'message', @@ -89,7 +83,13 @@ export class AgentChatRpcManager implements AgentChatAPI { traceId: trace?.traceId }); - resolve(chatResponse); + // Find trace and extract tool calls + const trace = this.findTraceForMessage(params.message); + + resolve({ + message: response.message, + traceId: trace?.traceId + } as ChatRespMessage); } else { reject(new Error("Invalid response format:", response)); } @@ -265,6 +265,66 @@ export class AgentChatRpcManager implements AgentChatAPI { return undefined; } + /** + * Extract tool call summaries from a trace + * @param trace The trace to extract tool calls from + * @returns Array of tool call summaries + */ + private extractToolCalls(trace: Trace): ToolCallSummary[] { + const toolCalls: ToolCallSummary[] = []; + + // Helper function to extract string value from attribute value + const extractValue = (value: any): string => { + if (typeof value === 'string') { + return value; + } + if (value && typeof value === 'object' && 'stringValue' in value) { + return String(value.stringValue); + } + return ''; + }; + + // Helper to check if a span is a tool execution span + const isToolExecutionSpan = (span: any): boolean => { + const attributes = span.attributes || []; + for (const attr of attributes) { + if (attr.key === 'gen_ai.operation.name') { + const value = extractValue(attr.value); + return value.startsWith('execute_tool'); + } + } + return false; + }; + + // Iterate through spans to find tool executions + for (const span of trace.spans || []) { + if (isToolExecutionSpan(span)) { + const attributes = span.attributes || []; + + let toolName = 'Unknown'; + let output = ''; + + // Extract tool name and output + for (const attr of attributes) { + const value = extractValue(attr.value); + if (attr.key === 'gen_ai.tool.name') { + toolName = value; + } else if (attr.key === 'gen_ai.tool.output') { + output = value; + } + } + + toolCalls.push({ + spanId: span.spanId, + toolName, + output + }); + } + } + + return toolCalls; + } + /** * Show trace details webview for a given chat message * Finds the trace matching the message and opens it in the trace details webview @@ -292,7 +352,31 @@ export class AgentChatRpcManager implements AgentChatAPI { } async showTraceView(params: TraceInput): Promise<void> { - await this.showTraceDetailsForMessage(params.message); + try { + let trace: Trace | undefined; + + // Support direct trace lookup by traceId + if (params.traceId) { + const traces = TraceServer.getTraces(); + trace = traces.find(t => t.traceId === params.traceId); + } else if (params.message) { + // Fallback to message-based lookup + trace = this.findTraceForMessage(params.message); + } + + if (!trace) { + const errorMessage = 'No trace found. Make sure tracing is enabled and the agent has processed this message.'; + vscode.window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + + // Open the trace details webview with isAgentChat=true and optional focusSpanId + TraceDetailsWebview.show(trace, true, params.focusSpanId); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Failed to show trace details'; + vscode.window.showErrorMessage(`Error: ${errorMessage}`); + throw error; + } } async getChatHistory(): Promise<ChatHistoryResponse> { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index f02bdbd5a46..b5c9cca00b2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -22,6 +22,8 @@ import React, { useState, useEffect, useRef } from "react"; import styled from "@emotion/styled"; import ChatInput from "./ChatInput"; import LoadingIndicator from "./LoadingIndicator"; +import ExecutionStepsButton from "./ExecutionStepsButton"; +import ExecutionStepsList from "./ExecutionStepsList"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Codicon, Icon, Button, ThemeColors } from "@wso2/ui-toolkit"; import ReactMarkdown from "react-markdown"; @@ -29,6 +31,7 @@ import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; import rehypeKatex from 'rehype-katex'; import 'katex/dist/katex.min.css'; +import { ToolCallSummary } from "@wso2/ballerina-core"; enum ChatMessageType { MESSAGE = "message", @@ -155,9 +158,8 @@ const ShowLogsButton = styled.button` background: none; border: none; color: var(--vscode-textLink-foreground); - font-size: 11px; - padding: 0; - margin: -4px 0 8px 24px; + font-size: 12px; + padding: 4px 0; cursor: pointer; text-decoration: none; display: inline-flex; @@ -305,6 +307,7 @@ const ChatInterface: React.FC = () => { const [isLoading, setIsLoading] = useState(false); const [isTracingEnabled, setIsTracingEnabled] = useState(false); const [showClearWarning, setShowClearWarning] = useState(false); + const [expandedSteps, setExpandedSteps] = useState<Record<number, boolean>>({}); const messagesEndRef = useRef<HTMLDivElement>(null); @@ -361,7 +364,13 @@ const ChatInterface: React.FC = () => { setMessages((prev) => [ ...prev, - { type: ChatMessageType.MESSAGE, text: chatResponse.message, isUser: false }, + { + type: ChatMessageType.MESSAGE, + text: chatResponse.message, + isUser: false, + traceId: chatResponse.traceId, + toolCalls: chatResponse.toolCalls + }, ]); } catch (error) { const errorMessage = @@ -428,6 +437,17 @@ const ChatInterface: React.FC = () => { setShowClearWarning(false); }; + const handleViewInTrace = async (traceId: string, spanId: string) => { + try { + await rpcClient.getAgentChatRpcClient().showTraceView({ + traceId, + focusSpanId: spanId + }); + } catch (error) { + console.error('Failed to show trace view:', error); + } + }; + return ( <ChatWrapper> {messages.length > 0 && ( @@ -489,11 +509,28 @@ const ChatInterface: React.FC = () => { </ProfilePic> )} </MessageContainer> - {/* Show "Show logs" button after agent responses (not user messages) */} - {!msg.isUser && isTracingEnabled && ( - <ShowLogsButton onClick={() => handleShowLogs(idx)}> - Show logs - </ShowLogsButton> + {!msg.isUser && (msg?.toolCalls || isTracingEnabled) && ( + <MessageActionsContainer> + {isTracingEnabled && ( + <ShowLogsButton onClick={() => handleShowLogs(idx)}> + Show logs + </ShowLogsButton> + )} + {msg?.toolCalls?.length > 0 && msg.traceId && ( + <ExecutionStepsButton + isExpanded={expandedSteps[idx] || false} + onToggle={() => setExpandedSteps(prev => ({ ...prev, [idx]: !prev[idx] }))} + /> + )} + </MessageActionsContainer> + )} + {/* Show ExecutionStepsList in a separate container when expanded */} + {!msg.isUser && msg?.toolCalls?.length > 0 && msg.traceId && expandedSteps[idx] && ( + <ExecutionStepsList + toolCalls={msg.toolCalls} + traceId={msg.traceId} + onViewInTrace={handleViewInTrace} + /> )} </React.Fragment> ))} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx new file mode 100644 index 00000000000..cb31bf763b5 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx @@ -0,0 +1,156 @@ +/** + * 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 { Codicon, Icon } from '@wso2/ui-toolkit'; +import { ToolCallSummary } from '@wso2/ballerina-core'; + +interface ExecutionStepsProps { + toolCalls: ToolCallSummary[]; + traceId: string; + onViewInTrace: (traceId: string, spanId: string) => void; +} + +const ExecutionSteps: React.FC<ExecutionStepsProps> = ({ toolCalls, traceId, onViewInTrace }) => { + const [isExpanded, setIsExpanded] = useState(false); + + if (!toolCalls || toolCalls.length === 0) { + return null; + } + + return ( + <> + <StepsToggle onClick={() => setIsExpanded(!isExpanded)}> + <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> + <ToggleText> + {isExpanded ? 'Hide' : 'View'} execution steps + </ToggleText> + </StepsToggle> + + {isExpanded && ( + <StepsContent> + {toolCalls.map((tool, idx) => ( + <ToolStep key={tool.spanId}> + <StepNumber>{idx + 1}.</StepNumber> + <Icon name="bi-wrench" + sx={{ + fontSize: '14px', + width: '14px', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + <ToolInfo> + <ToolName>{tool.toolName}</ToolName> + </ToolInfo> + <JumpLink onClick={() => onViewInTrace(traceId, tool.spanId)}> + Jump to span → + </JumpLink> + </ToolStep> + ))} + </StepsContent> + )} + </> + ); +}; + +// Styled components +const StepsToggle = styled.button` + display: flex; + align-items: center; + gap: 2px; + background: none; + border: none; + color: var(--vscode-textLink-foreground); + font-size: 12px; + padding: 4px 0; + cursor: pointer; + + &:hover { + text-decoration: underline; + color: var(--vscode-textLink-activeForeground); + } +`; + +const ToggleText = styled.span` + font-size: 12px; +`; + +const StepsContent = styled.div` + margin-top: 8px; + margin-left: 24px; + display: flex; + flex-direction: column; + gap: 6px; + max-width: 600px; + width: 100%; +`; + +const ToolStep = styled.div` + display: flex; + align-items: center; + gap: 4px; + padding: 6px 8px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + font-size: 12px; +`; + +const StepNumber = styled.span` + color: var(--vscode-descriptionForeground); + font-weight: 500; + min-width: 20px; +`; + +const ToolInfo = styled.div` + flex: 1; + display: flex; + align-items: center; + gap: 6px; + overflow: hidden; +`; + +const ToolName = styled.span` + font-weight: 500; + color: var(--vscode-foreground); +`; + +const JumpLink = styled.button` + background: none; + border: none; + color: var(--vscode-textLink-foreground); + font-size: 11px; + padding: 0; + cursor: pointer; + white-space: nowrap; + + &:hover { + text-decoration: underline; + } +`; + +export default ExecutionSteps; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx new file mode 100644 index 00000000000..5169b92fc04 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import styled from '@emotion/styled'; +import { Codicon } from '@wso2/ui-toolkit'; + +interface ExecutionStepsButtonProps { + isExpanded: boolean; + onToggle: () => void; +} + +const ExecutionStepsButton: React.FC<ExecutionStepsButtonProps> = ({ isExpanded, onToggle }) => { + return ( + <StepsToggle onClick={onToggle}> + <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> + <ToggleText> + {isExpanded ? 'Hide' : 'View'} execution steps + </ToggleText> + </StepsToggle> + ); +}; + +const StepsToggle = styled.button` + display: flex; + align-items: center; + gap: 2px; + background: none; + border: none; + color: var(--vscode-textLink-foreground); + font-size: 12px; + padding: 4px 0; + cursor: pointer; + + &:hover { + text-decoration: underline; + color: var(--vscode-textLink-activeForeground); + } +`; + +const ToggleText = styled.span` + font-size: 12px; +`; + +export default ExecutionStepsButton; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx new file mode 100644 index 00000000000..47027fd625e --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx @@ -0,0 +1,123 @@ +/** + * 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 { Codicon, Icon } from '@wso2/ui-toolkit'; +import { ToolCallSummary } from '@wso2/ballerina-core'; + +interface ExecutionStepsListProps { + toolCalls: ToolCallSummary[]; + traceId: string; + onViewInTrace: (traceId: string, spanId: string) => void; +} + +const ExecutionStepsList: React.FC<ExecutionStepsListProps> = ({ toolCalls, traceId, onViewInTrace }) => { + if (!toolCalls || toolCalls.length === 0) { + return null; + } + + return ( + <StepsContent> + {toolCalls.map((tool, idx) => ( + <ToolStep key={tool.spanId} onClick={() => onViewInTrace(traceId, tool.spanId)}> + <StepNumber>{idx + 1}.</StepNumber> + <Icon name="bi-wrench" + sx={{ + fontSize: '14px', + width: '14px', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + <ToolInfo> + <ToolName>{tool.toolName}</ToolName> + </ToolInfo> + <JumpLink> + <Codicon name="chevron-right" /> + </JumpLink> + </ToolStep> + ))} + </StepsContent> + ); +}; + +const StepsContent = styled.div` + margin-left: 24px; + display: flex; + flex-direction: column; + gap: 4px; +`; + +const ToolStep = styled.div` + display: flex; + align-items: center; + gap: 4px; + padding: 6px 8px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + font-size: 12px; + max-width: 40%; + cursor: pointer; + + &:hover { + background: var(--vscode-list-hoverBackground); + } +`; + +const StepNumber = styled.span` + color: var(--vscode-descriptionForeground); + font-weight: 500; + min-width: 20px; +`; + +const ToolInfo = styled.div` + flex: 1; + display: flex; + align-items: center; + gap: 6px; + overflow: hidden; +`; + +const ToolName = styled.span` + font-weight: 500; + color: var(--vscode-foreground); +`; + +const JumpLink = styled.button` + background: none; + border: none; + font-size: 11px; + padding: 0; + cursor: pointer; + white-space: nowrap; + + &:hover { + text-decoration: underline; + } +`; + +export default ExecutionStepsList; diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 6b727eb01d6..5c3025f9ee1 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -26,6 +26,7 @@ import { WaterfallView } from "./components/WaterfallView"; interface TraceDetailsProps { traceData: TraceData; isAgentChat: boolean; + focusSpanId?: string; } const Container = styled.div` @@ -547,7 +548,7 @@ const AIBadge: React.FC<AIBadgeProps> = ({ type }) => { ); }; -export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { +export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetailsProps) { const [expandedSections, setExpandedSections] = useState<Set<string>>( new Set(['trace', 'resource', 'scope', 'spans']) ); @@ -563,6 +564,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const [totalSpanCounts, setTotalSpanCounts] = useState({ aiCount: 0, nonAiCount: 0 }); const containerRef = React.useRef<HTMLDivElement>(null); const hasAutoExpandedRef = React.useRef<boolean>(false); + const hasFocusedRef = React.useRef<boolean>(false); // Track container width for responsive behavior useEffect(() => { @@ -666,21 +668,28 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { const sortedRootSpans = sortSpansByUmbrellaFirst(rootSpans); // Select first span on load + // Debug: Log when selectedSpanId changes useEffect(() => { - if (!selectedSpanId && sortedRootSpans.length > 0) { + console.log('[TraceDetails] selectedSpanId changed to:', selectedSpanId); + }, [selectedSpanId]); + + useEffect(() => { + // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it + if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current) { + console.log('[TraceDetails] Auto-selecting first root span:', sortedRootSpans[0].spanId); setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [sortedRootSpans.length]); + }, [sortedRootSpans.length, focusSpanId, selectedSpanId]); // Auto-expand first 3 levels of spans in advanced mode (only once) useEffect(() => { if (!isAdvancedMode || hasAutoExpandedRef.current || sortedRootSpans.length === 0) return; const spansToExpand = new Set<string>(); - + const expandRecursively = (spanId: string, currentLevel: number) => { if (currentLevel >= 3) return; - + const children = getChildSpans(spanId); if (children.length > 0) { spansToExpand.add(spanId); @@ -697,9 +706,58 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { hasAutoExpandedRef.current = true; }, [sortedRootSpans, isAdvancedMode]); - const formatDate = (dateString: string): string => { - return new Date(dateString).toLocaleString(); - }; + // Auto-focus on specific span if focusSpanId is provided + useEffect(() => { + if (focusSpanId && traceData.spans.length > 0) { + if (hasFocusedRef.current) { + console.log('[TraceDetails] Already focused, skipping'); + return; + } + console.log('[TraceDetails] Focusing on span:', focusSpanId); + hasFocusedRef.current = true; + + // Expand all parent spans to make the focused span visible FIRST + const span = traceData.spans.find(s => s.spanId === focusSpanId); + if (!span) { + console.error('[TraceDetails] Span not found:', focusSpanId); + return; + } + + console.log('[TraceDetails] Found span:', span.name); + + const newExpanded = new Set(expandedSpans); + let currentParentId = span.parentSpanId; + + while (currentParentId && currentParentId !== '0000000000000000') { + const parentSpan = traceData.spans.find(s => s.spanId === currentParentId); + if (parentSpan) { + newExpanded.add(currentParentId); + console.log('[TraceDetails] Expanding parent:', parentSpan.name); + currentParentId = parentSpan.parentSpanId; + } else { + break; + } + } + + // Set expanded state and select span + setExpandedSpans(newExpanded); + setSelectedSpanId(focusSpanId); + + console.log('[TraceDetails] Switched to tree view and selected span:', focusSpanId); + + // Scroll to the focused span after rendering + setTimeout(() => { + const spanElement = document.querySelector(`[data-span-id="${focusSpanId}"]`); + console.log('[TraceDetails] Looking for element with data-span-id:', focusSpanId, 'Found:', !!spanElement); + if (spanElement) { + console.log('[TraceDetails] Scrolling to span element'); + spanElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } else { + console.error('[TraceDetails] Could not find span element to scroll to'); + } + }, 500); + } + }, [focusSpanId]); const getChildSpans = (spanId: string): SpanData[] => { const children = traceData.spans.filter(s => s.parentSpanId === spanId); @@ -715,7 +773,12 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { return ( <React.Fragment key={span.spanId}> - <TreeItem level={level} isSelected={isSelected} onClick={() => selectSpan(span.spanId)}> + <TreeItem + level={level} + isSelected={isSelected} + onClick={() => selectSpan(span.spanId)} + data-span-id={span.spanId} + > <TreeChevronIcon hasChildren={hasChildren} isExpanded={isExpanded} @@ -858,7 +921,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { // Calculate waterfall height const spanBarHeight = 30; - const waterfallSpanCount = isAdvancedMode + const waterfallSpanCount = isAdvancedMode ? (totalSpanCounts.aiCount + totalSpanCounts.nonAiCount) : totalSpanCounts.aiCount; const waterfallCalculatedHeight = (waterfallSpanCount * spanBarHeight) + 70; @@ -873,12 +936,17 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { // Select first AI span when in agent chat view useEffect(() => { + // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it + if (focusSpanId || hasFocusedRef.current) { + return; + } + if (isAgentChat && !showFullTrace && rootAISpans.length > 0) { setSelectedSpanId(rootAISpans[0].spanId); } else if (!isAgentChat && !selectedSpanId && sortedRootSpans.length > 0) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length]); + }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); // Get span type badge const getSpanTypeBadge = (span: SpanData): string => { @@ -1331,6 +1399,7 @@ export function TraceDetails({ traceData, isAgentChat }: TraceDetailsProps) { level={level} isSelected={isSelected} onClick={() => setSelectedSpanId(span.spanId)} + data-span-id={span.spanId} > <AIBadge type={badgeType} /> <AISpanLabel> diff --git a/workspaces/ballerina/trace-visualizer/src/index.tsx b/workspaces/ballerina/trace-visualizer/src/index.tsx index 924b21d9971..23b24d82290 100644 --- a/workspaces/ballerina/trace-visualizer/src/index.tsx +++ b/workspaces/ballerina/trace-visualizer/src/index.tsx @@ -60,16 +60,16 @@ export interface AttributeData { declare global { interface Window { traceVisualizer: { - renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement) => void; + renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string) => void; }; } } -export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement) { +export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string) { const root = createRoot(target); root.render( <React.StrictMode> - <TraceDetails traceData={traceData} isAgentChat={isAgentChat} /> + <TraceDetails traceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} /> </React.StrictMode> ); } From 082947c7b9b0aeedcaae4f9c5bad0618cb1301cf Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 20:33:30 +0530 Subject: [PATCH 103/247] Improve search functionality in chat agent logs --- .../trace-visualizer/src/TraceDetails.tsx | 11 +-- .../src/components/JsonTreeViewer.tsx | 48 +++++++++++++ .../src/components/JsonViewer.tsx | 45 ++++++++++-- .../src/components/SpanInputOutput.tsx | 72 ++++++++++++++++--- 4 files changed, 153 insertions(+), 23 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 5c3025f9ee1..0da6408513a 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -1197,7 +1197,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai </span> <AdvancedSpanName>{span.name}</AdvancedSpanName> </div> - <AdvancedSpanKind>{getSpanKindLabel(span.kind)}</AdvancedSpanKind> {duration !== null && ( <span style={{ fontSize: '11px', color: 'var(--vscode-descriptionForeground)', minWidth: '60px', textAlign: 'right' }}> {formatDuration(duration)} @@ -1358,11 +1357,13 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai </span> <AdvancedSpanName>{span.name}</AdvancedSpanName> </div> - <AdvancedSpanKind>{getSpanKindLabel(span.kind)}</AdvancedSpanKind> {duration !== null && ( - <span style={{ fontSize: '11px', color: 'var(--vscode-descriptionForeground)', minWidth: '60px', textAlign: 'right' }}> - {formatDuration(duration)} - </span> + <AISpanDuration> + <> + <Icon name="bi-clock" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + {formatDuration(duration)} + </> + </AISpanDuration> )} </AdvancedSpanItem> {hasChildren && isExpanded && ( diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 616e8c6743d..82f35b4ecd4 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -293,6 +293,42 @@ function collectAllPaths(data: unknown, path: string = ''): Set<string> { return paths; } +// Find paths that match search query and their parent paths +function findMatchingPaths(data: unknown, searchQuery: string): Set<string> { + if (!searchQuery) return new Set(); + + const matchingPaths = new Set<string>(); + const regex = new RegExp(searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'); + + const traverse = (obj: unknown, currentPath: string, parentPaths: string[], key: string = '') => { + // Check if key or value matches + const keyMatches = key && regex.test(key); + const valueMatches = obj != null && typeof obj !== 'object' && regex.test(String(obj)); + + if (keyMatches || valueMatches) { + // Add all parent paths and current path + parentPaths.forEach(p => matchingPaths.add(p)); + matchingPaths.add(currentPath); + return; + } + + if (Array.isArray(obj)) { + obj.forEach((item, index) => { + const itemPath = `${currentPath}[${index}]`; + traverse(item, itemPath, [...parentPaths, currentPath], String(index)); + }); + } else if (obj != null && typeof obj === 'object') { + Object.entries(obj).forEach(([k, v]) => { + const itemPath = `${currentPath}.${k}`; + traverse(v, itemPath, [...parentPaths, currentPath], k); + }); + } + }; + + traverse(data, 'root', []); + return matchingPaths; +} + export function JsonTreeViewer({ data, searchQuery = '', @@ -312,6 +348,18 @@ export function JsonTreeViewer({ return generateInitialExpanded(parsedData, maxAutoExpandDepth); }, [parsedData, maxAutoExpandDepth, expandLastOnly]); + const [expandedPaths, setExpandedPaths] = useState<Set<string>>(initialExpanded); + + // Auto-expand only matching paths when searching, restore initial state when cleared + useEffect(() => { + if (searchQuery) { + const matchingPaths = findMatchingPaths(parsedData, searchQuery); + setExpandedPaths(matchingPaths); + } else { + setExpandedPaths(initialExpanded); + } + }, [searchQuery, parsedData, initialExpanded]); + // Handle collapse/expand all useEffect(() => { if (collapseAll) { diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index e5bca405854..1f2c1104fcd 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { useState, useMemo, ReactNode, useEffect } from "react"; +import React, { useState, useMemo, ReactNode, useEffect } from "react"; import styled from "@emotion/styled"; import { Icon } from "@wso2/ui-toolkit"; import { JsonTreeViewer, DEFAULT_AUTO_EXPAND_DEPTH } from "./JsonTreeViewer"; @@ -478,20 +478,20 @@ function syntaxHighlightJSON(json: string, searchQuery: string): ReactNode[] { // Preprocess LaTeX delimiters to convert \(...\) and \[...\] to $...$ and $$...$$ function preprocessLatex(text: string): string { if (!text || typeof text !== 'string') return text; - + // Convert display math \[...\] to $$...$$ let processed = text.replace(/\\\[(.*?)\\\]/gs, (_, math) => `$$${math}$$`); - + // Convert inline math \(...\) to $...$ processed = processed.replace(/\\\((.*?)\\\)/gs, (_, math) => `$${math}$`); - + return processed; } // Check if text might contain markdown syntax function mightContainMarkdown(text: string): boolean { if (!text || typeof text !== 'string') return false; - + // Check for common markdown patterns with more lenient matching const markdownPatterns = [ /^#{1,6}\s+.+/m, // Headers (# Header) @@ -514,7 +514,7 @@ function mightContainMarkdown(text: string): boolean { /!\[.*?\]\(.+?\)/, // Images (![alt](url)) /^\s*[-*_]{3,}\s*$/m, // Horizontal rules (--- or ***) ]; - + return markdownPatterns.some(pattern => pattern.test(text)); } @@ -540,7 +540,37 @@ export function JsonViewer({ const result = !isJSON && mightContainMarkdown(value); return result; }, [value, isJSON]); - + + const markdownComponents = useMemo(() => { + const create = (tag: any) => ({ children, ...props }: any) => { + const mapped = React.Children.map(children, (child: any) => + typeof child === 'string' ? highlightText(child, searchQuery) : child + ); + return React.createElement(tag, props, mapped); + }; + + return { + p: create('p'), + li: create('li'), + h1: create('h1'), + h2: create('h2'), + h3: create('h3'), + h4: create('h4'), + h5: create('h5'), + h6: create('h6'), + a: ({ children, ...props }: any) => + React.createElement('a', props, React.Children.map(children, (c: any) => + typeof c === 'string' ? highlightText(c, searchQuery) : c + )), + strong: create('strong'), + em: create('em'), + code: ({ inline, children, className, ...props }: any) => { + if (inline) return React.createElement('code', { className, ...props }, children); + return React.createElement('pre', props, React.createElement('code', { className }, children)); + } + }; + }, [searchQuery]); + const [viewMode, setViewMode] = useState<ViewMode>('formatted'); const [collapseAll, setCollapseAll] = useState(false); const [expandAll, setExpandAll] = useState(false); @@ -601,6 +631,7 @@ export function JsonViewer({ <ReactMarkdown remarkPlugins={[remarkMath, remarkGfm]} rehypePlugins={[rehypeKatex]} + components={markdownComponents} > {preprocessLatex(value)} </ReactMarkdown> diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 3aa678c4127..6dd2e874097 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -261,6 +261,49 @@ const NoMatchMessage = styled.div` font-size: 13px; `; +const NoResultsContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 24px; + gap: 12px; +`; + +const NoResultsTitle = styled.div` + font-size: 18px; + font-weight: 500; + color: var(--vscode-foreground); +`; + +const NoResultsSubtitle = styled.div` + font-size: 13px; + color: var(--vscode-descriptionForeground); + margin-bottom: 8px; +`; + +const ClearSearchButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: transparent; + border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); + border-radius: 4px; + color: var(--vscode-foreground); + font-size: 13px; + cursor: pointer; + transition: all 0.15s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + // Advanced Details styles const AdvancedDetailsContainer = styled.div` display: flex; @@ -350,7 +393,8 @@ function highlightText(text: string, searchQuery: string): ReactNode { } function textContainsSearch(text: string | undefined, searchQuery: string): boolean { - if (!searchQuery || !text) return true; + if (!searchQuery) return true; // No search query = show everything + if (!text) return false; // No text to search = no match return text.toLowerCase().includes(searchQuery.toLowerCase()); } @@ -753,9 +797,18 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { {/* No Matches Message */} {noMatches && ( - <NoMatchMessage> - No results found for "{searchQuery}" - </NoMatchMessage> + <NoResultsContainer> + <NoResultsTitle>No results found</NoResultsTitle> + <NoResultsSubtitle>Try different keywords - or search by type, title, span ID</NoResultsSubtitle> + <ClearSearchButton onClick={() => setSearchQuery('')}> + <Icon + name="bi-close" + sx={{ fontSize: "16px", width: "16px", height: "16px" }} + iconSx={{ display: "flex" }} + /> + Clear search + </ClearSearchButton> + </NoResultsContainer> )} {/* Input and Output Sections in Responsive Grid */} @@ -767,6 +820,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { title="Input" icon="bi-input" defaultOpen={true} + key={searchQuery ? `input-${searchQuery}` : 'input'} > <SectionContent> {inputData.systemInstructions && textContainsSearch(inputData.systemInstructions, searchQuery) && ( @@ -808,6 +862,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { title="Output" icon="bi-output" defaultOpen={true} + key={searchQuery ? `output-${searchQuery}` : 'output'} > <SectionContent> {outputData.error && textContainsSearch(outputData.error, searchQuery) && ( @@ -864,7 +919,8 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { {advancedMatches && ( <CollapsibleSection title="Advanced Details" - defaultOpen={spanType === 'other' || (!hasInput && !hasOutput)} + defaultOpen={spanType === 'other' || (!hasInput && !hasOutput) || (searchQuery && advancedMatches)} + key={searchQuery ? `advanced-${searchQuery}` : 'advanced'} > <AdvancedDetailsContainer> {/* Technical IDs */} @@ -944,12 +1000,6 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { </AttributesList> </SubSection> )} - - {searchQuery && filteredAdvancedAttributes.length === 0 && !technicalIdsMatch && ( - <NoMatchMessage> - No attributes match your search - </NoMatchMessage> - )} </AdvancedDetailsContainer> </CollapsibleSection> )} From dcc37a7857a0150c61680db4f583917f2c23cbb5 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 21:51:36 +0530 Subject: [PATCH 104/247] Add total token counts for invoke_agent span --- .../trace-visualizer/src/TraceDetails.tsx | 15 ++++++ .../src/components/SpanInputOutput.tsx | 54 ++++++++++++++----- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 0da6408513a..31822f847a0 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -969,6 +969,19 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai return inputTokens + outputTokens; }; + // Totals across the trace (input/output separately) + const { totalInputTokens, totalOutputTokens } = React.useMemo(() => { + let inTotal = 0; + let outTotal = 0; + traceData.spans.forEach(span => { + const inT = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); + const outT = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); + if (!isNaN(inT)) inTotal += inT; + if (!isNaN(outT)) outTotal += outT; + }); + return { totalInputTokens: inTotal, totalOutputTokens: outTotal }; + }, [traceData.spans]); + // Format date for display in tree const formatStartTime = (dateString: string | undefined): string => { if (!dateString) return ''; @@ -1714,6 +1727,8 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai <SpanInputOutput spanData={selectedSpan} spanName={selectedSpan.name} + totalInputTokens={totalInputTokens} + totalOutputTokens={totalOutputTokens} /> </DetailsPanel> )} diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 6dd2e874097..0f843cd761d 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -29,6 +29,9 @@ import { extractUserErrorDetails } from "../utils"; interface SpanInputOutputProps { spanData: SpanData; spanName?: string; + // Totals across the whole trace (optional) + totalInputTokens?: number; + totalOutputTokens?: number; } const Container = styled.div` @@ -175,7 +178,6 @@ const MetricsPills = styled.div` const MetricPill = styled.div` display: inline-flex; align-items: center; - gap: 4px; padding: 4px 10px; font-size: 11px; font-weight: 500; @@ -512,7 +514,7 @@ function stripSpanPrefix(spanName: string): string { return spanName; } -export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { +export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOutputTokens }: SpanInputOutputProps) { const [searchQuery, setSearchQuery] = useState(''); const [isIdPopupOpen, setIsIdPopupOpen] = useState(false); const [showRawError, setShowRawError] = useState(false); @@ -602,8 +604,19 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { textContainsSearch(metrics.model, searchQuery) || textContainsSearch(metrics.toolDescription, searchQuery) || textContainsSearch(String(metrics.inputTokens), searchQuery) || - textContainsSearch(String(metrics.outputTokens), searchQuery); - }, [searchQuery, metrics]); + textContainsSearch(String(metrics.outputTokens), searchQuery) || + textContainsSearch(String(totalInputTokens || ''), searchQuery) || + textContainsSearch(String(totalOutputTokens || ''), searchQuery) || + textContainsSearch('Latency', searchQuery) || + textContainsSearch('Temperature', searchQuery) || + textContainsSearch('Provider', searchQuery) || + textContainsSearch('Model', searchQuery) || + textContainsSearch('Tool Description', searchQuery) || + textContainsSearch('Input Tokens', searchQuery) || + textContainsSearch('Output Tokens', searchQuery) || + textContainsSearch('Total Input Tokens', searchQuery) || + textContainsSearch('Total Output Tokens', searchQuery); + }, [searchQuery, metrics, totalInputTokens, totalOutputTokens]); // Advanced attributes (not shown in input/output) const advancedAttributes = useMemo(() => { @@ -626,7 +639,12 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { textContainsSearch(spanData.traceId, searchQuery) || textContainsSearch(spanData.parentSpanId, searchQuery) || textContainsSearch(spanData.startTime, searchQuery) || - textContainsSearch(spanData.endTime, searchQuery); + textContainsSearch(spanData.endTime, searchQuery) || + textContainsSearch('Span ID', searchQuery) || + textContainsSearch('Trace ID', searchQuery) || + textContainsSearch('Parent Span ID', searchQuery) || + textContainsSearch('Start Time', searchQuery) || + textContainsSearch('End Time', searchQuery); }, [searchQuery, spanData]); // Check if advanced section has any matches @@ -757,7 +775,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { <MetricsPills> {metrics.latency && ( <MetricPill> - <Icon name="bi-clock" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + <Icon name="bi-clock" sx={{ marginRight: "4px", fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> {highlightText(`Latency: ${metrics.latency}`, searchQuery)} </MetricPill> )} @@ -771,9 +789,19 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { {highlightText(`Output Tokens: ${metrics.outputTokens}`, searchQuery)} </MetricPill> )} + {spanType === 'invoke' && typeof totalInputTokens === 'number' && totalInputTokens > 0 && ( + <MetricPill> + {highlightText(`Total Input Tokens: ${totalInputTokens}`, searchQuery)} + </MetricPill> + )} + {spanType === 'invoke' && typeof totalOutputTokens === 'number' && totalOutputTokens > 0 && ( + <MetricPill> + {highlightText(`Total Output Tokens: ${totalOutputTokens}`, searchQuery)} + </MetricPill> + )} {metrics.temperature && ( <MetricPill> - <Icon name="bi-thermostat" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + <Icon name="bi-thermostat" sx={{ marginRight: "4px", fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> {highlightText(`Temperature: ${metrics.temperature}`, searchQuery)} </MetricPill> )} @@ -929,7 +957,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { <SubSectionTitle>Technical IDs</SubSectionTitle> <TechnicalIdsGrid> <TechnicalRow> - <TechnicalLabel>Span ID:</TechnicalLabel> + <TechnicalLabel>{highlightText("Span ID:", searchQuery)}</TechnicalLabel> <TechnicalValue>{highlightText(spanData.spanId, searchQuery)}</TechnicalValue> <CopyWrapper> <CopyButton text={spanData.spanId} size="small" /> @@ -937,7 +965,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { </TechnicalRow> <TechnicalRow> - <TechnicalLabel>Trace ID:</TechnicalLabel> + <TechnicalLabel>{highlightText("Trace ID:", searchQuery)}</TechnicalLabel> <TechnicalValue>{highlightText(spanData.traceId, searchQuery)}</TechnicalValue> <CopyWrapper> <CopyButton text={spanData.traceId} size="small" /> @@ -945,7 +973,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { </TechnicalRow> <TechnicalRow> - <TechnicalLabel>Parent Span ID:</TechnicalLabel> + <TechnicalLabel>{highlightText("Parent Span ID:", searchQuery)}</TechnicalLabel> <TechnicalValue> {spanData.parentSpanId && spanData.parentSpanId !== '0000000000000000' ? highlightText(spanData.parentSpanId, searchQuery) @@ -960,7 +988,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { {spanData.startTime && ( <TechnicalRow> - <TechnicalLabel>Start Time:</TechnicalLabel> + <TechnicalLabel>{highlightText("Start Time:", searchQuery)}</TechnicalLabel> <TechnicalValue>{highlightText(formatDate(spanData.startTime), searchQuery)}</TechnicalValue> <CopyWrapper> <CopyButton text={formatDate(spanData.startTime)} size="small" /> @@ -970,7 +998,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { {spanData.endTime && ( <TechnicalRow> - <TechnicalLabel>End Time:</TechnicalLabel> + <TechnicalLabel>{highlightText("End Time:", searchQuery)}</TechnicalLabel> <TechnicalValue>{highlightText(formatDate(spanData.endTime), searchQuery)}</TechnicalValue> <CopyWrapper> <CopyButton text={formatDate(spanData.endTime)} size="small" /> @@ -990,7 +1018,7 @@ export function SpanInputOutput({ spanData, spanName }: SpanInputOutputProps) { <AttributesList> {filteredAdvancedAttributes.map((attr, index) => ( <AttributeRow key={index}> - <AttributeKey>{highlightText(attr.key, searchQuery)}:</AttributeKey> + <AttributeKey>{highlightText(`${attr.key}:`, searchQuery)}</AttributeKey> <AttributeValue>{highlightText(attr.value, searchQuery)}</AttributeValue> <CopyWrapper> <CopyButton text={`${attr.key}: ${attr.value}`} size="small" /> From e146a666504a96bdf5c44787f0f473d801608c21 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 22:42:18 +0530 Subject: [PATCH 105/247] Fix chat agent logs window styling --- .../trace-visualizer/src/TraceDetails.tsx | 6 ++++-- .../src/components/CollapsibleSection.tsx | 9 ++++----- .../src/components/JsonViewer.tsx | 15 ++++++++++++--- .../src/components/SpanInputOutput.tsx | 5 +++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 31822f847a0..0ecd477853f 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -31,7 +31,7 @@ interface TraceDetailsProps { const Container = styled.div` margin: 0; - padding: 16px; + padding: 0 16px; font-family: var(--vscode-font-family); background-color: var(--vscode-editor-background); color: var(--vscode-editor-foreground); @@ -106,6 +106,7 @@ const NavigationBar = styled.div` display: flex; align-items: center; justify-content: space-between; + margin-top: 16px; margin-bottom: 8px; `; @@ -175,6 +176,7 @@ const AgentChatLogsContainer = styled.div` display: flex; flex-direction: column; gap: 12px; + margin-bottom: 16px; `; const AISpanTreeContainer = styled.div<{ height: number; maxHeight: number; minHeight: number }>` @@ -199,7 +201,7 @@ const AISpanTreeItem = styled.div<{ level: number; isSelected: boolean }>` gap: 8px; position: relative; background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-hoverBackground)' : 'transparent'}; + props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; flex-wrap: wrap; &:hover { diff --git a/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx b/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx index f59e988880a..b066a03f35b 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx @@ -41,10 +41,10 @@ const Header = styled.button` align-items: center; justify-content: space-between; padding: 10px 12px; - background: var(--vscode-list-hoverBackground); + background: var(--vscode-sideBar-background); border: none; cursor: pointer; - color: var(--vscode-badge-foreground); + color: var(--vscode-editor-foreground); &:hover { background-color: var(--vscode-list-hoverBackground); @@ -58,15 +58,14 @@ const HeaderLeft = styled.div` `; const HeaderTitle = styled.span` - font-size: 15px; + font-size: 14px; font-weight: 500; - color: var(--vscode-badge-foreground); + font-family: var(--vscode-font-family); `; const HeaderIcon = styled.span` display: flex; align-items: center; - color: var(--vscode-badge-foreground); `; const ChevronIcon = styled.span` diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 1f2c1104fcd..31695694fce 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -168,9 +168,18 @@ const MarkdownContent = styled.div` color: var(--vscode-editor-foreground); } - h1 { font-size: 1.3em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 0.2em; } - h2 { font-size: 1.25em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 0.2em; } - h3 { font-size: 1.15em; } + h1:first-child, + h2:first-child, + h3:first-child, + h4:first-child, + h5:first-child, + h6:first-child { + margin-top: 0; + } + + h1 { font-size: 1.25em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 0.2em; } + h2 { font-size: 1.2em; border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 0.2em; } + h3 { font-size: 1.1em; } h4 { font-size: 1em; } h5 { font-size: 0.875em; } h6 { font-size: 0.85em; color: var(--vscode-descriptionForeground); } diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 0f843cd761d..95a33fe0f78 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -181,8 +181,9 @@ const MetricPill = styled.div` padding: 4px 10px; font-size: 11px; font-weight: 500; - background-color: var(--vscode-list-hoverBackground); - color: var(--vscode-badge-foreground); + background-color: var(--vscode-sideBar-background); + border: 1px solid var(--vscode-panel-border); + color: var(--vscode-editor-foreground); border-radius: 4px; `; From 6c5e9790a1c5409332899d41370dd39b88a16b38 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 18 Jan 2026 16:58:22 +0530 Subject: [PATCH 106/247] Refactor code to remove duplicated utility functions --- .../trace-visualizer/src/TraceDetails.tsx | 527 +++++------------- .../src/components/AIBadge.tsx | 92 +++ .../src/components/JsonTreeViewer.tsx | 89 +-- .../src/components/JsonViewer.tsx | 96 ++-- .../src/components/SpanInputOutput.tsx | 2 +- .../src/components/TraceEmptyState.tsx | 66 +++ .../ballerina/trace-visualizer/src/utils.ts | 204 +++++++ 7 files changed, 553 insertions(+), 523 deletions(-) create mode 100644 workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx create mode 100644 workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 0ecd477853f..47fcfcdecd2 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -22,6 +22,21 @@ import { TraceData, SpanData } from "./index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; import { SpanInputOutput } from "./components/SpanInputOutput"; import { WaterfallView } from "./components/WaterfallView"; +import { AIBadge } from "./components/AIBadge"; +import { TraceEmptyState } from "./components/TraceEmptyState"; +import { + timeContainsSpan, + sortSpansByUmbrellaFirst, + formatDuration, + getSpanDuration, + formatStartTime, + getSpanKindLabel, + stripSpanPrefix, + getSpanTypeBadge, + spanHasError, + getSpanTokens, + isAISpan +} from "./utils"; interface TraceDetailsProps { traceData: TraceData; @@ -29,6 +44,10 @@ interface TraceDetailsProps { focusSpanId?: string; } +// ============================================================================ +// BASE LAYOUT STYLES +// ============================================================================ + const Container = styled.div` margin: 0; padding: 0 16px; @@ -41,14 +60,17 @@ const Container = styled.div` overflow-y: auto; `; -const InfoGrid = styled.div` - font-size: 13px; - line-height: 1.4; - display: grid; - grid-template-columns: 150px 1fr; - gap: 8px 12px; +const AgentChatLogsContainer = styled.div` + display: flex; + flex-direction: column; + gap: 12px; + margin-bottom: 16px; `; +// ============================================================================ +// TREE VIEW STYLES +// ============================================================================ + const TreeItem = styled.div<{ level: number; isSelected: boolean }>` display: flex; align-items: center; @@ -92,92 +114,9 @@ const SpanKindBadge = styled.span` flex-shrink: 0; `; -// Span Details Panel Styles -const DetailsPanel = styled.div` - background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - padding: 16px; - margin-bottom: 4px; -`; - -// Navigation button styles -const NavigationBar = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - margin-top: 16px; - margin-bottom: 8px; -`; - -const ModeToggleButton = styled.button` - display: flex; - align-items: center; - gap: 6px; - padding: 4px 8px; - background: transparent; - border: 1px solid var(--vscode-panel-border); - color: var(--vscode-foreground); - border-radius: 4px; - cursor: pointer; - font-size: 13px; - transition: background-color 0.15s ease; - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } - - &:active { - transform: scale(0.98); - } -`; - -const ButtonGroup = styled.div` - display: flex; - gap: 4px; - align-items: center; -`; - -const ViewModeToggle = styled.div` - display: flex; - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - overflow: hidden; -`; - -const ViewModeButton = styled.button<{ isActive: boolean }>` - display: flex; - align-items: center; - justify-content: center; - padding: 4px 8px; - background: ${(props: { isActive: boolean }) => props.isActive - ? 'var(--vscode-button-background)' - : 'transparent'}; - color: ${(props: { isActive: boolean }) => props.isActive - ? 'var(--vscode-button-foreground)' - : 'var(--vscode-foreground)'}; - border: none; - cursor: pointer; - transition: background-color 0.15s ease; - - &:hover { - background: ${(props: { isActive: boolean }) => props.isActive - ? 'var(--vscode-button-hoverBackground)' - : 'var(--vscode-list-hoverBackground)'}; - } - - &:first-of-type { - border-right: 1px solid var(--vscode-panel-border); - } -`; - -// Agent Chat Logs Styles -const AgentChatLogsContainer = styled.div` - display: flex; - flex-direction: column; - gap: 12px; - margin-bottom: 16px; -`; +// ============================================================================ +// AI SPAN TREE STYLES +// ============================================================================ const AISpanTreeContainer = styled.div<{ height: number; maxHeight: number; minHeight: number }>` background-color: var(--vscode-editor-background); @@ -236,31 +175,6 @@ const AISpanTreeItem = styled.div<{ level: number; isSelected: boolean }>` `} `; -const AISpanBadge = styled.span<{ type: string }>` - font-size: 10px; - padding: 3px 8px; - border-radius: 3px; - font-weight: 500; - flex-shrink: 0; - display: flex; - align-items: center; - gap: 4px; - background-color: var(--vscode-editor-background); - color: ${(props: { type: string }) => { - switch (props.type) { - case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; - case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - default: return 'var(--vscode-badge-foreground)'; - } - }}; - border: 1px solid var(--vscode-dropdown-border); - - .ai-span-label { - color: var(--vscode-foreground); - } -`; - const AISpanLabel = styled.span` flex: 1; font-size: 13px; @@ -311,6 +225,18 @@ const AISpanMetadataGroup = styled.div` flex-shrink: 0; `; +const AISpanErrorIcon = styled.span` + display: flex; + align-items: center; + justify-content: center; + color: var(--vscode-errorForeground); + flex-shrink: 0; +`; + +// ============================================================================ +// ADVANCED MODE STYLES +// ============================================================================ + const AdvancedSpanGroup = styled.div<{ level: number }>` margin-left: ${(props: { level: number }) => props.level * 20 + 8}px; margin-top: 4px; @@ -365,125 +291,94 @@ const AdvancedSpanName = styled.span` color: var(--vscode-foreground); `; -const AdvancedSpanKind = styled.span` - font-size: 10px; - padding: 2px 6px; - border-radius: 3px; - background-color: var(--vscode-list-hoverBackground); - color: var(--vscode-badge-foreground); - flex-shrink: 0; -`; +// ============================================================================ +// NAVIGATION & CONTROLS +// ============================================================================ -const InfoSectionContainer = styled.div` - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - background-color: var(--vscode-editor-background); - overflow: hidden; - margin-bottom: 12px; +const NavigationBar = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 16px; + margin-bottom: 8px; `; -const InfoSectionHeader = styled.button` - width: 100%; +const ModeToggleButton = styled.button` display: flex; align-items: center; - gap: 8px; - padding: 10px 12px; + gap: 6px; + padding: 4px 8px; background: transparent; - border: none; + border: 1px solid var(--vscode-panel-border); + color: var(--vscode-foreground); + border-radius: 4px; cursor: pointer; - font-family: var(--vscode-font-family); - color: var(--vscode-foreground); font-size: 13px; - font-weight: 500; + transition: background-color 0.15s ease; &:hover { background-color: var(--vscode-list-hoverBackground); } -`; -const InfoSectionContent = styled.div<{ isOpen: boolean }>` - display: ${(props: { isOpen: boolean }) => props.isOpen ? 'block' : 'none'}; - border-top: 1px solid var(--vscode-panel-border); - padding: 12px; + &:active { + transform: scale(0.98); + } `; -const AISpanErrorIcon = styled.span` +const ButtonGroup = styled.div` display: flex; + gap: 4px; align-items: center; - justify-content: center; - color: var(--vscode-errorForeground); - flex-shrink: 0; `; -const EmptyState = styled.div` +const ViewModeToggle = styled.div` + display: flex; + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + overflow: hidden; +`; + +const ViewModeButton = styled.button<{ isActive: boolean }>` display: flex; - flex-direction: column; align-items: center; justify-content: center; - min-height: 400px; - text-align: center; - padding: 40px; - color: var(--vscode-descriptionForeground); -`; + padding: 4px 8px; + background: ${(props: { isActive: boolean }) => props.isActive + ? 'var(--vscode-button-background)' + : 'transparent'}; + color: ${(props: { isActive: boolean }) => props.isActive + ? 'var(--vscode-button-foreground)' + : 'var(--vscode-foreground)'}; + border: none; + cursor: pointer; + transition: background-color 0.15s ease; -const EmptyStateIcon = styled.div` - font-size: 48px; - margin-bottom: 20px; - opacity: 0.5; -`; + &:hover { + background: ${(props: { isActive: boolean }) => props.isActive + ? 'var(--vscode-button-hoverBackground)' + : 'var(--vscode-list-hoverBackground)'}; + } -const EmptyStateText = styled.div` - font-size: 16px; - margin-bottom: 8px; + &:first-of-type { + border-right: 1px solid var(--vscode-panel-border); + } `; -// Helper functions -const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { - if (!span.startTime || !span.endTime) return null; - return { - start: new Date(span.startTime).getTime(), - end: new Date(span.endTime).getTime() - }; -}; - -const timeContainsSpan = (parentSpan: SpanData, childSpan: SpanData): boolean => { - const parentRange = getSpanTimeRange(parentSpan); - const childRange = getSpanTimeRange(childSpan); - - if (!parentRange || !childRange) return false; - - // Parent contains child if it starts before/at and ends after/at, but they're not identical - return parentRange.start <= childRange.start && - parentRange.end >= childRange.end && - (parentRange.start < childRange.start || parentRange.end > childRange.end); -}; - -const sortSpansByUmbrellaFirst = (spans: SpanData[]): SpanData[] => { - return [...spans].sort((a, b) => { - const aRange = getSpanTimeRange(a); - const bRange = getSpanTimeRange(b); - - if (!aRange || !bRange) return 0; - - const aContainsB = timeContainsSpan(a, b); - const bContainsA = timeContainsSpan(b, a); - - if (aContainsB) return -1; // a comes first (umbrella) - if (bContainsA) return 1; // b comes first (umbrella) +// ============================================================================ +// DETAILS PANEL +// ============================================================================ - // Neither contains the other, sort by start time - return aRange.start - bRange.start; - }); -}; - -const formatDuration = (durationMs: number): string => { - return durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`; -}; +const DetailsPanel = styled.div` + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 16px; + margin-bottom: 4px; +`; -const getSpanDuration = (span: SpanData): number | null => { - const range = getSpanTimeRange(span); - return range ? range.end - range.start : null; -}; +// ============================================================================ +// COMPONENT DEFINITIONS +// ============================================================================ // Chevron component for tree items interface ChevronProps { @@ -502,61 +397,10 @@ const TreeChevronIcon: React.FC<ChevronProps> = ({ hasChildren, isExpanded, onCl </TreeChevron> ); -// AI Span Badge Component -interface AIBadgeProps { - type: string; -} - -const AIBadge: React.FC<AIBadgeProps> = ({ type }) => { - const getIconName = () => { - switch (type) { - case 'invoke': return 'bi-ai-agent'; - case 'chat': return 'bi-chat'; - case 'tool': return 'bi-wrench'; - default: return 'bi-action'; - } - }; - - const getLabel = () => { - switch (type) { - case 'invoke': return 'Invoke Agent'; - case 'chat': return 'Chat'; - case 'tool': return 'Execute Tool'; - default: return 'Operation'; - } - }; - - return ( - <AISpanBadge type={type}> - <Icon - name={getIconName()} - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - <span className="ai-span-label">{getLabel()}</span> - </AISpanBadge> - ); -}; - export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetailsProps) { - const [expandedSections, setExpandedSections] = useState<Set<string>>( - new Set(['trace', 'resource', 'scope', 'spans']) - ); const [expandedSpans, setExpandedSpans] = useState<Set<string>>(new Set()); const [selectedSpanId, setSelectedSpanId] = useState<string | null>(null); - const [showFullTrace, setShowFullTrace] = useState<boolean>(false); + const [showFullTrace] = useState<boolean>(false); const [isAdvancedMode, setIsAdvancedMode] = useState<boolean>(false); const [viewMode, setViewMode] = useState<'tree' | 'timeline'>('tree'); const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); @@ -585,16 +429,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai }; }, []); - const toggleSection = (section: string) => { - const newExpanded = new Set(expandedSections); - if (newExpanded.has(section)) { - newExpanded.delete(section); - } else { - newExpanded.add(section); - } - setExpandedSections(newExpanded); - }; - const toggleSpanExpansion = (spanId: string) => { const newExpanded = new Set(expandedSpans); if (newExpanded.has(spanId)) { @@ -633,21 +467,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai const duration = new Date(traceData.lastSeen).getTime() - new Date(traceData.firstSeen).getTime(); - const getSpanKindLabel = (kind: string | number): string => { - if (typeof kind === 'string') { - return kind; - } - const kindMap: { [key: number]: string } = { - 0: 'UNSPECIFIED', - 1: 'INTERNAL', - 2: 'SERVER', - 3: 'CLIENT', - 4: 'PRODUCER', - 5: 'CONSUMER' - }; - return kindMap[kind] || `UNKNOWN(${kind})`; - }; - // Build span hierarchy const spanMap = new Map<string, SpanData>(); const rootSpans: SpanData[] = []; @@ -669,16 +488,9 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai // Sort root spans: umbrella spans (those that contain others) come first, then by start time const sortedRootSpans = sortSpansByUmbrellaFirst(rootSpans); - // Select first span on load - // Debug: Log when selectedSpanId changes - useEffect(() => { - console.log('[TraceDetails] selectedSpanId changed to:', selectedSpanId); - }, [selectedSpanId]); - useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current) { - console.log('[TraceDetails] Auto-selecting first root span:', sortedRootSpans[0].spanId); setSelectedSpanId(sortedRootSpans[0].spanId); } }, [sortedRootSpans.length, focusSpanId, selectedSpanId]); @@ -712,21 +524,16 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai useEffect(() => { if (focusSpanId && traceData.spans.length > 0) { if (hasFocusedRef.current) { - console.log('[TraceDetails] Already focused, skipping'); return; } - console.log('[TraceDetails] Focusing on span:', focusSpanId); hasFocusedRef.current = true; // Expand all parent spans to make the focused span visible FIRST const span = traceData.spans.find(s => s.spanId === focusSpanId); if (!span) { - console.error('[TraceDetails] Span not found:', focusSpanId); return; } - console.log('[TraceDetails] Found span:', span.name); - const newExpanded = new Set(expandedSpans); let currentParentId = span.parentSpanId; @@ -734,7 +541,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai const parentSpan = traceData.spans.find(s => s.spanId === currentParentId); if (parentSpan) { newExpanded.add(currentParentId); - console.log('[TraceDetails] Expanding parent:', parentSpan.name); currentParentId = parentSpan.parentSpanId; } else { break; @@ -745,14 +551,10 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai setExpandedSpans(newExpanded); setSelectedSpanId(focusSpanId); - console.log('[TraceDetails] Switched to tree view and selected span:', focusSpanId); - // Scroll to the focused span after rendering setTimeout(() => { const spanElement = document.querySelector(`[data-span-id="${focusSpanId}"]`); - console.log('[TraceDetails] Looking for element with data-span-id:', focusSpanId, 'Found:', !!spanElement); if (spanElement) { - console.log('[TraceDetails] Scrolling to span element'); spanElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); } else { console.error('[TraceDetails] Could not find span element to scroll to'); @@ -807,7 +609,12 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai const selectedSpan = selectedSpanId ? spanMap.get(selectedSpanId) : null; - // Build AI span hierarchy based on time containment + /** + * Builds a hierarchy of AI spans based on time containment. + * Uses temporal relationships to determine parent-child structure. + * For each span, finds the smallest containing span as its parent. + * @returns Root AI spans (those with no time-based parent) sorted by start time + */ const buildAISpanHierarchy = () => { // First, identify all AI spans const aiSpans = traceData.spans.filter(span => @@ -950,27 +757,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai } }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); - // Get span type badge - const getSpanTypeBadge = (span: SpanData): string => { - const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; - if (operationName.startsWith('invoke_agent')) return 'invoke'; - if (operationName.startsWith('chat') || span.name.toLowerCase().startsWith('chat')) return 'chat'; - if (operationName.startsWith('execute_tool') || span.name.toLowerCase().startsWith('execute_tool')) return 'tool'; - return 'other'; - }; - - // Check if span has an error - const spanHasError = (span: SpanData): boolean => { - return span.attributes?.some(attr => attr.key === 'error.message' && attr.value) || false; - }; - - // Calculate total tokens for a span - const getSpanTokens = (span: SpanData): number => { - const inputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); - const outputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); - return inputTokens + outputTokens; - }; - // Totals across the trace (input/output separately) const { totalInputTokens, totalOutputTokens } = React.useMemo(() => { let inTotal = 0; @@ -984,32 +770,12 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai return { totalInputTokens: inTotal, totalOutputTokens: outTotal }; }, [traceData.spans]); - // Format date for display in tree - const formatStartTime = (dateString: string | undefined): string => { - if (!dateString) return ''; - const date = new Date(dateString); - return date.toLocaleString('en-US', { - month: 'short', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - hour12: false - }); - }; - - // Remove common prefixes from span names - const stripSpanPrefix = (spanName: string): string => { - const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; - for (const prefix of prefixes) { - if (spanName.startsWith(prefix)) { - return spanName.substring(prefix.length); - } - } - return spanName; - }; - - // Get AI child spans based on time containment + /** + * Gets AI child spans contained within a parent span's timeframe. + * Finds direct children only (not nested through intermediate AI spans). + * @param spanId - Parent span ID to find children for + * @returns Array of child AI spans sorted by start time + */ const getAIChildSpans = (spanId: string): SpanData[] => { const parentSpan = traceData.spans.find(s => s.spanId === spanId); if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) { @@ -1075,7 +841,12 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai }); }; - // Get non-AI child spans within an AI span's timeframe + /** + * Gets non-AI child spans within an AI span's timeframe. + * Excludes spans that are nested within child AI spans. + * @param parentSpanId - Parent AI span ID to find non-AI children for + * @returns Array of non-AI spans sorted by start time + */ const getNonAIChildSpans = (parentSpanId: string): SpanData[] => { const parentSpan = traceData.spans.find(s => s.spanId === parentSpanId); if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) { @@ -1131,7 +902,12 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai }); }; - // Group non-AI spans by type + /** + * Groups non-AI spans by their type/category. + * Categorizes spans as HTTP Calls, Database Operations, Client Calls, Server Operations, or Other. + * @param spans - Array of non-AI spans to group + * @returns Map of category names to arrays of spans + */ const groupNonAISpans = (spans: SpanData[]): Map<string, SpanData[]> => { const groups = new Map<string, SpanData[]>(); @@ -1174,11 +950,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai return sortSpansByUmbrellaFirst(children); }; - // Check if a span is an AI span - const isAISpan = (span: SpanData): boolean => { - return span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') || false; - }; - // Render non-AI span tree item hierarchically const renderNonAISpanTreeItem = (span: SpanData, spanList: SpanData[], nestLevel: number = 0): React.ReactNode => { const children = getChildSpansFromList(span.spanId, spanList); @@ -1267,31 +1038,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai <span style={{ width: '16px' }} /> )} </span> - <AISpanBadge type={badgeType}> - <Icon - name={badgeType === 'invoke' ? 'bi-ai-agent' : badgeType === 'chat' ? 'bi-chat' : badgeType === 'tool' ? 'bi-wrench' : 'bi-action'} - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - <span className="ai-span-label"> - {badgeType === 'invoke' && 'Invoke Agent'} - {badgeType === 'chat' && 'Chat'} - {badgeType === 'tool' && 'Execute Tool'} - {badgeType === 'other' && 'Operation'} - </span> - </AISpanBadge> + <AIBadge type={badgeType} /> <AISpanLabel> {stripSpanPrefix(span.name)} {spanHasError(span) && ( @@ -1686,17 +1433,11 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai )} */} {rootAISpans.length === 0 ? ( - <EmptyState> - <EmptyStateIcon> - <Codicon name="comment-discussion" /> - </EmptyStateIcon> - <EmptyStateText> - No AI agent interactions found in this trace - </EmptyStateText> - <EmptyStateText style={{ fontSize: '14px', opacity: 0.7 }}> - AI spans with span.type='ai' will appear here - </EmptyStateText> - </EmptyState> + <TraceEmptyState + icon="comment-discussion" + title="No AI agent interactions found in this trace" + subtitle="AI spans with span.type='ai' will appear here" + /> ) : ( <AgentChatLogsContainer> {viewMode === 'tree' ? ( diff --git a/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx b/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx new file mode 100644 index 00000000000..904afe2b814 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx @@ -0,0 +1,92 @@ +/** + * 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 styled from "@emotion/styled"; +import { Icon } from "@wso2/ui-toolkit"; + +interface AIBadgeProps { + type: 'invoke' | 'chat' | 'tool' | 'other'; +} + +const AISpanBadge = styled.span<{ type: string }>` + font-size: 10px; + padding: 3px 8px; + border-radius: 3px; + font-weight: 500; + flex-shrink: 0; + display: flex; + align-items: center; + gap: 4px; + background-color: var(--vscode-editor-background); + color: ${(props: { type: string }) => { + switch (props.type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-foreground)'; + } + }}; + border: 1px solid var(--vscode-dropdown-border); + + .ai-span-label { + color: var(--vscode-foreground); + } +`; + +export function AIBadge({ type }: AIBadgeProps) { + const getIconName = () => { + switch (type) { + case 'invoke': return 'bi-ai-agent'; + case 'chat': return 'bi-chat'; + case 'tool': return 'bi-wrench'; + default: return 'bi-action'; + } + }; + + const getLabel = () => { + switch (type) { + case 'invoke': return 'Invoke Agent'; + case 'chat': return 'Chat'; + case 'tool': return 'Execute Tool'; + default: return 'Operation'; + } + }; + + return ( + <AISpanBadge type={type}> + <Icon + name={getIconName()} + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + <span className="ai-span-label">{getLabel()}</span> + </AISpanBadge> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 82f35b4ecd4..1c143eee453 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -20,6 +20,7 @@ import { useState, useMemo, ReactNode, useEffect } from "react"; import styled from "@emotion/styled"; import { Codicon } from "@wso2/ui-toolkit"; import { CopyButton } from "./CopyButton"; +import { parseNestedJSON } from "../utils"; // Configurable auto-expand depth export const DEFAULT_AUTO_EXPAND_DEPTH = 2; @@ -54,7 +55,8 @@ const NodeRow = styled.div` &:hover { background-color: var(--vscode-list-hoverBackground); - & > span:last-child { + & > span:last-child, + & > span:last-child button { opacity: 1; } } @@ -71,7 +73,8 @@ const ExpandableRow = styled.div` &:hover { background-color: var(--vscode-list-hoverBackground); - & > span:last-child { + & > span:last-child, + & > span:last-child button { opacity: 1; } } @@ -102,18 +105,19 @@ const KeyBadge = styled.span<{ isArrayIndex?: boolean }>` border-radius: 3px; min-height: 18px; background-color: ${(props: { isArrayIndex?: boolean }) => props.isArrayIndex - ? 'var(--vscode-list-hoverBackground)' - : 'var(--vscode-badge-background)'}; + ? 'var(--vscode-badge-background)' + : 'var(--vscode-list-hoverBackground)'}; color: ${(props: { isArrayIndex?: boolean }) => props.isArrayIndex - ? 'var(--vscode-editor-foreground)' - : 'var(--vscode-badge-foreground)'}; + ? 'var(--vscode-badge-foreground)' + : 'var(--vscode-editor-foreground)'}; + border: 1px solid var(--vscode-button-border); flex-shrink: 0; `; const ValueText = styled.span` color: var(--vscode-editor-foreground); word-break: break-word; - flex: 1; + flex: 0 1 auto; margin-left: 6px; `; @@ -135,66 +139,9 @@ const Highlight = styled.mark` const CopyWrapper = styled.span` opacity: 0; transition: opacity 0.15s ease; + margin-left: 6px; `; -// Helper function to fix invalid JSON escape sequences -function fixJSONEscapes(str: string): string { - // Strategy: First escape all backslashes, then unescape valid JSON sequences - // This handles cases like \times where \t would be interpreted as tab - - // Step 1: Escape all backslashes - let result = str.replace(/\\/g, '\\\\'); - - // Step 2: Unescape valid JSON escape sequences - // Valid: \", \\, \/, \b, \f, \n, \r, \t, \uXXXX - result = result.replace(/\\\\\\(["\\/@bfnrt])/g, '\\$1'); - result = result.replace(/\\\\\\u([0-9a-fA-F]{4})/g, '\\u$1'); - - return result; -} - -// Helper function to check if a string is valid JSON -function isJSONString(str: string): boolean { - if (!str || typeof str !== 'string') return false; - const trimmed = str.trim(); - if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return false; - try { - const fixed = fixJSONEscapes(trimmed); - JSON.parse(fixed); - return true; - } catch (e) { - console.log('JSON parse failed:', e, 'Input:', trimmed.substring(0, 100)); - return false; - } -} - -// Parse nested JSON strings recursively -function parseNestedJSON(value: unknown): unknown { - if (typeof value === 'string') { - const trimmed = value.trim(); - if (isJSONString(trimmed)) { - try { - const parsed = JSON.parse(fixJSONEscapes(trimmed)); - return parseNestedJSON(parsed); - } catch (e) { - console.log('Failed to parse nested JSON:', e, 'Value:', trimmed.substring(0, 100)); - return value; - } - } - } - if (Array.isArray(value)) { - return value.map(item => parseNestedJSON(item)); - } - if (value !== null && typeof value === 'object') { - const result: Record<string, unknown> = {}; - for (const [key, val] of Object.entries(value)) { - result[key] = parseNestedJSON(val); - } - return result; - } - return value; -} - // Highlight search matches in text function highlightText(text: string, searchQuery: string): ReactNode { if (!searchQuery) return text; @@ -385,6 +332,16 @@ export function JsonTreeViewer({ }); }; + const isFlatRoot = useMemo(() => { + if (Array.isArray(parsedData)) { + return parsedData.every(item => item === null || typeof item !== 'object'); + } + if (parsedData !== null && typeof parsedData === 'object') { + return Object.values(parsedData).every(v => v === null || typeof v !== 'object'); + } + return true; + }, [parsedData]); + const renderValue = ( value: unknown, key: string, @@ -455,7 +412,7 @@ export function JsonTreeViewer({ // Handle primitives return ( <NodeRow key={path}> - <Spacer /> + {!isFlatRoot && <Spacer />} <KeyBadge isArrayIndex={isArrayIndex}> {highlightText(key, searchQuery)} </KeyBadge> diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 31695694fce..de5b298e2fa 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -21,6 +21,7 @@ import styled from "@emotion/styled"; import { Icon } from "@wso2/ui-toolkit"; import { JsonTreeViewer, DEFAULT_AUTO_EXPAND_DEPTH } from "./JsonTreeViewer"; import { CopyButton } from "./CopyButton"; +import { tryParseJSON, isJSONString, parseNestedJSON } from "../utils"; import ReactMarkdown from 'react-markdown'; import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; @@ -326,73 +327,15 @@ const JsonPunctuation = styled.span` color: var(--vscode-foreground); `; -// Helper function to fix invalid JSON escape sequences -function fixJSONEscapes(str: string): string { - // Strategy: First escape all backslashes, then unescape valid JSON sequences - // This handles cases like \times where \t would be interpreted as tab - - // Step 1: Escape all backslashes - let result = str.replace(/\\/g, '\\\\'); - - // Step 2: Unescape valid JSON escape sequences - // Valid: \", \\, \/, \b, \f, \n, \r, \t, \uXXXX - result = result.replace(/\\\\\\(["\\/@bfnrt])/g, '\\$1'); - result = result.replace(/\\\\\\u([0-9a-fA-F]{4})/g, '\\u$1'); - - return result; -} - -// Helper function to check if a string is valid JSON -function isJSONString(str: string): boolean { - if (!str || typeof str !== 'string') return false; - const trimmed = str.trim(); - if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return false; - try { - const fixed = fixJSONEscapes(trimmed); - JSON.parse(fixed); - return true; - } catch (e) { - console.log('JSON parse failed:', e, 'Input:', trimmed.substring(0, 100)); - return false; - } -} - -// Parse nested JSON strings recursively for formatting -function parseNestedJSON(value: unknown): unknown { - if (typeof value === 'string') { - const trimmed = value.trim(); - if (isJSONString(trimmed)) { - try { - const parsed = JSON.parse(fixJSONEscapes(trimmed)); - return parseNestedJSON(parsed); - } catch (e) { - console.log('Failed to parse nested JSON:', e, 'Value:', trimmed.substring(0, 100)); - return value; - } - } - } - if (Array.isArray(value)) { - return value.map(item => parseNestedJSON(item)); - } - if (value !== null && typeof value === 'object') { - const result: Record<string, unknown> = {}; - for (const [key, val] of Object.entries(value)) { - result[key] = parseNestedJSON(val); - } - return result; - } - return value; -} - // Format JSON with nested parsing function formatJSON(str: string): string { try { const trimmed = str.trim(); - const parsed = JSON.parse(fixJSONEscapes(trimmed)); + const parsed = tryParseJSON(trimmed); const deepParsed = parseNestedJSON(parsed); return JSON.stringify(deepParsed, null, 2); } catch (e) { - console.log('Failed to format JSON:', e); + console.error('Failed to format JSON:', e); return str; } } @@ -544,7 +487,10 @@ export function JsonViewer({ maxAutoExpandDepth = DEFAULT_AUTO_EXPAND_DEPTH, expandLastOnly = false }: JsonViewerProps) { - const isJSON = useMemo(() => isJSONString(value), [value]); + const isJSON = useMemo(() => { + const result = isJSONString(value); + return result; + }, [value]); const hasMarkdown = useMemo(() => { const result = !isJSON && mightContainMarkdown(value); return result; @@ -595,7 +541,17 @@ export function JsonViewer({ if (!isJSON) return null; try { const trimmed = value.trim(); - return JSON.parse(fixJSONEscapes(trimmed)); + let jsonStr = trimmed; + + // If it's a stringified JSON (starts with quotes), unwrap it first + if (trimmed.startsWith('"') && trimmed.endsWith('"')) { + const unescaped = JSON.parse(trimmed); + if (typeof unescaped === 'string') { + jsonStr = unescaped; + } + } + + return tryParseJSON(jsonStr); } catch { return null; } @@ -603,7 +559,21 @@ export function JsonViewer({ const formattedJSON = useMemo(() => { if (!isJSON) return value; - return formatJSON(value); + + let jsonStr = value.trim(); + // If it's a stringified JSON, unwrap it first + if (jsonStr.startsWith('"') && jsonStr.endsWith('"')) { + try { + const unescaped = JSON.parse(jsonStr); + if (typeof unescaped === 'string') { + jsonStr = unescaped; + } + } catch { + // Keep original if unwrapping fails + } + } + + return formatJSON(jsonStr); }, [value, isJSON]); // If not JSON, show raw text or markdown diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 95a33fe0f78..2f48982fb27 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -75,7 +75,7 @@ const IdButton = styled.button` display: flex; align-items: center; justify-content: center; - background: transparent; + background: var(--vscode-sideBar-background); border: 1px solid var(--vscode-panel-border); border-radius: 4px; padding: 4px 8px; diff --git a/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx b/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx new file mode 100644 index 00000000000..6a28fb83d63 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.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 styled from "@emotion/styled"; +import { Codicon } from "@wso2/ui-toolkit"; + +interface TraceEmptyStateProps { + icon?: string; + title: string; + subtitle?: string; +} + +const EmptyState = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 400px; + text-align: center; + padding: 40px; + color: var(--vscode-descriptionForeground); +`; + +const EmptyStateIcon = styled.div` + font-size: 48px; + margin-bottom: 20px; + opacity: 0.5; +`; + +const EmptyStateText = styled.div` + font-size: 16px; + margin-bottom: 8px; +`; + +export function TraceEmptyState({ icon = 'comment-discussion', title, subtitle }: TraceEmptyStateProps) { + return ( + <EmptyState> + <EmptyStateIcon> + <Codicon name={icon} /> + </EmptyStateIcon> + <EmptyStateText> + {title} + </EmptyStateText> + {subtitle && ( + <EmptyStateText style={{ fontSize: '14px', opacity: 0.7 }}> + {subtitle} + </EmptyStateText> + )} + </EmptyState> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/utils.ts b/workspaces/ballerina/trace-visualizer/src/utils.ts index 84523f8f049..7c0b690627a 100644 --- a/workspaces/ballerina/trace-visualizer/src/utils.ts +++ b/workspaces/ballerina/trace-visualizer/src/utils.ts @@ -16,6 +16,115 @@ * under the License. */ +import { SpanData } from './index'; + +export const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { + if (!span.startTime || !span.endTime) return null; + return { + start: new Date(span.startTime).getTime(), + end: new Date(span.endTime).getTime() + }; +}; + +export const timeContainsSpan = (parentSpan: SpanData, childSpan: SpanData): boolean => { + const parentRange = getSpanTimeRange(parentSpan); + const childRange = getSpanTimeRange(childSpan); + + if (!parentRange || !childRange) return false; + + // Parent contains child if it starts before/at and ends after/at, but they're not identical + return parentRange.start <= childRange.start && + parentRange.end >= childRange.end && + (parentRange.start < childRange.start || parentRange.end > childRange.end); +}; + +export const sortSpansByUmbrellaFirst = (spans: SpanData[]): SpanData[] => { + return [...spans].sort((a, b) => { + const aRange = getSpanTimeRange(a); + const bRange = getSpanTimeRange(b); + + if (!aRange || !bRange) return 0; + + const aContainsB = timeContainsSpan(a, b); + const bContainsA = timeContainsSpan(b, a); + + if (aContainsB) return -1; // a comes first (umbrella) + if (bContainsA) return 1; // b comes first (umbrella) + + // Neither contains the other, sort by start time + return aRange.start - bRange.start; + }); +}; + +export const formatDuration = (durationMs: number): string => { + return durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`; +}; + +export const getSpanDuration = (span: SpanData): number | null => { + const range = getSpanTimeRange(span); + return range ? range.end - range.start : null; +}; + +export const formatStartTime = (dateString: string | undefined): string => { + if (!dateString) return ''; + const date = new Date(dateString); + return date.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false + }); +}; + +export const getSpanKindLabel = (kind: string | number): string => { + if (typeof kind === 'string') { + return kind; + } + const kindMap: { [key: number]: string } = { + 0: 'UNSPECIFIED', + 1: 'INTERNAL', + 2: 'SERVER', + 3: 'CLIENT', + 4: 'PRODUCER', + 5: 'CONSUMER' + }; + return kindMap[kind] || `UNKNOWN(${kind})`; +}; + +export const stripSpanPrefix = (spanName: string): string => { + const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; + for (const prefix of prefixes) { + if (spanName.startsWith(prefix)) { + return spanName.substring(prefix.length); + } + } + return spanName; +}; + +export const getSpanTypeBadge = (span: SpanData): 'invoke' | 'chat' | 'tool' | 'other' => { + const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; + if (operationName.startsWith('invoke_agent')) return 'invoke'; + if (operationName.startsWith('chat') || span.name.toLowerCase().startsWith('chat')) return 'chat'; + if (operationName.startsWith('execute_tool') || span.name.toLowerCase().startsWith('execute_tool')) return 'tool'; + return 'other'; +}; + +export const spanHasError = (span: SpanData): boolean => { + return span.attributes?.some(attr => attr.key === 'error.message' && attr.value) || false; +}; + +export const getSpanTokens = (span: SpanData): number => { + const inputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); + const outputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); + return inputTokens + outputTokens; +}; + +export const isAISpan = (span: SpanData): boolean => { + return span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') || false; +}; + export const extractUserErrorDetails = (text: string | null) => { if (typeof text !== "string") return null; @@ -44,3 +153,98 @@ export const extractUserErrorDetails = (text: string | null) => { return results.length ? results : null; } + +export function fixJSONEscapes(str: string): string { + // Escape all backslashes + let result = str.replace(/\\/g, '\\\\'); + + // Unescape valid JSON escape sequences + // Valid: \", \\, \/, \b, \f, \n, \r, \t, \uXXXX + result = result.replace(/\\\\\\(["\\/@bfnrt])/g, '\\$1'); + result = result.replace(/\\\\\\u([0-9a-fA-F]{4})/g, '\\u$1'); + + return result; +} + +export function tryParseJSON(str: string): any { + const strategies = [ + // Strategy 1: Direct parse + () => JSON.parse(str), + + // Strategy 2: With fixJSONEscapes + () => JSON.parse(fixJSONEscapes(str)), + + // Strategy 3: Parse as relaxed JSON5-style (handles trailing commas, unquoted keys, etc) + // This uses a simple technique: wrap in eval with proper safeguards + () => { + // Only try this if it looks like valid JSON structure + if (!str.trim().match(/^[\[{]/)) throw new Error('Not JSON-like'); + + // Use Function constructor as safer alternative to eval + // This handles some relaxed JSON formats + return JSON.parse(str + .replace(/,(\s*[}\]])/g, '$1') // Remove trailing commas + .replace(/\n/g, '\\n') // Escape literal newlines + .replace(/\r/g, '\\r') // Escape literal carriage returns + .replace(/\t/g, '\\t') // Escape literal tabs + ); + } + ]; + + let lastError: any; + for (const strategy of strategies) { + try { + return strategy(); + } catch (e) { + lastError = e; + continue; + } + } + + throw lastError; +} + +export function isJSONString(str: string): boolean { + if (!str || typeof str !== 'string') return false; + const trimmed = str.trim(); + + // Check for direct JSON objects/arrays + if (trimmed.startsWith('{') || trimmed.startsWith('[')) { + try { + tryParseJSON(trimmed); + return true; + } catch (e) { + console.error('JSON parse failed:', e, 'Input:', trimmed.substring(0, 100)); + return false; + } + } + + console.error('Not detected as JSON. Starts with:', trimmed.substring(0, 20)); + return false; +} + +export function parseNestedJSON(value: unknown): unknown { + if (typeof value === 'string') { + const trimmed = value.trim(); + if (isJSONString(trimmed)) { + try { + const parsed = tryParseJSON(trimmed); + return parseNestedJSON(parsed); + } catch (e) { + console.error('Failed to parse nested JSON:', e, 'Value:', trimmed.substring(0, 100)); + return value; + } + } + } + if (Array.isArray(value)) { + return value.map(item => parseNestedJSON(item)); + } + if (value !== null && typeof value === 'object') { + const result: Record<string, unknown> = {}; + for (const [key, val] of Object.entries(value)) { + result[key] = parseNestedJSON(val); + } + return result; + } + return value; +} From 4a826735bff13764cfc5f7325c1463785b508579 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 18 Jan 2026 22:13:44 +0530 Subject: [PATCH 107/247] Update execution steps UI in agent chat window --- .../src/rpc-types/agent-chat/index.ts | 4 +- .../src/rpc-types/agent-chat/interfaces.ts | 12 + .../rpc-managers/agent-chat/rpc-manager.ts | 113 +++++++- .../Components/ChatInterface.tsx | 42 ++- .../Components/ExecutionSteps.tsx | 156 ----------- .../Components/ExecutionStepsButton.tsx | 60 ----- .../Components/ExecutionStepsList.tsx | 123 --------- .../Components/ExecutionTimeline.tsx | 254 ++++++++++++++++++ .../trace-visualizer/src/TraceDetails.tsx | 8 +- .../font-wso2-vscode/src/icons/bi-user.svg | 24 +- 10 files changed, 403 insertions(+), 393 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts index cafce784a40..2116e85932d 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse } from "./interfaces"; +import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, ExecutionStep } from "./interfaces"; export interface AgentChatAPI { getChatMessage: (params: ChatReqMessage) => Promise<ChatRespMessage>; @@ -28,4 +28,4 @@ export interface AgentChatAPI { getAgentStatus: () => Promise<AgentStatusResponse>; } -export type { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse }; +export type { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, ExecutionStep }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index ced82259d37..553694b808d 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -24,6 +24,7 @@ export interface ChatRespMessage { message: string; traceId?: string; toolCalls?: ToolCallSummary[]; + executionSteps?: ExecutionStep[]; } export interface ToolCallSummary { @@ -32,6 +33,17 @@ export interface ToolCallSummary { output: string; } +export interface ExecutionStep { + spanId: string; + operationType: 'invoke' | 'chat' | 'tool' | 'other'; + name: string; + fullName: string; + duration: number; + startTime?: string; + endTime?: string; + hasError?: boolean; +} + export interface TraceStatus { enabled: boolean; } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index ced4c9e0767..e5e0ab1d815 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -21,6 +21,7 @@ import { ChatReqMessage, ChatRespMessage, ToolCallSummary, + ExecutionStep, TraceInput, TraceStatus, ChatHistoryMessage, @@ -83,12 +84,15 @@ export class AgentChatRpcManager implements AgentChatAPI { traceId: trace?.traceId }); - // Find trace and extract tool calls + // Find trace and extract tool calls and execution steps const trace = this.findTraceForMessage(params.message); + const toolCalls = trace ? this.extractToolCalls(trace) : undefined; + const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; resolve({ message: response.message, - traceId: trace?.traceId + traceId: trace?.traceId, + executionSteps } as ChatRespMessage); } else { reject(new Error("Invalid response format:", response)); @@ -325,6 +329,111 @@ export class AgentChatRpcManager implements AgentChatAPI { return toolCalls; } + /** + * Remove operation prefixes from span names + * @param name The span name to clean + * @returns The cleaned span name + */ + private stripSpanPrefix(name: string): string { + const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; + for (const prefix of prefixes) { + if (name.startsWith(prefix)) { + return name.substring(prefix.length); + } + } + return name; + } + + /** + * Extract execution steps from a trace + * @param trace The trace to extract execution steps from + * @returns Array of execution steps sorted chronologically + */ + private extractExecutionSteps(trace: Trace): ExecutionStep[] { + const steps: ExecutionStep[] = []; + + // Helper function to extract string value from attribute value + const extractValue = (value: any): string => { + if (typeof value === 'string') { + return value; + } + if (value && typeof value === 'object' && 'stringValue' in value) { + return String(value.stringValue); + } + return ''; + }; + + // Iterate through all spans in the trace + for (const span of trace.spans || []) { + const attributes = span.attributes || []; + + let operationName = ''; + let toolName = ''; + let hasError = false; + + // Extract relevant attributes + for (const attr of attributes) { + const value = extractValue(attr.value); + + if (attr.key === 'gen_ai.operation.name') { + operationName = value; + } else if (attr.key === 'gen_ai.tool.name') { + toolName = value; + } else if (attr.key === 'error.message') { + hasError = true; + } + } + + // Determine operation type based on operation name + let operationType: 'invoke' | 'chat' | 'tool' | 'other' = 'other'; + let displayName = operationName; + + if (operationName.startsWith('invoke_agent')) { + operationType = 'invoke'; + displayName = this.stripSpanPrefix(span.name); + } else if (operationName.startsWith('chat')) { + operationType = 'chat'; + displayName = this.stripSpanPrefix(span.name); + } else if (operationName.startsWith('execute_tool')) { + operationType = 'tool'; + displayName = toolName || this.stripSpanPrefix(span.name); + } else { + // Skip spans that don't match our criteria + continue; + } + + // Calculate duration from ISO timestamps + const startTimeISO = span.startTime; + const endTimeISO = span.endTime; + let duration = 0; + + if (startTimeISO && endTimeISO) { + const startMs = new Date(startTimeISO).getTime(); + const endMs = new Date(endTimeISO).getTime(); + duration = endMs - startMs; + } + + steps.push({ + spanId: span.spanId, + operationType, + name: displayName, + fullName: operationName, + duration, + startTime: startTimeISO, + endTime: endTimeISO, + hasError + }); + } + + // Sort by start time chronologically + steps.sort((a, b) => { + if (!a.startTime || !b.startTime) { return 0; } + return a.startTime.localeCompare(b.startTime); + }); + + return steps; + } + /** * Show trace details webview for a given chat message * Finds the trace matching the message and opens it in the trace details webview diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index b5c9cca00b2..d0b1b45f1ce 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -22,8 +22,7 @@ import React, { useState, useEffect, useRef } from "react"; import styled from "@emotion/styled"; import ChatInput from "./ChatInput"; import LoadingIndicator from "./LoadingIndicator"; -import ExecutionStepsButton from "./ExecutionStepsButton"; -import ExecutionStepsList from "./ExecutionStepsList"; +import { ExecutionTimeline } from "./ExecutionTimeline"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Codicon, Icon, Button, ThemeColors } from "@wso2/ui-toolkit"; import ReactMarkdown from "react-markdown"; @@ -31,7 +30,7 @@ import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; import rehypeKatex from 'rehype-katex'; import 'katex/dist/katex.min.css'; -import { ToolCallSummary } from "@wso2/ballerina-core"; +import { ToolCallSummary, ExecutionStep } from "@wso2/ballerina-core"; enum ChatMessageType { MESSAGE = "message", @@ -43,6 +42,7 @@ interface ChatMessage { text: string; isUser: boolean; traceId?: string; + executionSteps?: ExecutionStep[]; } // ---------- WATER MARK ---------- @@ -369,7 +369,8 @@ const ChatInterface: React.FC = () => { text: chatResponse.message, isUser: false, traceId: chatResponse.traceId, - toolCalls: chatResponse.toolCalls + toolCalls: chatResponse.toolCalls, + executionSteps: chatResponse.executionSteps }, ]); } catch (error) { @@ -473,6 +474,14 @@ const ChatInterface: React.FC = () => { {/* Render each message */} {messages.map((msg, idx) => ( <React.Fragment key={idx}> + {/* Show execution timeline ABOVE agent message if available */} + {!msg.isUser && msg?.executionSteps && msg.executionSteps.length > 0 && msg.traceId && ( + <ExecutionTimeline + steps={msg.executionSteps} + traceId={msg.traceId} + onViewInTrace={handleViewInTrace} + /> + )} <MessageContainer isUser={msg.isUser}> {!msg.isUser && ( <ProfilePic> @@ -509,29 +518,14 @@ const ChatInterface: React.FC = () => { </ProfilePic> )} </MessageContainer> - {!msg.isUser && (msg?.toolCalls || isTracingEnabled) && ( + {/* Show "View All Logs" link below message if tracing is enabled */} + {!msg.isUser && isTracingEnabled && ( <MessageActionsContainer> - {isTracingEnabled && ( - <ShowLogsButton onClick={() => handleShowLogs(idx)}> - Show logs - </ShowLogsButton> - )} - {msg?.toolCalls?.length > 0 && msg.traceId && ( - <ExecutionStepsButton - isExpanded={expandedSteps[idx] || false} - onToggle={() => setExpandedSteps(prev => ({ ...prev, [idx]: !prev[idx] }))} - /> - )} + <ShowLogsButton onClick={() => handleShowLogs(idx)}> + View All Logs + </ShowLogsButton> </MessageActionsContainer> )} - {/* Show ExecutionStepsList in a separate container when expanded */} - {!msg.isUser && msg?.toolCalls?.length > 0 && msg.traceId && expandedSteps[idx] && ( - <ExecutionStepsList - toolCalls={msg.toolCalls} - traceId={msg.traceId} - onViewInTrace={handleViewInTrace} - /> - )} </React.Fragment> ))} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx deleted file mode 100644 index cb31bf763b5..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionSteps.tsx +++ /dev/null @@ -1,156 +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, { useState } from 'react'; -import styled from '@emotion/styled'; -import { Codicon, Icon } from '@wso2/ui-toolkit'; -import { ToolCallSummary } from '@wso2/ballerina-core'; - -interface ExecutionStepsProps { - toolCalls: ToolCallSummary[]; - traceId: string; - onViewInTrace: (traceId: string, spanId: string) => void; -} - -const ExecutionSteps: React.FC<ExecutionStepsProps> = ({ toolCalls, traceId, onViewInTrace }) => { - const [isExpanded, setIsExpanded] = useState(false); - - if (!toolCalls || toolCalls.length === 0) { - return null; - } - - return ( - <> - <StepsToggle onClick={() => setIsExpanded(!isExpanded)}> - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - <ToggleText> - {isExpanded ? 'Hide' : 'View'} execution steps - </ToggleText> - </StepsToggle> - - {isExpanded && ( - <StepsContent> - {toolCalls.map((tool, idx) => ( - <ToolStep key={tool.spanId}> - <StepNumber>{idx + 1}.</StepNumber> - <Icon name="bi-wrench" - sx={{ - fontSize: '14px', - width: '14px', - height: '14px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - <ToolInfo> - <ToolName>{tool.toolName}</ToolName> - </ToolInfo> - <JumpLink onClick={() => onViewInTrace(traceId, tool.spanId)}> - Jump to span → - </JumpLink> - </ToolStep> - ))} - </StepsContent> - )} - </> - ); -}; - -// Styled components -const StepsToggle = styled.button` - display: flex; - align-items: center; - gap: 2px; - background: none; - border: none; - color: var(--vscode-textLink-foreground); - font-size: 12px; - padding: 4px 0; - cursor: pointer; - - &:hover { - text-decoration: underline; - color: var(--vscode-textLink-activeForeground); - } -`; - -const ToggleText = styled.span` - font-size: 12px; -`; - -const StepsContent = styled.div` - margin-top: 8px; - margin-left: 24px; - display: flex; - flex-direction: column; - gap: 6px; - max-width: 600px; - width: 100%; -`; - -const ToolStep = styled.div` - display: flex; - align-items: center; - gap: 4px; - padding: 6px 8px; - background: var(--vscode-input-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - font-size: 12px; -`; - -const StepNumber = styled.span` - color: var(--vscode-descriptionForeground); - font-weight: 500; - min-width: 20px; -`; - -const ToolInfo = styled.div` - flex: 1; - display: flex; - align-items: center; - gap: 6px; - overflow: hidden; -`; - -const ToolName = styled.span` - font-weight: 500; - color: var(--vscode-foreground); -`; - -const JumpLink = styled.button` - background: none; - border: none; - color: var(--vscode-textLink-foreground); - font-size: 11px; - padding: 0; - cursor: pointer; - white-space: nowrap; - - &:hover { - text-decoration: underline; - } -`; - -export default ExecutionSteps; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx deleted file mode 100644 index 5169b92fc04..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsButton.tsx +++ /dev/null @@ -1,60 +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 { Codicon } from '@wso2/ui-toolkit'; - -interface ExecutionStepsButtonProps { - isExpanded: boolean; - onToggle: () => void; -} - -const ExecutionStepsButton: React.FC<ExecutionStepsButtonProps> = ({ isExpanded, onToggle }) => { - return ( - <StepsToggle onClick={onToggle}> - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - <ToggleText> - {isExpanded ? 'Hide' : 'View'} execution steps - </ToggleText> - </StepsToggle> - ); -}; - -const StepsToggle = styled.button` - display: flex; - align-items: center; - gap: 2px; - background: none; - border: none; - color: var(--vscode-textLink-foreground); - font-size: 12px; - padding: 4px 0; - cursor: pointer; - - &:hover { - text-decoration: underline; - color: var(--vscode-textLink-activeForeground); - } -`; - -const ToggleText = styled.span` - font-size: 12px; -`; - -export default ExecutionStepsButton; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx deleted file mode 100644 index 47027fd625e..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionStepsList.tsx +++ /dev/null @@ -1,123 +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 { Codicon, Icon } from '@wso2/ui-toolkit'; -import { ToolCallSummary } from '@wso2/ballerina-core'; - -interface ExecutionStepsListProps { - toolCalls: ToolCallSummary[]; - traceId: string; - onViewInTrace: (traceId: string, spanId: string) => void; -} - -const ExecutionStepsList: React.FC<ExecutionStepsListProps> = ({ toolCalls, traceId, onViewInTrace }) => { - if (!toolCalls || toolCalls.length === 0) { - return null; - } - - return ( - <StepsContent> - {toolCalls.map((tool, idx) => ( - <ToolStep key={tool.spanId} onClick={() => onViewInTrace(traceId, tool.spanId)}> - <StepNumber>{idx + 1}.</StepNumber> - <Icon name="bi-wrench" - sx={{ - fontSize: '14px', - width: '14px', - height: '14px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - <ToolInfo> - <ToolName>{tool.toolName}</ToolName> - </ToolInfo> - <JumpLink> - <Codicon name="chevron-right" /> - </JumpLink> - </ToolStep> - ))} - </StepsContent> - ); -}; - -const StepsContent = styled.div` - margin-left: 24px; - display: flex; - flex-direction: column; - gap: 4px; -`; - -const ToolStep = styled.div` - display: flex; - align-items: center; - gap: 4px; - padding: 6px 8px; - background: var(--vscode-input-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - font-size: 12px; - max-width: 40%; - cursor: pointer; - - &:hover { - background: var(--vscode-list-hoverBackground); - } -`; - -const StepNumber = styled.span` - color: var(--vscode-descriptionForeground); - font-weight: 500; - min-width: 20px; -`; - -const ToolInfo = styled.div` - flex: 1; - display: flex; - align-items: center; - gap: 6px; - overflow: hidden; -`; - -const ToolName = styled.span` - font-weight: 500; - color: var(--vscode-foreground); -`; - -const JumpLink = styled.button` - background: none; - border: none; - font-size: 11px; - padding: 0; - cursor: pointer; - white-space: nowrap; - - &:hover { - text-decoration: underline; - } -`; - -export default ExecutionStepsList; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx new file mode 100644 index 00000000000..9e421f07eab --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx @@ -0,0 +1,254 @@ +/** + * 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 { useState } from "react"; +import styled from "@emotion/styled"; +import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { ExecutionStep } from "@wso2/ballerina-core"; + +interface ExecutionTimelineProps { + steps: ExecutionStep[]; + traceId: string; + onViewInTrace: (traceId: string, spanId: string) => void; +} + +const TimelineContainer = styled.div` + max-width: 600px; + margin: 12px 0 0 24px; +`; + +const TimelineTitle = styled.div` + font-size: 11px; + color: var(--vscode-descriptionForeground); + letter-spacing: 0.5px; +`; + +const TimelineHeader = styled.button` + display: flex; + align-items: center; + gap: 2px; + background: transparent; + border: none; + padding: 0; + cursor: pointer; +`; + +const ToggleIcon = styled.span<{ isOpen: boolean }>` + color: var(--vscode-descriptionForeground); + display: inline-flex; + align-items: center; + justify-content: center; + transition: transform 0.15s ease; + transform: ${(props: { isOpen: boolean }) => (props.isOpen ? "rotate(90deg)" : "rotate(0deg)")}; +`; + +const TimelineList = styled.div` + margin-top: 8px; + margin-bottom: 4px; + display: flex; + flex-direction: column; + gap: 0; +`; + +const TimelineItem = styled.div` + display: flex; + align-items: flex-start; + position: relative; + margin-bottom: 8px; + + &:last-of-type { + margin-bottom: 0; + } +`; + +const ConnectorColumn = styled.div<{ isLast: boolean }>` + width: 20px; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + flex-shrink: 0; + padding-top: 4px; + + &::after { + content: ''; + position: absolute; + top: 14px; + left: 50%; + transform: translateX(-50%); + width: 1px; + height: calc(100% + 8px); + background-color: var(--vscode-panel-border); + display: ${(props: { isLast: boolean }) => props.isLast ? 'none' : 'block'}; + } +`; + +const Dot = styled.div<{ operationType: string }>` + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--vscode-panel-border); + z-index: 1; + flex-shrink: 0; +`; + +const ContentCard = styled.div` + width: 60%; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 8px 12px; + cursor: pointer; + transition: background-color 0.15s ease; + + &:hover { + background: var(--vscode-list-hoverBackground); + } +`; + +const CardContent = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const IconBadge = styled.div<{ operationType: string }>` + display: flex; + align-items: center; + justify-content: center; + color: ${(props: { operationType: string; }) => { + switch (props.operationType) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + default: return 'var(--vscode-badge-foreground)'; + } + }}; + flex-shrink: 0; +`; + +const OperationLabel = styled.span<{ operationType: string }>` + font-size: 10px; + font-weight: 600; + flex-shrink: 0; +`; + +const SpanName = styled.span` + font-size: 12px; + color: var(--vscode-foreground); + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +const Duration = styled.span` + font-size: 11px; + color: var(--vscode-descriptionForeground); + flex-shrink: 0; + margin-left: auto; +`; + +export function ExecutionTimeline({ steps, traceId, onViewInTrace }: ExecutionTimelineProps) { + if (!steps || steps.length === 0) { + return null; + } + + const [open, setOpen] = useState(false); + + const getIconName = (operationType: string) => { + switch (operationType) { + case 'invoke': return 'bi-ai-agent'; + case 'chat': return 'bi-chat'; + case 'tool': return 'bi-wrench'; + default: return 'bi-action'; + } + }; + + const getOperationLabel = (operationType: string) => { + switch (operationType) { + case 'invoke': return 'Invoke Agent'; + case 'chat': return 'Chat'; + case 'tool': return 'Execute Tool'; + default: return 'Other'; + } + }; + + const formatDuration = (ms: number) => { + if (ms < 1000) { + return `${Math.round(ms)}ms`; + } + return `${(ms / 1000).toFixed(2)}s`; + }; + + return ( + <TimelineContainer> + <TimelineHeader onClick={() => setOpen(!open)} aria-expanded={open}> + <TimelineTitle>Execution Steps ({steps.length})</TimelineTitle> + <ToggleIcon isOpen={open}> + <Codicon name="chevron-right" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + </ToggleIcon> + </TimelineHeader> + {open && ( + <TimelineList> + {steps.map((step, index) => ( + <TimelineItem key={step.spanId}> + <ConnectorColumn isLast={index === steps.length - 1}> + <Dot operationType={step.operationType} /> + </ConnectorColumn> + <ContentCard + onClick={() => onViewInTrace(traceId, step.spanId)} + title={step.fullName} + > + <CardContent> + <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}> + <IconBadge operationType={step.operationType}> + <Icon + name={getIconName(step.operationType)} + sx={{ + fontSize: '14px', + width: '14px', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "14px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </IconBadge> + <OperationLabel operationType={step.operationType}> + {getOperationLabel(step.operationType)} + </OperationLabel> + </div> + <SpanName>{step.name}</SpanName> + <Duration>{formatDuration(step.duration)}</Duration> + <Codicon name="chevron-right" /> + </CardContent> + </ContentCard> + </TimelineItem> + ))} + </TimelineList> + )} + </TimelineContainer> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 47fcfcdecd2..492cbb8ffe9 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -190,7 +190,7 @@ const AISpanDuration = styled.span` display: flex; align-items: center; justify-content: flex-end; - gap: 4px; + gap: 3px; flex-shrink: 0; min-width: 80px; text-align: right; @@ -1078,7 +1078,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai <AISpanDuration> {duration !== null ? ( <> - <Icon name="bi-clock" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + <Icon name="bi-clock" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> {duration < 1000 ? `${duration}ms` : `${(duration / 1000).toFixed(2)}s`} </> ) : ''} @@ -1122,7 +1122,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai {duration !== null && ( <AISpanDuration> <> - <Icon name="bi-clock" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + <Icon name="bi-clock" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> {formatDuration(duration)} </> </AISpanDuration> @@ -1204,7 +1204,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai <AISpanDuration> {duration !== null ? ( <> - <Icon name="bi-clock" sx={{ fontSize: "16px", width: "16px", height: "16px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + <Icon name="bi-clock" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> {duration < 1000 ? `${duration}ms` : `${(duration / 1000).toFixed(2)}s`} </> ) : ''} diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-user.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-user.svg index 5e4f4d56010..f19056a0e39 100644 --- a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-user.svg +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-user.svg @@ -1,23 +1,3 @@ -<!-- - ~ 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. ---> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> - <path fill="#000" - d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2M7.35 18.5C8.66 17.56 10.26 17 12 17s3.34.56 4.65 1.5c-1.31.94-2.91 1.5-4.65 1.5s-3.34-.56-4.65-1.5m10.79-1.38a9.95 9.95 0 0 0-12.28 0A7.96 7.96 0 0 1 4 12c0-4.42 3.58-8 8-8s8 3.58 8 8c0 1.95-.7 3.73-1.86 5.12" /> - <path fill="#000" - d="M12 6c-1.93 0-3.5 1.57-3.5 3.5S10.07 13 12 13s3.5-1.57 3.5-3.5S13.93 6 12 6m0 5c-.83 0-1.5-.67-1.5-1.5S11.17 8 12 8s1.5.67 1.5 1.5S12.83 11 12 11" /> -</svg> + <path fill="currentColor" d="M12 12q-1.65 0-2.825-1.175T8 8t1.175-2.825T12 4t2.825 1.175T16 8t-1.175 2.825T12 12m-8 6v-.8q0-.85.438-1.562T5.6 14.55q1.55-.775 3.15-1.162T12 13t3.25.388t3.15 1.162q.725.375 1.163 1.088T20 17.2v.8q0 .825-.587 1.413T18 20H6q-.825 0-1.412-.587T4 18m2 0h12v-.8q0-.275-.137-.5t-.363-.35q-1.35-.675-2.725-1.012T12 15t-2.775.338T6.5 16.35q-.225.125-.363.35T6 17.2zm6-8q.825 0 1.413-.587T14 8t-.587-1.412T12 6t-1.412.588T10 8t.588 1.413T12 10m0 8" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file From 7235464b6e3149e61b9415f6d913ddfa346033da Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 19 Jan 2026 00:10:10 +0530 Subject: [PATCH 108/247] Add openInFocusMode feature to trace details and related components --- .../src/rpc-types/agent-chat/interfaces.ts | 1 + .../features/tracing/trace-details-webview.ts | 12 +++- .../rpc-managers/agent-chat/rpc-manager.ts | 2 +- .../Components/ChatInterface.tsx | 3 +- .../trace-visualizer/src/TraceDetails.tsx | 63 +++++++++++++++---- .../src/components/JsonTreeViewer.tsx | 2 +- .../ballerina/trace-visualizer/src/index.tsx | 6 +- .../font-wso2-vscode/src/icons/bi-focus.svg | 3 + 8 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-focus.svg diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index 553694b808d..a634cfecaf2 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -52,6 +52,7 @@ export interface TraceInput { message?: string; traceId?: string; focusSpanId?: string; + openInFocusMode?: boolean; } export interface ChatHistoryMessage { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 03bc7fb5661..21eebc966f1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -68,6 +68,7 @@ export class TraceDetailsWebview { private _trace: Trace | undefined; private _isAgentChat: boolean = false; private _focusSpanId: string | undefined; + private _openInFocusMode: boolean = false; private constructor() { this._panel = TraceDetailsWebview.createWebview(); @@ -91,6 +92,7 @@ export class TraceDetailsWebview { data: traceData, isAgentChat: this._isAgentChat, focusSpanId: this._focusSpanId, + openInFocusMode: this._openInFocusMode, }); } break; @@ -127,7 +129,7 @@ export class TraceDetailsWebview { return panel; } - public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string): void { + public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string, openInFocusMode?: boolean): void { if (!TraceDetailsWebview.instance || !TraceDetailsWebview.instance._panel) { // Create new instance if it doesn't exist or was disposed TraceDetailsWebview.instance = new TraceDetailsWebview(); @@ -138,6 +140,7 @@ export class TraceDetailsWebview { instance._trace = trace; instance._isAgentChat = isAgentChat; instance._focusSpanId = focusSpanId; + instance._openInFocusMode = openInFocusMode; // Update title based on isAgentChat flag if (instance._panel) { @@ -163,6 +166,7 @@ export class TraceDetailsWebview { data: traceData, isAgentChat: this._isAgentChat, focusSpanId: this._focusSpanId, + openInFocusMode: this._openInFocusMode, }); } @@ -249,12 +253,13 @@ export class TraceDetailsWebview { let traceData = null; let isAgentChat = false; let focusSpanId = undefined; + let openInFocusMode = false; function renderTraceDetails() { if (window.traceVisualizer && window.traceVisualizer.renderWebview && traceData) { const container = document.getElementById("webview-container"); if (container) { - window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId); + window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId, openInFocusMode); } } else if (!traceData) { // Request trace data from extension @@ -273,6 +278,7 @@ export class TraceDetailsWebview { traceData = message.data; isAgentChat = message.isAgentChat || false; focusSpanId = message.focusSpanId; + openInFocusMode = message.openInFocusMode || false; renderTraceDetails(); break; } @@ -318,7 +324,7 @@ export class TraceDetailsWebview { this._panel = undefined; this._trace = undefined; - + // Clear the static instance when disposed if (TraceDetailsWebview.instance === this) { TraceDetailsWebview.instance = undefined; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index e5e0ab1d815..6e17d8d92b8 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -480,7 +480,7 @@ export class AgentChatRpcManager implements AgentChatAPI { } // Open the trace details webview with isAgentChat=true and optional focusSpanId - TraceDetailsWebview.show(trace, true, params.focusSpanId); + TraceDetailsWebview.show(trace, true, params.focusSpanId, params.openInFocusMode); } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Failed to show trace details'; vscode.window.showErrorMessage(`Error: ${errorMessage}`); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index d0b1b45f1ce..dcd67ee4bbd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -442,7 +442,8 @@ const ChatInterface: React.FC = () => { try { await rpcClient.getAgentChatRpcClient().showTraceView({ traceId, - focusSpanId: spanId + focusSpanId: spanId, + openInFocusMode: true }); } catch (error) { console.error('Failed to show trace view:', error); diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 492cbb8ffe9..18ca141d78c 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -42,6 +42,7 @@ interface TraceDetailsProps { traceData: TraceData; isAgentChat: boolean; focusSpanId?: string; + openInFocusMode?: boolean; } // ============================================================================ @@ -353,15 +354,23 @@ const ViewModeButton = styled.button<{ isActive: boolean }>` cursor: pointer; transition: background-color 0.15s ease; - &:hover { + &:hover:not(:disabled) { background: ${(props: { isActive: boolean }) => props.isActive ? 'var(--vscode-button-hoverBackground)' : 'var(--vscode-list-hoverBackground)'}; } + &:disabled { + cursor: not-allowed; + } + &:first-of-type { border-right: 1px solid var(--vscode-panel-border); } + + &:not(:first-of-type):not(:last-of-type) { + border-right: 1px solid var(--vscode-panel-border); + } `; // ============================================================================ @@ -397,12 +406,12 @@ const TreeChevronIcon: React.FC<ChevronProps> = ({ hasChildren, isExpanded, onCl </TreeChevron> ); -export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetailsProps) { +export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusMode }: TraceDetailsProps) { const [expandedSpans, setExpandedSpans] = useState<Set<string>>(new Set()); const [selectedSpanId, setSelectedSpanId] = useState<string | null>(null); const [showFullTrace] = useState<boolean>(false); const [isAdvancedMode, setIsAdvancedMode] = useState<boolean>(false); - const [viewMode, setViewMode] = useState<'tree' | 'timeline'>('tree'); + const [viewMode, setViewMode] = useState<'tree' | 'timeline' | 'focus'>(openInFocusMode ? 'focus' : 'tree'); const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); const [containerWidth, setContainerWidth] = useState<number>(window.innerWidth); const [aiSpanTreeDimensions, setAISpanTreeDimensions] = useState({ height: 180, maxHeight: 600, minHeight: 50 }); @@ -490,10 +499,11 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it - if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current) { + // Also don't auto-select if we're opening in focus mode + if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current && !openInFocusMode) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [sortedRootSpans.length, focusSpanId, selectedSpanId]); + }, [sortedRootSpans.length, focusSpanId, selectedSpanId, openInFocusMode]); // Auto-expand first 3 levels of spans in advanced mode (only once) useEffect(() => { @@ -746,7 +756,8 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai // Select first AI span when in agent chat view useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it - if (focusSpanId || hasFocusedRef.current) { + // Also don't auto-select if we're opening in focus mode + if (focusSpanId || hasFocusedRef.current || openInFocusMode) { return; } @@ -755,7 +766,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai } else if (!isAgentChat && !selectedSpanId && sortedRootSpans.length > 0) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); + }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId, openInFocusMode]); // Totals across the trace (input/output separately) const { totalInputTokens, totalOutputTokens } = React.useMemo(() => { @@ -1328,6 +1339,29 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai justifyContent: 'center' }} /> </ViewModeButton> + <ViewModeButton + isActive={viewMode === 'focus'} + onClick={() => setViewMode('focus')} + title="Focus Mode - Show only selected span details" + disabled={!selectedSpan} + style={{ opacity: !selectedSpan ? 0.5 : 1 }} + > + <Icon name="bi-focus" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} /> + </ViewModeButton> </ViewModeToggle> <ButtonGroup> <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> @@ -1347,10 +1381,12 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai justifyContent: 'center' }} /> </ModeToggleButton> - <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> - <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> - {isAdvancedMode ? 'Hide Advanced Spans' : 'Show Hidden Spans'} - </ModeToggleButton> + {viewMode !== 'focus' && ( + <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> + <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> + {isAdvancedMode ? 'Hide Advanced Spans' : 'Show Hidden Spans'} + </ModeToggleButton> + )} </ButtonGroup> </NavigationBar> @@ -1440,7 +1476,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai /> ) : ( <AgentChatLogsContainer> - {viewMode === 'tree' ? ( + {viewMode === 'tree' && ( <AISpanTreeContainer height={aiSpanTreeDimensions.height} maxHeight={aiSpanTreeDimensions.maxHeight} @@ -1451,7 +1487,8 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId }: TraceDetai : rootAISpans.map(span => renderAISpanTreeItem(span, 0)) } </AISpanTreeContainer> - ) : ( + )} + {viewMode === 'timeline' && ( <WaterfallView spans={isAdvancedMode ? traceData.spans : rootAISpans} selectedSpanId={selectedSpanId} diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 1c143eee453..e8864d74189 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -23,7 +23,7 @@ import { CopyButton } from "./CopyButton"; import { parseNestedJSON } from "../utils"; // Configurable auto-expand depth -export const DEFAULT_AUTO_EXPAND_DEPTH = 2; +export const DEFAULT_AUTO_EXPAND_DEPTH = 3; interface JsonTreeViewerProps { data: unknown; diff --git a/workspaces/ballerina/trace-visualizer/src/index.tsx b/workspaces/ballerina/trace-visualizer/src/index.tsx index 23b24d82290..b1887115880 100644 --- a/workspaces/ballerina/trace-visualizer/src/index.tsx +++ b/workspaces/ballerina/trace-visualizer/src/index.tsx @@ -60,16 +60,16 @@ export interface AttributeData { declare global { interface Window { traceVisualizer: { - renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string) => void; + renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openInFocusMode?: boolean) => void; }; } } -export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string) { +export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openInFocusMode?: boolean) { const root = createRoot(target); root.render( <React.StrictMode> - <TraceDetails traceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} /> + <TraceDetails traceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} openInFocusMode={openInFocusMode} /> </React.StrictMode> ); } diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-focus.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-focus.svg new file mode 100644 index 00000000000..cfe31c93c20 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-focus.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M5 21q-.825 0-1.412-.587T3 19v-3q0-.425.288-.712T4 15t.713.288T5 16v3h3q.425 0 .713.288T9 20t-.288.713T8 21zm14 0h-3q-.425 0-.712-.288T15 20t.288-.712T16 19h3v-3q0-.425.288-.712T20 15t.713.288T21 16v3q0 .825-.587 1.413T19 21M3 8V5q0-.825.588-1.412T5 3h3q.425 0 .713.288T9 4t-.288.713T8 5H5v3q0 .425-.288.713T4 9t-.712-.288T3 8m16 0V5h-3q-.425 0-.712-.288T15 4t.288-.712T16 3h3q.825 0 1.413.588T21 5v3q0 .425-.288.713T20 9t-.712-.288T19 8m-7 8q-1.65 0-2.825-1.175T8 12t1.175-2.825T12 8t2.825 1.175T16 12t-1.175 2.825T12 16" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file From 993eae4fe6340ded8ce576577d5c423686a42691 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 20 Jan 2026 14:39:02 +0530 Subject: [PATCH 109/247] Update trace visualizer layout --- .../src/rpc-types/agent-chat/interfaces.ts | 2 +- .../features/tracing/trace-details-webview.ts | 20 +- .../rpc-managers/agent-chat/rpc-manager.ts | 2 +- .../Components/ChatInterface.tsx | 2 +- .../trace-visualizer/src/TraceDetails.tsx | 1415 +++++++++-------- .../src/components/AIBadge.tsx | 12 +- .../src/components/JsonTreeViewer.tsx | 6 +- .../src/components/JsonViewer.tsx | 10 +- .../src/components/SpanInputOutput.tsx | 4 - .../src/components/WaterfallView.tsx | 9 +- .../ballerina/trace-visualizer/src/index.tsx | 6 +- .../ballerina/trace-visualizer/src/utils.ts | 9 + .../src/icons/bi-left-panel-close.svg | 3 + .../src/icons/bi-left-panel-open.svg | 3 + .../font-wso2-vscode/src/icons/bi-server.svg | 6 + 15 files changed, 819 insertions(+), 690 deletions(-) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-close.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-open.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-server.svg diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index a634cfecaf2..74cc97579eb 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -52,7 +52,7 @@ export interface TraceInput { message?: string; traceId?: string; focusSpanId?: string; - openInFocusMode?: boolean; + openWithSidebarCollapsed?: boolean; } export interface ChatHistoryMessage { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 21eebc966f1..166827bd5f7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -68,7 +68,7 @@ export class TraceDetailsWebview { private _trace: Trace | undefined; private _isAgentChat: boolean = false; private _focusSpanId: string | undefined; - private _openInFocusMode: boolean = false; + private _openWithSidebarCollapsed: boolean = false; private constructor() { this._panel = TraceDetailsWebview.createWebview(); @@ -92,7 +92,7 @@ export class TraceDetailsWebview { data: traceData, isAgentChat: this._isAgentChat, focusSpanId: this._focusSpanId, - openInFocusMode: this._openInFocusMode, + openWithSidebarCollapsed: this._openWithSidebarCollapsed, }); } break; @@ -112,7 +112,7 @@ export class TraceDetailsWebview { const panel = vscode.window.createWebviewPanel( 'ballerina.trace-details', 'Trace Details', - ViewColumn.Active, + ViewColumn.One, { enableScripts: true, localResourceRoots: [ @@ -129,7 +129,7 @@ export class TraceDetailsWebview { return panel; } - public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string, openInFocusMode?: boolean): void { + public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string, openWithSidebarCollapsed?: boolean): void { if (!TraceDetailsWebview.instance || !TraceDetailsWebview.instance._panel) { // Create new instance if it doesn't exist or was disposed TraceDetailsWebview.instance = new TraceDetailsWebview(); @@ -140,14 +140,14 @@ export class TraceDetailsWebview { instance._trace = trace; instance._isAgentChat = isAgentChat; instance._focusSpanId = focusSpanId; - instance._openInFocusMode = openInFocusMode; + instance._openWithSidebarCollapsed = openWithSidebarCollapsed; // Update title based on isAgentChat flag if (instance._panel) { instance._panel.title = isAgentChat ? 'Agent Chat Logs' : 'Trace Details'; } - instance._panel!.reveal(); + instance._panel!.reveal(ViewColumn.One); instance.updateWebview(); } @@ -166,7 +166,7 @@ export class TraceDetailsWebview { data: traceData, isAgentChat: this._isAgentChat, focusSpanId: this._focusSpanId, - openInFocusMode: this._openInFocusMode, + openWithSidebarCollapsed: this._openWithSidebarCollapsed, }); } @@ -253,13 +253,13 @@ export class TraceDetailsWebview { let traceData = null; let isAgentChat = false; let focusSpanId = undefined; - let openInFocusMode = false; + let openWithSidebarCollapsed = false; function renderTraceDetails() { if (window.traceVisualizer && window.traceVisualizer.renderWebview && traceData) { const container = document.getElementById("webview-container"); if (container) { - window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId, openInFocusMode); + window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId, openWithSidebarCollapsed); } } else if (!traceData) { // Request trace data from extension @@ -278,7 +278,7 @@ export class TraceDetailsWebview { traceData = message.data; isAgentChat = message.isAgentChat || false; focusSpanId = message.focusSpanId; - openInFocusMode = message.openInFocusMode || false; + openWithSidebarCollapsed = message.openWithSidebarCollapsed || false; renderTraceDetails(); break; } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 6e17d8d92b8..54fa66fa4e1 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -480,7 +480,7 @@ export class AgentChatRpcManager implements AgentChatAPI { } // Open the trace details webview with isAgentChat=true and optional focusSpanId - TraceDetailsWebview.show(trace, true, params.focusSpanId, params.openInFocusMode); + TraceDetailsWebview.show(trace, true, params.focusSpanId, params.openWithSidebarCollapsed); } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Failed to show trace details'; vscode.window.showErrorMessage(`Error: ${errorMessage}`); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index dcd67ee4bbd..653d447c0a1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -443,7 +443,7 @@ const ChatInterface: React.FC = () => { await rpcClient.getAgentChatRpcClient().showTraceView({ traceId, focusSpanId: spanId, - openInFocusMode: true + openWithSidebarCollapsed: true }); } catch (error) { console.error('Failed to show trace view:', error); diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 18ca141d78c..adcf25f8da7 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -6,7 +6,7 @@ * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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 @@ -16,7 +16,7 @@ * under the License. */ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef } from "react"; import styled from "@emotion/styled"; import { TraceData, SpanData } from "./index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; @@ -29,20 +29,30 @@ import { sortSpansByUmbrellaFirst, formatDuration, getSpanDuration, - formatStartTime, getSpanKindLabel, stripSpanPrefix, getSpanTypeBadge, spanHasError, getSpanTokens, - isAISpan + isAISpan, + getSpanLabel } from "./utils"; +// ============================================================================ +// CONSTANTS +// ============================================================================ + +const MIN_SIDEBAR_WIDTH = 260; +const SNAP_THRESHOLD = 100; +const MIN_DETAILS_PANEL_WIDTH = 250; +const MAX_INITIAL_SIDEBAR_WIDTH = 350; +const MAX_SIDEBAR_PERCENTAGE = 0.6; + interface TraceDetailsProps { traceData: TraceData; isAgentChat: boolean; focusSpanId?: string; - openInFocusMode?: boolean; + openWithSidebarCollapsed?: boolean; } // ============================================================================ @@ -51,23 +61,60 @@ interface TraceDetailsProps { const Container = styled.div` margin: 0; - padding: 0 16px; + padding: 0; font-family: var(--vscode-font-family); background-color: var(--vscode-editor-background); color: var(--vscode-editor-foreground); font-size: 13px; line-height: 1.5; height: 100vh; - overflow-y: auto; + overflow: hidden; `; const AgentChatLogsContainer = styled.div` + display: flex; + flex-direction: row; + align-items: stretch; + height: 100%; + overflow: hidden; +`; + +const SpanViewContainer = styled.div<{ width: number; isResizing?: boolean }>` + width: ${(props: { width: number }) => props.width}px; + display: flex; + flex-direction: column; + position: relative; + height: 100%; + overflow: hidden; + flex-shrink: 0; + + &::after { + content: ''; + position: absolute; + top: 0; + right: -4px; + bottom: 0; + width: 8px; + cursor: col-resize; + z-index: 10; + background-color: ${(props: { isResizing?: boolean }) => + props.isResizing ? 'var(--vscode-focusBorder, var(--vscode-panel-border))' : 'transparent'}; + opacity: ${(props: { isResizing?: boolean }) => props.isResizing ? '0.5' : '0'}; + transition: ${(props: { isResizing?: boolean }) => + props.isResizing ? 'none' : 'opacity 0.2s ease, background-color 0.2s ease'}; + } +`; + +const DetailsPanelContainer = styled.div` + flex: 1; + min-width: 200px; display: flex; flex-direction: column; - gap: 12px; - margin-bottom: 16px; + border-left: 1px solid var(--vscode-panel-border); + overflow: hidden; `; + // ============================================================================ // TREE VIEW STYLES // ============================================================================ @@ -121,109 +168,171 @@ const SpanKindBadge = styled.span` const AISpanTreeContainer = styled.div<{ height: number; maxHeight: number; minHeight: number }>` background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - padding: 12px; - height: ${(props: { height: number }) => props.height}px; - max-height: ${(props: { maxHeight: number }) => props.maxHeight}px; - min-height: ${(props: { minHeight: number }) => props.minHeight}px; + flex: 1; overflow-y: auto; - resize: vertical; + height: 100%; + overflow-x: hidden; + padding: 0 0 0 12px; `; -const AISpanTreeItem = styled.div<{ level: number; isSelected: boolean }>` +const TreeNodeContainer = styled.div<{ isLast?: boolean }>` + position: relative; display: flex; - align-items: center; - padding: 6px 8px; - padding-left: ${(props: { level: number }) => props.level * 20 + 8}px; + flex-direction: column; + + &::before { + content: ''; + position: absolute; + left: -13px; + width: 1px; + background-color: var(--vscode-tree-indentGuidesStroke); + + top: 0; + + height: ${(props: { isLast?: boolean }) => props.isLast ? '16px' : '100%'}; + } +`; + +const TreeNodeChildren = styled.div` + margin-left: 6px; + padding-left: 12px; + position: relative; + + &::before { + content: ''; + position: absolute; + top: -16px; + left: -1px; + width: 1px; + height: 20px; + background-color: var(--vscode-tree-indentGuidesStroke); + } +`; + +const ConnectorCurve = styled.div` + position: absolute; + left: -13px; + top: 0; + width: 8px; + height: 16px; + border-bottom: 1px solid var(--vscode-tree-indentGuidesStroke); + border-left: 1px solid var(--vscode-tree-indentGuidesStroke); + pointer-events: none; +`; + +const AISpanTreeItem = styled.div<{ isSelected: boolean }>` + display: flex; + flex-direction: column; + padding: 4px 8px 4px 0; + margin: 4px 0; cursor: pointer; - border-radius: 3px; - gap: 8px; + border-radius: 0; + gap: 6px; + z-index: 0; + position: relative; - background-color: ${(props: { isSelected: boolean }) => + min-height: 32px; + + &::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: -100vw; + z-index: -1; + + background-color: ${(props: { isSelected: boolean }) => props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; - flex-wrap: wrap; + transition: background-color 0.15s ease; + } - &:hover { + &:hover::before { background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-hoverBackground)' : 'var(--vscode-list-hoverBackground)'}; + props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; } - - /* Vertical line for tree structure */ - ${(props: { level: number }) => props.level > 0 && ` - &::before { - content: ''; - position: absolute; - left: ${props.level * 20 - 4}px; - top: 0; - bottom: 50%; - width: 1px; - background-color: var(--vscode-tree-indentGuidesStroke); - opacity: 0.4; - } - - /* Horizontal branch line */ - &::after { - content: ''; - position: absolute; - left: ${props.level * 20 - 4}px; - top: 50%; - width: 8px; - height: 1px; - background-color: var(--vscode-tree-indentGuidesStroke); - opacity: 0.4; - } - `} `; const AISpanLabel = styled.span` - flex: 1; font-size: 13px; display: flex; align-items: center; justify-content: flex-start; gap: 6px; + flex: 1; + min-width: 0; + + > span:first-of-type { + flex-shrink: 0; + } + + > span:nth-of-type(2) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + min-width: 0; + } `; -const AISpanDuration = styled.span` - font-size: 11px; - color: var(--vscode-descriptionForeground); +const AISpanTopRow = styled.div` display: flex; align-items: center; - justify-content: flex-end; - gap: 3px; - flex-shrink: 0; - min-width: 80px; - text-align: right; + gap: 8px; + width: 100%; + min-width: 0; `; -const AISpanTokenCount = styled.span` - font-size: 11px; - color: var(--vscode-descriptionForeground); +const ChevronToggleWrapper = styled.div` display: flex; align-items: center; - justify-content: flex-end; - gap: 4px; + justify-content: center; + width: 20px; + height: 20px; + margin-left: auto; flex-shrink: 0; - min-width: 110px; - text-align: right; + color: var(--vscode-descriptionForeground); + + &:hover { + color: var(--vscode-foreground); + } `; -const AISpanStartTime = styled.span` - font-size: 11px; - color: var(--vscode-descriptionForeground); - flex-shrink: 0; - white-space: nowrap; - min-width: 190px; - text-align: right; +const AISpanDuration = styled.span` + font-size: 10px; + color: inherit; + display: flex; + align-items: center; + gap: 3px; +`; + +const AISpanTokenCount = styled.span` + font-size: 10px; + color: inherit; + display: inline; `; const AISpanMetadataGroup = styled.div` display: flex; align-items: center; - gap: 16px; - margin-left: auto; - flex-shrink: 0; + gap: 6px; + flex-wrap: wrap; + margin-left: 0; + margin-top: 2px; +`; + +const AISpanMetadataPill = styled.span` + font-size: 11px; + padding: 1px 4px; + border-radius: 4px; + background-color: var(--vscode-sideBar-background); + border: 1px solid var(--vscode-panel-border); + color: var(--vscode-editor-foreground); + display: flex; + align-items: center; + gap: 4px; + white-space: nowrap; + font-weight: 300; `; const AISpanErrorIcon = styled.span` @@ -238,8 +347,7 @@ const AISpanErrorIcon = styled.span` // ADVANCED MODE STYLES // ============================================================================ -const AdvancedSpanGroup = styled.div<{ level: number }>` - margin-left: ${(props: { level: number }) => props.level * 20 + 8}px; +const AdvancedSpanGroup = styled.div` margin-top: 4px; margin-bottom: 4px; `; @@ -271,25 +379,83 @@ const AdvancedSpanGroupContent = styled.div` const AdvancedSpanItem = styled.div<{ isSelected: boolean }>` display: flex; - align-items: center; - padding: 4px 8px; + flex-direction: column; + padding: 4px 8px 4px 0; + margin: 4px 0; cursor: pointer; - border-radius: 3px; - gap: 8px; - margin: 2px 0; - background-color: ${(props: { isSelected: boolean }) => + border-radius: 0; + gap: 6px; + z-index: 0; + + position: relative; + min-height: 32px; + + &::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: -100vw; + z-index: -1; + + background-color: ${(props: { isSelected: boolean }) => props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; + transition: background-color 0.15s ease; + } - &:hover { + &:hover::before { background-color: ${(props: { isSelected: boolean }) => props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; } `; -const AdvancedSpanName = styled.span` +const NonAISpanTopRow = styled.div` + display: flex; + align-items: center; + gap: 8px; + width: 100%; + min-width: 0; +`; + +const NonAISpanLabel = styled.span` + font-size: 13px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 6px; flex: 1; - font-size: 12px; - color: var(--vscode-foreground); + min-width: 0; + + > span:first-of-type { + flex-shrink: 0; + } + + > span:nth-of-type(2) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + min-width: 0; + } +`; + +const NonAISpanIcon = styled.span<{ spanKind: string }>` + display: flex; + align-items: center; + justify-content: center; + padding: 4px; + border-radius: 3px; + flex-shrink: 0; + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-dropdown-border); + color: ${(props: { spanKind: string }) => { + switch (props.spanKind.toLowerCase()) { + case 'client': return 'var(--vscode-terminal-ansiBlue)'; + case 'server': return 'var(--vscode-terminal-ansiGreen)'; + default: return 'var(--vscode-foreground)'; + } + }}; `; // ============================================================================ @@ -300,8 +466,9 @@ const NavigationBar = styled.div` display: flex; align-items: center; justify-content: space-between; - margin-top: 16px; + margin-top: 24px; margin-bottom: 8px; + padding: 0 8px; `; const ModeToggleButton = styled.button` @@ -311,7 +478,7 @@ const ModeToggleButton = styled.button` padding: 4px 8px; background: transparent; border: 1px solid var(--vscode-panel-border); - color: var(--vscode-foreground); + color: var(--vscode-foreground); border-radius: 4px; cursor: pointer; font-size: 13px; @@ -332,57 +499,15 @@ const ButtonGroup = styled.div` align-items: center; `; -const ViewModeToggle = styled.div` - display: flex; - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - overflow: hidden; -`; - -const ViewModeButton = styled.button<{ isActive: boolean }>` - display: flex; - align-items: center; - justify-content: center; - padding: 4px 8px; - background: ${(props: { isActive: boolean }) => props.isActive - ? 'var(--vscode-button-background)' - : 'transparent'}; - color: ${(props: { isActive: boolean }) => props.isActive - ? 'var(--vscode-button-foreground)' - : 'var(--vscode-foreground)'}; - border: none; - cursor: pointer; - transition: background-color 0.15s ease; - - &:hover:not(:disabled) { - background: ${(props: { isActive: boolean }) => props.isActive - ? 'var(--vscode-button-hoverBackground)' - : 'var(--vscode-list-hoverBackground)'}; - } - - &:disabled { - cursor: not-allowed; - } - - &:first-of-type { - border-right: 1px solid var(--vscode-panel-border); - } - - &:not(:first-of-type):not(:last-of-type) { - border-right: 1px solid var(--vscode-panel-border); - } -`; - // ============================================================================ // DETAILS PANEL // ============================================================================ const DetailsPanel = styled.div` background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - padding: 16px; - margin-bottom: 4px; + height: 100%; + overflow-y: auto; + padding: 24px 16px; `; // ============================================================================ @@ -406,26 +531,65 @@ const TreeChevronIcon: React.FC<ChevronProps> = ({ hasChildren, isExpanded, onCl </TreeChevron> ); -export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusMode }: TraceDetailsProps) { +export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSidebarCollapsed }: TraceDetailsProps) { const [expandedSpans, setExpandedSpans] = useState<Set<string>>(new Set()); const [selectedSpanId, setSelectedSpanId] = useState<string | null>(null); const [showFullTrace] = useState<boolean>(false); const [isAdvancedMode, setIsAdvancedMode] = useState<boolean>(false); - const [viewMode, setViewMode] = useState<'tree' | 'timeline' | 'focus'>(openInFocusMode ? 'focus' : 'tree'); + const [viewMode, setViewMode] = useState<'tree' | 'timeline'>('tree'); + const [isSidebarVisible, setIsSidebarVisible] = useState<boolean>(!openWithSidebarCollapsed); const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); const [containerWidth, setContainerWidth] = useState<number>(window.innerWidth); const [aiSpanTreeDimensions, setAISpanTreeDimensions] = useState({ height: 180, maxHeight: 600, minHeight: 50 }); const [waterfallDimensions, setWaterfallDimensions] = useState({ height: 300, maxHeight: 800, minHeight: 150 }); const [totalSpanCounts, setTotalSpanCounts] = useState({ aiCount: 0, nonAiCount: 0 }); - const containerRef = React.useRef<HTMLDivElement>(null); - const hasAutoExpandedRef = React.useRef<boolean>(false); - const hasFocusedRef = React.useRef<boolean>(false); + const [spanViewWidth, setSpanViewWidth] = useState<number>(0); + const [isResizing, setIsResizing] = useState<boolean>(false); + const containerRef = useRef<HTMLDivElement>(null); + const hasAutoExpandedRef = useRef<boolean>(false); + const hasFocusedRef = useRef<boolean>(false); + + // Initialize span view width intelligently + useEffect(() => { + if (containerRef.current && spanViewWidth === 0) { + const currentContainerWidth = containerRef.current.offsetWidth; + let targetWidth = currentContainerWidth * 0.3; + + if (targetWidth > MAX_INITIAL_SIDEBAR_WIDTH) { + targetWidth = MAX_INITIAL_SIDEBAR_WIDTH; + } + + if (targetWidth < MIN_SIDEBAR_WIDTH) { + targetWidth = MIN_SIDEBAR_WIDTH; + } + + const maxAllowedWidth = currentContainerWidth - MIN_DETAILS_PANEL_WIDTH; + + if (targetWidth > maxAllowedWidth) { + targetWidth = Math.max(150, maxAllowedWidth); + if (maxAllowedWidth < 100) { + setIsSidebarVisible(false); + } + } + + setSpanViewWidth(targetWidth); + } + }, [containerRef.current]); // Track container width for responsive behavior useEffect(() => { const resizeObserver = new ResizeObserver((entries) => { for (const entry of entries) { - setContainerWidth(entry.contentRect.width); + const newWidth = entry.contentRect.width; + setContainerWidth(newWidth); + + // If the sidebar is open, ensure it doesn't violate boundaries on window resize + if (isSidebarVisible && spanViewWidth > 0) { + const maxAllowed = newWidth - MIN_DETAILS_PANEL_WIDTH; + if (spanViewWidth > maxAllowed) { + setSpanViewWidth(Math.max(MIN_SIDEBAR_WIDTH, maxAllowed)); + } + } } }); @@ -436,7 +600,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM return () => { resizeObserver.disconnect(); }; - }, []); + }, [spanViewWidth, isSidebarVisible]); const toggleSpanExpansion = (spanId: string) => { const newExpanded = new Set(expandedSpans); @@ -499,11 +663,10 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it - // Also don't auto-select if we're opening in focus mode - if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current && !openInFocusMode) { + if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [sortedRootSpans.length, focusSpanId, selectedSpanId, openInFocusMode]); + }, [sortedRootSpans.length, focusSpanId, selectedSpanId]); // Auto-expand first 3 levels of spans in advanced mode (only once) useEffect(() => { @@ -619,6 +782,71 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM const selectedSpan = selectedSpanId ? spanMap.get(selectedSpanId) : null; + // Handle resize drag + const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => { + const target = e.currentTarget; + const rect = target.getBoundingClientRect(); + const isInResizeArea = e.clientX >= rect.right - 8; + + if (isInResizeArea) { + e.preventDefault(); + setIsResizing(true); + } + }; + + useEffect(() => { + const handleMouseMove = (e: MouseEvent) => { + if (!isResizing || !containerRef.current) return; + + const containerRect = containerRef.current.getBoundingClientRect(); + const rawWidth = e.clientX - containerRect.left; + + if (isSidebarVisible) { + if (rawWidth < SNAP_THRESHOLD) { + setIsSidebarVisible(false); + } else { + const minWidth = MIN_SIDEBAR_WIDTH; + + // Constraint 1: Must leave space for the details panel + const limitByPanel = containerRect.width - MIN_DETAILS_PANEL_WIDTH; + + // Constraint 2: Max 70% of the screen + const limitByPercentage = containerRect.width * MAX_SIDEBAR_PERCENTAGE; + + // The actual max width is the stricter (smaller) of the two limits + const maxWidth = Math.min(limitByPanel, limitByPercentage); + + const newWidth = Math.max(minWidth, Math.min(rawWidth, maxWidth)); + setSpanViewWidth(newWidth); + } + } else { + // Wake up logic + if (rawWidth > SNAP_THRESHOLD) { + setIsSidebarVisible(true); + setSpanViewWidth(MIN_SIDEBAR_WIDTH); + } + } + }; + + const handleMouseUp = () => { + setIsResizing(false); + }; + + if (isResizing) { + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + document.body.style.cursor = 'col-resize'; + document.body.style.userSelect = 'none'; + } + + return () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + }; + }, [isResizing, isSidebarVisible]); + /** * Builds a hierarchy of AI spans based on time containment. * Uses temporal relationships to determine parent-child structure. @@ -756,8 +984,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM // Select first AI span when in agent chat view useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it - // Also don't auto-select if we're opening in focus mode - if (focusSpanId || hasFocusedRef.current || openInFocusMode) { + if (focusSpanId || hasFocusedRef.current) { return; } @@ -766,7 +993,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM } else if (!isAgentChat && !selectedSpanId && sortedRootSpans.length > 0) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId, openInFocusMode]); + }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); // Totals across the trace (input/output separately) const { totalInputTokens, totalOutputTokens } = React.useMemo(() => { @@ -961,327 +1188,339 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM return sortSpansByUmbrellaFirst(children); }; + /** + * Renders an expand/collapse chevron for tree items. + */ + const renderExpandChevron = ( + hasChildren: boolean, + isExpanded: boolean, + onToggle: (e: React.MouseEvent) => void + ) => { + if (!hasChildren) return null; + + return ( + <ChevronToggleWrapper onClick={onToggle} style={{ cursor: 'pointer' }}> + <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> + </ChevronToggleWrapper> + ); + }; + + /** + * Renders the content for an AI span (without recursion). + * Used by both renderAISpanTreeItem and renderMixedSpanTreeItem. + */ + const renderAISpanContent = ( + span: SpanData, + isSelected: boolean, + hasChildren: boolean, + isExpanded: boolean, + onToggle: (e: React.MouseEvent) => void, + showConnector: boolean = false + ) => { + const badgeType = getSpanTypeBadge(span); + const duration = getSpanDuration(span); + const totalTokens = getSpanTokens(span); + const isVeryNarrow = containerWidth < 500; + + return ( + <AISpanTreeItem + isSelected={isSelected} + onClick={() => setSelectedSpanId(span.spanId)} + data-span-id={span.spanId} + > + {showConnector && <ConnectorCurve />} + <AISpanTopRow> + <AIBadge type={badgeType} /> + <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> + <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> + <AISpanLabel> + <span style={{ fontWeight: 600 }}>{getSpanLabel(badgeType)}</span> + <span>{stripSpanPrefix(span.name)}</span> + </AISpanLabel> + {spanHasError(span) && ( + <AISpanErrorIcon> + <Icon + name="bi-error" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </AISpanErrorIcon> + )} + </div> + <AISpanMetadataGroup> + {duration !== null && ( + <AISpanMetadataPill> + <AISpanDuration> + {duration < 1000 ? `${duration}ms` : `${(duration / 1000).toFixed(2)}s`} + </AISpanDuration> + </AISpanMetadataPill> + )} + {!isVeryNarrow && totalTokens > 0 && ( + <AISpanMetadataPill> + <AISpanTokenCount> + {totalTokens.toLocaleString()} Tokens + </AISpanTokenCount> + </AISpanMetadataPill> + )} + </AISpanMetadataGroup> + </div> + {renderExpandChevron(hasChildren, isExpanded, onToggle)} + </AISpanTopRow> + </AISpanTreeItem> + ); + }; + + /** + * Renders the content for a non-AI span (without recursion). + * Used by both renderNonAISpanTreeItem and renderMixedSpanTreeItem. + */ + const renderNonAISpanContent = ( + span: SpanData, + isSelected: boolean, + hasChildren: boolean, + isExpanded: boolean, + onToggle: (e: React.MouseEvent) => void, + showConnector: boolean = false + ) => { + const duration = getSpanDuration(span); + const spanKind = getSpanKindLabel(span.kind); + + // Only show icons for server and client + const spanKindIcon = (() => { + switch (spanKind.toLowerCase()) { + case 'client': return 'bi-arrow-outward'; + case 'server': return 'bi-server'; + default: return 'bi-action'; + } + })(); + + return ( + <AdvancedSpanItem + isSelected={isSelected} + onClick={() => setSelectedSpanId(span.spanId)} + data-span-id={span.spanId} + > + {showConnector && <ConnectorCurve />} + <NonAISpanTopRow> + <NonAISpanIcon spanKind={spanKind}> + <Icon + name={spanKindIcon} + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </NonAISpanIcon> + <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> + <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> + <NonAISpanLabel> + <span style={{ fontWeight: 500, fontSize: '11px', textTransform: 'uppercase', opacity: 0.7 }}>{spanKind}</span> + <span>{span.name}</span> + </NonAISpanLabel> + {spanHasError(span) && ( + <AISpanErrorIcon> + <Icon + name="bi-error" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </AISpanErrorIcon> + )} + </div> + {duration !== null && ( + <AISpanMetadataGroup> + <AISpanMetadataPill> + <AISpanDuration> + {formatDuration(duration)} + </AISpanDuration> + </AISpanMetadataPill> + </AISpanMetadataGroup> + )} + </div> + {renderExpandChevron(hasChildren, isExpanded, onToggle)} + </NonAISpanTopRow> + </AdvancedSpanItem> + ); + }; + // Render non-AI span tree item hierarchically - const renderNonAISpanTreeItem = (span: SpanData, spanList: SpanData[], nestLevel: number = 0): React.ReactNode => { + const renderNonAISpanTreeItem = (span: SpanData, spanList: SpanData[], isFirstChild: boolean = false, isLastChild: boolean = false): React.ReactNode => { const children = getChildSpansFromList(span.spanId, spanList); const hasChildren = children.length > 0; const isExpanded = expandedSpans.has(span.spanId); const isSelected = selectedSpanId === span.spanId; - const duration = getSpanDuration(span); return ( - <React.Fragment key={span.spanId}> - <AdvancedSpanItem - isSelected={isSelected} - onClick={() => setSelectedSpanId(span.spanId)} - style={{ paddingLeft: `${8 + nestLevel * 16}px` }} - > - <div style={{ display: 'flex', alignItems: 'center', gap: '4px', flex: 1 }}> - <span - onClick={(e) => { - e.stopPropagation(); - if (hasChildren) { - toggleSpanExpansion(span.spanId); - } - }} - style={{ cursor: hasChildren ? 'pointer' : 'default', width: '16px', display: 'flex' }} - > - {hasChildren ? ( - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - ) : ( - <span style={{ width: '16px' }} /> - )} - </span> - <AdvancedSpanName>{span.name}</AdvancedSpanName> - </div> - {duration !== null && ( - <span style={{ fontSize: '11px', color: 'var(--vscode-descriptionForeground)', minWidth: '60px', textAlign: 'right' }}> - {formatDuration(duration)} - </span> - )} - </AdvancedSpanItem> + <TreeNodeContainer key={span.spanId} isLast={isLastChild}> + {renderNonAISpanContent( + span, + isSelected, + hasChildren, + isExpanded, + (e) => { + e.stopPropagation(); + if (hasChildren) { + toggleSpanExpansion(span.spanId); + } + }, + !isFirstChild + )} {hasChildren && isExpanded && ( - <> - {children.map(child => renderNonAISpanTreeItem(child, spanList, nestLevel + 1))} - </> + <TreeNodeChildren> + {children.map((child, index) => renderNonAISpanTreeItem(child, spanList, index === 0, index === children.length - 1))} + </TreeNodeChildren> )} - </React.Fragment> + </TreeNodeContainer> ); }; // Render mixed AI and non-AI span tree for advanced mode (true hierarchy based on parentSpanId) - const renderMixedSpanTreeItem = (span: SpanData, level: number = 0): React.ReactNode => { + const renderMixedSpanTreeItem = (span: SpanData, isFirstChild: boolean = false, isLastChild: boolean = false, isRoot: boolean = false): React.ReactNode => { const isAI = isAISpan(span); const children = getChildSpans(span.spanId); // Use regular getChildSpans for true hierarchy const hasChildren = children.length > 0; const isExpanded = expandedSpans.has(span.spanId); const isSelected = selectedSpanId === span.spanId; - const duration = getSpanDuration(span); - if (isAI) { - // Render as AI span - const badgeType = getSpanTypeBadge(span); - const totalTokens = getSpanTokens(span); - const startTime = formatStartTime(span.startTime); - const isNarrow = containerWidth < 700; - const isVeryNarrow = containerWidth < 500; - - return ( - <React.Fragment key={span.spanId}> - <AISpanTreeItem - level={level} - isSelected={isSelected} - onClick={() => setSelectedSpanId(span.spanId)} - > - <div style={{ display: 'flex', alignItems: 'center', gap: '4px', minWidth: 0 }}> - <span - onClick={(e) => { - e.stopPropagation(); - if (hasChildren) { - toggleSpanExpansion(span.spanId); - } - }} - style={{ cursor: hasChildren ? 'pointer' : 'default', width: '16px', display: 'flex', flexShrink: 0 }} - > - {hasChildren ? ( - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - ) : ( - <span style={{ width: '16px' }} /> - )} - </span> - <AIBadge type={badgeType} /> - <AISpanLabel> - {stripSpanPrefix(span.name)} - {spanHasError(span) && ( - <AISpanErrorIcon> - <Icon - name="bi-error" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </AISpanErrorIcon> - )} - </AISpanLabel> - </div> - <AISpanMetadataGroup> - {!isNarrow && ( - <AISpanStartTime> - {startTime ? `Started ${startTime}` : ''} - </AISpanStartTime> - )} - {!isVeryNarrow && ( - <AISpanTokenCount> - {totalTokens > 0 ? `${totalTokens.toLocaleString()} Tokens` : ''} - </AISpanTokenCount> - )} - <AISpanDuration> - {duration !== null ? ( - <> - <Icon name="bi-clock" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> - {duration < 1000 ? `${duration}ms` : `${(duration / 1000).toFixed(2)}s`} - </> - ) : ''} - </AISpanDuration> - </AISpanMetadataGroup> - </AISpanTreeItem> - {hasChildren && isExpanded && ( - <> - {children.map(child => renderMixedSpanTreeItem(child, level + 1))} - </> - )} - </React.Fragment> - ); - } else { - // Render as non-AI span - return ( - <React.Fragment key={span.spanId}> - <AdvancedSpanItem - isSelected={isSelected} - onClick={() => setSelectedSpanId(span.spanId)} - style={{ paddingLeft: `${8 + level * 16}px` }} - > - <div style={{ display: 'flex', alignItems: 'center', gap: '4px', flex: 1 }}> - <span - onClick={(e) => { - e.stopPropagation(); - if (hasChildren) { - toggleSpanExpansion(span.spanId); - } - }} - style={{ cursor: hasChildren ? 'pointer' : 'default', width: '16px', display: 'flex' }} - > - {hasChildren ? ( - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - ) : ( - <span style={{ width: '16px' }} /> - )} - </span> - <AdvancedSpanName>{span.name}</AdvancedSpanName> - </div> - {duration !== null && ( - <AISpanDuration> - <> - <Icon name="bi-clock" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> - {formatDuration(duration)} - </> - </AISpanDuration> + const handleToggle = (e: React.MouseEvent) => { + e.stopPropagation(); + if (hasChildren) { + toggleSpanExpansion(span.spanId); + } + }; + + return ( + <TreeNodeContainer key={span.spanId} isLast={isLastChild}> + {isAI ? ( + renderAISpanContent(span, isSelected, hasChildren, isExpanded, handleToggle, !isRoot) + ) : ( + renderNonAISpanContent(span, isSelected, hasChildren, isExpanded, handleToggle, !isRoot) + )} + {hasChildren && isExpanded && ( + <TreeNodeChildren> + {children.map((child, index) => + renderMixedSpanTreeItem(child, index === 0, index === children.length - 1, false) )} - </AdvancedSpanItem> - {hasChildren && isExpanded && ( - <> - {children.map(child => renderMixedSpanTreeItem(child, level + 1))} - </> - )} - </React.Fragment> - ); - } + </TreeNodeChildren> + )} + </TreeNodeContainer> + ); }; // Render AI span tree item recursively (always expanded) - const renderAISpanTreeItem = (span: SpanData, level: number = 0): React.ReactNode => { + const renderAISpanTreeItem = (span: SpanData, isFirstChild: boolean = false, isLastChild: boolean = false, isRoot: boolean = false): React.ReactNode => { const children = getAIChildSpans(span.spanId); const isSelected = selectedSpanId === span.spanId; - const duration = getSpanDuration(span); - const badgeType = getSpanTypeBadge(span); - const totalTokens = getSpanTokens(span); - const startTime = formatStartTime(span.startTime); - - // Determine what to show based on container width - const isNarrow = containerWidth < 700; - const isVeryNarrow = containerWidth < 500; // Get non-AI spans if in advanced mode const nonAISpans = isAdvancedMode ? getNonAIChildSpans(span.spanId) : []; const groupedNonAISpans = isAdvancedMode ? groupNonAISpans(nonAISpans) : new Map(); const groupKey = `${span.spanId}-advanced`; + // No-op toggle handler for AI spans (they don't have expand/collapse) + const handleToggle = () => { }; + + const hasAnyChildren = children.length > 0 || groupedNonAISpans.size > 0; + return ( - <React.Fragment key={span.spanId}> - <AISpanTreeItem - level={level} - isSelected={isSelected} - onClick={() => setSelectedSpanId(span.spanId)} - data-span-id={span.spanId} - > - <AIBadge type={badgeType} /> - <AISpanLabel> - {stripSpanPrefix(span.name)} - {spanHasError(span) && ( - <AISpanErrorIcon> - <Icon - name="bi-error" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </AISpanErrorIcon> + <TreeNodeContainer key={span.spanId} isLast={isLastChild}> + {renderAISpanContent(span, isSelected, false, false, handleToggle, !isRoot)} + + {hasAnyChildren && ( + <TreeNodeChildren> + {/* Render advanced mode spans if enabled */} + {isAdvancedMode && groupedNonAISpans.size > 0 && ( + <AdvancedSpanGroup> + {Array.from(groupedNonAISpans.entries()).map(([category, spans]) => { + const categoryKey = `${groupKey}-${category}`; + const isExpanded = expandedAdvancedSpanGroups.has(categoryKey); + + // Find root spans in this category (spans without parent in the list) + const spanIdsInCategory = new Set(spans.map((s: SpanData) => s.spanId)); + const rootSpansInCategory = spans.filter((s: SpanData) => + !s.parentSpanId || + s.parentSpanId === '0000000000000000' || + !spanIdsInCategory.has(s.parentSpanId) + ); + + // Sort root spans by start time + rootSpansInCategory.sort((a: SpanData, b: SpanData) => { + const aStart = a.startTime ? new Date(a.startTime).getTime() : 0; + const bStart = b.startTime ? new Date(b.startTime).getTime() : 0; + return aStart - bStart; + }); + + return ( + <div key={categoryKey}> + <AdvancedSpanGroupHeader + isExpanded={isExpanded} + onClick={() => { + const newExpanded = new Set(expandedAdvancedSpanGroups); + if (isExpanded) { + newExpanded.delete(categoryKey); + } else { + newExpanded.add(categoryKey); + } + setExpandedAdvancedSpanGroups(newExpanded); + }} + > + <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> + <span>{category} ({spans.length})</span> + </AdvancedSpanGroupHeader> + {isExpanded && ( + <AdvancedSpanGroupContent> + {rootSpansInCategory.map((rootSpan: SpanData, index: number) => + renderNonAISpanTreeItem(rootSpan, spans, index === 0, index === rootSpansInCategory.length - 1) + )} + </AdvancedSpanGroupContent> + )} + </div> + ); + })} + </AdvancedSpanGroup> )} - </AISpanLabel> - <AISpanMetadataGroup> - {!isNarrow && ( - <AISpanStartTime> - {startTime ? `Started ${startTime}` : ''} - </AISpanStartTime> - )} - {!isVeryNarrow && ( - <AISpanTokenCount> - {totalTokens > 0 ? `${totalTokens.toLocaleString()} Tokens` : ''} - </AISpanTokenCount> + {/* Render AI children */} + {children.map((child, index) => + renderAISpanTreeItem(child, index === 0 && groupedNonAISpans.size === 0, index === children.length - 1, false) )} - <AISpanDuration> - {duration !== null ? ( - <> - <Icon name="bi-clock" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> - {duration < 1000 ? `${duration}ms` : `${(duration / 1000).toFixed(2)}s`} - </> - ) : ''} - </AISpanDuration> - </AISpanMetadataGroup> - </AISpanTreeItem> - - {/* Render advanced mode spans if enabled */} - {isAdvancedMode && groupedNonAISpans.size > 0 && ( - <AdvancedSpanGroup level={level}> - {Array.from(groupedNonAISpans.entries()).map(([category, spans]) => { - const categoryKey = `${groupKey}-${category}`; - const isExpanded = expandedAdvancedSpanGroups.has(categoryKey); - - // Find root spans in this category (spans without parent in the list) - const spanIdsInCategory = new Set(spans.map((s: SpanData) => s.spanId)); - const rootSpansInCategory = spans.filter((s: SpanData) => - !s.parentSpanId || - s.parentSpanId === '0000000000000000' || - !spanIdsInCategory.has(s.parentSpanId) - ); - - // Sort root spans by start time - rootSpansInCategory.sort((a: SpanData, b: SpanData) => { - const aStart = a.startTime ? new Date(a.startTime).getTime() : 0; - const bStart = b.startTime ? new Date(b.startTime).getTime() : 0; - return aStart - bStart; - }); - - return ( - <div key={categoryKey}> - <AdvancedSpanGroupHeader - isExpanded={isExpanded} - onClick={() => { - const newExpanded = new Set(expandedAdvancedSpanGroups); - if (isExpanded) { - newExpanded.delete(categoryKey); - } else { - newExpanded.add(categoryKey); - } - setExpandedAdvancedSpanGroups(newExpanded); - }} - > - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - <span>{category} ({spans.length})</span> - </AdvancedSpanGroupHeader> - {isExpanded && ( - <AdvancedSpanGroupContent> - {rootSpansInCategory.map((rootSpan: SpanData) => - renderNonAISpanTreeItem(rootSpan, spans, 0) - )} - </AdvancedSpanGroupContent> - )} - </div> - ); - })} - </AdvancedSpanGroup> + </TreeNodeChildren> )} - - {/* Render AI children */} - {children.length > 0 && ( - <> - {children.map(child => renderAISpanTreeItem(child, level + 1))} - </> - )} - </React.Fragment> + </TreeNodeContainer> ); }; @@ -1295,179 +1534,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM const renderAgentChatLogs = () => ( <> - <NavigationBar> - <ViewModeToggle> - <ViewModeButton - isActive={viewMode === 'tree'} - onClick={() => setViewMode('tree')} - title="Tree View" - > - <Icon name="bi-list-tree" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} /> - </ViewModeButton> - <ViewModeButton - isActive={viewMode === 'timeline'} - onClick={() => setViewMode('timeline')} - title="Timeline View" - > - <Icon name="bi-timeline" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} /> - </ViewModeButton> - <ViewModeButton - isActive={viewMode === 'focus'} - onClick={() => setViewMode('focus')} - title="Focus Mode - Show only selected span details" - disabled={!selectedSpan} - style={{ opacity: !selectedSpan ? 0.5 : 1 }} - > - <Icon name="bi-focus" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} /> - </ViewModeButton> - </ViewModeToggle> - <ButtonGroup> - <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> - <Icon name="bi-download" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} /> - </ModeToggleButton> - {viewMode !== 'focus' && ( - <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> - <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> - {isAdvancedMode ? 'Hide Advanced Spans' : 'Show Hidden Spans'} - </ModeToggleButton> - )} - </ButtonGroup> - </NavigationBar> - - {/* Advanced mode: Show trace information sections */} - {/* {isAdvancedMode && ( - <> - <InfoSectionContainer> - <InfoSectionHeader onClick={() => toggleSection('trace')}> - <Codicon name={expandedSections.has('trace') ? 'chevron-down' : 'chevron-right'} /> - <span>Trace Information</span> - </InfoSectionHeader> - <InfoSectionContent isOpen={expandedSections.has('trace')}> - <InfoGrid> - <InfoLabel>Trace ID:</InfoLabel> - <InfoValue>{traceData.traceId}</InfoValue> - <InfoLabel>First Seen:</InfoLabel> - <InfoValue>{formatDate(traceData.firstSeen)}</InfoValue> - <InfoLabel>Last Seen:</InfoLabel> - <InfoValue>{formatDate(traceData.lastSeen)}</InfoValue> - <InfoLabel>Duration:</InfoLabel> - <InfoValue>{duration}ms</InfoValue> - </InfoGrid> - </InfoSectionContent> - </InfoSectionContainer> - - <InfoSectionContainer> - <InfoSectionHeader onClick={() => toggleSection('resource')}> - <Codicon name={expandedSections.has('resource') ? 'chevron-down' : 'chevron-right'} /> - <span>Resource</span> - </InfoSectionHeader> - <InfoSectionContent isOpen={expandedSections.has('resource')}> - <InfoGrid> - <InfoLabel>Name:</InfoLabel> - <InfoValue>{traceData.resource.name}</InfoValue> - </InfoGrid> - {traceData.resource.attributes && traceData.resource.attributes.length > 0 && ( - <AttributesContainer> - <InfoLabel style={{ marginBottom: '8px' }}>Attributes ({traceData.resource.attributes.length}):</InfoLabel> - {traceData.resource.attributes.map((attr, index) => ( - <AttributeItem key={index}> - <AttributeKey>{attr.key}:</AttributeKey> - <AttributeValue>{attr.value}</AttributeValue> - </AttributeItem> - ))} - </AttributesContainer> - )} - </InfoSectionContent> - </InfoSectionContainer> - - <InfoSectionContainer> - <InfoSectionHeader onClick={() => toggleSection('scope')}> - <Codicon name={expandedSections.has('scope') ? 'chevron-down' : 'chevron-right'} /> - <span>Instrumentation Scope</span> - </InfoSectionHeader> - <InfoSectionContent isOpen={expandedSections.has('scope')}> - <InfoGrid> - <InfoLabel>Name:</InfoLabel> - <InfoValue>{traceData.scope.name}</InfoValue> - {traceData.scope.version && ( - <> - <InfoLabel>Version:</InfoLabel> - <InfoValue>{traceData.scope.version}</InfoValue> - </> - )} - </InfoGrid> - {traceData.scope.attributes && traceData.scope.attributes.length > 0 && ( - <AttributesContainer> - <InfoLabel style={{ marginBottom: '8px' }}>Attributes ({traceData.scope.attributes.length}):</InfoLabel> - {traceData.scope.attributes.map((attr, index) => ( - <AttributeItem key={index}> - <AttributeKey>{attr.key}:</AttributeKey> - <AttributeValue>{attr.value}</AttributeValue> - </AttributeItem> - ))} - </AttributesContainer> - )} - </InfoSectionContent> - </InfoSectionContainer> - </> - )} */} - {rootAISpans.length === 0 ? ( <TraceEmptyState icon="comment-discussion" @@ -1476,41 +1542,106 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openInFocusM /> ) : ( <AgentChatLogsContainer> - {viewMode === 'tree' && ( - <AISpanTreeContainer - height={aiSpanTreeDimensions.height} - maxHeight={aiSpanTreeDimensions.maxHeight} - minHeight={aiSpanTreeDimensions.minHeight} - > - {isAdvancedMode - ? sortedRootSpans.map(span => renderMixedSpanTreeItem(span, 0)) - : rootAISpans.map(span => renderAISpanTreeItem(span, 0)) - } - </AISpanTreeContainer> - )} - {viewMode === 'timeline' && ( - <WaterfallView - spans={isAdvancedMode ? traceData.spans : rootAISpans} - selectedSpanId={selectedSpanId} - onSpanSelect={selectSpan} - isAdvancedMode={isAdvancedMode} - getChildSpans={isAdvancedMode ? getChildSpans : getAIChildSpans} - traceStartTime={traceData.firstSeen} - traceDuration={duration} - height={waterfallDimensions.height} - maxHeight={waterfallDimensions.maxHeight} - minHeight={waterfallDimensions.minHeight} - /> - )} + <SpanViewContainer width={isSidebarVisible ? spanViewWidth : 48} isResizing={isResizing} onMouseDown={isSidebarVisible ? handleMouseDown : undefined}> + <NavigationBar> + <ModeToggleButton + onClick={() => setIsSidebarVisible(!isSidebarVisible)} + title={isSidebarVisible ? "Hide sidebar" : "Show sidebar"} + > + <Icon + name={isSidebarVisible ? 'bi-left-panel-close' : 'bi-left-panel-open'} + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} /> + </ModeToggleButton> + {isSidebarVisible && ( + <> + <ButtonGroup> + <ModeToggleButton + onClick={() => setViewMode(viewMode === 'tree' ? 'timeline' : 'tree')} + title={viewMode === 'timeline' ? "Switch to Tree View" : "Switch to Timeline View"} + > + Timeline + </ModeToggleButton> + <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> + <Icon name="bi-download" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} /> + </ModeToggleButton> + <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> + <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> + </ModeToggleButton> + </ButtonGroup> + </> + )} + </NavigationBar> + {isSidebarVisible && ( + <> + {viewMode === 'tree' && ( + <AISpanTreeContainer + height={aiSpanTreeDimensions.height} + maxHeight={aiSpanTreeDimensions.maxHeight} + minHeight={aiSpanTreeDimensions.minHeight} + > + {isAdvancedMode + ? sortedRootSpans.map((span, index) => renderMixedSpanTreeItem(span, index === 0, index === sortedRootSpans.length - 1, true)) + : rootAISpans.map((span, index) => renderAISpanTreeItem(span, index === 0, index === rootAISpans.length - 1, true)) + } + </AISpanTreeContainer> + )} + {viewMode === 'timeline' && ( + <WaterfallView + spans={isAdvancedMode ? traceData.spans : rootAISpans} + selectedSpanId={selectedSpanId} + onSpanSelect={selectSpan} + isAdvancedMode={isAdvancedMode} + getChildSpans={isAdvancedMode ? getChildSpans : getAIChildSpans} + traceStartTime={traceData.firstSeen} + traceDuration={duration} + height={waterfallDimensions.height} + maxHeight={waterfallDimensions.maxHeight} + minHeight={waterfallDimensions.minHeight} + /> + )} + </> + )} + </SpanViewContainer> {selectedSpan && ( - <DetailsPanel> - <SpanInputOutput - spanData={selectedSpan} - spanName={selectedSpan.name} - totalInputTokens={totalInputTokens} - totalOutputTokens={totalOutputTokens} - /> - </DetailsPanel> + <> + <DetailsPanelContainer> + <DetailsPanel> + <SpanInputOutput + spanData={selectedSpan} + spanName={selectedSpan.name} + totalInputTokens={totalInputTokens} + totalOutputTokens={totalOutputTokens} + /> + </DetailsPanel> + </DetailsPanelContainer> + </> )} </AgentChatLogsContainer> )} diff --git a/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx b/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx index 904afe2b814..3025f1940ab 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx @@ -25,7 +25,7 @@ interface AIBadgeProps { const AISpanBadge = styled.span<{ type: string }>` font-size: 10px; - padding: 3px 8px; + padding: 4px; border-radius: 3px; font-weight: 500; flex-shrink: 0; @@ -58,15 +58,6 @@ export function AIBadge({ type }: AIBadgeProps) { } }; - const getLabel = () => { - switch (type) { - case 'invoke': return 'Invoke Agent'; - case 'chat': return 'Chat'; - case 'tool': return 'Execute Tool'; - default: return 'Operation'; - } - }; - return ( <AISpanBadge type={type}> <Icon @@ -86,7 +77,6 @@ export function AIBadge({ type }: AIBadgeProps) { justifyContent: 'center' }} /> - <span className="ai-span-label">{getLabel()}</span> </AISpanBadge> ); } diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index e8864d74189..4c74d022a2d 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -105,11 +105,11 @@ const KeyBadge = styled.span<{ isArrayIndex?: boolean }>` border-radius: 3px; min-height: 18px; background-color: ${(props: { isArrayIndex?: boolean }) => props.isArrayIndex - ? 'var(--vscode-badge-background)' - : 'var(--vscode-list-hoverBackground)'}; + ? 'var(--vscode-list-hoverBackground)' + : 'var(--vscode-button-background)'}; color: ${(props: { isArrayIndex?: boolean }) => props.isArrayIndex ? 'var(--vscode-badge-foreground)' - : 'var(--vscode-editor-foreground)'}; + : 'var(--vscode-button-foreground)'}; border: 1px solid var(--vscode-button-border); flex-shrink: 0; `; diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index de5b298e2fa..768ca35eab3 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -103,13 +103,14 @@ export const ToggleButton = styled.button<ToggleButtonProps>` cursor: pointer; transition: all 0.15s ease; + background-color: ${(props: ToggleButtonProps) => props.active - ? 'var(--vscode-button-background)' + ? 'var(--vscode-badge-background)' : 'var(--vscode-input-background)'}; color: ${(props: ToggleButtonProps) => props.active - ? 'var(--vscode-button-foreground)' + ? 'var(--vscode-badge-foreground)' : 'var(--vscode-foreground)'}; &:first-of-type { @@ -121,10 +122,7 @@ export const ToggleButton = styled.button<ToggleButtonProps>` } &:hover { - background-color: ${(props: ToggleButtonProps) => - props.active - ? 'var(--vscode-button-hoverBackground)' - : 'var(--vscode-list-hoverBackground)'}; + background-color: var(--vscode-list-hoverBackground); } `; diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 2f48982fb27..8b01adf8a7f 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -197,10 +197,6 @@ const InputOutputGrid = styled.div` display: grid; grid-template-columns: 1fr; gap: 16px; - - @media (min-width: 900px) { - grid-template-columns: 1fr 1fr; - } `; const SubSection = styled.div``; diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index a793ddc2ccc..3867db8a8d6 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -51,18 +51,12 @@ const WaterfallContainer = styled.div` const ZoomControlsBar = styled.div` display: flex; align-items: center; - justify-content: space-between; + justify-content: center; padding: 8px 12px; border-bottom: 1px solid var(--vscode-panel-border); background-color: var(--vscode-editorWidget-background); `; -const ZoomControlsLabel = styled.span` - font-size: 13px; - font-weight: 500; - color: var(--vscode-foreground); -`; - const ZoomControlsGroup = styled.div` display: flex; align-items: center; @@ -565,7 +559,6 @@ export function WaterfallView({ <WaterfallContainer> {/* Zoom Controls */} <ZoomControlsBar> - <ZoomControlsLabel>Timeline</ZoomControlsLabel> <ZoomControlsGroup> <ZoomButton onClick={() => setZoom(Math.max(0.2, zoom - 0.1))} diff --git a/workspaces/ballerina/trace-visualizer/src/index.tsx b/workspaces/ballerina/trace-visualizer/src/index.tsx index b1887115880..e66c5f7a135 100644 --- a/workspaces/ballerina/trace-visualizer/src/index.tsx +++ b/workspaces/ballerina/trace-visualizer/src/index.tsx @@ -60,16 +60,16 @@ export interface AttributeData { declare global { interface Window { traceVisualizer: { - renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openInFocusMode?: boolean) => void; + renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openWithSidebarCollapsed?: boolean) => void; }; } } -export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openInFocusMode?: boolean) { +export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openWithSidebarCollapsed?: boolean) { const root = createRoot(target); root.render( <React.StrictMode> - <TraceDetails traceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} openInFocusMode={openInFocusMode} /> + <TraceDetails traceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} openWithSidebarCollapsed={openWithSidebarCollapsed} /> </React.StrictMode> ); } diff --git a/workspaces/ballerina/trace-visualizer/src/utils.ts b/workspaces/ballerina/trace-visualizer/src/utils.ts index 7c0b690627a..a797670a247 100644 --- a/workspaces/ballerina/trace-visualizer/src/utils.ts +++ b/workspaces/ballerina/trace-visualizer/src/utils.ts @@ -248,3 +248,12 @@ export function parseNestedJSON(value: unknown): unknown { } return value; } + +export const getSpanLabel = (type: string) => { + switch (type) { + case 'invoke': return 'Invoke Agent'; + case 'chat': return 'Chat'; + case 'tool': return 'Execute Tool'; + default: return 'Operation'; + } +}; diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-close.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-close.svg new file mode 100644 index 00000000000..204de479b1d --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-close.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M16.5 14.8V9.2q0-.35-.3-.475t-.55.125L13.2 11.3q-.3.3-.3.7t.3.7l2.45 2.45q.25.25.55.125t.3-.475M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm3-2V5H5v14zm2 0h9V5h-9zm-2 0H5z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-open.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-open.svg new file mode 100644 index 00000000000..10c7fd9680f --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-left-panel-open.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M12.5 9.2v5.6q0 .35.3.475t.55-.125l2.45-2.45q.3-.3.3-.7t-.3-.7l-2.45-2.45q-.25-.25-.55-.125t-.3.475M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm3-2V5H5v14zm2 0h9V5h-9zm-2 0H5z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-server.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-server.svg new file mode 100644 index 00000000000..c79c53e30a6 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-server.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <g fill="none"> + <path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z" /> + <path fill="currentColor" d="M18 3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm0 12H6v4h12zm-5 1a1 1 0 1 1 0 2a1 1 0 0 1 0-2m3 0a1 1 0 1 1 0 2a1 1 0 0 1 0-2m2-6H6v3h12zm0-5H6v3h12z" stroke-width="0.5" stroke="currentColor" /> + </g> +</svg> \ No newline at end of file From fd15e2b258717cc0bb9b93c4ee84bb027991fe07 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 20 Jan 2026 14:59:41 +0530 Subject: [PATCH 110/247] Close vscode sidebar when opening trace view --- .../src/features/tracing/trace-details-webview.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 166827bd5f7..01fbb4910c7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -147,6 +147,8 @@ export class TraceDetailsWebview { instance._panel.title = isAgentChat ? 'Agent Chat Logs' : 'Trace Details'; } + vscode.commands.executeCommand('workbench.action.closeSidebar'); + instance._panel!.reveal(ViewColumn.One); instance.updateWebview(); } From 7c1148dc024c9a5a11e476763fe741758388595f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 21 Jan 2026 10:14:17 +0530 Subject: [PATCH 111/247] Update waterfall span view with styles for vertical view --- .../Components/ChatInterface.tsx | 3 +- .../trace-visualizer/src/TraceDetails.tsx | 3 - .../src/components/WaterfallView.tsx | 666 +++++++++++------- 3 files changed, 396 insertions(+), 276 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 653d447c0a1..2503610ef84 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -475,8 +475,7 @@ const ChatInterface: React.FC = () => { {/* Render each message */} {messages.map((msg, idx) => ( <React.Fragment key={idx}> - {/* Show execution timeline ABOVE agent message if available */} - {!msg.isUser && msg?.executionSteps && msg.executionSteps.length > 0 && msg.traceId && ( + {!msg.isUser && isTracingEnabled && msg?.executionSteps && msg.executionSteps.length > 0 && msg.traceId && ( <ExecutionTimeline steps={msg.executionSteps} traceId={msg.traceId} diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index adcf25f8da7..77cb970ee76 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -1621,9 +1621,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide getChildSpans={isAdvancedMode ? getChildSpans : getAIChildSpans} traceStartTime={traceData.firstSeen} traceDuration={duration} - height={waterfallDimensions.height} - maxHeight={waterfallDimensions.maxHeight} - minHeight={waterfallDimensions.minHeight} /> )} </> diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index 3867db8a8d6..0ec6bdd312c 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -6,7 +6,7 @@ * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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 @@ -16,11 +16,13 @@ * under the License. */ -import React, { useState, useMemo } from 'react'; +import React, { useState, useMemo, useRef, useEffect } from 'react'; import styled from '@emotion/styled'; import { SpanData } from '../index'; import { Codicon, Icon } from '@wso2/ui-toolkit'; +// --- Interfaces --- + interface WaterfallViewProps { spans: SpanData[]; selectedSpanId: string | null; @@ -29,32 +31,37 @@ interface WaterfallViewProps { getChildSpans: (spanId: string) => SpanData[]; traceStartTime: string; traceDuration: number; - height: number; - maxHeight: number; - minHeight: number; } interface FlatSpan extends SpanData { + status: any; level: number; startOffsetMs: number; durationMs: number; + hasChildren: boolean; + isCollapsed: boolean; } -// Styled Components +// --- Styled Components --- + const WaterfallContainer = styled.div` background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; + display: flex; + flex-direction: column; overflow: hidden; + margin: 0 8px; + height: 100%; + container-type: inline-size; `; const ZoomControlsBar = styled.div` display: flex; align-items: center; - justify-content: center; - padding: 8px 12px; + justify-content: space-between; + padding: 8px 0; border-bottom: 1px solid var(--vscode-panel-border); - background-color: var(--vscode-editorWidget-background); + flex-shrink: 0; + gap: 8px; `; const ZoomControlsGroup = styled.div` @@ -66,17 +73,28 @@ const ZoomControlsGroup = styled.div` const ZoomButton = styled.button` display: flex; align-items: center; - justify-content: center; - width: 24px; - height: 24px; - background: var(--vscode-button-secondaryBackground); + gap: 4px; + padding: 4px 8px; + background: transparent; border: 1px solid var(--vscode-panel-border); - border-radius: 3px; - cursor: pointer; color: var(--vscode-foreground); + border-radius: 4px; + cursor: pointer; + font-size: 13px; + transition: background-color 0.15s ease; + height: 26px; /* Explicit height for consistency */ &:hover { - background: var(--vscode-button-secondaryHoverBackground); + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; } `; @@ -102,53 +120,75 @@ const ZoomSlider = styled.input` const ZoomLabel = styled.span` font-size: 11px; color: var(--vscode-descriptionForeground); - min-width: 35px; + min-width: 12px; + text-align: right; `; -const TimelineContent = styled.div<{ height: number; maxHeight: number; minHeight: number }>` +const TimelineScrollArea = styled.div` + flex: 1; overflow-x: auto; overflow-y: auto; - height: ${(props: { height: number }) => props.height}px; - max-height: ${(props: { maxHeight: number }) => props.maxHeight}px; - min-height: ${(props: { minHeight: number }) => props.minHeight}px; - resize: vertical; + position: relative; + + &::-webkit-scrollbar { + width: 10px; + height: 10px; + } + &::-webkit-scrollbar-thumb { + background: var(--vscode-scrollbarSlider-background); + border-radius: 5px; + } + &::-webkit-scrollbar-corner { + background: transparent; + } `; -const TimelineInner = styled.div<{ width: number }>` - min-width: ${(props: { width: number }) => props.width}%; +const TimelineContent = styled.div<{ widthPercent: number }>` + width: ${(props: { widthPercent: number }) => props.widthPercent}%; + min-width: 100%; + position: relative; + height: 100%; `; const TimeAxis = styled.div` - position: relative; - height: 28px; + position: sticky; + top: 0; + height: 24px; width: 100%; border-bottom: 1px solid var(--vscode-panel-border); background-color: var(--vscode-editorWidget-background); + z-index: 10; + box-shadow: 0 1px 2px rgba(0,0,0,0.1); `; -const TimeMarker = styled.div<{ position: number }>` +const TimeMarker = styled.div<{ left: number }>` position: absolute; - left: ${(props: { position: number }) => props.position}%; + left: ${(props: { left: number }) => props.left}%; + transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; + pointer-events: none; `; const TimeMarkerTick = styled.div` width: 1px; - height: 8px; - background-color: var(--vscode-panel-border); + height: 4px; + background-color: var(--vscode-descriptionForeground); `; const TimeMarkerLabel = styled.span` - font-size: 11px; + font-size: 10px; color: var(--vscode-descriptionForeground); margin-top: 2px; + white-space: nowrap; `; const SpansContainer = styled.div` position: relative; - width: 100%;\n`; + width: 100%; + min-height: calc(100% - 24px); +`; const GridLinesContainer = styled.div` position: absolute; @@ -160,121 +200,116 @@ const GridLinesContainer = styled.div` z-index: 0; `; -const GridLineVertical = styled.div<{ position: number }>` +const GridLineVertical = styled.div<{ left: number }>` position: absolute; - left: ${(props: { position: number }) => props.position}%; + left: ${(props: { left: number }) => props.left}%; top: 0; bottom: 0; width: 1px; - background-color: var(--vscode-panel-border); - opacity: 0.3; + background-color: var(--vscode-editor-lineHighlightBorder); + opacity: 0.4; `; const SpanRow = styled.div<{ isSelected: boolean; level: number }>` position: relative; - height: 36px; + height: 44px; width: 100%; - min-width: 100%; - border-bottom: 1px solid var(--vscode-panel-border); - background-color: ${(props: { isSelected: boolean; level: number }) => props.isSelected + display: flex; + align-items: center; + background-color: ${(props: { isSelected: boolean }) => props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; &:hover { - background-color: ${(props: { isSelected: boolean; level: number }) => props.isSelected + background-color: ${(props: { isSelected: boolean }) => props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; } `; +const HierarchyGuide = styled.div<{ level: number }>` + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: ${(props: { level: number }) => props.level * 12}px; + border-right: 1px solid transparent; + pointer-events: none; + background: linear-gradient(90deg, transparent 95%, var(--vscode-tree-indentGuidesStroke) 100%); + background-size: 12px 100%; + opacity: 0.3; + z-index: 0; +`; + interface SpanBarProps { type: string; left: number; width: number; - isSelected: boolean; - level: number; -} - -interface SpanBarIconProps { - type: string; -} - -interface SpanBarIconProps { - type: string; } const SpanBar = styled.div<SpanBarProps>` position: absolute; - top: 6px; + top: 4px; height: 24px; - left: calc(${(props: SpanBarProps) => props.left}% + ${(props: SpanBarProps) => props.level * 20}px); - width: ${(props: SpanBarProps) => props.width}%; - min-width: 1px; + left: ${(props: SpanBarProps) => props.left}%; + width: ${(props: SpanBarProps) => Math.max(props.width, 0.1)}%; + border-radius: 3px; cursor: pointer; display: flex; align-items: center; - padding: 0 8px; + padding: 6px 6px; gap: 6px; overflow: visible; - transition: box-shadow 0.15s ease; - z-index: 1; + transition: opacity 0.15s ease; + z-index: 2; border: 1px solid; - border-color: ${(props: SpanBarIconProps) => { - switch (props.type) { - case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; - case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - default: return 'var(--vscode-badge-background)'; - } - }}; - - &:before { - content: ""; - position: absolute; - inset: 0; - background-color: ${(props: SpanBarIconProps) => { - switch (props.type) { - case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; - case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - default: return 'var(--vscode-badge-background)'; - } - }}; - opacity: 0.1; - border-radius: inherit; - z-index: -1; + border-color: ${(props: SpanBarProps) => getSpanColor(props.type)}; + background-color: ${(props: SpanBarProps) => getSpanBgColor(props.type)}; + + &:hover { + box-shadow: 0 2px 4px rgba(0,0,0,0.2); + z-index: 3; } `; -const SpanBarIcon = styled.span<SpanBarIconProps>` +const ChevronWrapper = styled.div` display: flex; align-items: center; + justify-content: center; + width: 14px; + height: 14px; + border-radius: 2px; flex-shrink: 0; - opacity: 0.9; - color: ${(props: SpanBarIconProps) => { - switch (props.type) { - case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; - case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - default: return 'var(--vscode-badge-background)'; - } - }}; + + &:hover { + background-color: rgba(255, 255, 255, 0.2); + } +`; + +const SpanBarIcon = styled.span<{ type: string }>` + display: flex; + align-items: center; + flex-shrink: 0; + color: ${(props: { type: string; }) => getSpanColor(props.type)}; `; const SpanBarLabel = styled.span` - font-size: 12px; + font-size: 11px; white-space: nowrap; flex: 1; font-weight: 500; + color: var(--vscode-foreground); + mix-blend-mode: hard-light; `; const SpanBarDuration = styled.span` - font-size: 11px; - opacity: 0.85; + font-size: 10px; + opacity: 0.8; flex-shrink: 0; margin-left: auto; + padding-left: 4px; `; const Tooltip = styled.div<{ x: number; y: number }>` @@ -284,10 +319,10 @@ const Tooltip = styled.div<{ x: number; y: number }>` background-color: var(--vscode-editorHoverWidget-background); border: 1px solid var(--vscode-editorHoverWidget-border); border-radius: 4px; - padding: 8px 12px; + padding: 10px; z-index: 1000; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - max-width: 300px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25); + max-width: 320px; pointer-events: none; `; @@ -295,29 +330,25 @@ const TooltipHeader = styled.div` display: flex; align-items: center; gap: 8px; - margin-bottom: 6px; + margin-bottom: 8px; + border-bottom: 1px solid var(--vscode-panel-border); + padding-bottom: 6px; `; const TooltipBadge = styled.span<{ type: string }>` font-size: 10px; padding: 2px 6px; border-radius: 3px; - font-weight: 500; - background-color: ${(props: { type: string }) => { - switch (props.type) { - case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; - case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - default: return 'var(--vscode-badge-background)'; - } - }}; + font-weight: 600; + background-color: ${(props: { type: string }) => getSpanColor(props.type)}; color: var(--vscode-editor-background); `; const TooltipName = styled.span` - font-size: 13px; - font-weight: 500; + font-size: 12px; + font-weight: 600; color: var(--vscode-foreground); + word-break: break-all; `; const TooltipDetails = styled.div` @@ -327,19 +358,44 @@ const TooltipDetails = styled.div` `; const TooltipRow = styled.div` - font-size: 12px; + font-size: 11px; color: var(--vscode-descriptionForeground); display: flex; - align-items: center; - gap: 4px; + justify-content: space-between; + gap: 12px; span.value { color: var(--vscode-foreground); - font-weight: 500; + font-family: var(--vscode-editor-font-family); } `; -// Helper functions +// --- Helper Functions --- + +const getSpanKindString = (kind: any): string => { + if (kind === 3 || kind === 'CLIENT') return 'client'; + if (kind === 2 || kind === 'SERVER') return 'server'; + if (kind === 4 || kind === 'PRODUCER') return 'producer'; + if (kind === 5 || kind === 'CONSUMER') return 'consumer'; + return 'internal'; +}; + +const getSpanColor = (type: string) => { + switch (type) { + case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + case 'error': return 'var(--vscode-terminal-ansiRed)'; + case 'client': return 'var(--vscode-terminal-ansiBlue)'; + case 'server': return 'var(--vscode-terminal-ansiGreen)'; + default: return 'var(--vscode-badge-background)'; + } +}; + +const getSpanBgColor = (type: string) => { + return 'var(--vscode-editor-background)'; +}; + const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { if (!span.startTime || !span.endTime) return null; return { @@ -349,14 +405,22 @@ const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null }; const formatDuration = (durationMs: number): string => { - return durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`; + if (durationMs === 0) return '< 1ms'; + return durationMs < 1000 ? `${durationMs.toFixed(0)}ms` : `${(durationMs / 1000).toFixed(3)}s`; }; -const getSpanType = (span: SpanData): 'invoke' | 'chat' | 'tool' | 'other' => { +const getSpanType = (span: SpanData): 'invoke' | 'chat' | 'tool' | 'error' | 'client' | 'server' | 'other' => { + if (span.status?.code === 2) return 'error'; + const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; if (operationName.startsWith('invoke_agent')) return 'invoke'; if (operationName.startsWith('chat') || span.name.toLowerCase().startsWith('chat')) return 'chat'; if (operationName.startsWith('execute_tool') || span.name.toLowerCase().startsWith('execute_tool')) return 'tool'; + + const kind = getSpanKindString(span.kind); + if (kind === 'client') return 'client'; + if (kind === 'server') return 'server'; + return 'other'; }; @@ -365,7 +429,10 @@ const getTypeLabel = (type: string): string => { case 'invoke': return 'Agent'; case 'chat': return 'Model'; case 'tool': return 'Tool'; - default: return 'Operation'; + case 'error': return 'Error'; + case 'client': return 'Client'; + case 'server': return 'Server'; + default: return 'Span'; } }; @@ -374,6 +441,9 @@ const getTypeIcon = (type: string): string => { case 'invoke': return 'bi-ai-agent'; case 'chat': return 'bi-chat'; case 'tool': return 'bi-wrench'; + case 'error': return 'bi-error'; + case 'client': return 'bi-arrow-outward'; + case 'server': return 'bi-server'; default: return 'bi-action'; } }; @@ -394,6 +464,8 @@ const getSpanTokens = (span: SpanData): number => { return inputTokens + outputTokens; }; +// --- Main Component --- + export function WaterfallView({ spans, selectedSpanId, @@ -401,242 +473,287 @@ export function WaterfallView({ getChildSpans, traceStartTime, traceDuration, - height, - maxHeight, - minHeight }: WaterfallViewProps) { - const [zoom, setZoom] = useState(0.8); + const [zoom, setZoom] = useState(1); const [hoveredSpan, setHoveredSpan] = useState<{ span: FlatSpan; x: number; y: number } | null>(null); + const [collapsedSpanIds, setCollapsedSpanIds] = useState<Set<string>>(new Set()); + const [isCompact, setIsCompact] = useState(false); - const traceStartMs = useMemo(() => new Date(traceStartTime).getTime(), [traceStartTime]); + const scrollContainerRef = useRef<HTMLDivElement>(null); + const containerRef = useRef<HTMLDivElement>(null); - // Calculate the actual earliest start time from all spans - const actualTraceStartMs = useMemo(() => { - if (spans.length === 0) return traceStartMs; + const traceStartMs = useMemo(() => new Date(traceStartTime).getTime(), [traceStartTime]); - let earliestStart = Infinity; + // Resize Observer for Compact Mode + useEffect(() => { + if (!containerRef.current) return; - const findEarliestStart = (span: SpanData) => { - const range = getSpanTimeRange(span); - if (range) { - earliestStart = Math.min(earliestStart, range.start); + const observer = new ResizeObserver((entries) => { + for (const entry of entries) { + // If width < 300px, switch to compact mode + setIsCompact(entry.contentRect.width < 300); } - const children = getChildSpans(span.spanId); - children.forEach(findEarliestStart); - }; - - // Find root spans - const spanIds = new Set(spans.map(s => s.spanId)); - const roots = spans.filter(span => - !span.parentSpanId || - span.parentSpanId === '0000000000000000' || - !spanIds.has(span.parentSpanId) - ); + }); - roots.forEach(findEarliestStart); + observer.observe(containerRef.current); + return () => observer.disconnect(); + }, []); - const calculatedStart = earliestStart !== Infinity ? earliestStart : traceStartMs; + // Flatten Span Hierarchy + const flatSpans = useMemo(() => { + const result: FlatSpan[] = []; + const processed = new Set<string>(); - return calculatedStart; - }, [spans, traceStartMs, traceStartTime, getChildSpans]); + const processSpan = (span: SpanData, level: number) => { + if (processed.has(span.spanId)) return; + processed.add(span.spanId); - // Calculate actual duration based on spans to ensure all spans are visible - const actualTraceDuration = useMemo(() => { - if (spans.length === 0) return traceDuration; + const range = getSpanTimeRange(span); + const startOffsetMs = range ? Math.max(0, range.start - traceStartMs) : 0; + const durationMs = range ? Math.max(0, range.end - range.start) : 0; + + // Check children presence and sort them + let children = getChildSpans(span.spanId); + children.sort((a, b) => { + const aStart = getSpanTimeRange(a)?.start || 0; + const bStart = getSpanTimeRange(b)?.start || 0; + return aStart - bStart; + }); + const hasChildren = children.length > 0; + const isCollapsed = collapsedSpanIds.has(span.spanId); - let maxEndOffset = 0; + result.push({ + ...span, + level, + startOffsetMs, + durationMs, + hasChildren, + isCollapsed + }); - // Recursively process all spans including children - const processSpan = (span: SpanData) => { - const range = getSpanTimeRange(span); - if (range) { - const endOffset = range.end - actualTraceStartMs; - maxEndOffset = Math.max(maxEndOffset, endOffset); + // Recurse only if not collapsed + if (hasChildren && !isCollapsed) { + children.forEach(child => processSpan(child, level + 1)); } - const children = getChildSpans(span.spanId); - children.forEach(processSpan); }; - // Find root spans and process their hierarchies - const spanIds = new Set(spans.map(s => s.spanId)); + const allSpanIds = new Set(spans.map(s => s.spanId)); const roots = spans.filter(span => !span.parentSpanId || span.parentSpanId === '0000000000000000' || - !spanIds.has(span.parentSpanId) - ); - roots.forEach(processSpan); - - const finalDuration = Math.max(maxEndOffset, traceDuration); - - // Use the maximum of the calculated duration and the provided traceDuration - return finalDuration; - }, [spans, actualTraceStartMs, traceDuration, getChildSpans]); - - // Find root spans (no parent or parent not in our span list) - const rootSpans = useMemo(() => { - const spanIds = new Set(spans.map(s => s.spanId)); - return spans.filter(span => - !span.parentSpanId || - span.parentSpanId === '0000000000000000' || - !spanIds.has(span.parentSpanId) + !allSpanIds.has(span.parentSpanId) ).sort((a, b) => { - const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; - const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; - return aTime - bTime; + const aStart = getSpanTimeRange(a)?.start || 0; + const bStart = getSpanTimeRange(b)?.start || 0; + return aStart - bStart; }); - }, [spans]); - // Flatten span hierarchy for rendering - const flatSpans = useMemo(() => { - const result: FlatSpan[] = []; + roots.forEach(span => processSpan(span, 0)); + return result; + }, [spans, getChildSpans, traceStartMs, collapsedSpanIds]); + + // Calculate actual content duration (longest span) + const contentMaxDurationMs = useMemo(() => { + let max = traceDuration; + flatSpans.forEach(s => { + if (s.startOffsetMs + s.durationMs > max) { + max = s.startOffsetMs + s.durationMs; + } + }); + return max > 0 ? max : 1000; + }, [flatSpans, traceDuration]); - const processSpan = (span: SpanData, level: number) => { - const range = getSpanTimeRange(span); - const startOffsetMs = range ? Math.max(0, range.start - actualTraceStartMs) : 0; - const durationMs = range ? range.end - range.start : 0; + // Generate Layout Data: Ticks and View Duration + const timelineLayout = useMemo(() => { + const totalPixels = zoom * (scrollContainerRef.current?.clientWidth || 1000); + const targetTicks = Math.max(5, Math.floor(totalPixels / 150)); - result.push({ - ...span, - level, - startOffsetMs, - durationMs - }); + const rawInterval = contentMaxDurationMs / targetTicks; + const magnitude = Math.pow(10, Math.floor(Math.log10(rawInterval))); + const normalized = rawInterval / magnitude; - const children = getChildSpans(span.spanId); - children.forEach(child => processSpan(child, level + 1)); - }; + let interval; + if (normalized < 1.5) interval = 1 * magnitude; + else if (normalized < 3) interval = 2 * magnitude; + else if (normalized < 7.5) interval = 5 * magnitude; + else interval = 10 * magnitude; - rootSpans.forEach(span => processSpan(span, 0)); - return result; - }, [rootSpans, getChildSpans, actualTraceStartMs]); + const viewDuration = Math.ceil(contentMaxDurationMs / interval) * interval; + const finalViewDuration = viewDuration < contentMaxDurationMs ? viewDuration + interval : viewDuration; - // Calculate time markers based on total duration - const timeMarkers = useMemo(() => { const markers: number[] = []; - if (actualTraceDuration <= 0) return markers; - - // Dynamic interval calculation for better scaling - const intervalMs = actualTraceDuration <= 1000 ? 200 : - actualTraceDuration <= 2000 ? 500 : - actualTraceDuration <= 5000 ? 1000 : - actualTraceDuration <= 10000 ? 2000 : - actualTraceDuration <= 30000 ? 5000 : - actualTraceDuration <= 60000 ? 10000 : 15000; - - for (let t = 0; t <= actualTraceDuration; t += intervalMs) { + for (let t = 0; t <= finalViewDuration; t += interval) { markers.push(t); } - // Ensure we have a marker at or very close to the end - const lastMarker = markers[markers.length - 1]; - if (lastMarker < actualTraceDuration && actualTraceDuration - lastMarker > intervalMs * 0.1) { - markers.push(actualTraceDuration); - } - - return markers; - }, [actualTraceDuration]); + return { + markers, + viewDuration: finalViewDuration + }; + }, [contentMaxDurationMs, zoom]); const formatTimeMarker = (ms: number): string => { - return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(ms % 1000 === 0 ? 0 : 1)}s`; + if (ms === 0) return '0ms'; + if (ms < 1000) return `${ms}ms`; + return `${(ms / 1000).toFixed(2)}s`; }; const handleSpanMouseEnter = (span: FlatSpan, event: React.MouseEvent) => { const rect = event.currentTarget.getBoundingClientRect(); + const screenWidth = window.innerWidth; + const x = Math.min(rect.left + rect.width / 2, screenWidth - 340); + setHoveredSpan({ span, - x: rect.left + rect.width / 2, + x: Math.max(10, x), y: rect.top - 10 }); }; - const handleSpanMouseLeave = () => { - setHoveredSpan(null); + // Collapse Actions + const handleToggleCollapse = (spanId: string) => { + const newSet = new Set(collapsedSpanIds); + if (newSet.has(spanId)) { + newSet.delete(spanId); + } else { + newSet.add(spanId); + } + setCollapsedSpanIds(newSet); }; - const timelineWidth = 100 * zoom; + const handleToggleAll = () => { + // If we have any collapsed spans, we expand all (clear set) + // If nothing is collapsed, we collapse all parents + if (collapsedSpanIds.size > 0) { + setCollapsedSpanIds(new Set()); + } else { + const allParentIds = new Set<string>(); + spans.forEach(s => { + const children = getChildSpans(s.spanId); + if (children.length > 0) { + allParentIds.add(s.spanId); + } + }); + setCollapsedSpanIds(allParentIds); + } + }; + + // Determine icon for the "Toggle All" button + const isAnyCollapsed = collapsedSpanIds.size > 0; return ( - <WaterfallContainer> + <WaterfallContainer ref={containerRef}> {/* Zoom Controls */} <ZoomControlsBar> + <ZoomButton + onClick={handleToggleAll} + title={isAnyCollapsed ? "Expand All Spans" : "Collapse All Spans"} + > + <Icon + name={isAnyCollapsed ? 'bi-expand-item' : 'bi-collapse-item'} + sx={{ fontSize: "14px", width: "14px", height: "14px" }} + iconSx={{ display: "flex" }} + /> + {!isCompact && (isAnyCollapsed ? 'Expand' : 'Collapse')} + </ZoomButton> <ZoomControlsGroup> <ZoomButton - onClick={() => setZoom(Math.max(0.2, zoom - 0.1))} + onClick={() => setZoom(Math.max(1, zoom - 1))} title="Zoom out" + disabled={zoom <= 1} > <Codicon name="zoom-out" /> </ZoomButton> - <ZoomSlider - type="range" - min="0.2" - max="1" - step="0.1" - value={zoom} - onChange={(e) => setZoom(parseFloat(e.target.value))} - /> - <ZoomLabel>{Math.round(zoom * 100)}%</ZoomLabel> + {!isCompact && ( + <> + <ZoomSlider + type="range" + min="1" + max="20" + step="0.5" + value={zoom} + onChange={(e) => setZoom(parseFloat(e.target.value))} + /> + <ZoomLabel>{zoom.toFixed(1)}x</ZoomLabel> + </> + )} <ZoomButton - onClick={() => setZoom(Math.min(1, zoom + 0.1))} + onClick={() => setZoom(Math.min(20, zoom + 1))} title="Zoom in" + disabled={zoom >= 20} > <Codicon name="zoom-in" /> </ZoomButton> </ZoomControlsGroup> </ZoomControlsBar> - {/* Timeline Content */} - <TimelineContent - height={height} - maxHeight={maxHeight} - minHeight={minHeight} - > - <TimelineInner width={timelineWidth}> + {/* Scroll Area */} + <TimelineScrollArea ref={scrollContainerRef}> + <TimelineContent widthPercent={zoom * 100}> {/* Time Axis */} <TimeAxis> - {timeMarkers.map((ms) => ( - <TimeMarker key={ms} position={(ms / actualTraceDuration) * 100 * zoom}> + {timelineLayout.markers.map((ms) => ( + <TimeMarker key={ms} left={(ms / timelineLayout.viewDuration) * 100}> <TimeMarkerTick /> <TimeMarkerLabel>{formatTimeMarker(ms)}</TimeMarkerLabel> </TimeMarker> ))} </TimeAxis> - {/* Spans */} <SpansContainer> - {/* Grid lines layer */} + {/* Background Grid */} <GridLinesContainer> - {timeMarkers.map((ms) => ( + {timelineLayout.markers.map((ms) => ( <GridLineVertical key={ms} - position={(ms / actualTraceDuration) * 100 * zoom} + left={(ms / timelineLayout.viewDuration) * 100} /> ))} </GridLinesContainer> + {/* Span Rows */} {flatSpans.map((span) => { - // Calculate percentages relative to the trace duration and apply zoom - const leftPercent = actualTraceDuration > 0 - ? (span.startOffsetMs / actualTraceDuration) * 100 * zoom - : 0; - const widthPercent = actualTraceDuration > 0 - ? Math.max(0.1, (span.durationMs / actualTraceDuration) * 100 * zoom) - : 0; const spanType = getSpanType(span); const isSelected = selectedSpanId === span.spanId; + const leftPercent = (span.startOffsetMs / timelineLayout.viewDuration) * 100; + const widthPercent = (span.durationMs / timelineLayout.viewDuration) * 100; return ( - <SpanRow key={span.spanId} isSelected={isSelected} level={span.level}> - {/* Span bar */} + <SpanRow + key={span.spanId} + isSelected={isSelected} + level={span.level} + > + <HierarchyGuide level={span.level} /> <SpanBar type={spanType} left={leftPercent} width={widthPercent} - isSelected={isSelected} - level={span.level} - onClick={() => onSpanSelect(span.spanId)} + onClick={(e) => { + e.stopPropagation(); + onSpanSelect(span.spanId); + }} onMouseEnter={(e) => handleSpanMouseEnter(span, e)} - onMouseLeave={handleSpanMouseLeave} + onMouseLeave={() => setHoveredSpan(null)} + style={{ + backgroundColor: `color-mix(in srgb, ${getSpanColor(spanType)} 15%, transparent)` + }} > + {/* Expand/Collapse Chevron */} + {span.hasChildren && ( + <ChevronWrapper + onClick={(e) => { + e.stopPropagation(); + handleToggleCollapse(span.spanId); + }} + > + <Codicon + name={span.isCollapsed ? "chevron-right" : "chevron-down"} + sx={{ fontSize: '12px' }} + /> + </ChevronWrapper> + )} + <SpanBarIcon type={spanType}> <Icon name={getTypeIcon(spanType)} @@ -661,12 +778,12 @@ export function WaterfallView({ ); })} </SpansContainer> - </TimelineInner> - </TimelineContent> + </TimelineContent> + </TimelineScrollArea> - {/* Tooltip */} + {/* Hover Tooltip */} {hoveredSpan && ( - <Tooltip x={hoveredSpan.x} y={hoveredSpan.y - 80}> + <Tooltip x={hoveredSpan.x} y={hoveredSpan.y - 100}> <TooltipHeader> <TooltipBadge type={getSpanType(hoveredSpan.span)}> {getTypeLabel(getSpanType(hoveredSpan.span))} @@ -674,6 +791,9 @@ export function WaterfallView({ <TooltipName>{stripSpanPrefix(hoveredSpan.span.name)}</TooltipName> </TooltipHeader> <TooltipDetails> + <TooltipRow> + Start: <span className="value">+{formatDuration(hoveredSpan.span.startOffsetMs)}</span> + </TooltipRow> <TooltipRow> Duration: <span className="value">{formatDuration(hoveredSpan.span.durationMs)}</span> </TooltipRow> @@ -683,7 +803,11 @@ export function WaterfallView({ </TooltipRow> )} <TooltipRow> - Offset: <span className="value">{formatDuration(hoveredSpan.span.startOffsetMs)}</span> + Status: <span className="value" style={{ + color: hoveredSpan.span.status?.code === 2 ? 'var(--vscode-terminal-ansiRed)' : 'inherit' + }}> + {hoveredSpan.span.status?.code === 2 ? 'Error' : 'Success'} + </span> </TooltipRow> </TooltipDetails> </Tooltip> From ae9b7402f8757303e5f83c5f66a12d63b61f2098 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 21 Jan 2026 19:07:03 +0530 Subject: [PATCH 112/247] Fix non AI spans not displayed in trace visualizer --- .../features/tracing/trace-details-webview.ts | 2 +- .../rpc-managers/agent-chat/rpc-manager.ts | 9 +- .../Components/ChatInterface.tsx | 8 + .../trace-visualizer/src/TraceDetails.tsx | 1365 ++++------------- .../src/components/SpanInputOutput.tsx | 89 +- .../src/components/SpanTree.tsx | 804 ++++++++++ .../src/components/WaterfallView.tsx | 18 +- .../src/{utils.ts => utils.tsx} | 40 + 8 files changed, 1240 insertions(+), 1095 deletions(-) create mode 100644 workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx rename workspaces/ballerina/trace-visualizer/src/{utils.ts => utils.tsx} (87%) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 01fbb4910c7..59fdafda538 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -144,7 +144,7 @@ export class TraceDetailsWebview { // Update title based on isAgentChat flag if (instance._panel) { - instance._panel.title = isAgentChat ? 'Agent Chat Logs' : 'Trace Details'; + instance._panel.title = 'Trace Logs'; } vscode.commands.executeCommand('workbench.action.closeSidebar'); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 54fa66fa4e1..9b990e7f2de 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -76,6 +76,10 @@ export class AgentChatRpcManager implements AgentChatAPI { this.currentAbortController.signal ); if (response && response.message) { + // Find trace and extract tool calls and execution steps + const trace = this.findTraceForMessage(params.message); + const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; + // Store agent response in history this.addMessageToHistory(sessionId, { type: 'message', @@ -84,11 +88,6 @@ export class AgentChatRpcManager implements AgentChatAPI { traceId: trace?.traceId }); - // Find trace and extract tool calls and execution steps - const trace = this.findTraceForMessage(params.message); - const toolCalls = trace ? this.extractToolCalls(trace) : undefined; - const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; - resolve({ message: response.message, traceId: trace?.traceId, diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 2503610ef84..0adb3bca45e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -146,6 +146,14 @@ const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading border-radius: ${({ isUser }: { isUser: boolean }) => (isUser ? "12px 12px 0px 12px" : "12px 12px 12px 0px")}; `; +const MessageActionsContainer = styled.div` + display: flex; + align-items: center; + gap: 12px; + margin: -4px 0 0 24px; + flex-wrap: wrap; +`; + // ---------- CHAT FOOTER ---------- const ChatFooter = styled.div` position: sticky; diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 77cb970ee76..b4c8d6464cc 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -16,26 +16,18 @@ * under the License. */ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect, useRef, useMemo } from "react"; import styled from "@emotion/styled"; import { TraceData, SpanData } from "./index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; import { SpanInputOutput } from "./components/SpanInputOutput"; import { WaterfallView } from "./components/WaterfallView"; -import { AIBadge } from "./components/AIBadge"; import { TraceEmptyState } from "./components/TraceEmptyState"; +import { SpanTree, AISpanTreeContainer } from "./components/SpanTree"; import { timeContainsSpan, sortSpansByUmbrellaFirst, - formatDuration, - getSpanDuration, - getSpanKindLabel, - stripSpanPrefix, - getSpanTypeBadge, - spanHasError, - getSpanTokens, - isAISpan, - getSpanLabel + isAISpan } from "./utils"; // ============================================================================ @@ -71,7 +63,7 @@ const Container = styled.div` overflow: hidden; `; -const AgentChatLogsContainer = styled.div` +const TraceLogsContainer = styled.div` display: flex; flex-direction: row; align-items: stretch; @@ -114,440 +106,235 @@ const DetailsPanelContainer = styled.div` overflow: hidden; `; - // ============================================================================ -// TREE VIEW STYLES +// NAVIGATION & CONTROLS // ============================================================================ -const TreeItem = styled.div<{ level: number; isSelected: boolean }>` +const NavigationBar = styled.div` display: flex; align-items: center; - padding: 4px 6px; - padding-left: ${(props: { level: number }) => props.level * 16}px; - cursor: pointer; - border-radius: 3px; - gap: 8px; - background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; - - &:hover { - background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; - } -`; - -const TreeChevron = styled.span` - display: inline-flex; - width: 16px; - height: 16px; - align-items: center; - justify-content: center; - flex-shrink: 0; -`; - -const SpanNameInTree = styled.span` - flex: 1; - font-size: 13px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -`; - -const SpanKindBadge = styled.span` - font-size: 10px; - padding: 2px 6px; - border-radius: 3px; - background-color: var(--vscode-badge-background); - color: var(--vscode-badge-foreground); - flex-shrink: 0; -`; - -// ============================================================================ -// AI SPAN TREE STYLES -// ============================================================================ - -const AISpanTreeContainer = styled.div<{ height: number; maxHeight: number; minHeight: number }>` - background-color: var(--vscode-editor-background); - flex: 1; - overflow-y: auto; - height: 100%; - overflow-x: hidden; - padding: 0 0 0 12px; -`; - -const TreeNodeContainer = styled.div<{ isLast?: boolean }>` - position: relative; - display: flex; - flex-direction: column; - - &::before { - content: ''; - position: absolute; - left: -13px; - width: 1px; - background-color: var(--vscode-tree-indentGuidesStroke); - - top: 0; - - height: ${(props: { isLast?: boolean }) => props.isLast ? '16px' : '100%'}; - } -`; - -const TreeNodeChildren = styled.div` - margin-left: 6px; - padding-left: 12px; - position: relative; - - &::before { - content: ''; - position: absolute; - top: -16px; - left: -1px; - width: 1px; - height: 20px; - background-color: var(--vscode-tree-indentGuidesStroke); - } -`; - -const ConnectorCurve = styled.div` - position: absolute; - left: -13px; - top: 0; - width: 8px; - height: 16px; - border-bottom: 1px solid var(--vscode-tree-indentGuidesStroke); - border-left: 1px solid var(--vscode-tree-indentGuidesStroke); - pointer-events: none; -`; - -const AISpanTreeItem = styled.div<{ isSelected: boolean }>` - display: flex; - flex-direction: column; - padding: 4px 8px 4px 0; - margin: 4px 0; - cursor: pointer; - border-radius: 0; - gap: 6px; - z-index: 0; - - position: relative; - min-height: 32px; - - &::before { - content: ''; - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: -100vw; - z-index: -1; - - background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; - transition: background-color 0.15s ease; - } - - &:hover::before { - background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; - } + justify-content: space-between; + margin-top: 24px; + margin-bottom: 8px; + padding: 0 8px; `; -const AISpanLabel = styled.span` - font-size: 13px; +const ModeToggleButton = styled.button<{ isSelected?: boolean; }>` display: flex; align-items: center; - justify-content: flex-start; gap: 6px; - flex: 1; - min-width: 0; - - > span:first-of-type { - flex-shrink: 0; - } - - > span:nth-of-type(2) { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - flex: 1; - min-width: 0; - } -`; - -const AISpanTopRow = styled.div` - display: flex; - align-items: center; - gap: 8px; - width: 100%; - min-width: 0; -`; - -const ChevronToggleWrapper = styled.div` - display: flex; - align-items: center; - justify-content: center; - width: 20px; - height: 20px; - margin-left: auto; - flex-shrink: 0; - color: var(--vscode-descriptionForeground); + padding: 4px 8px; + background: ${(props: { isSelected?: boolean }) => props.isSelected ? 'var(--vscode-list-activeSelectionBackground)' : 'transparent'}; + border: 1px solid var(--vscode-panel-border); + color: var(--vscode-foreground); + border-radius: 4px; + cursor: pointer; + font-size: 13px; + transition: background-color 0.15s ease; &:hover { - color: var(--vscode-foreground); + background-color: var(--vscode-list-hoverBackground); } -`; -const AISpanDuration = styled.span` - font-size: 10px; - color: inherit; - display: flex; - align-items: center; - gap: 3px; -`; - -const AISpanTokenCount = styled.span` - font-size: 10px; - color: inherit; - display: inline; -`; - -const AISpanMetadataGroup = styled.div` - display: flex; - align-items: center; - gap: 6px; - flex-wrap: wrap; - margin-left: 0; - margin-top: 2px; + &:active { + transform: scale(0.98); + } `; -const AISpanMetadataPill = styled.span` - font-size: 11px; - padding: 1px 4px; - border-radius: 4px; - background-color: var(--vscode-sideBar-background); - border: 1px solid var(--vscode-panel-border); - color: var(--vscode-editor-foreground); +const ButtonGroup = styled.div` display: flex; - align-items: center; gap: 4px; - white-space: nowrap; - font-weight: 300; -`; - -const AISpanErrorIcon = styled.span` - display: flex; align-items: center; - justify-content: center; - color: var(--vscode-errorForeground); - flex-shrink: 0; `; // ============================================================================ -// ADVANCED MODE STYLES +// DETAILS PANEL // ============================================================================ -const AdvancedSpanGroup = styled.div` - margin-top: 4px; - margin-bottom: 4px; -`; - -const AdvancedSpanGroupHeader = styled.div<{ isExpanded: boolean }>` - display: flex; - align-items: center; - padding: 6px 8px; - cursor: pointer; - border-radius: 3px; - gap: 8px; - background-color: var(--vscode-editorWidget-background); - border: 1px solid var(--vscode-panel-border); - font-size: 12px; - font-weight: 500; - color: var(--vscode-descriptionForeground); - margin-bottom: 4px; - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } +const DetailsPanel = styled.div` + background-color: var(--vscode-editor-background); + height: 100%; + overflow-y: auto; + padding: 24px 16px; `; -const AdvancedSpanGroupContent = styled.div` - margin-left: 16px; - border-left: 1px solid var(--vscode-tree-indentGuidesStroke); - padding-left: 8px; -`; +// ============================================================================ +// SEARCH INPUT +// ============================================================================ -const AdvancedSpanItem = styled.div<{ isSelected: boolean }>` +const SearchInputWrapper = styled.div` + padding: 8px; + background-color: var(--vscode-editor-background); + border-bottom: 1px solid var(--vscode-panel-border); + position: sticky; + top: 0; + z-index: 10; + width: 100%; + box-sizing: border-box; display: flex; - flex-direction: column; - padding: 4px 8px 4px 0; - margin: 4px 0; - cursor: pointer; - border-radius: 0; gap: 6px; - z-index: 0; - - position: relative; - min-height: 32px; - - &::before { - content: ''; - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: -100vw; - z-index: -1; - - background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; - transition: background-color 0.15s ease; - } - - &:hover::before { - background-color: ${(props: { isSelected: boolean }) => - props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; - } -`; - -const NonAISpanTopRow = styled.div` - display: flex; align-items: center; - gap: 8px; - width: 100%; - min-width: 0; `; -const NonAISpanLabel = styled.span` +const SearchInput = styled.input` + width: 100%; + background-color: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + padding: 6px; font-size: 13px; - display: flex; - align-items: center; - justify-content: flex-start; - gap: 6px; - flex: 1; - min-width: 0; + outline: none; + border-radius: 4px; + box-sizing: border-box; - > span:first-of-type { - flex-shrink: 0; + &:focus { + border-color: var(--vscode-focusBorder); } - - > span:nth-of-type(2) { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - flex: 1; - min-width: 0; + + &::placeholder { + color: var(--vscode-input-placeholderForeground); } `; -const NonAISpanIcon = styled.span<{ spanKind: string }>` +const ActionButton = styled.button` display: flex; align-items: center; justify-content: center; - padding: 4px; - border-radius: 3px; - flex-shrink: 0; - background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-dropdown-border); - color: ${(props: { spanKind: string }) => { - switch (props.spanKind.toLowerCase()) { - case 'client': return 'var(--vscode-terminal-ansiBlue)'; - case 'server': return 'var(--vscode-terminal-ansiGreen)'; - default: return 'var(--vscode-foreground)'; - } - }}; -`; - -// ============================================================================ -// NAVIGATION & CONTROLS -// ============================================================================ - -const NavigationBar = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - margin-top: 24px; - margin-bottom: 8px; - padding: 0 8px; -`; - -const ModeToggleButton = styled.button` - display: flex; - align-items: center; - gap: 6px; - padding: 4px 8px; + width: 28px; + height: 28px; + padding: 0; background: transparent; - border: 1px solid var(--vscode-panel-border); + border: 1px solid var(--vscode-input-border); color: var(--vscode-foreground); border-radius: 4px; cursor: pointer; - font-size: 13px; transition: background-color 0.15s ease; &:hover { background-color: var(--vscode-list-hoverBackground); + border-color: var(--vscode-focusBorder); } - - &:active { - transform: scale(0.98); - } -`; - -const ButtonGroup = styled.div` - display: flex; - gap: 4px; - align-items: center; -`; - -// ============================================================================ -// DETAILS PANEL -// ============================================================================ - -const DetailsPanel = styled.div` - background-color: var(--vscode-editor-background); - height: 100%; - overflow-y: auto; - padding: 24px 16px; `; // ============================================================================ // COMPONENT DEFINITIONS // ============================================================================ -// Chevron component for tree items -interface ChevronProps { - hasChildren: boolean; - isExpanded: boolean; - onClick: (e: React.MouseEvent) => void; -} - -const TreeChevronIcon: React.FC<ChevronProps> = ({ hasChildren, isExpanded, onClick }) => ( - <TreeChevron onClick={onClick}> - {hasChildren ? ( - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - ) : ( - <span style={{ width: '16px', display: 'inline-block' }} /> - )} - </TreeChevron> -); - export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSidebarCollapsed }: TraceDetailsProps) { - const [expandedSpans, setExpandedSpans] = useState<Set<string>>(new Set()); const [selectedSpanId, setSelectedSpanId] = useState<string | null>(null); const [showFullTrace] = useState<boolean>(false); - const [isAdvancedMode, setIsAdvancedMode] = useState<boolean>(false); + + // Rename state to capture user preference specifically + const [userAdvancedModePreference, setUserAdvancedModePreference] = useState<boolean>(false); + const [viewMode, setViewMode] = useState<'tree' | 'timeline'>('tree'); const [isSidebarVisible, setIsSidebarVisible] = useState<boolean>(!openWithSidebarCollapsed); + + const [expandedSpans, setExpandedSpans] = useState<Set<string>>(new Set()); const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); + const [waterfallCollapsedSpanIds, setWaterfallCollapsedSpanIds] = useState<Set<string>>(new Set()); + const [containerWidth, setContainerWidth] = useState<number>(window.innerWidth); - const [aiSpanTreeDimensions, setAISpanTreeDimensions] = useState({ height: 180, maxHeight: 600, minHeight: 50 }); - const [waterfallDimensions, setWaterfallDimensions] = useState({ height: 300, maxHeight: 800, minHeight: 150 }); - const [totalSpanCounts, setTotalSpanCounts] = useState({ aiCount: 0, nonAiCount: 0 }); const [spanViewWidth, setSpanViewWidth] = useState<number>(0); const [isResizing, setIsResizing] = useState<boolean>(false); const containerRef = useRef<HTMLDivElement>(null); const hasAutoExpandedRef = useRef<boolean>(false); const hasFocusedRef = useRef<boolean>(false); + const [searchQuery, setSearchQuery] = useState(""); + + // Calculate total span counts (memoized for immediate availability) + const totalSpanCounts = useMemo(() => { + // Fallback to manual check in case isAISpan utility behaves unexpectedly + const aiSpans = traceData.spans.filter(span => + isAISpan(span) || + span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') + ); + const aiCount = aiSpans.length; + const nonAiCount = traceData.spans.length - aiCount; + return { aiCount, nonAiCount }; + }, [traceData.spans]); + + // DERIVED STATE: Determine if we should show advanced mode + // If there are NO AI spans, we force Advanced Mode (Show Hidden/Raw Spans) + // If there ARE AI spans, we use the user's preference + const hasAISpans = totalSpanCounts.aiCount > 0; + const isAdvancedMode = !hasAISpans || userAdvancedModePreference; + + const handleToggleAll = () => { + const getParentsForCurrentView = () => { + const parentIds = new Set<string>(); + + // Standard Trace Parents (always include) + const existingIds = new Set(traceData.spans.map(s => s.spanId)); + traceData.spans.forEach(s => { + if (s.parentSpanId && existingIds.has(s.parentSpanId)) { + parentIds.add(s.parentSpanId); + } + }); + + // If in simple tree view, check for AI spans that contain other AI spans + if (viewMode === 'tree' && !isAdvancedMode) { + const aiSpans = traceData.spans.filter(span => + span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') + ); + + // Helper to check time containment (re-using logic from getAIChildSpans) + const containsTime = (parent: SpanData, child: SpanData) => { + const pStart = new Date(parent.startTime).getTime(); + const pEnd = new Date(parent.endTime).getTime(); + const cStart = new Date(child.startTime).getTime(); + const cEnd = new Date(child.endTime).getTime(); + return pStart <= cStart && pEnd >= cEnd; + }; + + aiSpans.forEach(parent => { + if (parentIds.has(parent.spanId)) return; // Already added + + const hasChild = aiSpans.some(child => + child.spanId !== parent.spanId && containsTime(parent, child) + ); + + if (hasChild) parentIds.add(parent.spanId); + }); + } + + return parentIds; + }; + + if (viewMode === 'tree') { + // If any are expanded, collapse all. Otherwise, expand calculated parents. + if (expandedSpans.size > 0) { + setExpandedSpans(new Set()); + } else { + setExpandedSpans(getParentsForCurrentView()); + } + } else { + // Waterfall Logic + if (waterfallCollapsedSpanIds.size > 0) { + setWaterfallCollapsedSpanIds(new Set()); + } else { + setWaterfallCollapsedSpanIds(getParentsForCurrentView()); + } + } + }; + + const getToggleState = () => { + if (viewMode === 'tree') { + const isAnyExpanded = expandedSpans.size > 0; + return { + icon: isAnyExpanded ? 'bi-collapse-item' : 'bi-expand-item', + tooltip: isAnyExpanded ? 'Collapse All' : 'Expand All' + }; + } else { + const isAnyCollapsed = waterfallCollapsedSpanIds.size > 0; + return { + icon: isAnyCollapsed ? 'bi-expand-item' : 'bi-collapse-item', + tooltip: isAnyCollapsed ? 'Expand All' : 'Collapse All' + }; + } + }; + + const toggleState = getToggleState(); // Initialize span view width intelligently useEffect(() => { @@ -668,6 +455,11 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide } }, [sortedRootSpans.length, focusSpanId, selectedSpanId]); + const getChildSpans = (spanId: string): SpanData[] => { + const children = traceData.spans.filter(s => s.parentSpanId === spanId); + return sortSpansByUmbrellaFirst(children); + }; + // Auto-expand first 3 levels of spans in advanced mode (only once) useEffect(() => { if (!isAdvancedMode || hasAutoExpandedRef.current || sortedRootSpans.length === 0) return; @@ -736,50 +528,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide } }, [focusSpanId]); - const getChildSpans = (spanId: string): SpanData[] => { - const children = traceData.spans.filter(s => s.parentSpanId === spanId); - return sortSpansByUmbrellaFirst(children); - }; - - const renderTreeItem = (span: SpanData, level: number = 0): React.ReactNode => { - const childSpans = getChildSpans(span.spanId); - const hasChildren = childSpans.length > 0; - const isExpanded = expandedSpans.has(span.spanId); - const isSelected = selectedSpanId === span.spanId; - const spanKind = getSpanKindLabel(span.kind); - - return ( - <React.Fragment key={span.spanId}> - <TreeItem - level={level} - isSelected={isSelected} - onClick={() => selectSpan(span.spanId)} - data-span-id={span.spanId} - > - <TreeChevronIcon - hasChildren={hasChildren} - isExpanded={isExpanded} - onClick={(e) => { - e.stopPropagation(); - if (hasChildren) { - toggleSpanExpansion(span.spanId); - } - }} - /> - <SpanNameInTree> - {span.name} - </SpanNameInTree> - <SpanKindBadge>{spanKind}</SpanKindBadge> - </TreeItem> - {hasChildren && isExpanded && ( - <> - {childSpans.map(child => renderTreeItem(child, level + 1))} - </> - )} - </React.Fragment> - ); - }; - const selectedSpan = selectedSpanId ? spanMap.get(selectedSpanId) : null; // Handle resize drag @@ -806,13 +554,10 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide setIsSidebarVisible(false); } else { const minWidth = MIN_SIDEBAR_WIDTH; - // Constraint 1: Must leave space for the details panel const limitByPanel = containerRect.width - MIN_DETAILS_PANEL_WIDTH; - // Constraint 2: Max 70% of the screen const limitByPercentage = containerRect.width * MAX_SIDEBAR_PERCENTAGE; - // The actual max width is the stricter (smaller) of the two limits const maxWidth = Math.min(limitByPanel, limitByPercentage); @@ -902,95 +647,19 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide const rootAISpans = buildAISpanHierarchy(); - // Count total visible items in advanced mode (AI spans + non-AI span groups) - const countTotalVisibleItems = (): { aiCount: number; nonAiCount: number } => { - if (isAdvancedMode) { - // In advanced mode, count all root spans and their expanded children - const countSpanAndChildren = (span: SpanData): number => { - let count = 1; // Count this span - const children = getChildSpans(span.spanId); - if (expandedSpans.has(span.spanId)) { - children.forEach(child => { - count += countSpanAndChildren(child); - }); - } - return count; - }; - - let totalCount = 0; - sortedRootSpans.forEach(span => { - totalCount += countSpanAndChildren(span); - }); - - // Separate AI and non-AI counts - const aiSpans = traceData.spans.filter(span => isAISpan(span)); - const aiCount = aiSpans.length; - const nonAiCount = totalCount - aiCount; - - return { aiCount, nonAiCount }; - } - - // In simplified mode, count AI spans only - const aiSpans = traceData.spans.filter(span => - span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') - ); - - const aiCount = aiSpans.length; - const nonAiCount = 0; - - return { aiCount, nonAiCount }; - }; - - // Calculate total span counts once when spans change (for waterfall) - useEffect(() => { - const aiSpans = traceData.spans.filter(span => isAISpan(span)); - const aiCount = aiSpans.length; - const nonAiCount = traceData.spans.length - aiCount; - setTotalSpanCounts({ aiCount, nonAiCount }); - }, [traceData.spans]); - - // Calculate container dimensions based on number of items - useEffect(() => { - const { aiCount, nonAiCount } = countTotalVisibleItems(); - const aiItemHeight = 36; // Height per AI span item - const nonAiItemHeight = 27 + 4; // Height per non-AI span item - let calculatedHeight = (aiCount * aiItemHeight) + (nonAiCount * nonAiItemHeight); - - // Default height: content size up to 180px (or 400px in advanced mode) - const maxDefaultHeight = isAdvancedMode ? 400 : 180; - const height = Math.min(calculatedHeight, maxDefaultHeight); - // Max height: content size up to 600px (or 800px in advanced mode for resizing) - const maxHeight = calculatedHeight; - // Min height: smaller of content or 50px - const minHeight = Math.min(calculatedHeight, 50); - - setAISpanTreeDimensions({ height, maxHeight, minHeight }); - - // Calculate waterfall height - const spanBarHeight = 30; - const waterfallSpanCount = isAdvancedMode - ? (totalSpanCounts.aiCount + totalSpanCounts.nonAiCount) - : totalSpanCounts.aiCount; - const waterfallCalculatedHeight = (waterfallSpanCount * spanBarHeight) + 70; - - // Set waterfall dimensions (simpler, fixed heights) - const maxDefaultWaterfallHeight = isAdvancedMode ? 400 : 300; - const waterfallHeight = Math.min(waterfallCalculatedHeight, maxDefaultWaterfallHeight); - const waterfallMaxHeight = waterfallCalculatedHeight; - const waterfallMinHeight = Math.min(waterfallCalculatedHeight, 150); - setWaterfallDimensions({ height: waterfallHeight, maxHeight: waterfallMaxHeight, minHeight: waterfallMinHeight }); - }, [traceData.spans, isAgentChat, showFullTrace, isAdvancedMode, expandedAdvancedSpanGroups, expandedSpans, totalSpanCounts]); - - // Select first AI span when in agent chat view + // Select first AI span when in agent chat view, or fallback to first generic span useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it if (focusSpanId || hasFocusedRef.current) { return; } + // 1. Try to select the first AI span if available if (isAgentChat && !showFullTrace && rootAISpans.length > 0) { setSelectedSpanId(rootAISpans[0].spanId); - } else if (!isAgentChat && !selectedSpanId && sortedRootSpans.length > 0) { + } + // 2. If no AI spans (or in advanced mode), select the first generic span + else if ((!isAgentChat || rootAISpans.length === 0) && !selectedSpanId && sortedRootSpans.length > 0) { setSelectedSpanId(sortedRootSpans[0].spanId); } }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); @@ -1008,56 +677,38 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide return { totalInputTokens: inTotal, totalOutputTokens: outTotal }; }, [traceData.spans]); - /** - * Gets AI child spans contained within a parent span's timeframe. - * Finds direct children only (not nested through intermediate AI spans). - * @param spanId - Parent span ID to find children for - * @returns Array of child AI spans sorted by start time - */ const getAIChildSpans = (spanId: string): SpanData[] => { + // Simple duplication of the logic or move to utils. + // For now, keeping it consistent with original file structure where logic resided here. const parentSpan = traceData.spans.find(s => s.spanId === spanId); - if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) { - return []; - } + if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) return []; const parentStart = new Date(parentSpan.startTime).getTime(); const parentEnd = new Date(parentSpan.endTime).getTime(); - - // Get all AI spans const aiSpans = traceData.spans.filter(span => span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') ); - // Find direct children: spans that are contained by this span but not by any smaller span const children: SpanData[] = []; aiSpans.forEach(potentialChild => { if (potentialChild.spanId === spanId) return; if (!potentialChild.startTime || !potentialChild.endTime) return; - const childStart = new Date(potentialChild.startTime).getTime(); const childEnd = new Date(potentialChild.endTime).getTime(); - - // Check if parent contains this child const parentContainsChild = parentStart <= childStart && parentEnd >= childEnd && (parentStart < childStart || parentEnd > childEnd); if (!parentContainsChild) return; - // Check if there's any other span that also contains this child but is smaller than parent let hasIntermediateParent = false; aiSpans.forEach(intermediateSpan => { if (intermediateSpan.spanId === spanId || intermediateSpan.spanId === potentialChild.spanId) return; if (!intermediateSpan.startTime || !intermediateSpan.endTime) return; - const intStart = new Date(intermediateSpan.startTime).getTime(); const intEnd = new Date(intermediateSpan.endTime).getTime(); - - // Check if intermediate span contains the child const intermediateContainsChild = intStart <= childStart && intEnd >= childEnd && (intStart < childStart || intEnd > childEnd); - - // Check if parent contains the intermediate span const parentContainsIntermediate = parentStart <= intStart && parentEnd >= intEnd && (parentStart < intStart || parentEnd > intEnd); @@ -1066,12 +717,9 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide } }); - if (!hasIntermediateParent) { - children.push(potentialChild); - } + if (!hasIntermediateParent) children.push(potentialChild); }); - // Sort children by start time return children.sort((a, b) => { const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; @@ -1079,452 +727,8 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide }); }; - /** - * Gets non-AI child spans within an AI span's timeframe. - * Excludes spans that are nested within child AI spans. - * @param parentSpanId - Parent AI span ID to find non-AI children for - * @returns Array of non-AI spans sorted by start time - */ - const getNonAIChildSpans = (parentSpanId: string): SpanData[] => { - const parentSpan = traceData.spans.find(s => s.spanId === parentSpanId); - if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) { - return []; - } - - const parentStart = new Date(parentSpan.startTime).getTime(); - const parentEnd = new Date(parentSpan.endTime).getTime(); - - // Get all non-AI spans - const nonAISpans = traceData.spans.filter(span => - !span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') - ); - - // Find spans contained within this AI span's timeframe - const containedSpans: SpanData[] = []; - - nonAISpans.forEach(span => { - if (!span.startTime || !span.endTime) return; - - const spanStart = new Date(span.startTime).getTime(); - const spanEnd = new Date(span.endTime).getTime(); - - // Check if this span is contained within the parent's timeframe - if (spanStart >= parentStart && spanEnd <= parentEnd) { - // Check if this span is directly contained (not nested in another AI span that's a child of parent) - const aiChildren = getAIChildSpans(parentSpanId); - let isDirectChild = true; - - for (const aiChild of aiChildren) { - if (!aiChild.startTime || !aiChild.endTime) continue; - const aiChildStart = new Date(aiChild.startTime).getTime(); - const aiChildEnd = new Date(aiChild.endTime).getTime(); - - // If this non-AI span is contained within an AI child, it's not a direct child - if (spanStart >= aiChildStart && spanEnd <= aiChildEnd) { - isDirectChild = false; - break; - } - } - - if (isDirectChild) { - containedSpans.push(span); - } - } - }); - - // Sort by start time - return containedSpans.sort((a, b) => { - const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; - const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; - return aTime - bTime; - }); - }; - - /** - * Groups non-AI spans by their type/category. - * Categorizes spans as HTTP Calls, Database Operations, Client Calls, Server Operations, or Other. - * @param spans - Array of non-AI spans to group - * @returns Map of category names to arrays of spans - */ - const groupNonAISpans = (spans: SpanData[]): Map<string, SpanData[]> => { - const groups = new Map<string, SpanData[]>(); - - spans.forEach(span => { - const kind = getSpanKindLabel(span.kind); - let category = 'Other'; - - // Categorize based on attributes or name - const httpAttr = span.attributes?.find(attr => - attr.key.toLowerCase().includes('http') || - attr.key.toLowerCase().includes('url') - ); - const dbAttr = span.attributes?.find(attr => - attr.key.toLowerCase().includes('db') || - attr.key.toLowerCase().includes('sql') - ); - - if (httpAttr || span.name.toLowerCase().includes('http')) { - category = 'HTTP Calls'; - } else if (dbAttr || span.name.toLowerCase().includes('db') || span.name.toLowerCase().includes('sql')) { - category = 'Database Operations'; - } else if (kind === 'CLIENT') { - category = 'Client Calls'; - } else if (kind === 'SERVER') { - category = 'Server Operations'; - } - - if (!groups.has(category)) { - groups.set(category, []); - } - groups.get(category)!.push(span); - }); - - return groups; - }; - - // Get child spans from a list of spans based on parent-child relationship - const getChildSpansFromList = (parentSpanId: string, spanList: SpanData[]): SpanData[] => { - const children = spanList.filter(s => s.parentSpanId === parentSpanId); - return sortSpansByUmbrellaFirst(children); - }; - - /** - * Renders an expand/collapse chevron for tree items. - */ - const renderExpandChevron = ( - hasChildren: boolean, - isExpanded: boolean, - onToggle: (e: React.MouseEvent) => void - ) => { - if (!hasChildren) return null; - - return ( - <ChevronToggleWrapper onClick={onToggle} style={{ cursor: 'pointer' }}> - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - </ChevronToggleWrapper> - ); - }; - /** - * Renders the content for an AI span (without recursion). - * Used by both renderAISpanTreeItem and renderMixedSpanTreeItem. - */ - const renderAISpanContent = ( - span: SpanData, - isSelected: boolean, - hasChildren: boolean, - isExpanded: boolean, - onToggle: (e: React.MouseEvent) => void, - showConnector: boolean = false - ) => { - const badgeType = getSpanTypeBadge(span); - const duration = getSpanDuration(span); - const totalTokens = getSpanTokens(span); - const isVeryNarrow = containerWidth < 500; - - return ( - <AISpanTreeItem - isSelected={isSelected} - onClick={() => setSelectedSpanId(span.spanId)} - data-span-id={span.spanId} - > - {showConnector && <ConnectorCurve />} - <AISpanTopRow> - <AIBadge type={badgeType} /> - <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> - <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> - <AISpanLabel> - <span style={{ fontWeight: 600 }}>{getSpanLabel(badgeType)}</span> - <span>{stripSpanPrefix(span.name)}</span> - </AISpanLabel> - {spanHasError(span) && ( - <AISpanErrorIcon> - <Icon - name="bi-error" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </AISpanErrorIcon> - )} - </div> - <AISpanMetadataGroup> - {duration !== null && ( - <AISpanMetadataPill> - <AISpanDuration> - {duration < 1000 ? `${duration}ms` : `${(duration / 1000).toFixed(2)}s`} - </AISpanDuration> - </AISpanMetadataPill> - )} - {!isVeryNarrow && totalTokens > 0 && ( - <AISpanMetadataPill> - <AISpanTokenCount> - {totalTokens.toLocaleString()} Tokens - </AISpanTokenCount> - </AISpanMetadataPill> - )} - </AISpanMetadataGroup> - </div> - {renderExpandChevron(hasChildren, isExpanded, onToggle)} - </AISpanTopRow> - </AISpanTreeItem> - ); - }; - - /** - * Renders the content for a non-AI span (without recursion). - * Used by both renderNonAISpanTreeItem and renderMixedSpanTreeItem. - */ - const renderNonAISpanContent = ( - span: SpanData, - isSelected: boolean, - hasChildren: boolean, - isExpanded: boolean, - onToggle: (e: React.MouseEvent) => void, - showConnector: boolean = false - ) => { - const duration = getSpanDuration(span); - const spanKind = getSpanKindLabel(span.kind); - - // Only show icons for server and client - const spanKindIcon = (() => { - switch (spanKind.toLowerCase()) { - case 'client': return 'bi-arrow-outward'; - case 'server': return 'bi-server'; - default: return 'bi-action'; - } - })(); - - return ( - <AdvancedSpanItem - isSelected={isSelected} - onClick={() => setSelectedSpanId(span.spanId)} - data-span-id={span.spanId} - > - {showConnector && <ConnectorCurve />} - <NonAISpanTopRow> - <NonAISpanIcon spanKind={spanKind}> - <Icon - name={spanKindIcon} - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </NonAISpanIcon> - <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> - <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> - <NonAISpanLabel> - <span style={{ fontWeight: 500, fontSize: '11px', textTransform: 'uppercase', opacity: 0.7 }}>{spanKind}</span> - <span>{span.name}</span> - </NonAISpanLabel> - {spanHasError(span) && ( - <AISpanErrorIcon> - <Icon - name="bi-error" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </AISpanErrorIcon> - )} - </div> - {duration !== null && ( - <AISpanMetadataGroup> - <AISpanMetadataPill> - <AISpanDuration> - {formatDuration(duration)} - </AISpanDuration> - </AISpanMetadataPill> - </AISpanMetadataGroup> - )} - </div> - {renderExpandChevron(hasChildren, isExpanded, onToggle)} - </NonAISpanTopRow> - </AdvancedSpanItem> - ); - }; - - // Render non-AI span tree item hierarchically - const renderNonAISpanTreeItem = (span: SpanData, spanList: SpanData[], isFirstChild: boolean = false, isLastChild: boolean = false): React.ReactNode => { - const children = getChildSpansFromList(span.spanId, spanList); - const hasChildren = children.length > 0; - const isExpanded = expandedSpans.has(span.spanId); - const isSelected = selectedSpanId === span.spanId; - - return ( - <TreeNodeContainer key={span.spanId} isLast={isLastChild}> - {renderNonAISpanContent( - span, - isSelected, - hasChildren, - isExpanded, - (e) => { - e.stopPropagation(); - if (hasChildren) { - toggleSpanExpansion(span.spanId); - } - }, - !isFirstChild - )} - {hasChildren && isExpanded && ( - <TreeNodeChildren> - {children.map((child, index) => renderNonAISpanTreeItem(child, spanList, index === 0, index === children.length - 1))} - </TreeNodeChildren> - )} - </TreeNodeContainer> - ); - }; - - // Render mixed AI and non-AI span tree for advanced mode (true hierarchy based on parentSpanId) - const renderMixedSpanTreeItem = (span: SpanData, isFirstChild: boolean = false, isLastChild: boolean = false, isRoot: boolean = false): React.ReactNode => { - const isAI = isAISpan(span); - const children = getChildSpans(span.spanId); // Use regular getChildSpans for true hierarchy - const hasChildren = children.length > 0; - const isExpanded = expandedSpans.has(span.spanId); - const isSelected = selectedSpanId === span.spanId; - - const handleToggle = (e: React.MouseEvent) => { - e.stopPropagation(); - if (hasChildren) { - toggleSpanExpansion(span.spanId); - } - }; - - return ( - <TreeNodeContainer key={span.spanId} isLast={isLastChild}> - {isAI ? ( - renderAISpanContent(span, isSelected, hasChildren, isExpanded, handleToggle, !isRoot) - ) : ( - renderNonAISpanContent(span, isSelected, hasChildren, isExpanded, handleToggle, !isRoot) - )} - {hasChildren && isExpanded && ( - <TreeNodeChildren> - {children.map((child, index) => - renderMixedSpanTreeItem(child, index === 0, index === children.length - 1, false) - )} - </TreeNodeChildren> - )} - </TreeNodeContainer> - ); - }; - - // Render AI span tree item recursively (always expanded) - const renderAISpanTreeItem = (span: SpanData, isFirstChild: boolean = false, isLastChild: boolean = false, isRoot: boolean = false): React.ReactNode => { - const children = getAIChildSpans(span.spanId); - const isSelected = selectedSpanId === span.spanId; - - // Get non-AI spans if in advanced mode - const nonAISpans = isAdvancedMode ? getNonAIChildSpans(span.spanId) : []; - const groupedNonAISpans = isAdvancedMode ? groupNonAISpans(nonAISpans) : new Map(); - const groupKey = `${span.spanId}-advanced`; - - // No-op toggle handler for AI spans (they don't have expand/collapse) - const handleToggle = () => { }; - - const hasAnyChildren = children.length > 0 || groupedNonAISpans.size > 0; - - return ( - <TreeNodeContainer key={span.spanId} isLast={isLastChild}> - {renderAISpanContent(span, isSelected, false, false, handleToggle, !isRoot)} - - {hasAnyChildren && ( - <TreeNodeChildren> - {/* Render advanced mode spans if enabled */} - {isAdvancedMode && groupedNonAISpans.size > 0 && ( - <AdvancedSpanGroup> - {Array.from(groupedNonAISpans.entries()).map(([category, spans]) => { - const categoryKey = `${groupKey}-${category}`; - const isExpanded = expandedAdvancedSpanGroups.has(categoryKey); - - // Find root spans in this category (spans without parent in the list) - const spanIdsInCategory = new Set(spans.map((s: SpanData) => s.spanId)); - const rootSpansInCategory = spans.filter((s: SpanData) => - !s.parentSpanId || - s.parentSpanId === '0000000000000000' || - !spanIdsInCategory.has(s.parentSpanId) - ); - - // Sort root spans by start time - rootSpansInCategory.sort((a: SpanData, b: SpanData) => { - const aStart = a.startTime ? new Date(a.startTime).getTime() : 0; - const bStart = b.startTime ? new Date(b.startTime).getTime() : 0; - return aStart - bStart; - }); - - return ( - <div key={categoryKey}> - <AdvancedSpanGroupHeader - isExpanded={isExpanded} - onClick={() => { - const newExpanded = new Set(expandedAdvancedSpanGroups); - if (isExpanded) { - newExpanded.delete(categoryKey); - } else { - newExpanded.add(categoryKey); - } - setExpandedAdvancedSpanGroups(newExpanded); - }} - > - <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> - <span>{category} ({spans.length})</span> - </AdvancedSpanGroupHeader> - {isExpanded && ( - <AdvancedSpanGroupContent> - {rootSpansInCategory.map((rootSpan: SpanData, index: number) => - renderNonAISpanTreeItem(rootSpan, spans, index === 0, index === rootSpansInCategory.length - 1) - )} - </AdvancedSpanGroupContent> - )} - </div> - ); - })} - </AdvancedSpanGroup> - )} - - {/* Render AI children */} - {children.map((child, index) => - renderAISpanTreeItem(child, index === 0 && groupedNonAISpans.size === 0, index === children.length - 1, false) - )} - </TreeNodeChildren> - )} - </TreeNodeContainer> - ); - }; - - // Render Agent Chat Logs view + // Render Trace Logs view const handleExportTrace = () => { // Dispatch custom event to communicate with webview script window.dispatchEvent(new CustomEvent('exportTrace', { @@ -1532,123 +736,144 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide })); }; - const renderAgentChatLogs = () => ( - <> - {rootAISpans.length === 0 ? ( + const renderTraceLogs = () => { + if (traceData.spans.length === 0) { + return ( <TraceEmptyState icon="comment-discussion" - title="No AI agent interactions found in this trace" - subtitle="AI spans with span.type='ai' will appear here" + title="No trace data found" + subtitle="Spans will appear here" /> - ) : ( - <AgentChatLogsContainer> - <SpanViewContainer width={isSidebarVisible ? spanViewWidth : 48} isResizing={isResizing} onMouseDown={isSidebarVisible ? handleMouseDown : undefined}> - <NavigationBar> + ); + } + + // isAdvancedMode is now a calculated value based on content + user preference + const shouldShowAdvancedView = isAdvancedMode; + + return ( + <TraceLogsContainer> + <SpanViewContainer width={isSidebarVisible ? spanViewWidth : 48} isResizing={isResizing} onMouseDown={isSidebarVisible ? handleMouseDown : undefined}> + <NavigationBar> + <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}> <ModeToggleButton onClick={() => setIsSidebarVisible(!isSidebarVisible)} title={isSidebarVisible ? "Hide sidebar" : "Show sidebar"} > <Icon name={isSidebarVisible ? 'bi-left-panel-close' : 'bi-left-panel-open'} - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} /> + sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} + iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> </ModeToggleButton> - {isSidebarVisible && ( - <> - <ButtonGroup> + <span style={{ fontSize: '16px', fontWeight: '600' }}>Trace</span> + </div> + {isSidebarVisible && ( + <> + <ButtonGroup> + <ModeToggleButton + onClick={() => setViewMode(viewMode === 'tree' ? 'timeline' : 'tree')} + title={viewMode === 'timeline' ? "Switch to Tree View" : "Switch to Timeline View"} + isSelected={viewMode === 'timeline'} + > + Timeline + </ModeToggleButton> + <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> + <Icon name="bi-download" + sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} + iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> + </ModeToggleButton> + {/* Only show the toggle button if the trace actually contains AI spans. + If it doesn't (hasAISpans is false), the view is automatically + forced to Advanced Mode by the derived state logic above. + */} + {hasAISpans && ( <ModeToggleButton - onClick={() => setViewMode(viewMode === 'tree' ? 'timeline' : 'tree')} - title={viewMode === 'timeline' ? "Switch to Tree View" : "Switch to Timeline View"} + onClick={() => setUserAdvancedModePreference(!userAdvancedModePreference)} + title={isAdvancedMode ? "Hide internal spans" : "Show all spans"} > - Timeline - </ModeToggleButton> - <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> - <Icon name="bi-download" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} /> - </ModeToggleButton> - <ModeToggleButton onClick={() => setIsAdvancedMode(!isAdvancedMode)}> <Codicon name={isAdvancedMode ? 'eye-closed' : 'eye'} /> </ModeToggleButton> - </ButtonGroup> - </> - )} - </NavigationBar> - {isSidebarVisible && ( - <> - {viewMode === 'tree' && ( - <AISpanTreeContainer - height={aiSpanTreeDimensions.height} - maxHeight={aiSpanTreeDimensions.maxHeight} - minHeight={aiSpanTreeDimensions.minHeight} - > - {isAdvancedMode - ? sortedRootSpans.map((span, index) => renderMixedSpanTreeItem(span, index === 0, index === sortedRootSpans.length - 1, true)) - : rootAISpans.map((span, index) => renderAISpanTreeItem(span, index === 0, index === rootAISpans.length - 1, true)) - } - </AISpanTreeContainer> - )} - {viewMode === 'timeline' && ( - <WaterfallView - spans={isAdvancedMode ? traceData.spans : rootAISpans} - selectedSpanId={selectedSpanId} - onSpanSelect={selectSpan} - isAdvancedMode={isAdvancedMode} - getChildSpans={isAdvancedMode ? getChildSpans : getAIChildSpans} - traceStartTime={traceData.firstSeen} - traceDuration={duration} - /> - )} + )} + </ButtonGroup> </> )} - </SpanViewContainer> - {selectedSpan && ( + </NavigationBar> + {isSidebarVisible && ( <> - <DetailsPanelContainer> - <DetailsPanel> - <SpanInputOutput - spanData={selectedSpan} - spanName={selectedSpan.name} - totalInputTokens={totalInputTokens} - totalOutputTokens={totalOutputTokens} + <SearchInputWrapper> + <SearchInput + type="text" + placeholder="Filter spans..." + value={searchQuery} + onChange={(e) => setSearchQuery(e.target.value)} + /> + <ActionButton + onClick={handleToggleAll} + title={toggleState.tooltip} + > + <Icon + name={toggleState.icon} + sx={{ fontSize: "14px", width: "14px", height: "14px" }} + iconSx={{ display: "flex" }} /> - </DetailsPanel> - </DetailsPanelContainer> + </ActionButton> + </SearchInputWrapper> + + {viewMode === 'tree' && ( + <AISpanTreeContainer> + <SpanTree + traceData={traceData} + rootAISpans={rootAISpans} + sortedRootSpans={sortedRootSpans} + isAdvancedMode={shouldShowAdvancedView} + expandedSpans={expandedSpans} + selectedSpanId={selectedSpanId} + expandedAdvancedSpanGroups={expandedAdvancedSpanGroups} + onSelectSpan={setSelectedSpanId} + onToggleSpanExpansion={toggleSpanExpansion} + setExpandedAdvancedSpanGroups={setExpandedAdvancedSpanGroups} + getChildSpans={getChildSpans} + containerWidth={containerWidth} + searchQuery={searchQuery} + /> + </AISpanTreeContainer> + )} + {viewMode === 'timeline' && ( + <WaterfallView + spans={shouldShowAdvancedView ? traceData.spans : rootAISpans} + selectedSpanId={selectedSpanId} + onSpanSelect={selectSpan} + isAdvancedMode={shouldShowAdvancedView} + getChildSpans={shouldShowAdvancedView ? getChildSpans : getAIChildSpans} + traceStartTime={traceData.firstSeen} + traceDuration={duration} + collapsedSpanIds={waterfallCollapsedSpanIds} + setCollapsedSpanIds={setWaterfallCollapsedSpanIds} + /> + )} </> )} - </AgentChatLogsContainer> - )} - </> - ); + </SpanViewContainer> + {selectedSpan && ( + <> + <DetailsPanelContainer> + <DetailsPanel> + <SpanInputOutput + spanData={selectedSpan} + spanName={selectedSpan.name} + totalInputTokens={totalInputTokens} + totalOutputTokens={totalOutputTokens} + /> + </DetailsPanel> + </DetailsPanelContainer> + </> + )} + </TraceLogsContainer> + ); + } - // Main return - decide which view to show return ( <Container ref={containerRef}> - {renderAgentChatLogs()} + {renderTraceLogs()} </Container> ); } diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx index 8b01adf8a7f..044e6cce97c 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx @@ -49,15 +49,33 @@ const SpanHeader = styled.div` position: relative; `; -const SpanIcon = styled.span<{ type: string }>` +const SpanIcon = styled.span<{ type: string; spanKind?: string }>` display: flex; align-items: center; justify-content: center; - color: ${(props: { type: string }) => { + padding: 4px; + border-radius: 3px; + flex-shrink: 0; + background-color: ${(props: { type: string; spanKind?: string }) => { + // Only non-AI spans get background + return props.type === 'other' ? 'var(--vscode-editor-background)' : 'transparent'; + }}; + border: ${(props: { type: string; spanKind?: string }) => { + // Only non-AI spans get border + return props.type === 'other' ? '1px solid var(--vscode-dropdown-border)' : 'none'; + }}; + color: ${(props: { type: string; spanKind?: string }) => { switch (props.type) { case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; + case 'other': + // Use span kind colors for non-AI spans (matching TraceDetails) + switch (props.spanKind?.toLowerCase()) { + case 'client': return 'var(--vscode-terminal-ansiBlue)'; + case 'server': return 'var(--vscode-terminal-ansiGreen)'; + default: return 'var(--vscode-foreground)'; + } default: return 'var(--vscode-badge-foreground)'; } }}; @@ -511,6 +529,30 @@ function stripSpanPrefix(spanName: string): string { return spanName; } +// Get icon name based on span type and kind +function getSpanIconName(spanType: 'invoke' | 'chat' | 'tool' | 'other', spanKind?: string): string { + switch (spanType) { + case 'invoke': + return 'bi-ai-agent'; + case 'chat': + return 'bi-chat'; + case 'tool': + return 'bi-wrench'; + case 'other': + // For non-AI spans, use icons based on span kind (server/client) + switch (spanKind?.toLowerCase()) { + case 'client': + return 'bi-arrow-outward'; + case 'server': + return 'bi-server'; + default: + return 'bi-action'; + } + default: + return 'bi-action'; + } +} + export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOutputTokens }: SpanInputOutputProps) { const [searchQuery, setSearchQuery] = useState(''); const [isIdPopupOpen, setIsIdPopupOpen] = useState(false); @@ -527,6 +569,23 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut return 'other'; }, [operationName, spanName]); + // Get span kind for non-AI spans + const spanKind = useMemo(() => { + const kind = spanData.kind; + if (typeof kind === 'string') { + return kind; + } + const kindMap: { [key: number]: string } = { + 0: 'UNSPECIFIED', + 1: 'INTERNAL', + 2: 'SERVER', + 3: 'CLIENT', + 4: 'PRODUCER', + 5: 'CONSUMER' + }; + return kindMap[kind] || `UNKNOWN(${kind})`; + }, [spanData.kind]); + // Extract metrics const metrics = useMemo(() => { const latencyMs = spanData.startTime && spanData.endTime @@ -548,7 +607,9 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut temperature, provider, model, - toolDescription + toolDescription, + startTime: spanData.startTime ? formatDate(spanData.startTime) : null, + endTime: spanData.endTime ? formatDate(spanData.endTime) : null }; }, [spanData]); @@ -604,6 +665,8 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut textContainsSearch(String(metrics.outputTokens), searchQuery) || textContainsSearch(String(totalInputTokens || ''), searchQuery) || textContainsSearch(String(totalOutputTokens || ''), searchQuery) || + textContainsSearch(metrics.startTime, searchQuery) || + textContainsSearch(metrics.endTime, searchQuery) || textContainsSearch('Latency', searchQuery) || textContainsSearch('Temperature', searchQuery) || textContainsSearch('Provider', searchQuery) || @@ -612,7 +675,9 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut textContainsSearch('Input Tokens', searchQuery) || textContainsSearch('Output Tokens', searchQuery) || textContainsSearch('Total Input Tokens', searchQuery) || - textContainsSearch('Total Output Tokens', searchQuery); + textContainsSearch('Total Output Tokens', searchQuery) || + textContainsSearch('Start Time', searchQuery) || + textContainsSearch('End Time', searchQuery); }, [searchQuery, metrics, totalInputTokens, totalOutputTokens]); // Advanced attributes (not shown in input/output) @@ -677,9 +742,9 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut {/* Span Header */} {spanName && ( <SpanHeader> - <SpanIcon type={spanType}> + <SpanIcon type={spanType} spanKind={spanKind}> <Icon - name={spanType === 'invoke' ? 'bi-ai-agent' : spanType === 'chat' ? 'bi-chat' : spanType === 'tool' ? 'bi-wrench' : 'bi-action'} + name={getSpanIconName(spanType, spanKind)} sx={{ fontSize: '24px', width: '24px', @@ -702,6 +767,8 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut {spanType === 'invoke' && 'Invoke Agent - '} {spanType === 'chat' && 'Chat - '} {spanType === 'tool' && 'Execute Tool - '} + {spanType === 'other' && spanKind.toLowerCase() === 'server' && 'Server - '} + {spanType === 'other' && spanKind.toLowerCase() === 'client' && 'Client - '} </span> {stripSpanPrefix(spanName)} </SpanTitle> @@ -817,6 +884,16 @@ export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOut {highlightText(`Tool Description: ${metrics.toolDescription}`, searchQuery)} </MetricPill> )} + {metrics.startTime && ( + <MetricPill> + {highlightText(`Start Time: ${metrics.startTime}`, searchQuery)} + </MetricPill> + )} + {metrics.endTime && ( + <MetricPill> + {highlightText(`End Time: ${metrics.endTime}`, searchQuery)} + </MetricPill> + )} </MetricsPills> )} diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx new file mode 100644 index 00000000000..8e1faaf25b0 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx @@ -0,0 +1,804 @@ +import React from "react"; +import styled from "@emotion/styled"; +import { TraceData, SpanData } from "../index"; +import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { AIBadge } from "./AIBadge"; +import { + formatDuration, + getSpanDuration, + getSpanKindLabel, + stripSpanPrefix, + getSpanTypeBadge, + spanHasError, + isAISpan, + getSpanLabel, + doesSpanMatch, + HighlightText +} from "../utils"; + +// ============================================================================ +// STYLES +// ============================================================================ + +export const AISpanTreeContainer = styled.div` + background-color: var(--vscode-editor-background); + flex: 1; + overflow-y: hidden; + height: 100%; + display: flex; + flex-direction: column; + padding: 0; +`; + +// New Scrollable Area for the tree itself +const TreeScrollArea = styled.div` + flex: 1; + overflow-y: auto; + overflow-x: hidden; + padding: 0 0 0 12px; +`; + +const TreeNodeContainer = styled.div<{ isLast?: boolean }>` + position: relative; + display: flex; + flex-direction: column; + + &::before { + content: ''; + position: absolute; + left: -13px; + width: 1px; + background-color: var(--vscode-tree-indentGuidesStroke); + top: 0; + height: ${(props: { isLast?: boolean }) => props.isLast ? '16px' : '100%'}; + } +`; + +const TreeNodeChildren = styled.div` + margin-left: 6px; + padding-left: 12px; + position: relative; + + &::before { + content: ''; + position: absolute; + top: -16px; + left: -1px; + width: 1px; + height: 20px; + background-color: var(--vscode-tree-indentGuidesStroke); + } +`; + +const ConnectorCurve = styled.div` + position: absolute; + left: -13px; + top: 0; + width: 8px; + height: 16px; + border-bottom: 1px solid var(--vscode-tree-indentGuidesStroke); + border-left: 1px solid var(--vscode-tree-indentGuidesStroke); + pointer-events: none; +`; + +const AISpanTreeItem = styled.div<{ isSelected: boolean }>` + display: flex; + flex-direction: column; + padding: 4px 8px 4px 0; + margin: 4px 0; + cursor: pointer; + border-radius: 0; + gap: 6px; + z-index: 0; + + position: relative; + min-height: 32px; + + &::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: -100vw; + z-index: -1; + + background-color: ${(props: { isSelected: boolean }) => + props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; + transition: background-color 0.15s ease; + } + + &:hover::before { + background-color: ${(props: { isSelected: boolean }) => + props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; + } +`; + +const AISpanLabel = styled.span` + font-size: 13px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 6px; + flex: 1; + min-width: 0; + + > span:first-of-type { + flex-shrink: 0; + } + + > span:nth-of-type(2) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + min-width: 0; + } +`; + +const AISpanTopRow = styled.div` + display: flex; + align-items: center; + gap: 8px; + width: 100%; + min-width: 0; +`; + +const ChevronToggleWrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + margin-left: auto; + flex-shrink: 0; + color: var(--vscode-descriptionForeground); + + &:hover { + color: var(--vscode-foreground); + } +`; + +const AISpanDuration = styled.span` + font-size: 10px; + color: inherit; + display: flex; + align-items: center; + gap: 3px; +`; + +const AISpanTokenCount = styled.span` + font-size: 10px; + color: inherit; + display: inline; +`; + +const AISpanMetadataGroup = styled.div` + display: flex; + align-items: center; + gap: 6px; + flex-wrap: wrap; + margin-left: 0; + margin-top: 2px; +`; + +const AISpanMetadataPill = styled.span` + font-size: 11px; + padding: 1px 4px; + border-radius: 4px; + background-color: var(--vscode-sideBar-background); + border: 1px solid var(--vscode-panel-border); + color: var(--vscode-editor-foreground); + display: flex; + align-items: center; + gap: 4px; + white-space: nowrap; + font-weight: 300; +`; + +const AISpanErrorIcon = styled.span` + display: flex; + align-items: center; + justify-content: center; + color: var(--vscode-errorForeground); + flex-shrink: 0; +`; + +// ============================================================================ +// ADVANCED MODE STYLES +// ============================================================================ + +const AdvancedSpanGroup = styled.div` + margin-top: 4px; + margin-bottom: 4px; +`; + +const AdvancedSpanGroupHeader = styled.div<{ isExpanded: boolean }>` + display: flex; + align-items: center; + padding: 6px 8px; + cursor: pointer; + border-radius: 3px; + gap: 8px; + background-color: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-panel-border); + font-size: 12px; + font-weight: 500; + color: var(--vscode-descriptionForeground); + margin-bottom: 4px; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } +`; + +const AdvancedSpanGroupContent = styled.div` + margin-left: 16px; + border-left: 1px solid var(--vscode-tree-indentGuidesStroke); + padding-left: 8px; +`; + +const AdvancedSpanItem = styled.div<{ isSelected: boolean }>` + display: flex; + flex-direction: column; + padding: 4px 8px 4px 0; + margin: 4px 0; + cursor: pointer; + border-radius: 0; + gap: 6px; + z-index: 0; + + position: relative; + min-height: 32px; + + &::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: -100vw; + z-index: -1; + + background-color: ${(props: { isSelected: boolean }) => + props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'transparent'}; + transition: background-color 0.15s ease; + } + + &:hover::before { + background-color: ${(props: { isSelected: boolean }) => + props.isSelected ? 'var(--vscode-list-inactiveSelectionBackground)' : 'var(--vscode-list-hoverBackground)'}; + } +`; + +const NonAISpanTopRow = styled.div` + display: flex; + align-items: center; + gap: 8px; + width: 100%; + min-width: 0; +`; + +const NonAISpanLabel = styled.span` + font-size: 13px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 6px; + flex: 1; + min-width: 0; + + > span:first-of-type { + flex-shrink: 0; + } + + > span:nth-of-type(2) { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + min-width: 0; + } +`; + +const NonAISpanIcon = styled.span<{ spanKind: string }>` + display: flex; + align-items: center; + justify-content: center; + padding: 4px; + border-radius: 3px; + flex-shrink: 0; + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-dropdown-border); + color: ${(props: { spanKind: string }) => { + switch (props.spanKind.toLowerCase()) { + case 'client': return 'var(--vscode-terminal-ansiBlue)'; + case 'server': return 'var(--vscode-terminal-ansiGreen)'; + default: return 'var(--vscode-foreground)'; + } + }}; +`; + +// ============================================================================ +// COMPONENT +// ============================================================================ + +interface SpanTreeProps { + traceData: TraceData; + rootAISpans: SpanData[]; + sortedRootSpans: SpanData[]; + isAdvancedMode: boolean; + expandedSpans: Set<string>; + selectedSpanId: string | null; + expandedAdvancedSpanGroups: Set<string>; + onSelectSpan: (spanId: string) => void; + onToggleSpanExpansion: (spanId: string) => void; + setExpandedAdvancedSpanGroups: (groups: Set<string>) => void; + getChildSpans: (spanId: string) => SpanData[]; + containerWidth: number; + searchQuery: string; +} + +export function SpanTree({ + traceData, + rootAISpans, + sortedRootSpans, + isAdvancedMode, + expandedSpans, + selectedSpanId, + expandedAdvancedSpanGroups, + onSelectSpan, + onToggleSpanExpansion, + setExpandedAdvancedSpanGroups, + getChildSpans, + containerWidth, + searchQuery +}: SpanTreeProps) { + + // Helper functions moved from TraceDetails + const getAIChildSpans = (spanId: string): SpanData[] => { + const parentSpan = traceData.spans.find(s => s.spanId === spanId); + if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) return []; + + const parentStart = new Date(parentSpan.startTime).getTime(); + const parentEnd = new Date(parentSpan.endTime).getTime(); + const aiSpans = traceData.spans.filter(span => + span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') + ); + + const children: SpanData[] = []; + + aiSpans.forEach(potentialChild => { + if (potentialChild.spanId === spanId) return; + if (!potentialChild.startTime || !potentialChild.endTime) return; + + const childStart = new Date(potentialChild.startTime).getTime(); + const childEnd = new Date(potentialChild.endTime).getTime(); + const parentContainsChild = parentStart <= childStart && parentEnd >= childEnd && + (parentStart < childStart || parentEnd > childEnd); + + if (!parentContainsChild) return; + + let hasIntermediateParent = false; + aiSpans.forEach(intermediateSpan => { + if (intermediateSpan.spanId === spanId || intermediateSpan.spanId === potentialChild.spanId) return; + if (!intermediateSpan.startTime || !intermediateSpan.endTime) return; + const intStart = new Date(intermediateSpan.startTime).getTime(); + const intEnd = new Date(intermediateSpan.endTime).getTime(); + const intermediateContainsChild = intStart <= childStart && intEnd >= childEnd && + (intStart < childStart || intEnd > childEnd); + const parentContainsIntermediate = parentStart <= intStart && parentEnd >= intEnd && + (parentStart < intStart || parentEnd > intEnd); + + if (intermediateContainsChild && parentContainsIntermediate) { + hasIntermediateParent = true; + } + }); + + if (!hasIntermediateParent) children.push(potentialChild); + }); + + return children.sort((a, b) => { + const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; + const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; + return aTime - bTime; + }); + }; + + const calculateTokenBreakdown = (spanId: string): { input: number; output: number } => { + const span = traceData.spans.find(s => s.spanId === spanId); + if (!span) return { input: 0, output: 0 }; + let input = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); + let output = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); + if (isNaN(input)) input = 0; + if (isNaN(output)) output = 0; + const children = getAIChildSpans(spanId); + children.forEach(child => { + const childTokens = calculateTokenBreakdown(child.spanId); + input += childTokens.input; + output += childTokens.output; + }); + return { input, output }; + }; + + const getNonAIChildSpans = (parentSpanId: string): SpanData[] => { + const parentSpan = traceData.spans.find(s => s.spanId === parentSpanId); + if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) return []; + const parentStart = new Date(parentSpan.startTime).getTime(); + const parentEnd = new Date(parentSpan.endTime).getTime(); + const nonAISpans = traceData.spans.filter(span => + !span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') + ); + const containedSpans: SpanData[] = []; + nonAISpans.forEach(span => { + if (!span.startTime || !span.endTime) return; + const spanStart = new Date(span.startTime).getTime(); + const spanEnd = new Date(span.endTime).getTime(); + if (spanStart >= parentStart && spanEnd <= parentEnd) { + const aiChildren = getAIChildSpans(parentSpanId); + let isDirectChild = true; + for (const aiChild of aiChildren) { + if (!aiChild.startTime || !aiChild.endTime) continue; + const aiChildStart = new Date(aiChild.startTime).getTime(); + const aiChildEnd = new Date(aiChild.endTime).getTime(); + if (spanStart >= aiChildStart && spanEnd <= aiChildEnd) { + isDirectChild = false; + break; + } + } + if (isDirectChild) containedSpans.push(span); + } + }); + return containedSpans.sort((a, b) => { + const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; + const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; + return aTime - bTime; + }); + }; + + const groupNonAISpans = (spans: SpanData[]): Map<string, SpanData[]> => { + const groups = new Map<string, SpanData[]>(); + spans.forEach(span => { + const kind = getSpanKindLabel(span.kind); + let category = 'Other'; + const httpAttr = span.attributes?.find(attr => attr.key.toLowerCase().includes('http') || attr.key.toLowerCase().includes('url')); + const dbAttr = span.attributes?.find(attr => attr.key.toLowerCase().includes('db') || attr.key.toLowerCase().includes('sql')); + + if (httpAttr || span.name.toLowerCase().includes('http')) category = 'HTTP Calls'; + else if (dbAttr || span.name.toLowerCase().includes('db') || span.name.toLowerCase().includes('sql')) category = 'Database Operations'; + else if (kind === 'CLIENT') category = 'Client Calls'; + else if (kind === 'SERVER') category = 'Server Operations'; + + if (!groups.has(category)) groups.set(category, []); + groups.get(category)!.push(span); + }); + return groups; + }; + + const getChildSpansFromList = (parentSpanId: string, spanList: SpanData[]): SpanData[] => { + const children = spanList.filter(s => s.parentSpanId === parentSpanId); + return children.sort((a, b) => { + const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; + const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; + return aTime - bTime; + }); + }; + + const renderExpandChevron = (hasChildren: boolean, isExpanded: boolean, onClick: (e: React.MouseEvent) => void) => { + if (!hasChildren) return null; + return ( + <ChevronToggleWrapper onClick={onClick} style={{ cursor: 'pointer' }}> + <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> + </ChevronToggleWrapper> + ); + }; + + const renderAISpanContent = (span: SpanData, isSelected: boolean, hasChildren: boolean, isExpanded: boolean, onToggle: (e: React.MouseEvent) => void, showConnector: boolean = false) => { + const badgeType = getSpanTypeBadge(span); + const duration = getSpanDuration(span); + const isVeryNarrow = containerWidth < 500; + let inputTokens = 0; + let outputTokens = 0; + + if (badgeType === 'invoke' && hasChildren) { + const breakdown = calculateTokenBreakdown(span.spanId); + inputTokens = breakdown.input; + outputTokens = breakdown.output; + } else { + inputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0') || 0; + outputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0') || 0; + } + const totalTokens = inputTokens + outputTokens; + + return ( + <AISpanTreeItem isSelected={isSelected} onClick={() => onSelectSpan(span.spanId)} data-span-id={span.spanId}> + {showConnector && <ConnectorCurve />} + <AISpanTopRow> + <AIBadge type={badgeType} /> + <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> + <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> + <AISpanLabel> + <span style={{ fontWeight: 600 }}>{getSpanLabel(badgeType)}</span> + <span title={span.name}> + <HighlightText text={stripSpanPrefix(span.name)} query={searchQuery} /> + </span> + </AISpanLabel> + {spanHasError(span) && ( + <AISpanErrorIcon> + <Icon name="bi-error" sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> + </AISpanErrorIcon> + )} + </div> + <AISpanMetadataGroup> + {duration !== null && ( + <AISpanMetadataPill> + <AISpanDuration> + <Icon name="bi-clock" sx={{ fontSize: '12px', width: '12px', height: '12px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> + {formatDuration(duration)} + </AISpanDuration> + </AISpanMetadataPill> + )} + {!isVeryNarrow && totalTokens > 0 && ( + <AISpanMetadataPill> + <AISpanTokenCount title={`Input: ${inputTokens.toLocaleString()}\nOutput: ${outputTokens.toLocaleString()}\nTotal: ${totalTokens.toLocaleString()}`} style={{ cursor: 'help' }}> + {totalTokens.toLocaleString()} Tokens + </AISpanTokenCount> + </AISpanMetadataPill> + )} + </AISpanMetadataGroup> + </div> + {renderExpandChevron(hasChildren, isExpanded, onToggle)} + </AISpanTopRow> + </AISpanTreeItem> + ); + }; + + const renderNonAISpanContent = (span: SpanData, isSelected: boolean, hasChildren: boolean, isExpanded: boolean, onToggle: (e: React.MouseEvent) => void, showConnector: boolean = false) => { + const duration = getSpanDuration(span); + const spanKind = getSpanKindLabel(span.kind); + const spanKindIcon = (() => { + switch (spanKind.toLowerCase()) { + case 'client': return 'bi-arrow-outward'; + case 'server': return 'bi-server'; + default: return 'bi-action'; + } + })(); + + return ( + <AdvancedSpanItem isSelected={isSelected} onClick={() => onSelectSpan(span.spanId)} data-span-id={span.spanId}> + {showConnector && <ConnectorCurve />} + <NonAISpanTopRow> + <NonAISpanIcon spanKind={spanKind}> + <Icon name={spanKindIcon} sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> + </NonAISpanIcon> + <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> + <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> + <NonAISpanLabel> + <span style={{ fontWeight: 500, fontSize: '11px', textTransform: 'uppercase', opacity: 0.7 }}>{spanKind}</span> + <span title={span.name}> + <HighlightText text={span.name} query={searchQuery} /> + </span> + </NonAISpanLabel> + {spanHasError(span) && ( + <AISpanErrorIcon> + <Icon name="bi-error" sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> + </AISpanErrorIcon> + )} + </div> + {duration !== null && ( + <AISpanMetadataGroup> + <AISpanMetadataPill> + <AISpanDuration> + <Icon name="bi-clock" sx={{ fontSize: '12px', width: '12px', height: '12px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> + {formatDuration(duration)} + </AISpanDuration> + </AISpanMetadataPill> + </AISpanMetadataGroup> + )} + </div> + {renderExpandChevron(hasChildren, isExpanded, onToggle)} + </NonAISpanTopRow> + </AdvancedSpanItem> + ); + }; + + // Recursive render function for non-AI tree items (filtering included) + const renderNonAISpanTreeItem = (span: SpanData, spanList: SpanData[], isFirstChild: boolean = false, isLastChild: boolean = false): React.ReactNode => { + const children = getChildSpansFromList(span.spanId, spanList); + + // Filter children based on search query + const visibleChildren = children.map(child => ({ + node: child, + element: renderNonAISpanTreeItem(child, spanList, false, false) // We don't care about isFirst/isLast for index yet + })).filter(item => item.element !== null); + + const isMatch = doesSpanMatch(span, searchQuery); + + // If span doesn't match and has no visible children, don't render it + if (!isMatch && visibleChildren.length === 0) { + return null; + } + + const hasChildren = visibleChildren.length > 0; + // Auto-expand if searching and matches found, otherwise use default expanded state + const isExpanded = searchQuery ? true : expandedSpans.has(span.spanId); + const isSelected = selectedSpanId === span.spanId; + + return ( + <TreeNodeContainer key={span.spanId} isLast={isLastChild}> + {renderNonAISpanContent( + span, + isSelected, + hasChildren, + isExpanded, + (e) => { + e.stopPropagation(); + if (hasChildren) onToggleSpanExpansion(span.spanId); + }, + !isFirstChild + )} + {hasChildren && isExpanded && ( + <TreeNodeChildren> + {visibleChildren.map((child, index) => + // Re-render to ensure styling props (isFirst/isLast) are correct for filtered list + renderNonAISpanTreeItem(child.node, spanList, index === 0, index === visibleChildren.length - 1) + )} + </TreeNodeChildren> + )} + </TreeNodeContainer> + ); + }; + + // Recursive render function for Mixed tree items (Advanced Mode root) + const renderMixedSpanTreeItem = (span: SpanData, isFirstChild: boolean = false, isLastChild: boolean = false, isRoot: boolean = false): React.ReactNode => { + const isAI = isAISpan(span); + const children = getChildSpans(span.spanId); + + const visibleChildren = children.map(child => ({ + node: child, + element: renderMixedSpanTreeItem(child, false, false, false) + })).filter(item => item.element !== null); + + const isMatch = doesSpanMatch(span, searchQuery); + + if (!isMatch && visibleChildren.length === 0) { + return null; + } + + const hasChildren = visibleChildren.length > 0; + const isExpanded = searchQuery ? true : expandedSpans.has(span.spanId); + const isSelected = selectedSpanId === span.spanId; + + const handleToggle = (e: React.MouseEvent) => { + e.stopPropagation(); + if (hasChildren) onToggleSpanExpansion(span.spanId); + }; + + return ( + <TreeNodeContainer key={span.spanId} isLast={isLastChild}> + {isAI ? ( + renderAISpanContent(span, isSelected, hasChildren, isExpanded, handleToggle, !isRoot) + ) : ( + renderNonAISpanContent(span, isSelected, hasChildren, isExpanded, handleToggle, !isRoot) + )} + {hasChildren && isExpanded && ( + <TreeNodeChildren> + {visibleChildren.map((child, index) => + renderMixedSpanTreeItem(child.node, index === 0, index === visibleChildren.length - 1, false) + )} + </TreeNodeChildren> + )} + </TreeNodeContainer> + ); + }; + + // Recursive render function for AI Tree items (Simple View) + const renderAISpanTreeItem = (span: SpanData, isFirstChild: boolean = false, isLastChild: boolean = false, isRoot: boolean = false): React.ReactNode => { + const children = getAIChildSpans(span.spanId); + const isSelected = selectedSpanId === span.spanId; + const nonAISpans = isAdvancedMode ? getNonAIChildSpans(span.spanId) : []; + const groupedNonAISpans = isAdvancedMode ? groupNonAISpans(nonAISpans) : new Map(); + + // 1. Process AI Children + const visibleAIChildren = children.map(child => ({ + node: child, + element: renderAISpanTreeItem(child, false, false, false) + })).filter(item => item.element !== null); + + // 2. Process Advanced Groups (Non-AI children) + const visibleGroups: React.ReactNode[] = []; + + if (isAdvancedMode && groupedNonAISpans.size > 0) { + const groupKey = `${span.spanId}-advanced`; + + Array.from(groupedNonAISpans.entries()).forEach(([category, spans]) => { + // Filter the spans within this group + const visibleSpansInGroup = spans.filter((s: SpanData) => { + // This is a simplified check. Ideally, we recursively check children of these spans too. + // Reusing renderNonAISpanTreeItem logic to determine visibility + return renderNonAISpanTreeItem(s, spans) !== null; + }); + + if (visibleSpansInGroup.length > 0) { + const categoryKey = `${groupKey}-${category}`; + const isExpanded = searchQuery ? true : expandedAdvancedSpanGroups.has(categoryKey); + + const spanIdsInCategory = new Set(spans.map((s: SpanData) => s.spanId)); + const rootSpansInCategory = visibleSpansInGroup.filter((s: SpanData) => + !s.parentSpanId || + s.parentSpanId === '0000000000000000' || + !spanIdsInCategory.has(s.parentSpanId) + ); + rootSpansInCategory.sort((a: SpanData, b: SpanData) => { + const aStart = a.startTime ? new Date(a.startTime).getTime() : 0; + const bStart = b.startTime ? new Date(b.startTime).getTime() : 0; + return aStart - bStart; + }); + + visibleGroups.push( + <div key={categoryKey}> + <AdvancedSpanGroupHeader + isExpanded={isExpanded} + onClick={() => { + const newExpanded = new Set(expandedAdvancedSpanGroups); + if (isExpanded) newExpanded.delete(categoryKey); + else newExpanded.add(categoryKey); + setExpandedAdvancedSpanGroups(newExpanded); + }} + > + <Codicon name={isExpanded ? 'chevron-down' : 'chevron-right'} /> + <span>{category} ({visibleSpansInGroup.length})</span> + </AdvancedSpanGroupHeader> + {isExpanded && ( + <AdvancedSpanGroupContent> + {rootSpansInCategory.map((rootSpan: SpanData, index: number) => + renderNonAISpanTreeItem(rootSpan, spans, index === 0, index === rootSpansInCategory.length - 1) + )} + </AdvancedSpanGroupContent> + )} + </div> + ); + } + }); + } + + const isMatch = doesSpanMatch(span, searchQuery); + + // Visibility Check: Show if span matches, OR has visible AI children, OR has visible Non-AI groups + if (!isMatch && visibleAIChildren.length === 0 && visibleGroups.length === 0) { + return null; + } + + const hasAnyChildren = visibleAIChildren.length > 0 || visibleGroups.length > 0; + const isExpanded = searchQuery ? true : expandedSpans.has(span.spanId); + + return ( + <TreeNodeContainer key={span.spanId} isLast={isLastChild}> + {renderAISpanContent(span, isSelected, visibleAIChildren.length > 0, isExpanded, () => { }, !isRoot)} + {hasAnyChildren && ( + <TreeNodeChildren> + {visibleGroups.length > 0 && ( + <AdvancedSpanGroup> + {visibleGroups} + </AdvancedSpanGroup> + )} + {visibleAIChildren.map((child, index) => + renderAISpanTreeItem(child.node, index === 0 && visibleGroups.length === 0, index === visibleAIChildren.length - 1, false) + )} + </TreeNodeChildren> + )} + </TreeNodeContainer> + ); + }; + + return ( + <AISpanTreeContainer> + <TreeScrollArea> + {isAdvancedMode || rootAISpans.length === 0 + ? sortedRootSpans.map((span, index) => renderMixedSpanTreeItem(span, index === 0, index === sortedRootSpans.length - 1, true)) + : rootAISpans.map((span, index) => renderAISpanTreeItem(span, index === 0, index === rootAISpans.length - 1, true)) + } + </TreeScrollArea> + </AISpanTreeContainer> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index 0ec6bdd312c..9ded2bcd407 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -31,6 +31,8 @@ interface WaterfallViewProps { getChildSpans: (spanId: string) => SpanData[]; traceStartTime: string; traceDuration: number; + collapsedSpanIds: Set<string>; + setCollapsedSpanIds: (ids: Set<string>) => void; } interface FlatSpan extends SpanData { @@ -57,7 +59,7 @@ const WaterfallContainer = styled.div` const ZoomControlsBar = styled.div` display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-end; padding: 8px 0; border-bottom: 1px solid var(--vscode-panel-border); flex-shrink: 0; @@ -473,10 +475,11 @@ export function WaterfallView({ getChildSpans, traceStartTime, traceDuration, + collapsedSpanIds, + setCollapsedSpanIds }: WaterfallViewProps) { const [zoom, setZoom] = useState(1); const [hoveredSpan, setHoveredSpan] = useState<{ span: FlatSpan; x: number; y: number } | null>(null); - const [collapsedSpanIds, setCollapsedSpanIds] = useState<Set<string>>(new Set()); const [isCompact, setIsCompact] = useState(false); const scrollContainerRef = useRef<HTMLDivElement>(null); @@ -645,17 +648,6 @@ export function WaterfallView({ <WaterfallContainer ref={containerRef}> {/* Zoom Controls */} <ZoomControlsBar> - <ZoomButton - onClick={handleToggleAll} - title={isAnyCollapsed ? "Expand All Spans" : "Collapse All Spans"} - > - <Icon - name={isAnyCollapsed ? 'bi-expand-item' : 'bi-collapse-item'} - sx={{ fontSize: "14px", width: "14px", height: "14px" }} - iconSx={{ display: "flex" }} - /> - {!isCompact && (isAnyCollapsed ? 'Expand' : 'Collapse')} - </ZoomButton> <ZoomControlsGroup> <ZoomButton onClick={() => setZoom(Math.max(1, zoom - 1))} diff --git a/workspaces/ballerina/trace-visualizer/src/utils.ts b/workspaces/ballerina/trace-visualizer/src/utils.tsx similarity index 87% rename from workspaces/ballerina/trace-visualizer/src/utils.ts rename to workspaces/ballerina/trace-visualizer/src/utils.tsx index a797670a247..d81d2a837b3 100644 --- a/workspaces/ballerina/trace-visualizer/src/utils.ts +++ b/workspaces/ballerina/trace-visualizer/src/utils.tsx @@ -16,6 +16,7 @@ * under the License. */ +import styled from "@emotion/styled"; import { SpanData } from './index'; export const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { @@ -257,3 +258,42 @@ export const getSpanLabel = (type: string) => { default: return 'Operation'; } }; + +export const doesSpanMatch = (span: SpanData, query: string): boolean => { + if (!query) return true; + const lowerQuery = query.toLowerCase(); + + // Search in Name + if (span.name.toLowerCase().includes(lowerQuery)) return true; + + // Search in Span Kind (optional, good for advanced view) + if (getSpanKindLabel(span.kind).toLowerCase().includes(lowerQuery)) return true; + + return false; +}; + +const HighlightMark = styled.mark` + background-color: var(--vscode-editor-findMatchHighlightBackground); + color: inherit; + padding: 0; + border-radius: 2px; +`; + +export const HighlightText = ({ text, query }: { text: string; query: string }) => { + if (!query || !text) return <>{text} </>; + + // Escape regex characters in query + const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const parts = text.split(new RegExp(`(${escapedQuery})`, 'gi')); + + return ( + <> + { + parts.map((part, i) => + part.toLowerCase() === query.toLowerCase() + ? <HighlightMark key={i} > {part} </HighlightMark> + : part + )} + </> + ); +}; From 8fa318610fb464b2f1550124f7cb2238a1c0fcc7 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 23 Jan 2026 15:40:17 +0530 Subject: [PATCH 113/247] Update agent chat input icons --- .../src/views/AgentChatPanel/Components/ChatInput.tsx | 3 ++- workspaces/common-libs/font-wso2-vscode/src/icons/bi-send.svg | 3 +++ workspaces/common-libs/font-wso2-vscode/src/icons/bi-stop.svg | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-send.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-stop.svg diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInput.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInput.tsx index c1c31770274..59623e9fa4d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInput.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInput.tsx @@ -20,6 +20,7 @@ import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle, KeyboardEvent, useCallback } from "react"; import styled from "@emotion/styled"; +import { Icon } from "@wso2/ui-toolkit"; const Container = styled.div` width: calc(100% - 40px); @@ -246,7 +247,7 @@ const ChatInput: React.FC<ChatInputProps> = ({ value = "", onSend, onStop, isLoa disabled={!inputValue.trim() && !isLoading} onClick={isLoading ? onStop : handleSend} > - <span className={`codicon ${isLoading ? "codicon-stop-circle" : "codicon-send"}`} /> + <Icon name={isLoading ? "bi-stop" : "bi-send"} sx={{ fontSize: "20px", width: "20px", height: "20px" }} /> </ActionButton> </InputArea> </FlexRow> diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-send.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-send.svg new file mode 100644 index 00000000000..edee7f13d17 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-send.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="m19.8 12.925l-15.4 6.5q-.5.2-.95-.088T3 18.5v-13q0-.55.45-.837t.95-.088l15.4 6.5q.625.275.625.925t-.625.925M5 17l11.85-5L5 7v3.5l6 1.5l-6 1.5zm0 0V7z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-stop.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-stop.svg new file mode 100644 index 00000000000..52fd2537966 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-stop.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M9 16h6q.425 0 .713-.288T16 15V9q0-.425-.288-.712T15 8H9q-.425 0-.712.288T8 9v6q0 .425.288.713T9 16m3 6q-2.075 0-3.9-.788t-3.175-2.137T2.788 15.9T2 12t.788-3.9t2.137-3.175T8.1 2.788T12 2t3.9.788t3.175 2.137T21.213 8.1T22 12t-.788 3.9t-2.137 3.175t-3.175 2.138T12 22m0-2q3.35 0 5.675-2.325T20 12t-2.325-5.675T12 4T6.325 6.325T4 12t2.325 5.675T12 20m0-8" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file From e584bf72ef7681ffe046b0815cadfa2816f18572 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 25 Jan 2026 00:28:57 +0530 Subject: [PATCH 114/247] Update sidebar search in trace logs --- .../trace-visualizer/src/TraceDetails.tsx | 29 +- .../src/components/SearchInput.tsx | 1 + .../src/components/SpanTree.tsx | 140 ++++++- .../src/components/WaterfallView.tsx | 381 ++++++++++++------ 4 files changed, 392 insertions(+), 159 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index b4c8d6464cc..1eaba6262f0 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -24,6 +24,7 @@ import { SpanInputOutput } from "./components/SpanInputOutput"; import { WaterfallView } from "./components/WaterfallView"; import { TraceEmptyState } from "./components/TraceEmptyState"; import { SpanTree, AISpanTreeContainer } from "./components/SpanTree"; +import { SearchInput } from "./components/SearchInput"; import { timeContainsSpan, sortSpansByUmbrellaFirst, @@ -176,26 +177,6 @@ const SearchInputWrapper = styled.div` align-items: center; `; -const SearchInput = styled.input` - width: 100%; - background-color: var(--vscode-input-background); - color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border); - padding: 6px; - font-size: 13px; - outline: none; - border-radius: 4px; - box-sizing: border-box; - - &:focus { - border-color: var(--vscode-focusBorder); - } - - &::placeholder { - color: var(--vscode-input-placeholderForeground); - } -`; - const ActionButton = styled.button` display: flex; align-items: center; @@ -801,10 +782,9 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide <> <SearchInputWrapper> <SearchInput - type="text" - placeholder="Filter spans..." value={searchQuery} - onChange={(e) => setSearchQuery(e.target.value)} + onChange={setSearchQuery} + placeholder="Filter spans..." /> <ActionButton onClick={handleToggleAll} @@ -834,6 +814,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide getChildSpans={getChildSpans} containerWidth={containerWidth} searchQuery={searchQuery} + onClearSearch={() => setSearchQuery('')} /> </AISpanTreeContainer> )} @@ -848,6 +829,8 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide traceDuration={duration} collapsedSpanIds={waterfallCollapsedSpanIds} setCollapsedSpanIds={setWaterfallCollapsedSpanIds} + searchQuery={searchQuery} + onClearSearch={() => setSearchQuery('')} /> )} </> diff --git a/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx index 0104c695ede..a9cd30386bc 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx @@ -29,6 +29,7 @@ const Container = styled.div` position: relative; display: flex; align-items: center; + width: 100%; `; const SearchIcon = styled.span` diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx index 8e1faaf25b0..a730c6529ea 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx @@ -1,4 +1,22 @@ -import React from "react"; +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useMemo } from "react"; import styled from "@emotion/styled"; import { TraceData, SpanData } from "../index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; @@ -204,6 +222,43 @@ const AISpanErrorIcon = styled.span` flex-shrink: 0; `; +const NoResultsContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 24px; + gap: 12px; +`; + +const NoResultsTitle = styled.div` + font-size: 18px; + font-weight: 500; + color: var(--vscode-foreground); +`; + +const ClearSearchButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: transparent; + border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); + border-radius: 4px; + color: var(--vscode-foreground); + font-size: 13px; + cursor: pointer; + transition: all 0.15s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + // ============================================================================ // ADVANCED MODE STYLES // ============================================================================ @@ -337,6 +392,7 @@ interface SpanTreeProps { getChildSpans: (spanId: string) => SpanData[]; containerWidth: number; searchQuery: string; + onClearSearch?: () => void; } export function SpanTree({ @@ -352,9 +408,32 @@ export function SpanTree({ setExpandedAdvancedSpanGroups, getChildSpans, containerWidth, - searchQuery + searchQuery, + onClearSearch }: SpanTreeProps) { + /** + * EXTENDED MATCH LOGIC + * Checks if span matches the query by Name, Attributes, Label, or Kind. + */ + const extendedDoesSpanMatch = (span: SpanData): boolean => { + if (!searchQuery) return true; + + // 1. Check existing match logic (Name, attributes, etc.) + if (doesSpanMatch(span, searchQuery)) return true; + + // 2. Check Span Label (e.g. "LLM Call", "Tool", etc.) + const badgeType = getSpanTypeBadge(span); + const label = getSpanLabel(badgeType); + if (label && label.toLowerCase().includes(searchQuery.toLowerCase())) return true; + + // 3. Check Span Kind (e.g. "CLIENT", "SERVER") + const kind = getSpanKindLabel(span.kind); + if (kind && kind.toLowerCase().includes(searchQuery.toLowerCase())) return true; + + return false; + }; + // Helper functions moved from TraceDetails const getAIChildSpans = (spanId: string): SpanData[] => { const parentSpan = traceData.spans.find(s => s.spanId === spanId); @@ -518,7 +597,10 @@ export function SpanTree({ <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> <AISpanLabel> - <span style={{ fontWeight: 600 }}>{getSpanLabel(badgeType)}</span> + <span style={{ fontWeight: 600 }}> + {/* Updated to highlight label */} + <HighlightText text={getSpanLabel(badgeType)} query={searchQuery} /> + </span> <span title={span.name}> <HighlightText text={stripSpanPrefix(span.name)} query={searchQuery} /> </span> @@ -574,7 +656,10 @@ export function SpanTree({ <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: '2px', flex: 1, minWidth: 0 }}> <div style={{ display: 'flex', alignItems: 'center', gap: '6px', width: '100%', minWidth: 0 }}> <NonAISpanLabel> - <span style={{ fontWeight: 500, fontSize: '11px', textTransform: 'uppercase', opacity: 0.7 }}>{spanKind}</span> + <span style={{ fontWeight: 500, fontSize: '11px', textTransform: 'uppercase', opacity: 0.7 }}> + {/* Updated to highlight span kind */} + <HighlightText text={spanKind} query={searchQuery} /> + </span> <span title={span.name}> <HighlightText text={span.name} query={searchQuery} /> </span> @@ -612,7 +697,8 @@ export function SpanTree({ element: renderNonAISpanTreeItem(child, spanList, false, false) // We don't care about isFirst/isLast for index yet })).filter(item => item.element !== null); - const isMatch = doesSpanMatch(span, searchQuery); + // Uses extended match + const isMatch = extendedDoesSpanMatch(span); // If span doesn't match and has no visible children, don't render it if (!isMatch && visibleChildren.length === 0) { @@ -659,7 +745,8 @@ export function SpanTree({ element: renderMixedSpanTreeItem(child, false, false, false) })).filter(item => item.element !== null); - const isMatch = doesSpanMatch(span, searchQuery); + // Uses extended match + const isMatch = extendedDoesSpanMatch(span); if (!isMatch && visibleChildren.length === 0) { return null; @@ -762,7 +849,8 @@ export function SpanTree({ }); } - const isMatch = doesSpanMatch(span, searchQuery); + // Uses extended match + const isMatch = extendedDoesSpanMatch(span); // Visibility Check: Show if span matches, OR has visible AI children, OR has visible Non-AI groups if (!isMatch && visibleAIChildren.length === 0 && visibleGroups.length === 0) { @@ -791,13 +879,43 @@ export function SpanTree({ ); }; + // Calculate visible spans for "no results" detection + const visibleSpans = useMemo(() => { + const spans = isAdvancedMode || rootAISpans.length === 0 ? sortedRootSpans : rootAISpans; + return spans.map(span => { + if (isAdvancedMode || rootAISpans.length === 0) { + return renderMixedSpanTreeItem(span, true, false, true); + } else { + return renderAISpanTreeItem(span, true, false, true); + } + }).filter(element => element !== null); + }, [isAdvancedMode, rootAISpans, sortedRootSpans, searchQuery]); + + const noResults = searchQuery && visibleSpans.length === 0; + return ( <AISpanTreeContainer> <TreeScrollArea> - {isAdvancedMode || rootAISpans.length === 0 - ? sortedRootSpans.map((span, index) => renderMixedSpanTreeItem(span, index === 0, index === sortedRootSpans.length - 1, true)) - : rootAISpans.map((span, index) => renderAISpanTreeItem(span, index === 0, index === rootAISpans.length - 1, true)) - } + {noResults ? ( + <NoResultsContainer> + <NoResultsTitle>No results found</NoResultsTitle> + <ClearSearchButton onClick={() => onClearSearch?.()}> + <Icon + name="bi-close" + sx={{ fontSize: "16px", width: "16px", height: "16px" }} + iconSx={{ display: "flex" }} + /> + Clear search + </ClearSearchButton> + </NoResultsContainer> + ) : ( + <> + {isAdvancedMode || rootAISpans.length === 0 + ? sortedRootSpans.map((span, index) => renderMixedSpanTreeItem(span, index === 0, index === sortedRootSpans.length - 1, true)) + : rootAISpans.map((span, index) => renderAISpanTreeItem(span, index === 0, index === rootAISpans.length - 1, true)) + } + </> + )} </TreeScrollArea> </AISpanTreeContainer> ); diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index 9ded2bcd407..15ce00249b2 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -20,6 +20,7 @@ import React, { useState, useMemo, useRef, useEffect } from 'react'; import styled from '@emotion/styled'; import { SpanData } from '../index'; import { Codicon, Icon } from '@wso2/ui-toolkit'; +import { doesSpanMatch, getSpanTypeBadge, getSpanLabel, getSpanKindLabel, HighlightText } from '../utils'; // --- Interfaces --- @@ -33,6 +34,8 @@ interface WaterfallViewProps { traceDuration: number; collapsedSpanIds: Set<string>; setCollapsedSpanIds: (ids: Set<string>) => void; + searchQuery: string; + onClearSearch?: () => void; } interface FlatSpan extends SpanData { @@ -372,6 +375,43 @@ const TooltipRow = styled.div` } `; +const NoResultsContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 24px; + gap: 12px; +`; + +const NoResultsTitle = styled.div` + font-size: 18px; + font-weight: 500; + color: var(--vscode-foreground); +`; + +const ClearSearchButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: transparent; + border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); + border-radius: 4px; + color: var(--vscode-foreground); + font-size: 13px; + cursor: pointer; + transition: all 0.15s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + // --- Helper Functions --- const getSpanKindString = (kind: any): string => { @@ -476,7 +516,9 @@ export function WaterfallView({ traceStartTime, traceDuration, collapsedSpanIds, - setCollapsedSpanIds + setCollapsedSpanIds, + searchQuery, + onClearSearch }: WaterfallViewProps) { const [zoom, setZoom] = useState(1); const [hoveredSpan, setHoveredSpan] = useState<{ span: FlatSpan; x: number; y: number } | null>(null); @@ -487,6 +529,28 @@ export function WaterfallView({ const traceStartMs = useMemo(() => new Date(traceStartTime).getTime(), [traceStartTime]); + /** + * EXTENDED MATCH LOGIC + * Checks if span matches the query by Name, Attributes, Label, or Kind. + */ + const extendedDoesSpanMatch = (span: SpanData): boolean => { + if (!searchQuery) return true; + + // 1. Check existing match logic (Name, attributes, etc.) + if (doesSpanMatch(span, searchQuery)) return true; + + // 2. Check Span Label (e.g. "LLM Call", "Tool", etc.) + const badgeType = getSpanTypeBadge(span); + const label = getSpanLabel(badgeType); + if (label && label.toLowerCase().includes(searchQuery.toLowerCase())) return true; + + // 3. Check Span Kind (e.g. "CLIENT", "SERVER") + const kind = getSpanKindLabel(span.kind); + if (kind && kind.toLowerCase().includes(searchQuery.toLowerCase())) return true; + + return false; + }; + // Resize Observer for Compact Mode useEffect(() => { if (!containerRef.current) return; @@ -502,7 +566,38 @@ export function WaterfallView({ return () => observer.disconnect(); }, []); - // Flatten Span Hierarchy + // Helper to check if a span or any of its descendants match the search + const spanOrDescendantMatches = useMemo(() => { + const cache = new Map<string, boolean>(); + + const checkMatch = (span: SpanData): boolean => { + if (cache.has(span.spanId)) { + return cache.get(span.spanId)!; + } + + // Check if this span matches + if (extendedDoesSpanMatch(span)) { + cache.set(span.spanId, true); + return true; + } + + // Check if any child matches + const children = getChildSpans(span.spanId); + for (const child of children) { + if (checkMatch(child)) { + cache.set(span.spanId, true); + return true; + } + } + + cache.set(span.spanId, false); + return false; + }; + + return checkMatch; + }, [searchQuery, spans, getChildSpans]); + + // Flatten Span Hierarchy with search filtering const flatSpans = useMemo(() => { const result: FlatSpan[] = []; const processed = new Set<string>(); @@ -511,6 +606,11 @@ export function WaterfallView({ if (processed.has(span.spanId)) return; processed.add(span.spanId); + // Skip this span if it doesn't match the search (and no descendants match) + if (searchQuery && !spanOrDescendantMatches(span)) { + return; + } + const range = getSpanTimeRange(span); const startOffsetMs = range ? Math.max(0, range.start - traceStartMs) : 0; const durationMs = range ? Math.max(0, range.end - range.start) : 0; @@ -522,8 +622,15 @@ export function WaterfallView({ const bStart = getSpanTimeRange(b)?.start || 0; return aStart - bStart; }); + + // Filter children based on search + if (searchQuery) { + children = children.filter(child => spanOrDescendantMatches(child)); + } + const hasChildren = children.length > 0; - const isCollapsed = collapsedSpanIds.has(span.spanId); + // Auto-expand when searching + const isCollapsed = searchQuery ? false : collapsedSpanIds.has(span.spanId); result.push({ ...span, @@ -553,7 +660,7 @@ export function WaterfallView({ roots.forEach(span => processSpan(span, 0)); return result; - }, [spans, getChildSpans, traceStartMs, collapsedSpanIds]); + }, [spans, getChildSpans, traceStartMs, collapsedSpanIds, searchQuery, spanOrDescendantMatches]); // Calculate actual content duration (longest span) const contentMaxDurationMs = useMemo(() => { @@ -644,134 +751,158 @@ export function WaterfallView({ // Determine icon for the "Toggle All" button const isAnyCollapsed = collapsedSpanIds.size > 0; + // Check if we have no results + const noResults = searchQuery && flatSpans.length === 0; + return ( <WaterfallContainer ref={containerRef}> + {/* No Results Message */} + {noResults && ( + <NoResultsContainer> + <NoResultsTitle>No results found</NoResultsTitle> + <ClearSearchButton onClick={() => onClearSearch?.()}> + <Icon + name="bi-close" + sx={{ fontSize: "16px", width: "16px", height: "16px" }} + iconSx={{ display: "flex" }} + /> + Clear search + </ClearSearchButton> + </NoResultsContainer> + )} + {/* Zoom Controls */} - <ZoomControlsBar> - <ZoomControlsGroup> - <ZoomButton - onClick={() => setZoom(Math.max(1, zoom - 1))} - title="Zoom out" - disabled={zoom <= 1} - > - <Codicon name="zoom-out" /> - </ZoomButton> - {!isCompact && ( - <> - <ZoomSlider - type="range" - min="1" - max="20" - step="0.5" - value={zoom} - onChange={(e) => setZoom(parseFloat(e.target.value))} - /> - <ZoomLabel>{zoom.toFixed(1)}x</ZoomLabel> - </> - )} - <ZoomButton - onClick={() => setZoom(Math.min(20, zoom + 1))} - title="Zoom in" - disabled={zoom >= 20} - > - <Codicon name="zoom-in" /> - </ZoomButton> - </ZoomControlsGroup> - </ZoomControlsBar> - - {/* Scroll Area */} - <TimelineScrollArea ref={scrollContainerRef}> - <TimelineContent widthPercent={zoom * 100}> - {/* Time Axis */} - <TimeAxis> - {timelineLayout.markers.map((ms) => ( - <TimeMarker key={ms} left={(ms / timelineLayout.viewDuration) * 100}> - <TimeMarkerTick /> - <TimeMarkerLabel>{formatTimeMarker(ms)}</TimeMarkerLabel> - </TimeMarker> - ))} - </TimeAxis> - - <SpansContainer> - {/* Background Grid */} - <GridLinesContainer> - {timelineLayout.markers.map((ms) => ( - <GridLineVertical - key={ms} - left={(ms / timelineLayout.viewDuration) * 100} - /> - ))} - </GridLinesContainer> - - {/* Span Rows */} - {flatSpans.map((span) => { - const spanType = getSpanType(span); - const isSelected = selectedSpanId === span.spanId; - const leftPercent = (span.startOffsetMs / timelineLayout.viewDuration) * 100; - const widthPercent = (span.durationMs / timelineLayout.viewDuration) * 100; - - return ( - <SpanRow - key={span.spanId} - isSelected={isSelected} - level={span.level} - > - <HierarchyGuide level={span.level} /> - <SpanBar - type={spanType} - left={leftPercent} - width={widthPercent} - onClick={(e) => { - e.stopPropagation(); - onSpanSelect(span.spanId); - }} - onMouseEnter={(e) => handleSpanMouseEnter(span, e)} - onMouseLeave={() => setHoveredSpan(null)} - style={{ - backgroundColor: `color-mix(in srgb, ${getSpanColor(spanType)} 15%, transparent)` - }} - > - {/* Expand/Collapse Chevron */} - {span.hasChildren && ( - <ChevronWrapper + {!noResults && ( + <> + <ZoomControlsBar> + <ZoomControlsGroup> + <ZoomButton + onClick={() => setZoom(Math.max(1, zoom - 1))} + title="Zoom out" + disabled={zoom <= 1} + > + <Codicon name="zoom-out" /> + </ZoomButton> + {!isCompact && ( + <> + <ZoomSlider + type="range" + min="1" + max="20" + step="0.5" + value={zoom} + onChange={(e) => setZoom(parseFloat(e.target.value))} + /> + <ZoomLabel>{zoom.toFixed(1)}x</ZoomLabel> + </> + )} + <ZoomButton + onClick={() => setZoom(Math.min(20, zoom + 1))} + title="Zoom in" + disabled={zoom >= 20} + > + <Codicon name="zoom-in" /> + </ZoomButton> + </ZoomControlsGroup> + </ZoomControlsBar> + + {/* Scroll Area */} + <TimelineScrollArea ref={scrollContainerRef}> + <TimelineContent widthPercent={zoom * 100}> + {/* Time Axis */} + <TimeAxis> + {timelineLayout.markers.map((ms) => ( + <TimeMarker key={ms} left={(ms / timelineLayout.viewDuration) * 100}> + <TimeMarkerTick /> + <TimeMarkerLabel>{formatTimeMarker(ms)}</TimeMarkerLabel> + </TimeMarker> + ))} + </TimeAxis> + + <SpansContainer> + {/* Background Grid */} + <GridLinesContainer> + {timelineLayout.markers.map((ms) => ( + <GridLineVertical + key={ms} + left={(ms / timelineLayout.viewDuration) * 100} + /> + ))} + </GridLinesContainer> + + {/* Span Rows */} + {flatSpans.map((span) => { + const spanType = getSpanType(span); + const isSelected = selectedSpanId === span.spanId; + const leftPercent = (span.startOffsetMs / timelineLayout.viewDuration) * 100; + const widthPercent = (span.durationMs / timelineLayout.viewDuration) * 100; + + return ( + <SpanRow + key={span.spanId} + isSelected={isSelected} + level={span.level} + > + <HierarchyGuide level={span.level} /> + <SpanBar + type={spanType} + left={leftPercent} + width={widthPercent} onClick={(e) => { e.stopPropagation(); - handleToggleCollapse(span.spanId); + onSpanSelect(span.spanId); }} - > - <Codicon - name={span.isCollapsed ? "chevron-right" : "chevron-down"} - sx={{ fontSize: '12px' }} - /> - </ChevronWrapper> - )} - - <SpanBarIcon type={spanType}> - <Icon - name={getTypeIcon(spanType)} - sx={{ - fontSize: '14px', - width: '14px', - height: '14px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' + onMouseEnter={(e) => handleSpanMouseEnter(span, e)} + onMouseLeave={() => setHoveredSpan(null)} + style={{ + backgroundColor: `color-mix(in srgb, ${getSpanColor(spanType)} 15%, transparent)` }} - iconSx={{ - fontSize: '14px', - display: 'flex' - }} - /> - </SpanBarIcon> - <SpanBarLabel>{stripSpanPrefix(span.name)}</SpanBarLabel> - <SpanBarDuration>{formatDuration(span.durationMs)}</SpanBarDuration> - </SpanBar> - </SpanRow> - ); - })} - </SpansContainer> - </TimelineContent> - </TimelineScrollArea> + > + {/* Expand/Collapse Chevron */} + {span.hasChildren && ( + <ChevronWrapper + onClick={(e) => { + e.stopPropagation(); + handleToggleCollapse(span.spanId); + }} + > + <Codicon + name={span.isCollapsed ? "chevron-right" : "chevron-down"} + sx={{ fontSize: '12px' }} + /> + </ChevronWrapper> + )} + + <SpanBarIcon type={spanType}> + <Icon + name={getTypeIcon(spanType)} + sx={{ + fontSize: '14px', + width: '14px', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: '14px', + display: 'flex' + }} + /> + </SpanBarIcon> + <SpanBarLabel> + <HighlightText text={stripSpanPrefix(span.name)} query={searchQuery} /> + </SpanBarLabel> + <SpanBarDuration>{formatDuration(span.durationMs)}</SpanBarDuration> + </SpanBar> + </SpanRow> + ); + })} + </SpansContainer> + </TimelineContent> + </TimelineScrollArea> + </> + )} {/* Hover Tooltip */} {hoveredSpan && ( From 018be78c8d9239696f45261141a7d88721a6408e Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 25 Jan 2026 00:42:21 +0530 Subject: [PATCH 115/247] Add tooltip for token breakdown in SpanTree component --- .../src/components/SpanTree.tsx | 100 +++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx index a730c6529ea..0ef8ebff69e 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { useMemo } from "react"; +import React, { useMemo, useState } from "react"; import styled from "@emotion/styled"; import { TraceData, SpanData } from "../index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; @@ -259,6 +259,41 @@ const ClearSearchButton = styled.button` } `; +const Tooltip = styled.div<{ x: number; y: number }>` + position: fixed; + left: ${(props: { x: number; y: number }) => props.x}px; + top: ${(props: { x: number; y: number }) => props.y}px; + background-color: var(--vscode-editorHoverWidget-background); + border: 1px solid var(--vscode-editorHoverWidget-border); + border-radius: 4px; + padding: 10px; + z-index: 1000; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25); + max-width: 280px; + pointer-events: none; +`; + +const TooltipRow = styled.div` + font-size: 11px; + color: var(--vscode-descriptionForeground); + display: flex; + justify-content: space-between; + gap: 12px; + padding: 2px 0; + + span.value { + color: var(--vscode-foreground); + font-family: var(--vscode-editor-font-family); + font-weight: 500; + } +`; + +const TooltipDivider = styled.div` + height: 1px; + background-color: var(--vscode-panel-border); + margin: 6px 0; +`; + // ============================================================================ // ADVANCED MODE STYLES // ============================================================================ @@ -412,6 +447,14 @@ export function SpanTree({ onClearSearch }: SpanTreeProps) { + const [hoveredTokenInfo, setHoveredTokenInfo] = useState<{ + input: number; + output: number; + total: number; + x: number; + y: number; + } | null>(null); + /** * EXTENDED MATCH LOGIC * Checks if span matches the query by Name, Attributes, Label, or Kind. @@ -622,7 +665,41 @@ export function SpanTree({ )} {!isVeryNarrow && totalTokens > 0 && ( <AISpanMetadataPill> - <AISpanTokenCount title={`Input: ${inputTokens.toLocaleString()}\nOutput: ${outputTokens.toLocaleString()}\nTotal: ${totalTokens.toLocaleString()}`} style={{ cursor: 'help' }}> + <AISpanTokenCount + style={{ cursor: 'help' }} + onMouseEnter={(e: React.MouseEvent) => { + const rect = e.currentTarget.getBoundingClientRect(); + const screenWidth = window.innerWidth; + const screenHeight = window.innerHeight; + const tooltipWidth = 280; + const tooltipHeight = 100; + + let x = rect.left + rect.width / 2; + let y = rect.bottom + 8; + + // Adjust horizontal position if tooltip would overflow + if (x + tooltipWidth / 2 > screenWidth - 10) { + x = screenWidth - tooltipWidth / 2 - 10; + } + if (x - tooltipWidth / 2 < 10) { + x = tooltipWidth / 2 + 10; + } + + // Adjust vertical position if tooltip would overflow + if (y + tooltipHeight > screenHeight - 10) { + y = rect.top - tooltipHeight - 8; + } + + setHoveredTokenInfo({ + input: inputTokens, + output: outputTokens, + total: totalTokens, + x, + y + }); + }} + onMouseLeave={() => setHoveredTokenInfo(null)} + > {totalTokens.toLocaleString()} Tokens </AISpanTokenCount> </AISpanMetadataPill> @@ -917,6 +994,25 @@ export function SpanTree({ </> )} </TreeScrollArea> + + {/* Token Breakdown Tooltip */} + {hoveredTokenInfo && ( + <Tooltip x={hoveredTokenInfo.x} y={hoveredTokenInfo.y}> + <TooltipRow> + <span>Input:</span> + <span className="value">{hoveredTokenInfo.input.toLocaleString()}</span> + </TooltipRow> + <TooltipRow> + <span>Output:</span> + <span className="value">{hoveredTokenInfo.output.toLocaleString()}</span> + </TooltipRow> + <TooltipDivider /> + <TooltipRow> + <span>Total:</span> + <span className="value">{hoveredTokenInfo.total.toLocaleString()}</span> + </TooltipRow> + </Tooltip> + )} </AISpanTreeContainer> ); } From ce463e9c320e42f697311a3ade7f2c419cbfaecc Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 25 Jan 2026 08:59:21 +0530 Subject: [PATCH 116/247] Enhance JsonTreeViewer with "Show More" functionality --- .../trace-visualizer/src/TraceDetails.tsx | 4 +- .../src/components/JsonTreeViewer.tsx | 63 ++++++++++++++++++- .../{SpanInputOutput.tsx => SpanDetails.tsx} | 5 +- .../src/components/SpanTree.tsx | 1 + 4 files changed, 67 insertions(+), 6 deletions(-) rename workspaces/ballerina/trace-visualizer/src/components/{SpanInputOutput.tsx => SpanDetails.tsx} (99%) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 1eaba6262f0..66eed375497 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -20,7 +20,7 @@ import React, { useState, useEffect, useRef, useMemo } from "react"; import styled from "@emotion/styled"; import { TraceData, SpanData } from "./index"; import { Codicon, Icon } from "@wso2/ui-toolkit"; -import { SpanInputOutput } from "./components/SpanInputOutput"; +import { SpanDetails } from "./components/SpanDetails"; import { WaterfallView } from "./components/WaterfallView"; import { TraceEmptyState } from "./components/TraceEmptyState"; import { SpanTree, AISpanTreeContainer } from "./components/SpanTree"; @@ -840,7 +840,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide <> <DetailsPanelContainer> <DetailsPanel> - <SpanInputOutput + <SpanDetails spanData={selectedSpan} spanName={selectedSpan.name} totalInputTokens={totalInputTokens} diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 4c74d022a2d..1d60f6bf37c 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -142,6 +142,31 @@ const CopyWrapper = styled.span` margin-left: 6px; `; +const ShowMoreButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 4px 6px; + margin: 8px 0; + background-color: var(--vscode-list-hoverBackground); + border: 1px solid var(--vscode-panel-border); + border-radius: 3px; + color: var(--vscode-badge-foreground); + font-size: 12px; + font-family: var(--vscode-font-family); + cursor: pointer; + transition: all 0.15s ease; + width: fit-content; + + &:hover { + background-color: var(--vscode-button-secondaryHoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + // Highlight search matches in text function highlightText(text: string, searchQuery: string): ReactNode { if (!searchQuery) return text; @@ -296,12 +321,20 @@ export function JsonTreeViewer({ }, [parsedData, maxAutoExpandDepth, expandLastOnly]); const [expandedPaths, setExpandedPaths] = useState<Set<string>>(initialExpanded); + const [showHiddenItems, setShowHiddenItems] = useState(false); + + // Reset showHiddenItems when data changes + useEffect(() => { + setShowHiddenItems(false); + }, [parsedData]); // Auto-expand only matching paths when searching, restore initial state when cleared useEffect(() => { if (searchQuery) { const matchingPaths = findMatchingPaths(parsedData, searchQuery); setExpandedPaths(matchingPaths); + // Show all items when searching + setShowHiddenItems(true); } else { setExpandedPaths(initialExpanded); } @@ -424,8 +457,36 @@ export function JsonTreeViewer({ ); }; - // Render based on data type if (Array.isArray(parsedData)) { + const showCondensedView = expandLastOnly && parsedData.length > 4 && !showHiddenItems && !searchQuery; + const numItemsToShowAtStart = 0; + + if (showCondensedView) { + const hiddenCount = parsedData.length - numItemsToShowAtStart - 1; // -1 for the last item we'll show + + return ( + <Container> + {/* First few items (collapsed) */} + {parsedData.slice(0, numItemsToShowAtStart).map((item, index) => ( + <div key={`root[${index}]`} style={{ marginBottom: '4px' }}> + {renderValue(item, String(index), `root[${index}]`, true)} + </div> + ))} + + {/* Show more button */} + <ShowMoreButton onClick={() => setShowHiddenItems(true)}> + <Codicon name="chevron-down" /> + View {hiddenCount} hidden {hiddenCount === 1 ? 'item' : 'items'} + </ShowMoreButton> + + {/* Last item (expanded) */} + <div key={`root[${parsedData.length - 1}]`} style={{ marginBottom: '4px' }}> + {renderValue(parsedData[parsedData.length - 1], String(parsedData.length - 1), `root[${parsedData.length - 1}]`, true)} + </div> + </Container> + ); + } + return ( <Container> {parsedData.map((item, index) => ( diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx similarity index 99% rename from workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx rename to workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx index 044e6cce97c..4b9583ff2ec 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanInputOutput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx @@ -26,10 +26,9 @@ import { CopyButton } from "./CopyButton"; import { SpanData } from "../index"; import { extractUserErrorDetails } from "../utils"; -interface SpanInputOutputProps { +interface SpanDetailsProps { spanData: SpanData; spanName?: string; - // Totals across the whole trace (optional) totalInputTokens?: number; totalOutputTokens?: number; } @@ -553,7 +552,7 @@ function getSpanIconName(spanType: 'invoke' | 'chat' | 'tool' | 'other', spanKin } } -export function SpanInputOutput({ spanData, spanName, totalInputTokens, totalOutputTokens }: SpanInputOutputProps) { +export function SpanDetails({ spanData, spanName, totalInputTokens, totalOutputTokens }: SpanDetailsProps) { const [searchQuery, setSearchQuery] = useState(''); const [isIdPopupOpen, setIsIdPopupOpen] = useState(false); const [showRawError, setShowRawError] = useState(false); diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx index 0ef8ebff69e..1203752b133 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx @@ -69,6 +69,7 @@ const TreeNodeContainer = styled.div<{ isLast?: boolean }>` background-color: var(--vscode-tree-indentGuidesStroke); top: 0; height: ${(props: { isLast?: boolean }) => props.isLast ? '16px' : '100%'}; + z-index: 1; } `; From 9844d4b1a6273471f8d728630e01b139b820da8a Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 25 Jan 2026 13:47:40 +0530 Subject: [PATCH 117/247] Include execution steps in chat history --- .../ballerina-core/src/rpc-types/agent-chat/interfaces.ts | 1 + .../src/rpc-managers/agent-chat/rpc-manager.ts | 3 ++- .../src/views/AgentChatPanel/Components/ChatInterface.tsx | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index 74cc97579eb..485b67d5e8e 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -60,6 +60,7 @@ export interface ChatHistoryMessage { text: string; isUser: boolean; traceId?: string; + executionSteps?: ExecutionStep[]; } export interface ChatHistoryResponse { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 9b990e7f2de..4ae924d683e 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -85,7 +85,8 @@ export class AgentChatRpcManager implements AgentChatAPI { type: 'message', text: response.message, isUser: false, - traceId: trace?.traceId + traceId: trace?.traceId, + executionSteps }); resolve({ diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 0adb3bca45e..4938680b637 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -332,7 +332,8 @@ const ChatInterface: React.FC = () => { type: msg.type === 'error' ? ChatMessageType.ERROR : ChatMessageType.MESSAGE, text: msg.text, isUser: msg.isUser, - traceId: msg.traceId + traceId: msg.traceId, + executionSteps: msg.executionSteps })); setMessages(chatMessages); } From 5fbbfc12cc59de4f6fc845c2d8b75ba43339d862 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 26 Jan 2026 00:45:15 +0530 Subject: [PATCH 118/247] Update trace-tree panel view to allow focusing on specific spans --- .../src/features/tracing/activate.ts | 8 ++++---- .../src/features/tracing/trace-tree-view.ts | 12 ++++++++++++ .../src/features/tryit/activator.ts | 4 +++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts index d33bf3c59f6..bfa627a7d66 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts @@ -92,8 +92,8 @@ export function activateTracing(ballerinaExtInstance: BallerinaExtension) { const showTraceDetailsCommand = vscode.commands.registerCommand( SHOW_TRACE_DETAILS_COMMAND, - (trace: Trace) => { - showTraceDetails(trace); + (trace: Trace, focusSpanId?: string) => { + showTraceDetails(trace, focusSpanId); } ); @@ -192,9 +192,9 @@ async function showTraceWindow(): Promise<void> { /** * Show trace details in a webview */ -function showTraceDetails(trace: Trace): void { +function showTraceDetails(trace: Trace, focusSpanId?: string): void { try { - TraceDetailsWebview.show(trace); + TraceDetailsWebview.show(trace, false, focusSpanId); } catch (error) { const message = error instanceof Error ? error.message : String(error); vscode.window.showErrorMessage(`Failed to show trace details: ${message}`); diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-tree-view.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-tree-view.ts index aa2bee9098f..86e8cd2cafd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-tree-view.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-tree-view.ts @@ -120,6 +120,18 @@ export class TraceTreeDataProvider implements vscode.TreeDataProvider<TraceNode item.iconPath = new vscode.ThemeIcon('package'); item.contextValue = 'span'; + + // Add command to open trace details with this span focused when clicked + const traces = TraceServer.getTraces(); + const trace = traces.find(t => t.traceId === element.traceId); + if (trace) { + item.command = { + command: 'ballerina.showTraceDetails', + title: 'Show Trace Details', + arguments: [trace, element.span.spanId] + }; + } + return item; } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts index 1752037dcd2..4de04c5b10a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts @@ -89,7 +89,7 @@ async function openTryItView(withNotice: boolean = false, resourceMetadata?: Res // Check if service is already running BEFORE we potentially start it // This will be used to determine if we should reuse the session ID for AI Agent service - const wasServiceAlreadyRunning = await isServiceAlreadyRunning(projectPath); + let wasServiceAlreadyRunning = await isServiceAlreadyRunning(projectPath); if (withNotice) { const selection = await vscode.window.showInformationMessage( @@ -101,6 +101,8 @@ async function openTryItView(withNotice: boolean = false, resourceMetadata?: Res if (selection !== "Test") { return; } + + wasServiceAlreadyRunning = false; } else { const processesRunning = await checkBallerinaProcessRunning(projectPath); if (!processesRunning) { From e45e3fe1d2ff972265c064fc2c5c72a8225d9c4b Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 26 Jan 2026 00:47:12 +0530 Subject: [PATCH 119/247] Update findTraceForMessage to use agent response as well when searching for traces --- .../rpc-managers/agent-chat/rpc-manager.ts | 65 +++++++++---------- .../Components/ChatInterface.tsx | 20 ++---- .../trace-visualizer/src/TraceDetails.tsx | 16 +++-- 3 files changed, 44 insertions(+), 57 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 4ae924d683e..00999e65238 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -68,7 +68,6 @@ export class AgentChatRpcManager implements AgentChatAPI { this.currentAbortController = new AbortController(); const payload = { sessionId: extension.agentChatContext.chatSessionId, ...params }; - console.log('[Agent Chat] Sending message with session ID:', payload.sessionId); const response = await this.fetchTestData( extension.agentChatContext.chatEp, @@ -77,7 +76,7 @@ export class AgentChatRpcManager implements AgentChatAPI { ); if (response && response.message) { // Find trace and extract tool calls and execution steps - const trace = this.findTraceForMessage(params.message); + const trace = this.findTraceForMessage(extension.agentChatContext.chatSessionId, params.message, response.message); const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; // Store agent response in history @@ -106,10 +105,15 @@ export class AgentChatRpcManager implements AgentChatAPI { const sessionId = extension.agentChatContext?.chatSessionId; if (sessionId) { + const trace = this.findTraceForMessage(extension.agentChatContext.chatSessionId, params.message, null, errorMessage); + const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; + this.addMessageToHistory(sessionId, { type: 'error', text: errorMessage, - isUser: false + isUser: false, + traceId: trace?.traceId, + executionSteps }); } @@ -156,6 +160,7 @@ export class AgentChatRpcManager implements AgentChatAPI { }); if (!response.ok) { + const errorData = await response.json(); switch (response.status) { case 400: throw new Error("Bad Request: The server could not understand the request."); @@ -208,9 +213,11 @@ export class AgentChatRpcManager implements AgentChatAPI { /** * Find the trace that corresponds to a chat message by matching span attributes * @param userMessage The user's input message + * @param agentResponse The agent's output message + * @param sessionId * @returns The matching trace or undefined if not found */ - findTraceForMessage(userMessage: string): Trace | undefined { + findTraceForMessage(sessionId: string, userMessage: string, agentResponse?: string, errorResponse?: string): Trace | undefined { // Get all traces from the TraceServer const traces = TraceServer.getTraces(); @@ -233,6 +240,7 @@ export class AgentChatRpcManager implements AgentChatAPI { // 1. span.type === "ai" // 2. gen_ai.operation.name === "invoke_agent" // 3. gen_ai.input.messages matches the user message + // 4. gen_ai.output.messages matches the agent response (if provided) const attributes = span.attributes || []; @@ -240,6 +248,8 @@ export class AgentChatRpcManager implements AgentChatAPI { let spanType: string | undefined; let operationName: string | undefined; let inputMessages: string | undefined; + let outputMessages: string | undefined; + let conversationId: string | undefined; for (const attr of attributes) { const attrValue = extractValue(attr.value); @@ -250,6 +260,10 @@ export class AgentChatRpcManager implements AgentChatAPI { operationName = attrValue; } else if (attr.key === 'gen_ai.input.messages') { inputMessages = attrValue; + } else if (attr.key === 'gen_ai.output.messages') { + outputMessages = attrValue; + } else if (attr.key === 'gen_ai.conversation.id') { + conversationId = attrValue; } } @@ -257,10 +271,18 @@ export class AgentChatRpcManager implements AgentChatAPI { if (spanType === 'ai' && operationName === 'invoke_agent' && inputMessages) { + + if (conversationId != sessionId) continue; + // Check if the input message matches - // inputMessages might be JSON or contain the message - if (inputMessages.includes(userMessage)) { - return trace; + const inputMatches = inputMessages.includes(userMessage); + + // Check if output message also matches + if (agentResponse && outputMessages) { + const outputMatches = outputMessages.includes(agentResponse); + if (inputMatches && outputMatches) { + return trace; + } } } } @@ -434,32 +456,6 @@ export class AgentChatRpcManager implements AgentChatAPI { return steps; } - /** - * Show trace details webview for a given chat message - * Finds the trace matching the message and opens it in the trace details webview - * @param userMessage The user's input message - * @throws Error if no trace is found for the message - */ - async showTraceDetailsForMessage(userMessage: string): Promise<void> { - try { - // Find the trace that matches the user message - const trace = this.findTraceForMessage(userMessage); - - if (!trace) { - const errorMessage = 'No trace found for the given message. Make sure tracing is enabled and the agent has processed this message.'; - vscode.window.showErrorMessage(errorMessage); - throw new Error(errorMessage); - } - - // Open the trace details webview with isAgentChat=true - TraceDetailsWebview.show(trace, true); - } catch (error) { - const errorMessage = error instanceof Error ? error.message : 'Failed to show trace details'; - vscode.window.showErrorMessage(`Error: ${errorMessage}`); - throw error; - } - } - async showTraceView(params: TraceInput): Promise<void> { try { let trace: Trace | undefined; @@ -468,9 +464,6 @@ export class AgentChatRpcManager implements AgentChatAPI { if (params.traceId) { const traces = TraceServer.getTraces(); trace = traces.find(t => t.traceId === params.traceId); - } else if (params.message) { - // Fallback to message-based lookup - trace = this.findTraceForMessage(params.message); } if (!trace) { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 4938680b637..21ba5fb93b2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -401,24 +401,16 @@ const ChatInterface: React.FC = () => { const handleShowLogs = async (messageIndex: number) => { try { - // Find the corresponding user message - // Look backwards from the current index to find the last user message - let userMessage = ''; - - for (let i = messageIndex - 1; i >= 0; i--) { - if (messages[i].isUser) { - userMessage = messages[i].text; - break; - } - } + // Get the trace ID from the agent's response message + const message = messages[messageIndex]; - if (!userMessage) { - console.error('Could not find user message for this response'); + if (!message || message.isUser || !message.traceId) { + console.error('No trace ID found for this message'); return; } - // Call the RPC method to show the trace view - await rpcClient.getAgentChatRpcClient().showTraceView({ message: userMessage }); + // Call the RPC method to show the trace view using the traceId + await rpcClient.getAgentChatRpcClient().showTraceView({ traceId: message.traceId }); } catch (error) { console.error('Failed to show trace view:', error); } diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 66eed375497..e09d9a8fe26 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -236,10 +236,12 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide }, [traceData.spans]); // DERIVED STATE: Determine if we should show advanced mode - // If there are NO AI spans, we force Advanced Mode (Show Hidden/Raw Spans) - // If there ARE AI spans, we use the user's preference + // - If opened from trace tree view (!isAgentChat), always show all spans (advanced mode) + // - If opened from agent chat (isAgentChat): + // - If there are NO AI spans, force Advanced Mode (Show Hidden/Raw Spans) + // - If there ARE AI spans, use the user's preference const hasAISpans = totalSpanCounts.aiCount > 0; - const isAdvancedMode = !hasAISpans || userAdvancedModePreference; + const isAdvancedMode = !isAgentChat || !hasAISpans || userAdvancedModePreference; const handleToggleAll = () => { const getParentsForCurrentView = () => { @@ -762,11 +764,11 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> </ModeToggleButton> - {/* Only show the toggle button if the trace actually contains AI spans. - If it doesn't (hasAISpans is false), the view is automatically - forced to Advanced Mode by the derived state logic above. + {/* Only show the toggle button in agent chat context with AI spans. + When opened from trace tree view (!isAgentChat), always show all spans + and hide the toggle button. */} - {hasAISpans && ( + {isAgentChat && hasAISpans && ( <ModeToggleButton onClick={() => setUserAdvancedModePreference(!userAdvancedModePreference)} title={isAdvancedMode ? "Hide internal spans" : "Show all spans"} From 87f7c66c390e62e9168450adcaceb9ad3825e091 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 26 Jan 2026 00:49:07 +0530 Subject: [PATCH 120/247] Remove "Experimental" label from tracing commands --- workspaces/ballerina/ballerina-extension/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index e0e3d34e709..d81ca924b74 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -723,20 +723,20 @@ }, { "command": "ballerina.enableTracing", - "title": "Enable Tracing (Experimental)", + "title": "Enable Tracing", "category": "Ballerina", "enablement": "isSupportedProject" }, { "command": "ballerina.disableTracing", - "title": "Disable Tracing (Experimental)", + "title": "Disable Tracing", "category": "Ballerina", "icon": "$(circle-slash)", "enablement": "isSupportedProject" }, { "command": "ballerina.clearTraces", - "title": "Clear Traces (Experimental)", + "title": "Clear Traces", "category": "Ballerina", "icon": "$(clear-all)", "hidden": true, From 69781761856de798baa47accbd84faae35454011 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 26 Jan 2026 02:35:02 +0530 Subject: [PATCH 121/247] Refactor code --- .../src/rpc-types/agent-chat/interfaces.ts | 7 -- .../rpc-managers/agent-chat/rpc-manager.ts | 65 +------------------ .../Components/ChatInterface.tsx | 5 +- .../Components/ExecutionTimeline.tsx | 2 +- .../src/components/AIBadge.tsx | 2 +- .../src/components/CollapsibleSection.tsx | 2 +- .../src/components/CopyButton.tsx | 2 +- .../src/components/JsonTreeViewer.tsx | 2 +- .../src/components/JsonViewer.tsx | 2 +- .../src/components/SearchInput.tsx | 2 +- .../src/components/SpanDetails.tsx | 2 +- .../src/components/TraceEmptyState.tsx | 2 +- .../src/components/WaterfallView.tsx | 2 +- 13 files changed, 14 insertions(+), 83 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index 485b67d5e8e..24833b6289a 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -23,16 +23,9 @@ export interface ChatReqMessage { export interface ChatRespMessage { message: string; traceId?: string; - toolCalls?: ToolCallSummary[]; executionSteps?: ExecutionStep[]; } -export interface ToolCallSummary { - spanId: string; - toolName: string; - output: string; -} - export interface ExecutionStep { spanId: string; operationType: 'invoke' | 'chat' | 'tool' | 'other'; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 00999e65238..bca5825f843 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -20,7 +20,6 @@ import { AgentChatAPI, ChatReqMessage, ChatRespMessage, - ToolCallSummary, ExecutionStep, TraceInput, TraceStatus, @@ -272,7 +271,7 @@ export class AgentChatRpcManager implements AgentChatAPI { operationName === 'invoke_agent' && inputMessages) { - if (conversationId != sessionId) continue; + if (conversationId != sessionId) { continue; } // Check if the input message matches const inputMatches = inputMessages.includes(userMessage); @@ -290,67 +289,7 @@ export class AgentChatRpcManager implements AgentChatAPI { return undefined; } - - /** - * Extract tool call summaries from a trace - * @param trace The trace to extract tool calls from - * @returns Array of tool call summaries - */ - private extractToolCalls(trace: Trace): ToolCallSummary[] { - const toolCalls: ToolCallSummary[] = []; - - // Helper function to extract string value from attribute value - const extractValue = (value: any): string => { - if (typeof value === 'string') { - return value; - } - if (value && typeof value === 'object' && 'stringValue' in value) { - return String(value.stringValue); - } - return ''; - }; - - // Helper to check if a span is a tool execution span - const isToolExecutionSpan = (span: any): boolean => { - const attributes = span.attributes || []; - for (const attr of attributes) { - if (attr.key === 'gen_ai.operation.name') { - const value = extractValue(attr.value); - return value.startsWith('execute_tool'); - } - } - return false; - }; - - // Iterate through spans to find tool executions - for (const span of trace.spans || []) { - if (isToolExecutionSpan(span)) { - const attributes = span.attributes || []; - - let toolName = 'Unknown'; - let output = ''; - - // Extract tool name and output - for (const attr of attributes) { - const value = extractValue(attr.value); - if (attr.key === 'gen_ai.tool.name') { - toolName = value; - } else if (attr.key === 'gen_ai.tool.output') { - output = value; - } - } - - toolCalls.push({ - spanId: span.spanId, - toolName, - output - }); - } - } - - return toolCalls; - } - + /** * Remove operation prefixes from span names * @param name The span name to clean diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 21ba5fb93b2..2e70a45ad35 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -24,13 +24,13 @@ import ChatInput from "./ChatInput"; import LoadingIndicator from "./LoadingIndicator"; import { ExecutionTimeline } from "./ExecutionTimeline"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { Codicon, Icon, Button, ThemeColors } from "@wso2/ui-toolkit"; +import { Icon, Button, ThemeColors } from "@wso2/ui-toolkit"; import ReactMarkdown from "react-markdown"; import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; import rehypeKatex from 'rehype-katex'; import 'katex/dist/katex.min.css'; -import { ToolCallSummary, ExecutionStep } from "@wso2/ballerina-core"; +import { ExecutionStep } from "@wso2/ballerina-core"; enum ChatMessageType { MESSAGE = "message", @@ -378,7 +378,6 @@ const ChatInterface: React.FC = () => { text: chatResponse.message, isUser: false, traceId: chatResponse.traceId, - toolCalls: chatResponse.toolCalls, executionSteps: chatResponse.executionSteps }, ]); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx index 9e421f07eab..dd0cf7fb911 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx b/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx index 3025f1940ab..c87fed09226 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/AIBadge.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx b/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx index b066a03f35b..c10eae74a80 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/CollapsibleSection.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx b/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx index 5420891c56c..5d16c5c6298 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 1d60f6bf37c..0058da0558e 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 768ca35eab3..121de389b93 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx b/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx index a9cd30386bc..6096b45f2c9 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SearchInput.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx index 4b9583ff2ec..b07e4e5bd7f 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx b/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx index 6a28fb83d63..dac8371a90e 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/TraceEmptyState.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index 15ce00249b2..0ab388d202e 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except From 3c1d40c982e60504de29c2197aa605714835d04f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 26 Jan 2026 11:40:47 +0530 Subject: [PATCH 122/247] Fix coderabbit suggestions --- .../Components/ChatInterface.tsx | 3 +- .../Components/ExecutionTimeline.tsx | 4 +- .../trace-visualizer/src/TraceDetails.tsx | 175 ++++++++++-------- .../src/components/JsonTreeViewer.tsx | 17 +- .../src/components/JsonViewer.tsx | 14 +- .../src/components/SpanTree.tsx | 8 +- .../ballerina/trace-visualizer/src/utils.tsx | 18 +- 7 files changed, 133 insertions(+), 106 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 2e70a45ad35..da9abbd7aa1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -518,8 +518,7 @@ const ChatInterface: React.FC = () => { </ProfilePic> )} </MessageContainer> - {/* Show "View All Logs" link below message if tracing is enabled */} - {!msg.isUser && isTracingEnabled && ( + {!msg.isUser && isTracingEnabled && msg.traceId && ( <MessageActionsContainer> <ShowLogsButton onClick={() => handleShowLogs(idx)}> View All Logs diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx index dd0cf7fb911..f605d9c2240 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx @@ -165,12 +165,12 @@ const Duration = styled.span` `; export function ExecutionTimeline({ steps, traceId, onViewInTrace }: ExecutionTimelineProps) { + const [open, setOpen] = useState(false); + if (!steps || steps.length === 0) { return null; } - const [open, setOpen] = useState(false); - const getIconName = (operationType: string) => { switch (operationType) { case 'invoke': return 'bi-ai-agent'; diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index e09d9a8fe26..d1e38e9a3ff 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -243,6 +243,80 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide const hasAISpans = totalSpanCounts.aiCount > 0; const isAdvancedMode = !isAgentChat || !hasAISpans || userAdvancedModePreference; + // Helper to get immediate AI children of a span (defined early for reuse) + const getAIChildSpans = (spanId: string): SpanData[] => { + const parentSpan = traceData.spans.find(s => s.spanId === spanId); + if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) return []; + + const parentStart = new Date(parentSpan.startTime).getTime(); + const parentEnd = new Date(parentSpan.endTime).getTime(); + const aiSpans = traceData.spans.filter(span => + span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') + ); + + const children: SpanData[] = []; + + aiSpans.forEach(potentialChild => { + if (potentialChild.spanId === spanId) return; + if (!potentialChild.startTime || !potentialChild.endTime) return; + const childStart = new Date(potentialChild.startTime).getTime(); + const childEnd = new Date(potentialChild.endTime).getTime(); + const parentContainsChild = parentStart <= childStart && parentEnd >= childEnd && + (parentStart < childStart || parentEnd > childEnd); + + if (!parentContainsChild) return; + + let hasIntermediateParent = false; + aiSpans.forEach(intermediateSpan => { + if (intermediateSpan.spanId === spanId || intermediateSpan.spanId === potentialChild.spanId) return; + if (!intermediateSpan.startTime || !intermediateSpan.endTime) return; + const intStart = new Date(intermediateSpan.startTime).getTime(); + const intEnd = new Date(intermediateSpan.endTime).getTime(); + const intermediateContainsChild = intStart <= childStart && intEnd >= childEnd && + (intStart < childStart || intEnd > childEnd); + const parentContainsIntermediate = parentStart <= intStart && parentEnd >= intEnd && + (parentStart < intStart || parentEnd > intEnd); + + if (intermediateContainsChild && parentContainsIntermediate) { + hasIntermediateParent = true; + } + }); + + if (!hasIntermediateParent) children.push(potentialChild); + }); + + return children.sort((a, b) => { + const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; + const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; + return aTime - bTime; + }); + }; + + // Auto-expand invoke agent spans and their immediate children (1 level) by default + const hasAutoExpandedAIRef = useRef<boolean>(false); + useEffect(() => { + if (!isAdvancedMode && !hasAutoExpandedAIRef.current && expandedSpans.size === 0) { + const spansToExpand = new Set<string>(); + + // Find all invoke agent spans + const invokeSpans = traceData.spans.filter(span => { + const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; + return operationName.startsWith('invoke_agent'); + }); + + // Expand each invoke span and its immediate children + invokeSpans.forEach(span => { + spansToExpand.add(span.spanId); + // Reuse existing getAIChildSpans logic to find immediate children + const children = getAIChildSpans(span.spanId); + children.forEach(child => spansToExpand.add(child.spanId)); + }); + + setExpandedSpans(spansToExpand); + hasAutoExpandedAIRef.current = true; + } + }, [isAdvancedMode, traceData.spans, expandedSpans.size]); + const handleToggleAll = () => { const getParentsForCurrentView = () => { const parentIds = new Set<string>(); @@ -470,36 +544,27 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide // Auto-focus on specific span if focusSpanId is provided useEffect(() => { - if (focusSpanId && traceData.spans.length > 0) { - if (hasFocusedRef.current) { - return; - } - hasFocusedRef.current = true; - - // Expand all parent spans to make the focused span visible FIRST - const span = traceData.spans.find(s => s.spanId === focusSpanId); - if (!span) { - return; - } - - const newExpanded = new Set(expandedSpans); - let currentParentId = span.parentSpanId; - - while (currentParentId && currentParentId !== '0000000000000000') { - const parentSpan = traceData.spans.find(s => s.spanId === currentParentId); - if (parentSpan) { - newExpanded.add(currentParentId); - currentParentId = parentSpan.parentSpanId; - } else { - break; + if (focusSpanId && traceData.spans.length > 0 && !hasFocusedRef.current) { + setExpandedSpans(prev => { + // Expand all parent spans to make the focused span visible FIRST + const span = traceData.spans.find(s => s.spanId === focusSpanId); + if (!span) { + return prev; } - } - - // Set expanded state and select span - setExpandedSpans(newExpanded); + const newExpanded = new Set(prev); + let currentParentId = span.parentSpanId; + while (currentParentId && currentParentId !== '0000000000000000') { + const parentSpan = traceData.spans.find(s => s.spanId === currentParentId); + if (parentSpan) { + newExpanded.add(currentParentId); + currentParentId = parentSpan.parentSpanId; + } else { + break; + } + } + return newExpanded; + }); setSelectedSpanId(focusSpanId); - - // Scroll to the focused span after rendering setTimeout(() => { const spanElement = document.querySelector(`[data-span-id="${focusSpanId}"]`); if (spanElement) { @@ -508,8 +573,9 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide console.error('[TraceDetails] Could not find span element to scroll to'); } }, 500); + hasFocusedRef.current = true; } - }, [focusSpanId]); + }, [focusSpanId, traceData.spans.length]); const selectedSpan = selectedSpanId ? spanMap.get(selectedSpanId) : null; @@ -660,57 +726,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide return { totalInputTokens: inTotal, totalOutputTokens: outTotal }; }, [traceData.spans]); - const getAIChildSpans = (spanId: string): SpanData[] => { - // Simple duplication of the logic or move to utils. - // For now, keeping it consistent with original file structure where logic resided here. - const parentSpan = traceData.spans.find(s => s.spanId === spanId); - if (!parentSpan || !parentSpan.startTime || !parentSpan.endTime) return []; - - const parentStart = new Date(parentSpan.startTime).getTime(); - const parentEnd = new Date(parentSpan.endTime).getTime(); - const aiSpans = traceData.spans.filter(span => - span.attributes?.some(attr => attr.key === 'span.type' && attr.value === 'ai') - ); - - const children: SpanData[] = []; - - aiSpans.forEach(potentialChild => { - if (potentialChild.spanId === spanId) return; - if (!potentialChild.startTime || !potentialChild.endTime) return; - const childStart = new Date(potentialChild.startTime).getTime(); - const childEnd = new Date(potentialChild.endTime).getTime(); - const parentContainsChild = parentStart <= childStart && parentEnd >= childEnd && - (parentStart < childStart || parentEnd > childEnd); - - if (!parentContainsChild) return; - - let hasIntermediateParent = false; - aiSpans.forEach(intermediateSpan => { - if (intermediateSpan.spanId === spanId || intermediateSpan.spanId === potentialChild.spanId) return; - if (!intermediateSpan.startTime || !intermediateSpan.endTime) return; - const intStart = new Date(intermediateSpan.startTime).getTime(); - const intEnd = new Date(intermediateSpan.endTime).getTime(); - const intermediateContainsChild = intStart <= childStart && intEnd >= childEnd && - (intStart < childStart || intEnd > childEnd); - const parentContainsIntermediate = parentStart <= intStart && parentEnd >= intEnd && - (parentStart < intStart || parentEnd > intEnd); - - if (intermediateContainsChild && parentContainsIntermediate) { - hasIntermediateParent = true; - } - }); - - if (!hasIntermediateParent) children.push(potentialChild); - }); - - return children.sort((a, b) => { - const aTime = a.startTime ? new Date(a.startTime).getTime() : 0; - const bTime = b.startTime ? new Date(b.startTime).getTime() : 0; - return aTime - bTime; - }); - }; - - // Render Trace Logs view const handleExportTrace = () => { // Dispatch custom event to communicate with webview script diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index 0058da0558e..abbc63157f0 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -171,12 +171,14 @@ const ShowMoreButton = styled.button` function highlightText(text: string, searchQuery: string): ReactNode { if (!searchQuery) return text; - const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'i'); const parts = text.split(regex); - return parts.map((part, i) => - regex.test(part) ? <Highlight key={i}>{part}</Highlight> : part - ); + return parts.map((part, i) => { + // Create a new RegExp for each test to avoid lastIndex issues + const statelessRegex = new RegExp(regex.source, 'i'); + return statelessRegex.test(part) ? <Highlight key={i}>{part}</Highlight> : part; + }); } // Generate initial expanded state based on depth @@ -270,12 +272,13 @@ function findMatchingPaths(data: unknown, searchQuery: string): Set<string> { if (!searchQuery) return new Set(); const matchingPaths = new Set<string>(); - const regex = new RegExp(searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'); + // Do not use 'g' flag, and re-create RegExp for each test to avoid lastIndex issues + const regexSource = searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const traverse = (obj: unknown, currentPath: string, parentPaths: string[], key: string = '') => { // Check if key or value matches - const keyMatches = key && regex.test(key); - const valueMatches = obj != null && typeof obj !== 'object' && regex.test(String(obj)); + const keyMatches = key && new RegExp(regexSource, 'i').test(key); + const valueMatches = obj != null && typeof obj !== 'object' && new RegExp(regexSource, 'i').test(String(obj)); if (keyMatches || valueMatches) { // Add all parent paths and current path diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 121de389b93..0377c390449 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -346,10 +346,13 @@ function syntaxHighlightJSON(json: string, searchQuery: string): ReactNode[] { const highlight = (text: string): ReactNode => { if (!searchQuery) return text; - const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + // Use non-global regex to avoid state issues + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'i'); const parts = text.split(regex); return parts.map((part, idx) => - regex.test(part) ? <Highlight key={idx}>{part}</Highlight> : part + idx % 2 === 1 + ? <Highlight key={idx}>{part}</Highlight> + : part ); }; @@ -471,10 +474,13 @@ function mightContainMarkdown(text: string): boolean { // Highlight text for plain text display function highlightText(text: string, searchQuery: string): ReactNode { if (!searchQuery) return text; - const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); + // Use non-global regex to avoid state issues + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'i'); const parts = text.split(regex); return parts.map((part, i) => - regex.test(part) ? <Highlight key={i}>{part}</Highlight> : part + i % 2 === 1 + ? <Highlight key={i}>{part}</Highlight> + : part ); } diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx index 1203752b133..0d800b04c01 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx @@ -938,10 +938,14 @@ export function SpanTree({ const hasAnyChildren = visibleAIChildren.length > 0 || visibleGroups.length > 0; const isExpanded = searchQuery ? true : expandedSpans.has(span.spanId); + const handleToggle = (e: React.MouseEvent) => { + e.stopPropagation(); + if (hasAnyChildren) onToggleSpanExpansion(span.spanId); + }; return ( <TreeNodeContainer key={span.spanId} isLast={isLastChild}> - {renderAISpanContent(span, isSelected, visibleAIChildren.length > 0, isExpanded, () => { }, !isRoot)} - {hasAnyChildren && ( + {renderAISpanContent(span, isSelected, visibleAIChildren.length > 0, isExpanded, handleToggle, !isRoot)} + {hasAnyChildren && isExpanded && ( <TreeNodeChildren> {visibleGroups.length > 0 && ( <AdvancedSpanGroup> diff --git a/workspaces/ballerina/trace-visualizer/src/utils.tsx b/workspaces/ballerina/trace-visualizer/src/utils.tsx index d81d2a837b3..ebc7297368c 100644 --- a/workspaces/ballerina/trace-visualizer/src/utils.tsx +++ b/workspaces/ballerina/trace-visualizer/src/utils.tsx @@ -117,9 +117,13 @@ export const spanHasError = (span: SpanData): boolean => { }; export const getSpanTokens = (span: SpanData): number => { - const inputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); - const outputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); - return inputTokens + outputTokens; + const inputRaw = span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'; + const outputRaw = span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'; + const inputTokens = Number.parseInt(inputRaw); + const outputTokens = Number.parseInt(outputRaw); + const safeInput = Number.isFinite(inputTokens) && !Number.isNaN(inputTokens) ? inputTokens : 0; + const safeOutput = Number.isFinite(outputTokens) && !Number.isNaN(outputTokens) ? outputTokens : 0; + return safeInput + safeOutput; }; export const isAISpan = (span: SpanData): boolean => { @@ -215,12 +219,9 @@ export function isJSONString(str: string): boolean { tryParseJSON(trimmed); return true; } catch (e) { - console.error('JSON parse failed:', e, 'Input:', trimmed.substring(0, 100)); return false; } } - - console.error('Not detected as JSON. Starts with:', trimmed.substring(0, 20)); return false; } @@ -232,7 +233,6 @@ export function parseNestedJSON(value: unknown): unknown { const parsed = tryParseJSON(trimmed); return parseNestedJSON(parsed); } catch (e) { - console.error('Failed to parse nested JSON:', e, 'Value:', trimmed.substring(0, 100)); return value; } } @@ -280,7 +280,7 @@ const HighlightMark = styled.mark` `; export const HighlightText = ({ text, query }: { text: string; query: string }) => { - if (!query || !text) return <>{text} </>; + if (!query || !text) return <>{text}</>; // Escape regex characters in query const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); @@ -291,7 +291,7 @@ export const HighlightText = ({ text, query }: { text: string; query: string }) { parts.map((part, i) => part.toLowerCase() === query.toLowerCase() - ? <HighlightMark key={i} > {part} </HighlightMark> + ? <HighlightMark key={i}>{part}</HighlightMark> : part )} </> From e57d6b7399f8cbb10baafddb132bb4a1d0ae7ae8 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 26 Jan 2026 12:14:56 +0530 Subject: [PATCH 123/247] Refactor code --- .../rpc-managers/agent-chat/rpc-manager.ts | 44 +++-- .../Components/ChatInterface.tsx | 35 +++- .../src/components/JsonTreeViewer.tsx | 24 +-- .../src/components/JsonViewer.tsx | 63 +------- .../src/components/SpanDetails.tsx | 150 +++--------------- .../src/components/SpanTree.tsx | 40 +---- .../src/components/WaterfallView.tsx | 101 +++--------- .../src/components/shared-styles.tsx | 132 +++++++++++++++ .../ballerina/trace-visualizer/src/utils.tsx | 107 +++++++++++-- 9 files changed, 343 insertions(+), 353 deletions(-) create mode 100644 workspaces/ballerina/trace-visualizer/src/components/shared-styles.tsx diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index bca5825f843..ac63f224f9a 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -75,7 +75,7 @@ export class AgentChatRpcManager implements AgentChatAPI { ); if (response && response.message) { // Find trace and extract tool calls and execution steps - const trace = this.findTraceForMessage(extension.agentChatContext.chatSessionId, params.message, response.message); + const trace = this.findTraceForMessage(extension.agentChatContext.chatSessionId, params.message); const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; // Store agent response in history @@ -103,20 +103,31 @@ export class AgentChatRpcManager implements AgentChatAPI { : "An unknown error occurred"; const sessionId = extension.agentChatContext?.chatSessionId; + let traceId: string | undefined; + let executionSteps: ExecutionStep[] | undefined; + if (sessionId) { - const trace = this.findTraceForMessage(extension.agentChatContext.chatSessionId, params.message, null, errorMessage); - const executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; + const trace = this.findTraceForMessage(extension.agentChatContext.chatSessionId, params.message); + traceId = trace?.traceId; + executionSteps = trace ? this.extractExecutionSteps(trace) : undefined; this.addMessageToHistory(sessionId, { type: 'error', text: errorMessage, isUser: false, - traceId: trace?.traceId, + traceId, executionSteps }); } - reject(error); + // Embed trace information in the error for RPC transmission + const traceInfo = { traceId, executionSteps }; + const errorWithTrace = new Error(JSON.stringify({ + message: errorMessage, + traceInfo: traceInfo + })); + + reject(errorWithTrace); } finally { this.currentAbortController = null; } @@ -216,10 +227,19 @@ export class AgentChatRpcManager implements AgentChatAPI { * @param sessionId * @returns The matching trace or undefined if not found */ - findTraceForMessage(sessionId: string, userMessage: string, agentResponse?: string, errorResponse?: string): Trace | undefined { + findTraceForMessage(sessionId: string, userMessage: string): Trace | undefined { // Get all traces from the TraceServer const traces = TraceServer.getTraces(); + // Sort traces from most recent to least recent based on lastSeen timestamp + traces.sort((a, b) => { + const timeA = a.lastSeen.getTime(); + const timeB = b.lastSeen.getTime(); + + // Sort in descending order (most recent first) + return timeB - timeA; + }); + // Helper function to extract string value from attribute value const extractValue = (value: any): string => { if (typeof value === 'string') { @@ -271,25 +291,19 @@ export class AgentChatRpcManager implements AgentChatAPI { operationName === 'invoke_agent' && inputMessages) { + // If sessionId doesn't match, skip if (conversationId != sessionId) { continue; } // Check if the input message matches const inputMatches = inputMessages.includes(userMessage); - - // Check if output message also matches - if (agentResponse && outputMessages) { - const outputMatches = outputMessages.includes(agentResponse); - if (inputMatches && outputMatches) { - return trace; - } - } + if (inputMatches) return trace; } } } return undefined; } - + /** * Remove operation prefixes from span names * @param name The span name to clean diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index da9abbd7aa1..e8cb6830da3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -382,12 +382,37 @@ const ChatInterface: React.FC = () => { }, ]); } catch (error) { - const errorMessage = - error && typeof error === "object" && "message" in error - ? String(error.message) - : "An unknown error occurred"; + let errorMessage = "An unknown error occurred"; + let traceId: string | undefined; + let executionSteps: ExecutionStep[] | undefined; + + // Try to parse structured error with trace information + if (error && typeof error === "object" && "message" in error) { + try { + const parsedError = JSON.parse(String(error.message)); + if (parsedError.message && parsedError.traceInfo) { + errorMessage = parsedError.message; + traceId = parsedError.traceInfo.traceId; + executionSteps = parsedError.traceInfo.executionSteps; + } else { + // Fallback to regular error message + errorMessage = String(error.message); + } + } catch (parseError) { + // If JSON parsing fails, use the original error message + errorMessage = String(error.message); + } + } - setMessages((prev) => [...prev, { type: ChatMessageType.ERROR, text: errorMessage, isUser: false }]); + console.error("Chat message error:", error); + + setMessages((prev) => [...prev, { + type: ChatMessageType.ERROR, + text: errorMessage, + isUser: false, + traceId, + executionSteps + }]); } finally { setIsLoading(false); } diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx index abbc63157f0..08f33022d02 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonTreeViewer.tsx @@ -21,6 +21,7 @@ import styled from "@emotion/styled"; import { Codicon } from "@wso2/ui-toolkit"; import { CopyButton } from "./CopyButton"; import { parseNestedJSON } from "../utils"; +import { Highlight, CopyWrapper } from "./shared-styles"; // Configurable auto-expand depth export const DEFAULT_AUTO_EXPAND_DEPTH = 3; @@ -129,16 +130,7 @@ const TypeIndicator = styled.span` align-self: center; `; -const Highlight = styled.mark` - background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); - color: inherit; - padding: 0 1px; - border-radius: 2px; -`; - -const CopyWrapper = styled.span` - opacity: 0; - transition: opacity 0.15s ease; +const StyledCopyWrapper = styled(CopyWrapper)` margin-left: 6px; `; @@ -398,9 +390,9 @@ export function JsonTreeViewer({ {highlightText(key, searchQuery)} </KeyBadge> <TypeIndicator>[{value.length} {value.length === 1 ? 'item' : 'items'}]</TypeIndicator> - <CopyWrapper> + <StyledCopyWrapper> <CopyButton text={JSON.stringify(value, null, 2)} size="small" inline /> - </CopyWrapper> + </StyledCopyWrapper> </ExpandableRow> {isExpanded && ( <TreeNode> @@ -428,9 +420,9 @@ export function JsonTreeViewer({ {highlightText(key, searchQuery)} </KeyBadge> <TypeIndicator>{`{${keys.length} ${keys.length === 1 ? 'property' : 'properties'}}`}</TypeIndicator> - <CopyWrapper> + <StyledCopyWrapper> <CopyButton text={JSON.stringify(value, null, 2)} size="small" inline /> - </CopyWrapper> + </StyledCopyWrapper> </ExpandableRow> {isExpanded && ( <TreeNode> @@ -453,9 +445,9 @@ export function JsonTreeViewer({ {highlightText(key, searchQuery)} </KeyBadge> <ValueText>{highlightText(String(value), searchQuery)}</ValueText> - <CopyWrapper> + <StyledCopyWrapper> <CopyButton text={String(value)} size="small" inline /> - </CopyWrapper> + </StyledCopyWrapper> </NodeRow> ); }; diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 0377c390449..27047321959 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -21,7 +21,8 @@ import styled from "@emotion/styled"; import { Icon } from "@wso2/ui-toolkit"; import { JsonTreeViewer, DEFAULT_AUTO_EXPAND_DEPTH } from "./JsonTreeViewer"; import { CopyButton } from "./CopyButton"; -import { tryParseJSON, isJSONString, parseNestedJSON } from "../utils"; +import { tryParseJSON, isJSONString, parseNestedJSON, highlightText } from "../utils"; +import { Highlight, ToggleGroup, ToggleButton, ToggleButtonProps } from "./shared-styles"; import ReactMarkdown from 'react-markdown'; import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; @@ -68,11 +69,6 @@ const Title = styled.h4` letter-spacing: 0.5px; `; -export const ToggleGroup = styled.div` - display: flex; - gap: 2px; -`; - const IconButton = styled.button` display: inline-flex; align-items: center; @@ -91,41 +87,6 @@ const IconButton = styled.button` } `; -export interface ToggleButtonProps { - active: boolean; -} - -export const ToggleButton = styled.button<ToggleButtonProps>` - padding: 4px 10px; - font-size: 11px; - font-family: var(--vscode-font-family); - border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); - cursor: pointer; - transition: all 0.15s ease; - - - background-color: ${(props: ToggleButtonProps) => - props.active - ? 'var(--vscode-badge-background)' - : 'var(--vscode-input-background)'}; - color: ${(props: ToggleButtonProps) => - props.active - ? 'var(--vscode-badge-foreground)' - : 'var(--vscode-foreground)'}; - - &:first-of-type { - border-radius: 3px 0 0 3px; - } - - &:last-of-type { - border-radius: 0 3px 3px 0; - } - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } -`; - const ContentWrapper = styled.div` background-color: var(--vscode-input-background); border: 1px solid var(--vscode-panel-border); @@ -293,13 +254,6 @@ const MarkdownContent = styled.div` } `; -const Highlight = styled.mark` - background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); - color: inherit; - padding: 0 1px; - border-radius: 2px; -`; - // Syntax highlighting for JSON const JsonKey = styled.span` color: var(--vscode-symbolIcon-propertyForeground, #9cdcfe); @@ -471,19 +425,6 @@ function mightContainMarkdown(text: string): boolean { return markdownPatterns.some(pattern => pattern.test(text)); } -// Highlight text for plain text display -function highlightText(text: string, searchQuery: string): ReactNode { - if (!searchQuery) return text; - // Use non-global regex to avoid state issues - const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'i'); - const parts = text.split(regex); - return parts.map((part, i) => - i % 2 === 1 - ? <Highlight key={i}>{part}</Highlight> - : part - ); -} - export function JsonViewer({ value, title, diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx index b07e4e5bd7f..be1fa199ee8 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx @@ -21,10 +21,27 @@ import styled from "@emotion/styled"; import { Icon } from "@wso2/ui-toolkit"; import { SearchInput } from "./SearchInput"; import { CollapsibleSection } from "./CollapsibleSection"; -import { JsonViewer, ToggleGroup, ToggleButton } from "./JsonViewer"; +import { JsonViewer } from "./JsonViewer"; import { CopyButton } from "./CopyButton"; import { SpanData } from "../index"; -import { extractUserErrorDetails } from "../utils"; +import { + extractUserErrorDetails, + highlightText, + textContainsSearch, + getAttributeValue, + formatDate, + getSpanIconName, + stripSpanPrefix +} from "../utils"; +import { + Highlight, + CopyWrapper, + ToggleGroup, + ToggleButton, + NoResultsContainer, + NoResultsTitle, + ClearSearchButton +} from "./shared-styles"; interface SpanDetailsProps { spanData: SpanData; @@ -263,63 +280,12 @@ const ErrorHeaderRight = styled.div` gap: 4px; `; -const Highlight = styled.mark` - background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); - color: inherit; - padding: 0 1px; - border-radius: 2px; -`; - -const NoMatchMessage = styled.div` - text-align: center; - padding: 24px; - color: var(--vscode-descriptionForeground); - font-size: 13px; -`; - -const NoResultsContainer = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 48px 24px; - gap: 12px; -`; - -const NoResultsTitle = styled.div` - font-size: 18px; - font-weight: 500; - color: var(--vscode-foreground); -`; - const NoResultsSubtitle = styled.div` font-size: 13px; color: var(--vscode-descriptionForeground); margin-bottom: 8px; `; -const ClearSearchButton = styled.button` - display: flex; - align-items: center; - gap: 6px; - padding: 6px 12px; - background: transparent; - border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); - border-radius: 4px; - color: var(--vscode-foreground); - font-size: 13px; - cursor: pointer; - transition: all 0.15s ease; - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } - - &:active { - transform: scale(0.98); - } -`; - // Advanced Details styles const AdvancedDetailsContainer = styled.div` display: flex; @@ -388,45 +354,7 @@ const AttributeValue = styled.span` word-break: break-all; `; -const CopyWrapper = styled.span` - opacity: 0; - transition: opacity 0.15s ease; - flex-shrink: 0; -`; - // Helper functions -function getAttributeValue(attributes: Array<{ key: string; value: string }> | undefined, key: string): string | undefined { - return attributes?.find(a => a.key === key)?.value; -} - -function highlightText(text: string, searchQuery: string): ReactNode { - if (!searchQuery) return text; - const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi'); - const parts = text.split(regex); - return parts.map((part, i) => - regex.test(part) ? <Highlight key={i}>{part}</Highlight> : part - ); -} - -function textContainsSearch(text: string | undefined, searchQuery: string): boolean { - if (!searchQuery) return true; // No search query = show everything - if (!text) return false; // No text to search = no match - return text.toLowerCase().includes(searchQuery.toLowerCase()); -} - -function formatDate(isoString: string): string { - const date = new Date(isoString); - return date.toLocaleString('en-US', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - fractionalSecondDigits: 3 - }); -} - function formatErrorText(rawText: string): string { if (typeof rawText !== "string") return rawText; @@ -517,41 +445,6 @@ const EXCLUDED_ATTRIBUTE_KEYS = [ 'error.message' ]; -// Remove common prefixes from span names -function stripSpanPrefix(spanName: string): string { - const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; - for (const prefix of prefixes) { - if (spanName.startsWith(prefix)) { - return spanName.substring(prefix.length); - } - } - return spanName; -} - -// Get icon name based on span type and kind -function getSpanIconName(spanType: 'invoke' | 'chat' | 'tool' | 'other', spanKind?: string): string { - switch (spanType) { - case 'invoke': - return 'bi-ai-agent'; - case 'chat': - return 'bi-chat'; - case 'tool': - return 'bi-wrench'; - case 'other': - // For non-AI spans, use icons based on span kind (server/client) - switch (spanKind?.toLowerCase()) { - case 'client': - return 'bi-arrow-outward'; - case 'server': - return 'bi-server'; - default: - return 'bi-action'; - } - default: - return 'bi-action'; - } -} - export function SpanDetails({ spanData, spanName, totalInputTokens, totalOutputTokens }: SpanDetailsProps) { const [searchQuery, setSearchQuery] = useState(''); const [isIdPopupOpen, setIsIdPopupOpen] = useState(false); @@ -622,7 +515,7 @@ export function SpanDetails({ spanData, spanName, totalInputTokens, totalOutputT return { systemInstructions, messages: inputMessages || toolArguments, - messagesLabel: toolArguments ? 'Tool Arguments' : (operationName === 'invoke_agent' ? 'User' : 'Messages'), + messagesLabel: toolArguments ? 'Tool Arguments' : (operationName?.includes('invoke_agent') ? 'User' : 'Messages'), tools: inputTools }; }, [spanData.attributes, operationName]); @@ -716,6 +609,7 @@ export function SpanDetails({ spanData, spanName, totalInputTokens, totalOutputT const hasInput = inputData.systemInstructions || inputData.messages || inputData.tools; const hasOutput = outputData.messages || outputData.error; + const hasError = !!outputData.error; const noMatches = searchQuery && !inputMatches && !outputMatches && !metricsMatch && !advancedMatches; // Close popup when clicking outside @@ -920,7 +814,7 @@ export function SpanDetails({ spanData, spanName, totalInputTokens, totalOutputT <CollapsibleSection title="Input" icon="bi-input" - defaultOpen={true} + defaultOpen={!hasError} key={searchQuery ? `input-${searchQuery}` : 'input'} > <SectionContent> diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx index 0d800b04c01..247fc9356ea 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanTree.tsx @@ -33,6 +33,7 @@ import { doesSpanMatch, HighlightText } from "../utils"; +import { NoResultsContainer, NoResultsTitle, ClearSearchButton } from "./shared-styles"; // ============================================================================ // STYLES @@ -223,43 +224,6 @@ const AISpanErrorIcon = styled.span` flex-shrink: 0; `; -const NoResultsContainer = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 48px 24px; - gap: 12px; -`; - -const NoResultsTitle = styled.div` - font-size: 18px; - font-weight: 500; - color: var(--vscode-foreground); -`; - -const ClearSearchButton = styled.button` - display: flex; - align-items: center; - gap: 6px; - padding: 6px 12px; - background: transparent; - border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); - border-radius: 4px; - color: var(--vscode-foreground); - font-size: 13px; - cursor: pointer; - transition: all 0.15s ease; - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } - - &:active { - transform: scale(0.98); - } -`; - const Tooltip = styled.div<{ x: number; y: number }>` position: fixed; left: ${(props: { x: number; y: number }) => props.x}px; @@ -971,7 +935,7 @@ export function SpanTree({ return renderAISpanTreeItem(span, true, false, true); } }).filter(element => element !== null); - }, [isAdvancedMode, rootAISpans, sortedRootSpans, searchQuery]); + }, [isAdvancedMode, rootAISpans, sortedRootSpans, searchQuery, traceData]); const noResults = searchQuery && visibleSpans.length === 0; diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index 0ab388d202e..9afd1a35991 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -20,7 +20,19 @@ import React, { useState, useMemo, useRef, useEffect } from 'react'; import styled from '@emotion/styled'; import { SpanData } from '../index'; import { Codicon, Icon } from '@wso2/ui-toolkit'; -import { doesSpanMatch, getSpanTypeBadge, getSpanLabel, getSpanKindLabel, HighlightText } from '../utils'; +import { + doesSpanMatch, + getSpanTypeBadge, + getSpanLabel, + getSpanKindLabel, + HighlightText, + getSpanTimeRange, + formatDuration, + stripSpanPrefix, + getSpanTokens, + getSpanColor +} from '../utils'; +import { NoResultsContainer, NoResultsTitle, ClearSearchButton } from './shared-styles'; // --- Interfaces --- @@ -375,43 +387,6 @@ const TooltipRow = styled.div` } `; -const NoResultsContainer = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 48px 24px; - gap: 12px; -`; - -const NoResultsTitle = styled.div` - font-size: 18px; - font-weight: 500; - color: var(--vscode-foreground); -`; - -const ClearSearchButton = styled.button` - display: flex; - align-items: center; - gap: 6px; - padding: 6px 12px; - background: transparent; - border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); - border-radius: 4px; - color: var(--vscode-foreground); - font-size: 13px; - cursor: pointer; - transition: all 0.15s ease; - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } - - &:active { - transform: scale(0.98); - } -`; - // --- Helper Functions --- const getSpanKindString = (kind: any): string => { @@ -422,35 +397,10 @@ const getSpanKindString = (kind: any): string => { return 'internal'; }; -const getSpanColor = (type: string) => { - switch (type) { - case 'invoke': return 'var(--vscode-terminal-ansiCyan)'; - case 'chat': return 'var(--vscode-terminalSymbolIcon-optionForeground)'; - case 'tool': return 'var(--vscode-terminal-ansiBrightMagenta)'; - case 'error': return 'var(--vscode-terminal-ansiRed)'; - case 'client': return 'var(--vscode-terminal-ansiBlue)'; - case 'server': return 'var(--vscode-terminal-ansiGreen)'; - default: return 'var(--vscode-badge-background)'; - } -}; - const getSpanBgColor = (type: string) => { return 'var(--vscode-editor-background)'; }; -const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { - if (!span.startTime || !span.endTime) return null; - return { - start: new Date(span.startTime).getTime(), - end: new Date(span.endTime).getTime() - }; -}; - -const formatDuration = (durationMs: number): string => { - if (durationMs === 0) return '< 1ms'; - return durationMs < 1000 ? `${durationMs.toFixed(0)}ms` : `${(durationMs / 1000).toFixed(3)}s`; -}; - const getSpanType = (span: SpanData): 'invoke' | 'chat' | 'tool' | 'error' | 'client' | 'server' | 'other' => { if (span.status?.code === 2) return 'error'; @@ -490,22 +440,6 @@ const getTypeIcon = (type: string): string => { } }; -const stripSpanPrefix = (spanName: string): string => { - const prefixes = ['invoke_agent ', 'execute_tool ', 'chat ']; - for (const prefix of prefixes) { - if (spanName.startsWith(prefix)) { - return spanName.substring(prefix.length); - } - } - return spanName; -}; - -const getSpanTokens = (span: SpanData): number => { - const inputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.input_tokens')?.value || '0'); - const outputTokens = parseInt(span.attributes?.find(attr => attr.key === 'gen_ai.usage.output_tokens')?.value || '0'); - return inputTokens + outputTokens; -}; - // --- Main Component --- export function WaterfallView({ @@ -523,6 +457,7 @@ export function WaterfallView({ const [zoom, setZoom] = useState(1); const [hoveredSpan, setHoveredSpan] = useState<{ span: FlatSpan; x: number; y: number } | null>(null); const [isCompact, setIsCompact] = useState(false); + const [scrollContainerWidth, setScrollContainerWidth] = useState(1000); const scrollContainerRef = useRef<HTMLDivElement>(null); const containerRef = useRef<HTMLDivElement>(null); @@ -559,6 +494,10 @@ export function WaterfallView({ for (const entry of entries) { // If width < 300px, switch to compact mode setIsCompact(entry.contentRect.width < 300); + // Update scrollContainerWidth to trigger timelineLayout recalc + if (scrollContainerRef.current) { + setScrollContainerWidth(scrollContainerRef.current.clientWidth); + } } }); @@ -675,7 +614,7 @@ export function WaterfallView({ // Generate Layout Data: Ticks and View Duration const timelineLayout = useMemo(() => { - const totalPixels = zoom * (scrollContainerRef.current?.clientWidth || 1000); + const totalPixels = zoom * scrollContainerWidth; const targetTicks = Math.max(5, Math.floor(totalPixels / 150)); const rawInterval = contentMaxDurationMs / targetTicks; @@ -700,7 +639,7 @@ export function WaterfallView({ markers, viewDuration: finalViewDuration }; - }, [contentMaxDurationMs, zoom]); + }, [contentMaxDurationMs, zoom, scrollContainerWidth]); const formatTimeMarker = (ms: number): string => { if (ms === 0) return '0ms'; diff --git a/workspaces/ballerina/trace-visualizer/src/components/shared-styles.tsx b/workspaces/ballerina/trace-visualizer/src/components/shared-styles.tsx new file mode 100644 index 00000000000..56a85e6ff04 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/shared-styles.tsx @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import styled from "@emotion/styled"; + +/** + * Shared styled component for highlighting search matches + */ +export const Highlight = styled.mark` + background-color: var(--vscode-editor-findMatchHighlightBackground, #ffcc00); + color: inherit; + padding: 0 1px; + border-radius: 2px; +`; + +/** + * Shared wrapper for copy buttons that appear on hover + */ +export const CopyWrapper = styled.span` + opacity: 0; + transition: opacity 0.15s ease; + flex-shrink: 0; +`; + +/** + * Shared toggle group container for toggle buttons + */ +export const ToggleGroup = styled.div` + display: flex; + gap: 2px; +`; + +/** + * Props for ToggleButton + */ +export interface ToggleButtonProps { + active: boolean; +} + +/** + * Shared toggle button component + */ +export const ToggleButton = styled.button<ToggleButtonProps>` + padding: 4px 10px; + font-size: 11px; + font-family: var(--vscode-font-family); + border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); + cursor: pointer; + transition: all 0.15s ease; + + background-color: ${(props: ToggleButtonProps) => + props.active + ? 'var(--vscode-badge-background)' + : 'var(--vscode-input-background)'}; + color: ${(props: ToggleButtonProps) => + props.active + ? 'var(--vscode-badge-foreground)' + : 'var(--vscode-foreground)'}; + + &:first-of-type { + border-radius: 3px 0 0 3px; + } + + &:last-of-type { + border-radius: 0 3px 3px 0; + } + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } +`; + +/** + * Shared "no results" container + */ +export const NoResultsContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 24px; + gap: 12px; +`; + +/** + * Shared "no results" title + */ +export const NoResultsTitle = styled.div` + font-size: 18px; + font-weight: 500; + color: var(--vscode-foreground); +`; + +/** + * Shared clear search button + */ +export const ClearSearchButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: transparent; + border: 1px solid var(--vscode-button-border, var(--vscode-panel-border)); + border-radius: 4px; + color: var(--vscode-foreground); + font-size: 13px; + cursor: pointer; + transition: all 0.15s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; diff --git a/workspaces/ballerina/trace-visualizer/src/utils.tsx b/workspaces/ballerina/trace-visualizer/src/utils.tsx index ebc7297368c..eaaac25e204 100644 --- a/workspaces/ballerina/trace-visualizer/src/utils.tsx +++ b/workspaces/ballerina/trace-visualizer/src/utils.tsx @@ -16,8 +16,9 @@ * under the License. */ -import styled from "@emotion/styled"; +import { ReactNode } from "react"; import { SpanData } from './index'; +import { Highlight } from './components/shared-styles'; export const getSpanTimeRange = (span: SpanData): { start: number; end: number } | null => { if (!span.startTime || !span.endTime) return null; @@ -272,13 +273,6 @@ export const doesSpanMatch = (span: SpanData, query: string): boolean => { return false; }; -const HighlightMark = styled.mark` - background-color: var(--vscode-editor-findMatchHighlightBackground); - color: inherit; - padding: 0; - border-radius: 2px; -`; - export const HighlightText = ({ text, query }: { text: string; query: string }) => { if (!query || !text) return <>{text}</>; @@ -291,9 +285,104 @@ export const HighlightText = ({ text, query }: { text: string; query: string }) { parts.map((part, i) => part.toLowerCase() === query.toLowerCase() - ? <HighlightMark key={i}>{part}</HighlightMark> + ? <Highlight key={i}>{part}</Highlight> : part )} </> ); }; + +/** + * Highlights text that matches a search query. + * Returns a ReactNode with highlighted portions. + */ +export function highlightText(text: string, searchQuery: string): ReactNode { + if (!searchQuery) return text; + const regex = new RegExp(`(${searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'i'); + const parts = text.split(regex); + return parts.map((part, i) => + i % 2 === 1 ? <Highlight key={i}>{part}</Highlight> : part + ); +} + +/** + * Checks if text contains a search query (case-insensitive) + */ +export function textContainsSearch(text: string | undefined, searchQuery: string): boolean { + if (!searchQuery) return true; // No search query = show everything + if (!text) return false; // No text to search = no match + return text.toLowerCase().includes(searchQuery.toLowerCase()); +} + +/** + * Gets an attribute value from a span's attributes array + */ +export function getAttributeValue(attributes: Array<{ key: string; value: string }> | undefined, key: string): string | undefined { + return attributes?.find(a => a.key === key)?.value; +} + +/** + * Formats a date string to a readable format + */ +export function formatDate(isoString: string): string { + const date = new Date(isoString); + return date.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + fractionalSecondDigits: 3 + }); +} + +/** + * Gets the appropriate icon name for a span type + */ +export function getSpanIconName(spanType: 'invoke' | 'chat' | 'tool' | 'other', spanKind?: string): string { + switch (spanType) { + case 'invoke': + return 'bi-ai-agent'; + case 'chat': + return 'bi-chat'; + case 'tool': + return 'bi-wrench'; + case 'other': + // For non-AI spans, use icons based on span kind (server/client) + switch (spanKind?.toLowerCase()) { + case 'client': + return 'bi-arrow-outward'; + case 'server': + return 'bi-server'; + default: + return 'bi-action'; + } + default: + return 'bi-action'; + } +} + +/** + * Gets the color for a span type + */ +export function getSpanColor(type: string): string { + switch (type) { + case 'invoke': + return 'var(--vscode-terminal-ansiCyan)'; + case 'chat': + return 'var(--vscode-terminalSymbolIcon-optionForeground)'; + case 'tool': + return 'var(--vscode-terminal-ansiBrightMagenta)'; + case 'error': + return 'var(--vscode-terminal-ansiRed)'; + case 'client': + return 'var(--vscode-terminal-ansiBlue)'; + case 'server': + return 'var(--vscode-terminal-ansiGreen)'; + case 'other': + return 'var(--vscode-foreground)'; + default: + return 'var(--vscode-badge-background)'; + } +} From 188289b1f1c6b8b48c8e90042d99faf814243a94 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 27 Jan 2026 17:13:46 +0530 Subject: [PATCH 124/247] Fix coderabbit suggestions --- .../rpc-managers/agent-chat/rpc-manager.ts | 2 +- .../trace-visualizer/src/TraceDetails.tsx | 23 +++++++----------- .../src/components/CopyButton.tsx | 24 +++++++++++++++++-- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index ac63f224f9a..2f27e538e00 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -296,7 +296,7 @@ export class AgentChatRpcManager implements AgentChatAPI { // Check if the input message matches const inputMatches = inputMessages.includes(userMessage); - if (inputMatches) return trace; + if (inputMatches) { return trace; } } } } diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index d1e38e9a3ff..57bd468f74e 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -418,7 +418,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide setSpanViewWidth(targetWidth); } - }, [containerRef.current]); + }, []); // Track container width for responsive behavior useEffect(() => { @@ -505,13 +505,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide // Sort root spans: umbrella spans (those that contain others) come first, then by start time const sortedRootSpans = sortSpansByUmbrellaFirst(rootSpans); - useEffect(() => { - // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it - if (!selectedSpanId && sortedRootSpans.length > 0 && !focusSpanId && !hasFocusedRef.current) { - setSelectedSpanId(sortedRootSpans[0].spanId); - } - }, [sortedRootSpans.length, focusSpanId, selectedSpanId]); - const getChildSpans = (spanId: string): SpanData[] => { const children = traceData.spans.filter(s => s.parentSpanId === spanId); return sortSpansByUmbrellaFirst(children); @@ -696,22 +689,24 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide const rootAISpans = buildAISpanHierarchy(); - // Select first AI span when in agent chat view, or fallback to first generic span + // Consolidated auto-selection: prefer AI spans in agent mode, otherwise select first root span useEffect(() => { - // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it + // Early return if focus is already set - let the focus effect handle it if (focusSpanId || hasFocusedRef.current) { return; } - // 1. Try to select the first AI span if available + // 1. Prefer the first AI span when in agent chat view (not showing full trace) if (isAgentChat && !showFullTrace && rootAISpans.length > 0) { setSelectedSpanId(rootAISpans[0].spanId); + return; } - // 2. If no AI spans (or in advanced mode), select the first generic span - else if ((!isAgentChat || rootAISpans.length === 0) && !selectedSpanId && sortedRootSpans.length > 0) { + + // 2. Otherwise, select the first generic root span if nothing is selected + if (!selectedSpanId && sortedRootSpans.length > 0) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); + }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId, selectedSpanId]); // Totals across the trace (input/output separately) const { totalInputTokens, totalOutputTokens } = React.useMemo(() => { diff --git a/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx b/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx index 5d16c5c6298..2ab7a75b7b8 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/CopyButton.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { useState, useCallback } from "react"; +import React, { useState, useCallback, useRef, useEffect } from "react"; import styled from "@emotion/styled"; import { Icon } from "@wso2/ui-toolkit"; @@ -59,18 +59,38 @@ const COPY_FEEDBACK_DURATION = 2000; export function CopyButton({ text, title = "Copy", inline = false, size = "medium" }: CopyButtonProps) { const [copied, setCopied] = useState(false); + const copyTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null); const handleCopy = useCallback(async (e: React.MouseEvent) => { e.stopPropagation(); try { await navigator.clipboard.writeText(text); setCopied(true); - setTimeout(() => setCopied(false), COPY_FEEDBACK_DURATION); + + // Clear any existing timeout before setting a new one + if (copyTimeoutRef.current) { + clearTimeout(copyTimeoutRef.current); + } + + // Store the new timeout ID + copyTimeoutRef.current = setTimeout(() => { + setCopied(false); + copyTimeoutRef.current = null; + }, COPY_FEEDBACK_DURATION); } catch (err) { console.error("Failed to copy text:", err); } }, [text]); + // Cleanup timeout on unmount + useEffect(() => { + return () => { + if (copyTimeoutRef.current) { + clearTimeout(copyTimeoutRef.current); + } + }; + }, []); + return ( <Button onClick={handleCopy} From d3710ada076f9596a619a54021feae57eee4f1f2 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 27 Jan 2026 18:03:06 +0530 Subject: [PATCH 125/247] Fix parameters in findTraceForMessage documentation --- .../src/rpc-managers/agent-chat/rpc-manager.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 2f27e538e00..1105ca4010c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -222,9 +222,8 @@ export class AgentChatRpcManager implements AgentChatAPI { /** * Find the trace that corresponds to a chat message by matching span attributes + * @param sessionId The chat session ID * @param userMessage The user's input message - * @param agentResponse The agent's output message - * @param sessionId * @returns The matching trace or undefined if not found */ findTraceForMessage(sessionId: string, userMessage: string): Trace | undefined { From 575613e952377324b5e8448e671ab741d8b8e595 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 28 Jan 2026 15:19:32 +0530 Subject: [PATCH 126/247] Fix not being able to select items in span tree --- .../trace-visualizer/src/TraceDetails.tsx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 57bd468f74e..4eb6bad7cd4 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -689,24 +689,22 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide const rootAISpans = buildAISpanHierarchy(); - // Consolidated auto-selection: prefer AI spans in agent mode, otherwise select first root span + // Select first AI span when in agent chat view, or fallback to first generic span useEffect(() => { - // Early return if focus is already set - let the focus effect handle it + // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it if (focusSpanId || hasFocusedRef.current) { return; } - // 1. Prefer the first AI span when in agent chat view (not showing full trace) + // 1. Try to select the first AI span if available if (isAgentChat && !showFullTrace && rootAISpans.length > 0) { setSelectedSpanId(rootAISpans[0].spanId); - return; } - - // 2. Otherwise, select the first generic root span if nothing is selected - if (!selectedSpanId && sortedRootSpans.length > 0) { + // 2. If no AI spans (or in advanced mode), select the first generic span + else if ((!isAgentChat || rootAISpans.length === 0) && !selectedSpanId && sortedRootSpans.length > 0) { setSelectedSpanId(sortedRootSpans[0].spanId); } - }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId, selectedSpanId]); + }, [isAgentChat, showFullTrace, rootAISpans.length, sortedRootSpans.length, focusSpanId]); // Totals across the trace (input/output separately) const { totalInputTokens, totalOutputTokens } = React.useMemo(() => { From 00df73fd2293314a1daeea550f3f71c878fbb332 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 2 Feb 2026 18:47:06 +0530 Subject: [PATCH 127/247] Enhance styling in ChatInterface and ExecutionTimeline components --- .../src/views/AgentChatPanel/Components/ChatInterface.tsx | 8 +++++--- .../views/AgentChatPanel/Components/ExecutionTimeline.tsx | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index e8cb6830da3..6ff5cb18915 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -113,6 +113,8 @@ const MessageContainer = styled.div<{ isUser: boolean }>` `; const ProfilePic = styled.div` + padding: 4px; + border: 1px solid var(--vscode-panel-border); width: 18px; height: 18px; border-radius: 50%; @@ -150,7 +152,7 @@ const MessageActionsContainer = styled.div` display: flex; align-items: center; gap: 12px; - margin: -4px 0 0 24px; + margin: -4px 0 0 36px; flex-wrap: wrap; `; @@ -515,7 +517,7 @@ const ChatInterface: React.FC = () => { sx={{ width: 18, height: 18 }} iconSx={{ fontSize: "18px", - color: "var(--vscode-foreground)", + color: "var(--vscode-terminal-ansiBrightCyan)", cursor: "default", }} /> @@ -546,7 +548,7 @@ const ChatInterface: React.FC = () => { {!msg.isUser && isTracingEnabled && msg.traceId && ( <MessageActionsContainer> <ShowLogsButton onClick={() => handleShowLogs(idx)}> - View All Logs + View Logs </ShowLogsButton> </MessageActionsContainer> )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx index f605d9c2240..26c66f05c8d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx @@ -29,7 +29,7 @@ interface ExecutionTimelineProps { const TimelineContainer = styled.div` max-width: 600px; - margin: 12px 0 0 24px; + margin: 12px 0 0 36px; `; const TimelineTitle = styled.div` From 0b7c301cb476ff1613d142d6425fb06e489d9ecd Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Mon, 9 Feb 2026 12:57:45 +0530 Subject: [PATCH 128/247] Add ResourceAccordionSkeleton component and integrate it into ResourceAccordion and ResourceAccordionV2 for loading state management --- .../Skeletons/ResourceAccordionSkeleton.tsx | 85 +++++++++++++++++++ .../src/components/Skeletons/index.tsx | 1 + .../components/ResourceAccordion.tsx | 13 ++- .../components/ResourceAccordionV2.tsx | 17 +++- 4 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx new file mode 100644 index 00000000000..3ab28e69e1b --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styled from "@emotion/styled"; +import { SkeletonBase } from "./styles"; + +const SkeletonContainer = styled.div` + margin-top: 10px; + overflow: hidden; + background-color: var(--vscode-editorHoverWidget-background); + pointer-events: none; +`; + +const SkeletonHeader = styled.div` + padding: 10px; + cursor: default; + display: grid; + grid-template-columns: 3fr 1fr; +`; + +const MethodSection = styled.div` + display: flex; + align-items: center; + gap: 4px; +`; + +const ButtonSection = styled.div` + display: flex; + align-items: center; + margin-left: auto; + gap: 6px; +`; + +const MethodBoxSkeleton = styled(SkeletonBase)` + height: 25px; + min-width: 70px; + width: auto; +`; + +const MethodPathSkeleton = styled(SkeletonBase)` + height: 16px; + width: 150px; + margin-left: 10px; +`; + +const ButtonSkeleton = styled(SkeletonBase)` + width: 33px; + height: 25px; + border-radius: 4px; +`; + +export const ResourceAccordionSkeleton = () => { + return ( + <SkeletonContainer data-testid="service-agent-view-resource-skeleton"> + <SkeletonHeader> + <MethodSection> + <MethodBoxSkeleton /> + <MethodPathSkeleton /> + </MethodSection> + <ButtonSection> + <ButtonSkeleton /> + <ButtonSkeleton /> + </ButtonSection> + </SkeletonHeader> + </SkeletonContainer> + ); +}; + +export default ResourceAccordionSkeleton; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx index 53d47454d80..fd464d9ab8d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx @@ -19,3 +19,4 @@ export { TitleBarSkeleton } from "./TitleBarSkeleton"; export { SwitchSkeleton } from "./SwitchSkeleton"; export { DiagramSkeleton } from "./DiagramSkeleton"; +export { ResourceAccordionSkeleton } from "./ResourceAccordionSkeleton"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx index c10e6634961..e1649567c49 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx @@ -20,6 +20,7 @@ import React, { useState } from 'react'; import styled from '@emotion/styled'; import { Button, Codicon, Confirm, Icon } from '@wso2/ui-toolkit'; import { FunctionModel } from '@wso2/ballerina-core'; +import { ResourceAccordionSkeleton } from '../../../../components/Skeletons'; import { canDataBind } from '../utils'; @@ -141,6 +142,7 @@ export function ResourceAccordion(params: ResourceAccordionProps) { const [isOpen, setIsOpen] = useState(false); const [isConfirmOpen, setConfirmOpen] = useState(false); const [confirmEl, setConfirmEl] = React.useState(null); + const [isDeleting, setIsDeleting] = useState(false); const toggleAccordion = () => { @@ -169,7 +171,12 @@ export function ResourceAccordion(params: ResourceAccordionProps) { const handleConfirm = (status: boolean) => { if (status) { - onDeleteResource && onDeleteResource(functionModel); + setIsDeleting(true); + try { + onDeleteResource && onDeleteResource(functionModel); + } catch (error) { + setIsDeleting(false); + } } setConfirmOpen(false); setConfirmEl(null); @@ -179,6 +186,10 @@ export function ResourceAccordion(params: ResourceAccordionProps) { onResourceImplement(functionModel) } + if (isDeleting) { + return <ResourceAccordionSkeleton />; + } + return ( <AccordionContainer data-testid="service-agent-view-resource"> <AccordionHeader onClick={handleResourceImplement}> 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 index bc45603995c..54ade9d0e3f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx @@ -21,6 +21,7 @@ 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'; +import { ResourceAccordionSkeleton } from '../../../../components/Skeletons'; type MethodProp = { color: string; @@ -96,6 +97,7 @@ const MethodBox = styled.div<MethodProp>` const MethodSection = styled.div` display: flex; + align-items: center; gap: 4px; `; @@ -141,7 +143,6 @@ const ActionButton = styled(Button)` } `; - export interface ResourceAccordionPropsV2 { resource: ProjectStructureArtifactResponse; onEditResource: (resource: FunctionModel) => void; @@ -158,6 +159,7 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { const [isOpen, setIsOpen] = useState(false); const [isConfirmOpen, setConfirmOpen] = useState(false); const [confirmEl, setConfirmEl] = React.useState(null); + const [isDeleting, setIsDeleting] = useState(false); const { rpcClient } = useRpcContext(); @@ -195,8 +197,13 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { const handleConfirm = async (status: boolean) => { if (status) { - const functionModel = await getFunctionModel(); - onDeleteResource && onDeleteResource(functionModel.function); + setIsDeleting(true); + try { + const functionModel = await getFunctionModel(); + onDeleteResource && onDeleteResource(functionModel.function); + } catch (error) { + setIsDeleting(false); + } } setConfirmOpen(false); setConfirmEl(null); @@ -228,6 +235,10 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { } } + if (isDeleting) { + return <ResourceAccordionSkeleton />; + } + return ( <AccordionContainer data-testid="service-agent-view-resource"> <AccordionHeader onClick={handleResourceImplement}> From 2926a098f6c1fb0d82a46ff05bae30bccaba9aed Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Mon, 9 Feb 2026 12:58:55 +0530 Subject: [PATCH 129/247] Update copyright year in ResourceAccordionSkeleton component to 2026 --- .../src/components/Skeletons/ResourceAccordionSkeleton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx index 3ab28e69e1b..fdac79653eb 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/ResourceAccordionSkeleton.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except From d7436e6118ec0e397e7bc5183756f66cfa6d9025 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 13:00:46 +0530 Subject: [PATCH 130/247] Fix coderabbit suggestions --- .../src/views/AgentChatPanel/Components/ChatInterface.tsx | 3 +-- .../trace-visualizer/src/components/SpanDetails.tsx | 6 ++++-- .../trace-visualizer/src/components/WaterfallView.tsx | 1 - 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 6ff5cb18915..63831e5d275 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -141,7 +141,7 @@ const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading opacity: ${({ isUser, isError }: { isUser: boolean; isError?: boolean }) => (isUser ? "0.3" : isError ? "0.05" : "1")}; border-radius: inherit; border: 1px solid ${({ isUser }: { isUser: boolean }) => - isUser ? "var(--vscode-peekView-border)" : "var(--vscode-panel-border)"};; + isUser ? "var(--vscode-peekView-border)" : "var(--vscode-panel-border)"}; z-index: -1; } @@ -317,7 +317,6 @@ const ChatInterface: React.FC = () => { const [isLoading, setIsLoading] = useState(false); const [isTracingEnabled, setIsTracingEnabled] = useState(false); const [showClearWarning, setShowClearWarning] = useState(false); - const [expandedSteps, setExpandedSteps] = useState<Record<number, boolean>>({}); const messagesEndRef = useRef<HTMLDivElement>(null); diff --git a/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx index be1fa199ee8..add127deaf0 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/SpanDetails.tsx @@ -484,8 +484,10 @@ export function SpanDetails({ spanData, spanName, totalInputTokens, totalOutputT ? new Date(spanData.endTime).getTime() - new Date(spanData.startTime).getTime() : null; - const inputTokens = parseInt(getAttributeValue(spanData.attributes, 'gen_ai.usage.input_tokens') || '0'); - const outputTokens = parseInt(getAttributeValue(spanData.attributes, 'gen_ai.usage.output_tokens') || '0'); + const rawInput = parseInt(getAttributeValue(spanData.attributes, 'gen_ai.usage.input_tokens') || '0'); + const rawOutput = parseInt(getAttributeValue(spanData.attributes, 'gen_ai.usage.output_tokens') || '0'); + const inputTokens = Number.isFinite(rawInput) ? rawInput : 0; + const outputTokens = Number.isFinite(rawOutput) ? rawOutput : 0; const temperature = getAttributeValue(spanData.attributes, 'gen_ai.request.temperature'); const provider = getAttributeValue(spanData.attributes, 'gen_ai.provider.name'); const model = getAttributeValue(spanData.attributes, 'gen_ai.request.model'); diff --git a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx index 9afd1a35991..284b1cfcfbe 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/WaterfallView.tsx @@ -40,7 +40,6 @@ interface WaterfallViewProps { spans: SpanData[]; selectedSpanId: string | null; onSpanSelect: (spanId: string) => void; - isAdvancedMode: boolean; getChildSpans: (spanId: string) => SpanData[]; traceStartTime: string; traceDuration: number; From cf079df0ebf21853c0fa248e8fc260d5023bf82f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 13:10:06 +0530 Subject: [PATCH 131/247] Update dependencies in pnpm-lock.yaml for improved compatibility --- common/config/rush/pnpm-lock.yaml | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index e5de3ee6993..ae45afeb255 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2324,12 +2324,27 @@ importers: '@wso2/ui-toolkit': specifier: workspace:* version: link:../../common-libs/ui-toolkit + katex: + specifier: ^0.16.27 + version: 0.16.27 react: specifier: 18.2.0 version: 18.2.0 react-dom: specifier: 18.2.0 version: 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) + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 devDependencies: '@types/react': specifier: 18.2.0 @@ -40811,12 +40826,12 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: @@ -40826,12 +40841,12 @@ snapshots: '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: @@ -59021,7 +59036,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -59055,7 +59070,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 6.0.1(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild From 57cbc9631bce62b9fef9e6f1c1dc02732ca03366 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Mon, 9 Feb 2026 13:33:50 +0530 Subject: [PATCH 132/247] Enhance PanelContainer component by adding overlay prop and updating its usage in DiagramWrapper for resource configuration display --- .../src/components/Panel/index.tsx | 7 +++-- .../src/views/BI/DiagramWrapper/index.tsx | 29 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) 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 0246bb2b866..8adaacc6889 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Panel/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Panel/index.tsx @@ -30,6 +30,7 @@ export interface PanelContainerProps { subPanelWidth?: number; onClose: () => void; onBack?: () => void; + overlay?: boolean; } namespace S { @@ -45,13 +46,13 @@ namespace S { } export function PanelContainer(props: PanelContainerProps) { - const { children, title, show, onClose, onBack, width, subPanel, subPanelWidth } = props; + const { children, title, show, onClose, onBack, width, subPanel, subPanelWidth, overlay = false } = props; return ( <SidePanel isOpen={show} alignment="right" - overlay={false} + overlay={overlay} width={width || 400} sx={{ fontFamily: "GilmerRegular", @@ -69,7 +70,7 @@ export function PanelContainer(props: PanelContainerProps) { <BackIcon /> </S.StyledButton> )} - {title} + {title} </S.TitleContainer> <S.StyledButton data-testid="close-panel-btn" appearance="icon" onClick={onClose}> <CloseIcon /> 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 a634ecfc6e2..2acbacb6ee1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -394,22 +394,21 @@ export function DiagramWrapper(param: DiagramWrapperProps) { ) } {/* This is for editing a http resource */} - {functionModel && isResource && functionModel.kind === "RESOURCE" && ( - <PanelContainer - title={"Resource Configuration"} - show={!!functionModel} + <PanelContainer + title={"Resource Configuration"} + show={!!(isResource && functionModel?.kind === "RESOURCE")} + onClose={handleFunctionClose} + width={400} + overlay={true} + > + <ResourceForm + model={functionModel} + isSaving={isSaving} + filePath={filePath} + onSave={handleResourceSubmit} onClose={handleFunctionClose} - width={400} - > - <ResourceForm - model={functionModel} - isSaving={isSaving} - filePath={filePath} - onSave={handleResourceSubmit} - onClose={handleFunctionClose} - /> - </PanelContainer> - )} + /> + </PanelContainer> </View > ); } From 16605278120bae73760f66e0f7546702d52d2cbf Mon Sep 17 00:00:00 2001 From: Senith Uthsara <senithkarunarathneu@gmail.com> Date: Mon, 9 Feb 2026 13:58:43 +0530 Subject: [PATCH 133/247] Fix Boolean editor and enum editor to provide none selected option --- .../src/components/Form/index.tsx | 484 +++++++++--------- .../components/editors/ExpressionEditor.tsx | 5 +- .../components/editors/ExpressionField.tsx | 4 +- .../BooleanEditor/BooleanEditor.tsx | 60 +-- .../EnumEditor/EnumEditor.tsx | 41 +- 5 files changed, 306 insertions(+), 288 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 72ec975c1e0..6786d00f98c 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -496,60 +496,66 @@ export const Form = forwardRef((props: FormProps) => { formFields.forEach((field) => { // Only set field defaults if no existing value is present if (defaultValues[field.key] === undefined) { - if (field.hidden) { - defaultValues[field.key] = field.value; - } else if (isDropdownField(field)) { - defaultValues[field.key] = getValueForDropdown(field) ?? ""; - } else if (field.type === "FLAG" && field.types?.length > 1) { - defaultValues[field.key] = String(field.value === "true") || String((typeof field.value === "boolean" && field.value)); - } else if (field.type === "FLAG") { - defaultValues[field.key] = field.value || "true"; - } else if (typeof field.value === "string") { - defaultValues[field.key] = formatJSONLikeString(field.value) ?? ""; - } else { - defaultValues[field.key] = field.value ?? ""; - } - if (field.key === "variable") { - defaultValues[field.key] = formValues[field.key] ?? defaultValues[field.key] ?? ""; - } - if (field.key === "parameters" && field.value.length === 0) { - defaultValues[field.key] = formValues[field.key] ?? []; - } + if (field.hidden) { + defaultValues[field.key] = field.value; + } else if (isDropdownField(field)) { + defaultValues[field.key] = getValueForDropdown(field) ?? ""; + } else if (field.type === "FLAG" && field.types?.length > 1) { + if (field.value && typeof field.value === "boolean") { + defaultValues[field.key] = String(field.value); + } + else { + defaultValues[field.key] = field.value; + } + } else if (field.type === "FLAG") { + defaultValues[field.key] = field.value || "true"; + } else if (typeof field.value === "string") { + defaultValues[field.key] = formatJSONLikeString(field.value) ?? ""; + } else { + defaultValues[field.key] = field.value ?? ""; + } + if (field.key === "variable") { + defaultValues[field.key] = formValues[field.key] ?? defaultValues[field.key] ?? ""; + } + 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]; - const newType = field.value; + if (field.key === "type") { + // Handle the case where the type is changed via 'Add Type' + const existingType = formValues[field.key]; + const newType = field.value; - if (existingType !== newType) { - setValue(field.key, newType); - getVisualiableFields(); + if (existingType !== newType) { + setValue(field.key, newType); + getVisualiableFields(); + } } - } - // Handle choice fields and their properties - if (field?.choices && field.choices.length > 0) { - // Get the selected choice index (default to 0 if not set) - const selectedChoiceIndex = formValues[field.key] !== undefined ? Number(formValues[field.key]) : 0; + // Handle choice fields and their properties + if (field?.choices && field.choices.length > 0) { + // Get the selected choice index (default to 0 if not set) + const selectedChoiceIndex = formValues[field.key] !== undefined ? Number(formValues[field.key]) : 0; - const selectedChoice = field.choices[selectedChoiceIndex]; + const selectedChoice = field.choices[selectedChoiceIndex]; - if (selectedChoice && selectedChoice?.properties) { - Object.entries(selectedChoice.properties).forEach(([propKey, propValue]) => { - // Preserve existing form values if they exist, otherwise use propValue.value - if (formValues[propKey] !== undefined && formValues[propKey] !== "") { - defaultValues[propKey] = formValues[propKey]; - } else if (propValue?.value !== undefined && defaultValues[propKey] === undefined) { - defaultValues[propKey] = propValue.value; - } + if (selectedChoice && selectedChoice?.properties) { + Object.entries(selectedChoice.properties).forEach(([propKey, propValue]) => { + // Preserve existing form values if they exist, otherwise use propValue.value + if (formValues[propKey] !== undefined && formValues[propKey] !== "") { + defaultValues[propKey] = formValues[propKey]; + } else if (propValue?.value !== undefined && defaultValues[propKey] === undefined) { + defaultValues[propKey] = propValue.value; + } - diagnosticsMap.push({ key: propKey, diagnostics: [] }); - }); + diagnosticsMap.push({ key: propKey, diagnostics: [] }); + }); + } } - } - diagnosticsMap.push({ key: field.key, diagnostics: [] }); - }}); + diagnosticsMap.push({ key: field.key, diagnostics: [] }); + } + }); setDiagnosticsInfo(diagnosticsMap); reset(defaultValues); @@ -931,105 +937,51 @@ export const Form = forwardRef((props: FormProps) => { {actionButton && <S.ActionButtonContainer>{actionButton}</S.ActionButtonContainer>} {infoLabel && !compact && ( <S.MarkdownWrapper> - <S.MarkdownContainer ref={markdownRef} isExpanded={isMarkdownExpanded}> - <ReactMarkdown>{stripHtmlTags(infoLabel)}</ReactMarkdown> - </S.MarkdownContainer> - {markdownRef.current && markdownRef.current.scrollHeight > 200 && ( - <S.ButtonContainer> - <LinkButton - onClick={handleShowMoreClick} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={isMarkdownExpanded ? "chevron-up" : "chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - {isMarkdownExpanded ? "Show Less" : "Show More"} - </LinkButton> - </S.ButtonContainer> - )} - </S.MarkdownWrapper> - )} - {!preserveOrder && !compact && ( - <FormDescription formFields={formFields} selectedNode={selectedNode} /> - )} + <S.MarkdownContainer ref={markdownRef} isExpanded={isMarkdownExpanded}> + <ReactMarkdown>{stripHtmlTags(infoLabel)}</ReactMarkdown> + </S.MarkdownContainer> + {markdownRef.current && markdownRef.current.scrollHeight > 200 && ( + <S.ButtonContainer> + <LinkButton + onClick={handleShowMoreClick} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={isMarkdownExpanded ? "chevron-up" : "chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + {isMarkdownExpanded ? "Show Less" : "Show More"} + </LinkButton> + </S.ButtonContainer> + )} + </S.MarkdownWrapper> + )} + {!preserveOrder && !compact && ( + <FormDescription formFields={formFields} selectedNode={selectedNode} /> + )} - {/* + {/* * Two rendering modes based on preserveOrder prop: * * 1. preserveOrder = true: Render all fields in original order from formFields array * 2. preserveOrder = false: Render name and type fields at the bottom, and rest at top */} - <S.CategoryRow bottomBorder={false}> - {(() => { - const fieldsToRender = formFields - .sort((a, b) => b.groupNo - a.groupNo) - .filter((field) => field.type !== "VIEW"); - - const renderedComponents: React.ReactNode[] = []; - let renderedFieldCount = 0; - const injectedIndices = new Set<number>(); // Track which injections have been added - - fieldsToRender.forEach((field) => { - // Check if we need to inject components before this field - if (injectedComponents) { - injectedComponents.forEach((injected) => { - if (injected.index === renderedFieldCount && !injectedIndices.has(injected.index)) { - renderedComponents.push( - <React.Fragment key={`injected-${injected.index}`}> - {injected.component} - </React.Fragment> - ); - injectedIndices.add(injected.index); - } - }); - } - - if (field.advanced || field.hidden) { - return; - } - // When preserveOrder is false, skip prioritized fields (they'll be rendered at bottom) - if (!preserveOrder && isPrioritizedField(field)) { - return; - } - - const updatedField = updateFormFieldWithImports(field, formImports); - renderedComponents.push( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - selectedNode={selectedNode} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - openSubPanel={handleOpenSubPanel} - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - autoFocus={firstEditableFieldIndex === formFields.indexOf(updatedField) && !hideSaveButton} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - setSubComponentEnabled={setIsSubComponentEnabled} - handleNewTypeSelected={handleNewTypeSelected} - onBlur={handleOnBlur} - isContextTypeEditorSupported={updatedField?.isContextTypeSupported} - openFormTypeEditor={ - openFormTypeEditor && - ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) - } - /> - {updatedField.key === "scope" && scopeFieldAddon} - </S.Row> - ); - renderedFieldCount++; - }); - - // Check if we need to inject components after all fields + <S.CategoryRow bottomBorder={false}> + {(() => { + const fieldsToRender = formFields + .sort((a, b) => b.groupNo - a.groupNo) + .filter((field) => field.type !== "VIEW"); + + const renderedComponents: React.ReactNode[] = []; + let renderedFieldCount = 0; + const injectedIndices = new Set<number>(); // Track which injections have been added + + fieldsToRender.forEach((field) => { + // Check if we need to inject components before this field if (injectedComponents) { injectedComponents.forEach((injected) => { - if (injected.index >= renderedFieldCount && !injectedIndices.has(injected.index)) { + if (injected.index === renderedFieldCount && !injectedIndices.has(injected.index)) { renderedComponents.push( <React.Fragment key={`injected-${injected.index}`}> {injected.component} @@ -1040,68 +992,98 @@ export const Form = forwardRef((props: FormProps) => { }); } - return renderedComponents; - })()} - {hasAdvanceFields && ( - <S.Row> - {optionalFieldsTitle} - <S.ButtonContainer> - {!showAdvancedOptions && ( - <LinkButton - onClick={handleOnShowAdvancedOptions} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={"chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - Expand - </LinkButton> - )} - {showAdvancedOptions && ( - <LinkButton - onClick={handleOnHideAdvancedOptions} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={"chevron-up"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - />Collapsed - </LinkButton> - )} - </S.ButtonContainer> - </S.Row> - )} - {hasAdvanceFields && - showAdvancedOptions && - formFields.map((field) => { - if (field.advanced && !field.hidden) { - const updatedField = updateFormFieldWithImports(field, formImports); - return ( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - onBlur={handleOnBlur} - /> - </S.Row> + if (field.advanced || field.hidden) { + return; + } + // When preserveOrder is false, skip prioritized fields (they'll be rendered at bottom) + if (!preserveOrder && isPrioritizedField(field)) { + return; + } + + const updatedField = updateFormFieldWithImports(field, formImports); + renderedComponents.push( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + selectedNode={selectedNode} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + openSubPanel={handleOpenSubPanel} + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + autoFocus={firstEditableFieldIndex === formFields.indexOf(updatedField) && !hideSaveButton} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + setSubComponentEnabled={setIsSubComponentEnabled} + handleNewTypeSelected={handleNewTypeSelected} + onBlur={handleOnBlur} + isContextTypeEditorSupported={updatedField?.isContextTypeSupported} + openFormTypeEditor={ + openFormTypeEditor && + ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) + } + /> + {updatedField.key === "scope" && scopeFieldAddon} + </S.Row> + ); + renderedFieldCount++; + }); + + // Check if we need to inject components after all fields + if (injectedComponents) { + injectedComponents.forEach((injected) => { + if (injected.index >= renderedFieldCount && !injectedIndices.has(injected.index)) { + renderedComponents.push( + <React.Fragment key={`injected-${injected.index}`}> + {injected.component} + </React.Fragment> ); + injectedIndices.add(injected.index); } - return null; - })} - {hasAdvanceFields && - showAdvancedOptions && - advancedChoiceFields.map((field) => { + }); + } + + return renderedComponents; + })()} + {hasAdvanceFields && ( + <S.Row> + {optionalFieldsTitle} + <S.ButtonContainer> + {!showAdvancedOptions && ( + <LinkButton + onClick={handleOnShowAdvancedOptions} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={"chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + Expand + </LinkButton> + )} + {showAdvancedOptions && ( + <LinkButton + onClick={handleOnHideAdvancedOptions} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={"chevron-up"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + />Collapsed + </LinkButton> + )} + </S.ButtonContainer> + </S.Row> + )} + {hasAdvanceFields && + showAdvancedOptions && + formFields.map((field) => { + if (field.advanced && !field.hidden) { const updatedField = updateFormFieldWithImports(field, formImports); return ( <S.Row key={updatedField.key}> @@ -1120,57 +1102,81 @@ export const Form = forwardRef((props: FormProps) => { /> </S.Row> ); - })} - </S.CategoryRow> - - {!preserveOrder && (variableField || typeField || targetTypeField) && ( - <S.CategoryRow topBorder={!compact && hasParameters}> - {variableField && ( - <EditorFactory - field={variableField} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - onBlur={handleOnBlur} - /> - )} - {typeField && !isInferredReturnType && ( + } + return null; + })} + {hasAdvanceFields && + showAdvancedOptions && + advancedChoiceFields.map((field) => { + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + onBlur={handleOnBlur} + /> + </S.Row> + ); + })} + </S.CategoryRow> + + {!preserveOrder && (variableField || typeField || targetTypeField) && ( + <S.CategoryRow topBorder={!compact && hasParameters}> + {variableField && ( + <EditorFactory + field={variableField} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + onBlur={handleOnBlur} + /> + )} + {typeField && !isInferredReturnType && ( + <EditorFactory + field={typeField} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, typeField, newType)) + } + handleOnFieldFocus={handleOnFieldFocus} + handleOnTypeChange={handleOnTypeChange} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleNewTypeSelected={handleNewTypeSelected} + onBlur={handleOnBlur} + + /> + )} + {targetTypeField && !targetTypeField.advanced && ( + <> <EditorFactory - field={typeField} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, typeField, newType)) - } + field={targetTypeField} handleOnFieldFocus={handleOnFieldFocus} - handleOnTypeChange={handleOnTypeChange} recordTypeFields={recordTypeFields} onIdentifierEditingStateChange={handleIdentifierEditingStateChange} handleNewTypeSelected={handleNewTypeSelected} + handleOnTypeChange={handleOnTypeChange} onBlur={handleOnBlur} - /> - )} - {targetTypeField && !targetTypeField.advanced && ( - <> - <EditorFactory - field={targetTypeField} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleNewTypeSelected={handleNewTypeSelected} - handleOnTypeChange={handleOnTypeChange} - onBlur={handleOnBlur} + {typeField && ( + <TypeHelperText + targetTypeField={targetTypeField} + typeField={typeField} /> - {typeField && ( - <TypeHelperText - targetTypeField={targetTypeField} - typeField={typeField} - /> - )} - </> - )} - </S.CategoryRow> - )} + )} + </> + )} + </S.CategoryRow> + )} {concertMessage && ( <S.ConcertContainer> diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx index 45cb70639d8..29db4db249c 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx @@ -613,9 +613,6 @@ export const ExpressionEditor = (props: ExpressionEditorProps) => { ? handleOpenExpandedMode : undefined; - const defaultValueText = field.defaultValue ? - <S.DefaultValue>Defaults to {field.defaultValue}</S.DefaultValue> : null; - const documentation = field.documentation ? field.documentation.endsWith('.') ? field.documentation @@ -651,6 +648,7 @@ export const ExpressionEditor = (props: ExpressionEditorProps) => { <S.HeaderContainer> <S.LabelContainer> <S.Label>{field.label}</S.Label> + {field.defaultValue && <S.DefaultValue style={{marginLeft: '8px'}}>{ `(Default: ${field.defaultValue}) `}</S.DefaultValue>} {(required ?? !field.optional) && <RequiredFormInput />} {getPrimaryInputType(field.types)?.ballerinaType && ( <S.Type style={{ marginLeft: '5px' }} isVisible={focused} title={getPrimaryInputType(field.types)?.ballerinaType}> @@ -661,7 +659,6 @@ export const ExpressionEditor = (props: ExpressionEditorProps) => { </S.HeaderContainer> <S.EditorMdContainer> {documentation && <ReactMarkdown>{documentation}</ReactMarkdown>} - {defaultValueText} </S.EditorMdContainer> </div> <S.FieldInfoSection> diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionField.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionField.tsx index e3c60f01c94..86f88497ffd 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionField.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionField.tsx @@ -197,7 +197,7 @@ export const ExpressionField: React.FC<ExpressionFieldProps> = (props: Expressio <BooleanEditor value={value} field={field} - onChange={(val) => onChange(val, val.length)} + onChange={(val) => onChange(val, val?.length)} /> ); } @@ -206,7 +206,7 @@ export const ExpressionField: React.FC<ExpressionFieldProps> = (props: Expressio <EnumEditor value={value} field={field} - onChange={(val) => onChange(val, val.length)} + onChange={(val) => onChange(val, val?.length)} items={primaryInputType.options.map(option => ( { id: option.value, diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx index e76a3d1afab..9bdc1cd058d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx @@ -16,28 +16,34 @@ * under the License. */ -import React, { ChangeEvent, useEffect } from "react"; +import React, { ChangeEvent } from "react"; import { Dropdown } from "@wso2/ui-toolkit"; import { FormField } from "../../../Form/types"; import { OptionProps } from "@wso2/ballerina-core"; -import { normalizeEditorValue } from "../ChipExpressionEditor/utils"; interface BooleanEditorProps { value: string; field: FormField; - onChange: (value: string, cursorPosition: number) => void; + onChange: (value: string | undefined, cursorPosition: number) => void; } -const initialDropdownItems: OptionProps[] = [ +const DEFAULT_NONE_SELECTED_VALUE = "__none__"; + +const dropdownItems: OptionProps[] = [ { id: "1", content: "True", - value: true + value: "true" }, { id: "2", content: "False", - value: false + value: "false" + }, + { + id: "default-option", + content: "None Selected", + value: DEFAULT_NONE_SELECTED_VALUE } ] @@ -51,46 +57,34 @@ const parseBoolean = (value: unknown): boolean => { return false; }; -const isValueMatchBooleanValue = (value: unknown): boolean => { - if (typeof value === 'boolean') return true; - if (typeof value === 'string') { - const v = value.trim().toLowerCase(); - if (v === 'true' || v === 'false') return true; - } - return false; -}; - - export const BooleanEditor: React.FC<BooleanEditorProps> = ({ value, onChange, field }) => { - const [dropdownOptions, setDropdownOptions] = React.useState<OptionProps[]>(initialDropdownItems); + const handleChange = (e: ChangeEvent<HTMLSelectElement>) => { - handleChangeWrapper(parseBoolean(e.target.value)); + let value = e.target.value; + if (value === DEFAULT_NONE_SELECTED_VALUE) { + onChange("", 0); + } else { + const bool = parseBoolean(value); + onChange(String(bool), String(bool).length); + } } - useEffect(() => { - if (!field.optional) return; - setDropdownOptions([...initialDropdownItems, { - id: "default-option", - content: "None Selected", - value: "" - },]); - }, [field]); - const getValidatedValue = (): string => { if (typeof value === 'boolean') return String(value); - if (isValueMatchBooleanValue(value)) return value; - return field.optional ? "" : "false" + if (value === undefined || value === "") return DEFAULT_NONE_SELECTED_VALUE; + if (typeof value === 'string') { + const v = value.trim().toLowerCase(); + if (v === 'true' || v === 'false') return v; + } + return DEFAULT_NONE_SELECTED_VALUE; } - const handleChangeWrapper = (value: boolean | string) => { - onChange(String(value), String(value).length); - } return ( <Dropdown id={field.key} value={getValidatedValue()} - items={dropdownOptions} + items={dropdownItems} onChange={handleChange} sx={{ width: "100%" }} containerSx={{ width: "100%" }} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx index 0c8ee39a612..b1991571273 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx @@ -17,7 +17,7 @@ */ import { Dropdown, OptionProps } from "@wso2/ui-toolkit"; -import React, { ChangeEvent, useEffect, useMemo } from "react" +import React, { ChangeEvent, useMemo } from "react" import { FormField } from "../../../Form/types"; interface EnumEditorProps { @@ -27,20 +27,41 @@ interface EnumEditorProps { items: OptionProps[]; } +const DEFAULT_NONE_SELECTED_VALUE = "__none__"; + export const EnumEditor = (props: EnumEditorProps) => { // Ensure value is in items, otherwise use first item's value - const itemsList = props.items.length > 0 ? props.items : props.field.itemOptions; - const selectedValue = props.value && props.value !== "" && itemsList.some(item => item.value === props.value) ? props.value : itemsList[0].value; - const handleChange = (e: ChangeEvent<HTMLSelectElement>) => { - props.onChange(e.target.value, e.target.value.length) - } + const itemsList = useMemo(() => { + const baseItems = props.items.length > 0 ? props.items : props.field.itemOptions; + return [ + ...baseItems, + { + id: "default-option", + content: "None Selected", + value: DEFAULT_NONE_SELECTED_VALUE + } + ]; + }, [props.items, props.field.itemOptions]); - // Set the selected value as field value by calling onChange only if the value is not already set - useEffect(() => { + const selectedValue = useMemo(() => { if (props.value === undefined || props.value === null || props.value === "") { - props.onChange(selectedValue, selectedValue.length) + return DEFAULT_NONE_SELECTED_VALUE; } - }, [selectedValue, props.value]) + if (props.value && itemsList.some(item => item.value === props.value)) { + return props.value; + } + return itemsList[0].value; + }, [props.value, itemsList]); + + const handleChange = (e: ChangeEvent<HTMLSelectElement>) => { + const value = e.target.value; + if (value === DEFAULT_NONE_SELECTED_VALUE) { + props.onChange("", 0); + } else { + props.onChange(value, value.length); + } + } + return ( <Dropdown From d3d9f62a0bbd21b362818e668eb292d39193fd7b Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 14:09:28 +0530 Subject: [PATCH 134/247] Remove isAdvancedMode prop from TraceDetails component --- workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 4eb6bad7cd4..4527c8647ff 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -833,7 +833,6 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide spans={shouldShowAdvancedView ? traceData.spans : rootAISpans} selectedSpanId={selectedSpanId} onSpanSelect={selectSpan} - isAdvancedMode={shouldShowAdvancedView} getChildSpans={shouldShowAdvancedView ? getChildSpans : getAIChildSpans} traceStartTime={traceData.firstSeen} traceDuration={duration} From 3a07b956858e1cb1f113482e371123683e43a8c8 Mon Sep 17 00:00:00 2001 From: Senith Uthsara <senithkarunarathneu@gmail.com> Date: Mon, 9 Feb 2026 14:12:43 +0530 Subject: [PATCH 135/247] Improve non selected item label --- .../MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx | 2 +- .../editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx index 9bdc1cd058d..9383e00f86d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/BooleanEditor/BooleanEditor.tsx @@ -42,7 +42,7 @@ const dropdownItems: OptionProps[] = [ }, { id: "default-option", - content: "None Selected", + content: "No Selection", value: DEFAULT_NONE_SELECTED_VALUE } ] diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx index b1991571273..d567f5aa832 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/EnumEditor/EnumEditor.tsx @@ -37,7 +37,7 @@ export const EnumEditor = (props: EnumEditorProps) => { ...baseItems, { id: "default-option", - content: "None Selected", + content: "No Selection", value: DEFAULT_NONE_SELECTED_VALUE } ]; From 1a65b995c5f88f4e1863886263d714fc1c5c26f7 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Mon, 9 Feb 2026 16:39:05 +0530 Subject: [PATCH 136/247] Implement open in buttons for DATA_MAPPER_CREATION and FUNCTION_CREATION nodes --- .../src/interfaces/extended-lang-client.ts | 3 +- .../rpc-managers/bi-diagram/rpc-manager.ts | 3 +- .../src/components/Form/index.tsx | 34 +++++++++++++++++-- .../src/views/BI/FlowDiagram/index.tsx | 14 ++++++++ .../views/BI/Forms/FormGenerator/index.tsx | 5 ++- 5 files changed, 53 insertions(+), 6 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 4cd2cfe64c1..4a977a27928 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -29,7 +29,7 @@ import { SqFlow } from "../rpc-types/sequence-diagram/interfaces"; import { FieldType, FunctionModel, ListenerModel, ServiceClassModel, ServiceInitModel, ServiceModel } from "./service"; import { CDModel } from "./component-diagram"; import { DMModel, ExpandedDMModel, IntermediateClause, Mapping, VisualizableField, FnMetadata, ResultClauseType, IOType } from "./data-mapper"; -import { DataMapperMetadata, SCOPE } from "../state-machine-types"; +import { ArtifactData, DataMapperMetadata, SCOPE } from "../state-machine-types"; import { ToolParameters } from "../rpc-types/ai-agent/interfaces"; export interface DidOpenParams { @@ -855,6 +855,7 @@ export interface BISourceCodeRequest { isConnector?: boolean; isFunctionNodeUpdate?: boolean; isHelperPaneChange?: boolean; + artifactData?: ArtifactData; } export type BISourceCodeResponse = { 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 dca33238b36..01f06610d64 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 @@ -247,7 +247,8 @@ export class BiDiagramRpcManager implements BIDiagramAPI { const artifacts = await updateSourceCode({ textEdits: model.textEdits, description: this.getSourceDescription(params) }); resolve({ artifacts }); } else { - const artifacts = await updateSourceCode({ textEdits: model.textEdits, artifactData: this.getArtifactDataFromNodeKind(params.flowNode.codedata.node), description: this.getSourceDescription(params)}, params.isHelperPaneChange); + const artifactData = params.artifactData || this.getArtifactDataFromNodeKind(params.flowNode.codedata.node); + const artifacts = await updateSourceCode({ textEdits: model.textEdits, artifactData, description: this.getSourceDescription(params)}, params.isHelperPaneChange); resolve({ artifacts }); } }) 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 536613af4d6..2b35be91b09 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -723,9 +723,13 @@ export const Form = forwardRef((props: FormProps) => { const expressionField = formFields.find((field) => field.key === "expression"); const targetTypeField = formFields.find((field) => field.codedata?.kind === "PARAM_FOR_TYPE_INFER"); const hasParameters = hasRequiredParameters(formFields, selectedNode) || hasOptionalParameters(formFields); - const canOpenInDataMapper = selectedNode === "VARIABLE" && + + const canOpenInDataMapper = (selectedNode === "VARIABLE" && expressionField && - visualizableField?.isDataMapped; + visualizableField?.isDataMapped) || + selectedNode === "DATA_MAPPER_CREATION"; + + const canOpenInFunctionEditor = selectedNode === "FUNCTION_CREATION"; const contextValue: FormContext = { form: { @@ -902,7 +906,20 @@ export const Form = forwardRef((props: FormProps) => { return handleOnSave({ ...data, editorConfig: { - view: MACHINE_VIEW.InlineDataMapper, + view: selectedNode === "VARIABLE" ? MACHINE_VIEW.InlineDataMapper : MACHINE_VIEW.DataMapper, + displayMode: EditorDisplayMode.VIEW, + }, + }); + })(); + }; + + const handleOnOpenInFunctionEditor = () => { + setSavingButton('functionEditor'); + handleSubmit((data) => { + return handleOnSave({ + ...data, + editorConfig: { + view: MACHINE_VIEW.BIDiagram, displayMode: EditorDisplayMode.VIEW, }, }); @@ -1207,6 +1224,17 @@ export const Form = forwardRef((props: FormProps) => { ) : submitText || "Open in Data Mapper"} </Button> } + {canOpenInFunctionEditor && ( + <Button + appearance="secondary" + onClick={handleOnOpenInFunctionEditor} + disabled={isSaving} + > + {isSaving && savingButton === 'functionEditor' ? ( + <Typography variant="progress">{submitText || "Opening in Function Editor..."}</Typography> + ) : submitText || "Open in Function Editor"} + </Button> + )} <Button appearance="primary" onClick={handleOnSaveClick} 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 1c483802e69..70e31aef214 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -1366,6 +1366,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); return; } + rpcClient .getBIDiagramRpcClient() .getSourceCode({ @@ -1373,9 +1374,22 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { flowNode: updatedNode, isFunctionNodeUpdate: editorConfig?.displayMode !== EditorDisplayMode.NONE, isHelperPaneChange: options?.isChangeFromHelperPane, + artifactData: editorConfig && + editorConfig.displayMode !== EditorDisplayMode.NONE && + editorConfig.view === MACHINE_VIEW.DataMapper ? + { artifactType: DIRECTORY_MAP.DATA_MAPPER } : undefined, }) .then(async (response) => { if (response.artifacts.length > 0) { + + if (editorConfig && editorConfig.displayMode !== EditorDisplayMode.NONE) { + const newArtifact = response.artifacts.find(res => res.isNew); + if (newArtifact) { + rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: newArtifact.path, position: newArtifact.position } }); + return; + } + } + if (updatedNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER || (updatedNode?.codedata?.node === "AGENT_CALL" && updatedNode?.properties?.model?.value === "")) { await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); 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 b9ad9f4b6c2..0d1edd1c46e 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 @@ -267,7 +267,10 @@ export const FormGenerator = forwardRef<FormExpressionEditorRef, FormProps>(func node.codedata.object === "Agent" && node.codedata.symbol === "run" ); - return isAgentNode; + const isDataMapperCreationNode = node && node.codedata.node === "DATA_MAPPER_CREATION"; + const isFunctionCreationNode = node && node.codedata.node === "FUNCTION_CREATION"; + + return isAgentNode || isDataMapperCreationNode || isFunctionCreationNode; }, [node]); const importsCodedataRef = useRef<any>(null); // To store codeData for getVisualizableFields From 7268a8947e7f3eceb41e625999385c900241123d Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Mon, 9 Feb 2026 14:56:32 +0000 Subject: [PATCH 137/247] Update CHANGELOG.md for unreleased changes and security fixes --- .../ballerina-extension/CHANGELOG.md | 22 +++++++++++++++++++ workspaces/bi/bi-extension/CHANGELOG.md | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/CHANGELOG.md b/workspaces/ballerina/ballerina-extension/CHANGELOG.md index 4ceccac0d1f..200c98e896b 100644 --- a/workspaces/ballerina/ballerina-extension/CHANGELOG.md +++ b/workspaces/ballerina/ballerina-extension/CHANGELOG.md @@ -4,6 +4,28 @@ All notable changes to the **Ballerina** extension will be documented in this fi The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/). +## [Unreleased] + +### Added + +- **Event Integration** — Introduced CDC for PostgreSQL support. +- **FTP Integration** — Added support for deprecated FTP functions. +- **Expression Editor** — Added SQL support for expression editing. + +### Changed + +- **Project Creation** — Refactored form layout and validation. +- **Service Management** — Improved Try-it flow and multiple Ballerina version detection; sorted HTTP resources in service designer and artifact views. +- **Form Validation** — Ensured form validation runs before language server diagnostics. + +### Fixed + +- **Installation** — Added warning for conflicting Ballerina installations. +- **UI Components** — Fixed resource configuration response reset, record config helper overflow, and Boolean/enum editor selection. +- **Type Editor** — Fixed recursive type creation issue. +- **Expression Editor** — Fixed completions for method access. +- **Security** — Updated dependencies to address vulnerabilities (CVE-2026-25128, CVE-2025-50537, CVE-2025-13465, CVE-2026-25547). + ## [5.7.3](https://github.com/wso2/vscode-extensions/compare/ballerina-5.7.2...ballerina-5.7.3) - 2026-01-23 ### Fixed diff --git a/workspaces/bi/bi-extension/CHANGELOG.md b/workspaces/bi/bi-extension/CHANGELOG.md index 29d51afc7d7..def1415e8aa 100644 --- a/workspaces/bi/bi-extension/CHANGELOG.md +++ b/workspaces/bi/bi-extension/CHANGELOG.md @@ -4,6 +4,28 @@ All notable changes to the **WSO2 Integrator: BI** extension will be documented The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/). +## [Unreleased] + +### Added + +- **Event Integration** — Introduced CDC for PostgreSQL support. +- **FTP Integration** — Added support for deprecated FTP functions. +- **Expression Editor** — Added SQL support for expression editing. + +### Changed + +- **Project Creation** — Refactored form layout and validation. +- **Service Management** — Improved Try-it flow and multiple Ballerina version detection; sorted HTTP resources in service designer and artifact views. +- **Form Validation** — Ensured form validation runs before language server diagnostics. + +### Fixed + +- **Installation** — Added warning for conflicting Ballerina installations. +- **UI Components** — Fixed resource configuration response reset, record config helper overflow, and Boolean/enum editor selection. +- **Type Editor** — Fixed recursive type creation issue. +- **Expression Editor** — Fixed completions for method access. +- **Security** — Updated dependencies to address vulnerabilities (CVE-2026-25128, CVE-2025-50537, CVE-2025-13465, CVE-2026-25547). + ## [1.6.1](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.6.0...ballerina-integrator-1.6.1) - 2026-01-22 ### Fixed From c13018a0aeb925127cb12dbf28073ed297e0a240 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Mon, 9 Feb 2026 20:35:52 +0530 Subject: [PATCH 138/247] Update TypeScript version to 4.2.4 and adjust ESLint ignore patterns --- common/config/rush/pnpm-lock.yaml | 47 +++++++++---------- .../graphql-design-diagram/package.json | 2 +- workspaces/bi/bi-extension/.eslintrc.json | 3 +- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 762539d31d2..7c8adf92b73 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1810,16 +1810,16 @@ importers: version: 6.0.1 tslint: specifier: 6.1.3 - version: 6.1.3(typescript@4.1.3) + version: 6.1.3(typescript@4.2.4) tslint-react: specifier: 5.0.0 - version: 5.0.0(tslint@6.1.3(typescript@4.1.3))(typescript@4.1.3) + version: 5.0.0(tslint@6.1.3(typescript@4.2.4))(typescript@4.2.4) tslint-react-hooks: specifier: 2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@4.1.3))(typescript@4.1.3) + version: 2.2.2(tslint@6.1.3(typescript@4.2.4))(typescript@4.2.4) typescript: - specifier: 4.1.3 - version: 4.1.3 + specifier: 4.2.4 + version: 4.2.4 vscode-uri: specifier: 3.1.0 version: 3.1.0 @@ -23796,8 +23796,8 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - typescript@4.1.3: - resolution: {integrity: sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==} + typescript@4.2.4: + resolution: {integrity: sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==} engines: {node: '>=4.2.0'} hasBin: true @@ -48978,10 +48978,7 @@ snapshots: pretty-format: 25.5.0 throat: 5.0.0 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate jest-leak-detector@25.5.0: dependencies: @@ -57248,10 +57245,10 @@ snapshots: tslint-config-prettier@1.18.0: {} - tslint-react-hooks@2.2.2(tslint@6.1.3(typescript@4.1.3))(typescript@4.1.3): + tslint-react-hooks@2.2.2(tslint@6.1.3(typescript@4.2.4))(typescript@4.2.4): dependencies: - tslint: 6.1.3(typescript@4.1.3) - typescript: 4.1.3 + tslint: 6.1.3(typescript@4.2.4) + typescript: 4.2.4 tslint-react-hooks@2.2.2(tslint@6.1.3(typescript@4.9.4))(typescript@4.9.4): dependencies: @@ -57275,11 +57272,11 @@ snapshots: tsutils: 3.21.0(typescript@4.9.4) typescript: 4.9.4 - tslint-react@5.0.0(tslint@6.1.3(typescript@4.1.3))(typescript@4.1.3): + tslint-react@5.0.0(tslint@6.1.3(typescript@4.2.4))(typescript@4.2.4): dependencies: - tslint: 6.1.3(typescript@4.1.3) - tsutils: 3.21.0(typescript@4.1.3) - typescript: 4.1.3 + tslint: 6.1.3(typescript@4.2.4) + tsutils: 3.21.0(typescript@4.2.4) + typescript: 4.2.4 tslint-react@5.0.0(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3): dependencies: @@ -57304,7 +57301,7 @@ snapshots: tsutils: 2.29.0(typescript@5.8.3) typescript: 5.8.3 - tslint@6.1.3(typescript@4.1.3): + tslint@6.1.3(typescript@4.2.4): dependencies: '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 @@ -57318,8 +57315,8 @@ snapshots: resolve: 1.22.11 semver: 5.7.2 tslib: 1.14.1 - tsutils: 2.29.0(typescript@4.1.3) - typescript: 4.1.3 + tsutils: 2.29.0(typescript@4.2.4) + typescript: 4.2.4 tslint@6.1.3(typescript@4.9.4): dependencies: @@ -57355,10 +57352,10 @@ snapshots: tsutils: 2.29.0(typescript@5.8.3) typescript: 5.8.3 - tsutils@2.29.0(typescript@4.1.3): + tsutils@2.29.0(typescript@4.2.4): dependencies: tslib: 1.14.1 - typescript: 4.1.3 + typescript: 4.2.4 tsutils@2.29.0(typescript@4.9.4): dependencies: @@ -57375,10 +57372,10 @@ snapshots: tslib: 1.14.1 typescript: 3.9.10 - tsutils@3.21.0(typescript@4.1.3): + tsutils@3.21.0(typescript@4.2.4): dependencies: tslib: 1.14.1 - typescript: 4.1.3 + typescript: 4.2.4 tsutils@3.21.0(typescript@4.9.4): dependencies: @@ -57528,7 +57525,7 @@ snapshots: typescript@3.9.10: {} - typescript@4.1.3: {} + typescript@4.2.4: {} typescript@4.9.4: {} diff --git a/workspaces/ballerina/graphql-design-diagram/package.json b/workspaces/ballerina/graphql-design-diagram/package.json index 8eb6f125ad8..642fad75c60 100644 --- a/workspaces/ballerina/graphql-design-diagram/package.json +++ b/workspaces/ballerina/graphql-design-diagram/package.json @@ -33,7 +33,7 @@ "tslint": "6.1.3", "tslint-react": "5.0.0", "tslint-react-hooks": "2.2.2", - "typescript": "4.1.3", + "typescript": "4.2.4", "@projectstorm/react-diagrams": "6.7.4", "@emotion/styled": "11.14.0", "lodash": "4.17.23", diff --git a/workspaces/bi/bi-extension/.eslintrc.json b/workspaces/bi/bi-extension/.eslintrc.json index 1314ad17b72..441dcfa07d5 100644 --- a/workspaces/bi/bi-extension/.eslintrc.json +++ b/workspaces/bi/bi-extension/.eslintrc.json @@ -25,6 +25,7 @@ "ignorePatterns": [ "out", "dist", - "**/*.d.ts" + "**/*.d.ts", + "src/test/test-resources" ] } \ No newline at end of file From 096ae82d978fc4f6614854419fdced2e561755af Mon Sep 17 00:00:00 2001 From: Senith Uthsara <senithkarunarathneu@gmail.com> Date: Tue, 10 Feb 2026 10:55:52 +0530 Subject: [PATCH 139/247] remove number editor get helper button --- .../editors/MultiModeExpressionEditor/Configurations.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/Configurations.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/Configurations.tsx index ea9deee0cf3..a80b291bfce 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/Configurations.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/Configurations.tsx @@ -212,6 +212,10 @@ export class NumberExpressionEditorConfig extends ChipExpressionEditorDefaultCon } + getIsToggleHelperAvailable(): boolean { + return false; + } + getIsValueCompatible(value: string): boolean { return this.DECIMAL_INPUT_REGEX.test(value); } From 9ed73956e742213ab7e285b029bfb52643ae7e22 Mon Sep 17 00:00:00 2001 From: samithkavishke <samithkarunathilake@gmail.com> Date: Tue, 10 Feb 2026 13:21:05 +0530 Subject: [PATCH 140/247] Remove Try it button for FTP services --- .../ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 506a1f61a47..2edc88460ba 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -821,7 +821,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { /> Configure </Button> { - serviceModel && (isHttpService || isMcpService || isFtpService) && ( + serviceModel && (isHttpService || isMcpService) && ( <> <Button appearance="secondary" tooltip="Try Service" onClick={handleServiceTryIt}> <Icon name="play" isCodicon={true} sx={{ marginRight: 8, fontSize: 16 }} /> <ButtonText>Try It</ButtonText> From 350c1ff80d00ab4f629bd50f10981b26e15b1382 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Tue, 10 Feb 2026 14:02:01 +0530 Subject: [PATCH 141/247] chore: update package versions in ballerina extensions - Bumped VSCode engine version to ^1.100.0 in ballerina-extension. - Updated webpack-dev-server to version 5.2.3 in ballerina-visualizer. - Upgraded html-to-image to version 1.11.11 in both graphql-design-diagram and persist-layer-diagram. --- common/config/rush/pnpm-lock.yaml | 497 ++++++++++++++---- .../ballerina-extension/package.json | 2 +- .../ballerina-visualizer/package.json | 2 +- .../graphql-design-diagram/package.json | 2 +- .../persist-layer-diagram/package.json | 2 +- 5 files changed, 386 insertions(+), 119 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 9622a5ab8ff..2a01fb5459b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1079,7 +1079,7 @@ importers: devDependencies: '@storybook/react': specifier: 6.5.16 - version: 6.5.16(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: 4.17.16 version: 4.17.16 @@ -1290,10 +1290,10 @@ importers: version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 - version: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -1481,7 +1481,7 @@ importers: version: 7.27.1(@babel/core@7.27.1) '@storybook/react': specifier: 6.5.16 - version: 6.5.16(@babel/core@7.27.1)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.1)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: 10.4.0 version: 10.4.0 @@ -1714,7 +1714,7 @@ importers: version: 6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/react': specifier: 6.5.9 - version: 6.5.9(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.9(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1) + version: 6.5.9(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.9(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -1750,7 +1750,7 @@ importers: version: 5.104.1(webpack-cli@4.10.0) webpack-cli: specifier: 4.10.0 - version: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1788,8 +1788,8 @@ importers: specifier: 2.4.1 version: 2.4.1 html-to-image: - specifier: 1.10.8 - version: 1.10.8 + specifier: 1.11.11 + version: 1.11.11 lodash: specifier: 4.17.23 version: 4.17.23 @@ -1931,8 +1931,8 @@ importers: specifier: 6.2.0 version: 6.2.0(webpack@5.104.1) html-to-image: - specifier: 1.10.8 - version: 1.10.8 + specifier: 1.11.11 + version: 1.11.11 lodash: specifier: 4.17.23 version: 4.17.23 @@ -2233,7 +2233,7 @@ importers: devDependencies: '@storybook/react': specifier: 6.5.9 - version: 6.5.9(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.4)(webpack-dev-server@5.2.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.9(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.4)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: 2.2.9 version: 2.2.9 @@ -7382,6 +7382,10 @@ packages: '@nevware21/ts-utils@0.12.6': resolution: {integrity: sha512-UsS1hbgr/V/x8dT7hVHvr/PwHzASi8/Itis1+L8ykLiqsUXdfzrB1maL0vMmKbDEJpmGARsoC/7RIswi+n248Q==} + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -7520,6 +7524,40 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} + '@peculiar/asn1-cms@2.6.0': + resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==} + + '@peculiar/asn1-csr@2.6.0': + resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==} + + '@peculiar/asn1-ecc@2.6.0': + resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==} + + '@peculiar/asn1-pfx@2.6.0': + resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==} + + '@peculiar/asn1-pkcs8@2.6.0': + resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==} + + '@peculiar/asn1-pkcs9@2.6.0': + resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==} + + '@peculiar/asn1-rsa@2.6.0': + resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==} + + '@peculiar/asn1-schema@2.6.0': + resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + + '@peculiar/asn1-x509-attr@2.6.0': + resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==} + + '@peculiar/asn1-x509@2.6.0': + resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==} + + '@peculiar/x509@1.14.3': + resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} + engines: {node: '>=20.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -12500,6 +12538,10 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + engines: {node: '>=12.0.0'} + assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -13354,6 +13396,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} + c8@10.1.3: resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} engines: {node: '>=18'} @@ -16622,9 +16668,6 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} - html-to-image@1.10.8: - resolution: {integrity: sha512-t+JyFJwKDCp4ZwBp4iC/wqw0meQDDc77Qs8OFl5P7RGlIP3LQMvwpD7VXxqQfC7/TfC+GKYlFP6WDYfXTmXHfw==} - html-to-image@1.11.11: resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==} @@ -20232,6 +20275,10 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + pkijs@3.3.3: + resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} + engines: {node: '>=16.0.0'} + playwright-core@1.55.1: resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} engines: {node: '>=18'} @@ -20981,6 +21028,13 @@ packages: pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -21626,6 +21680,9 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -22190,6 +22247,10 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + selfsigned@5.5.0: + resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} + engines: {node: '>=18'} + semver-diff@2.1.0: resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} engines: {node: '>=0.10.0'} @@ -23684,6 +23745,10 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + ttf2eot@2.0.0: resolution: {integrity: sha512-U56aG2Ylw7psLOmakjemAzmpqVgeadwENg9oaDjaZG5NYX4WB6+7h74bNPcc+0BXsoU5A/XWiHabDXyzFOmsxQ==} hasBin: true @@ -24647,6 +24712,19 @@ packages: webpack-cli: optional: true + webpack-dev-server@5.2.3: + resolution: {integrity: sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.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'} @@ -28894,7 +28972,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -28903,7 +28981,7 @@ snapshots: '@jest/console@30.0.0': dependencies: '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 jest-message-util: 30.0.0 jest-util: 30.0.0 @@ -29030,14 +29108,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-mock: 29.7.0 '@jest/environment@30.0.0': dependencies: '@jest/fake-timers': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-mock: 30.0.0 '@jest/expect-utils@29.7.0': @@ -29078,7 +29156,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -29087,7 +29165,7 @@ snapshots: dependencies: '@jest/types': 30.0.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-message-util: 30.0.0 jest-mock: 30.0.0 jest-util: 30.0.0 @@ -29122,12 +29200,12 @@ snapshots: '@jest/pattern@30.0.0': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-regex-util: 30.0.0 '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-regex-util: 30.0.1 '@jest/reporters@25.5.1': @@ -29169,7 +29247,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -29198,7 +29276,7 @@ snapshots: '@jest/transform': 30.0.0 '@jest/types': 30.0.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -29395,7 +29473,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/yargs': 15.0.20 chalk: 4.1.2 @@ -29424,7 +29502,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -30248,6 +30326,8 @@ snapshots: '@nevware21/ts-utils@0.12.6': {} + '@noble/hashes@1.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -30364,6 +30444,96 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true + '@peculiar/asn1-cms@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pfx': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.6.0': + dependencies: + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509-attr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/x509@1.14.3': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-csr': 2.6.0 + '@peculiar/asn1-ecc': 2.6.0 + '@peculiar/asn1-pkcs9': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -30404,7 +30574,7 @@ snapshots: webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -30418,10 +30588,10 @@ snapshots: optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)) type-fest: 4.41.0 - webpack-dev-server: 5.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-server: 5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -30435,7 +30605,7 @@ snapshots: optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@4.10.0) type-fest: 4.41.0 - webpack-dev-server: 5.2.1(webpack-cli@4.10.0)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': @@ -30455,7 +30625,7 @@ snapshots: webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -30469,7 +30639,7 @@ snapshots: optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 '@pmmmwh/react-refresh-webpack-plugin@0.6.0(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': @@ -35391,7 +35561,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 @@ -37262,7 +37432,7 @@ snapshots: dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.29.0) '@babel/preset-react': 7.27.1(@babel/core@7.29.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.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/core-webpack': 7.4.0(encoding@0.1.13) '@storybook/docs-tools': 7.4.0(encoding@0.1.13) '@storybook/node-logger': 7.4.0 @@ -37502,7 +37672,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.104.1(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color @@ -37829,11 +37999,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.1)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.1)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) @@ -37892,11 +38062,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.29.0) '@babel/preset-react': 7.27.1(@babel/core@7.29.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.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) @@ -37955,11 +38125,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.9(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.9(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.9(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.9(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.9 '@storybook/core': 6.5.9(@storybook/builder-webpack5@6.5.9(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) @@ -38020,11 +38190,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.9(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.4)(webpack-dev-server@5.2.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.9(@babel/core@7.29.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.4)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.29.0) '@babel/preset-react': 7.27.1(@babel/core@7.29.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.1(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.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.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.9 '@storybook/core': 6.5.9(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.4)(webpack@5.104.1) @@ -39318,11 +39488,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/braces@3.0.5': {} @@ -39351,15 +39521,15 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/dagre@0.7.52': {} @@ -39407,7 +39577,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -39445,7 +39615,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/handlebars@4.1.0': dependencies: @@ -39474,7 +39644,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/is-function@1.0.3': {} @@ -39514,7 +39684,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -39614,7 +39784,7 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/node@14.18.63': {} @@ -39650,7 +39820,7 @@ snapshots: '@types/npmlog@4.1.6': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/overlayscrollbars@1.12.5': {} @@ -39739,7 +39909,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/resolve@1.20.2': {} @@ -39755,7 +39925,7 @@ snapshots: '@types/selenium-webdriver@4.35.5': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/ws': 8.2.1 '@types/semver@7.7.1': {} @@ -39763,11 +39933,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/send@1.2.1': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/serve-index@1.9.4': dependencies: @@ -39776,12 +39946,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/source-list-map@0.1.6': {} @@ -39917,7 +40087,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@types/ws@8.2.1': dependencies: @@ -40752,12 +40922,12 @@ snapshots: '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: @@ -40767,12 +40937,12 @@ snapshots: '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.21.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: @@ -40783,11 +40953,11 @@ snapshots: dependencies: webpack-cli: 4.10.0(webpack@5.104.1) - '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.1)': + '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@4.10.0)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack@5.104.1)': dependencies: @@ -40796,6 +40966,13 @@ snapshots: optionalDependencies: webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1)': + dependencies: + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + optionalDependencies: + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) @@ -41304,6 +41481,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + asn1js@3.0.7: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + assert-plus@1.0.0: {} assert@1.5.1: @@ -42674,6 +42857,8 @@ snapshots: bytes@3.1.2: {} + bytestreamjs@2.0.1: {} + c8@10.1.3: dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -47148,8 +47333,6 @@ snapshots: html-tags@3.3.1: {} - html-to-image@1.10.8: {} - html-to-image@1.11.11: {} html-url-attributes@3.0.1: {} @@ -48133,7 +48316,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.1(babel-plugin-macros@3.1.0) @@ -48159,7 +48342,7 @@ snapshots: '@jest/expect': 30.0.0 '@jest/test-result': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.1(babel-plugin-macros@3.1.0) @@ -48569,7 +48752,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -48578,7 +48761,7 @@ snapshots: '@jest/environment': 30.0.0 '@jest/fake-timers': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-mock: 30.0.0 jest-util: 30.0.0 jest-validate: 30.0.0 @@ -48619,7 +48802,7 @@ snapshots: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.24 + '@types/node': 16.18.126 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -48637,7 +48820,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.24 + '@types/node': 16.18.126 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -48652,7 +48835,7 @@ snapshots: jest-haste-map@30.0.0: dependencies: '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -48845,19 +49028,19 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-util: 29.7.0 jest-mock@30.0.0: dependencies: '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-util: 30.0.0 jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-util: 30.2.0 jest-pnp-resolver@1.2.3(jest-resolve@25.5.1): @@ -48990,7 +49173,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -49016,7 +49199,7 @@ snapshots: '@jest/test-result': 30.0.0 '@jest/transform': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -49097,7 +49280,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.3 @@ -49124,7 +49307,7 @@ snapshots: '@jest/test-result': 30.0.0 '@jest/transform': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -49148,7 +49331,7 @@ snapshots: jest-serializer@26.6.2: dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 graceful-fs: 4.2.11 jest-snapshot@20.0.3: @@ -49269,7 +49452,7 @@ snapshots: jest-util@26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -49278,7 +49461,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -49287,7 +49470,7 @@ snapshots: jest-util@30.0.0: dependencies: '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -49296,7 +49479,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -49367,7 +49550,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.24 + '@types/node': 16.18.126 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -49378,7 +49561,7 @@ snapshots: dependencies: '@jest/test-result': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 22.15.24 + '@types/node': 16.18.126 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -49397,7 +49580,7 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -49409,14 +49592,14 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.0.0: dependencies: - '@types/node': 22.15.24 + '@types/node': 16.18.126 '@ungap/structured-clone': 1.3.0 jest-util: 30.0.0 merge-stream: 2.0.0 @@ -52193,6 +52376,15 @@ snapshots: dependencies: find-up: 3.0.0 + pkijs@3.3.3: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.7 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + playwright-core@1.55.1: {} playwright@1.55.1: @@ -53135,6 +53327,12 @@ snapshots: pure-rand@7.0.1: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + q@1.5.1: {} qified@0.6.0: @@ -54158,6 +54356,8 @@ snapshots: redux@5.0.1: {} + reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -54625,7 +54825,7 @@ snapshots: rollup@1.32.1: dependencies: '@types/estree': 1.0.8 - '@types/node': 22.15.24 + '@types/node': 16.18.126 acorn: 7.4.1 rollup@4.41.0: @@ -54872,6 +55072,11 @@ snapshots: '@types/node-forge': 1.3.14 node-forge: 1.3.3 + selfsigned@5.5.0: + dependencies: + '@peculiar/x509': 1.14.3 + pkijs: 3.3.3 + semver-diff@2.1.0: dependencies: semver: 5.7.2 @@ -57093,6 +57298,10 @@ snapshots: tslib: 1.14.1 typescript: 5.8.3 + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + ttf2eot@2.0.0: dependencies: argparse: 1.0.10 @@ -58116,12 +58325,12 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1): + webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.104.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) - '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.1) + '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3) colorette: 2.0.20 commander: 7.2.0 cross-spawn: 7.0.6 @@ -58132,7 +58341,7 @@ snapshots: webpack: 5.104.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@4.10.0)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) webpack-cli@4.10.0(webpack@5.104.1): dependencies: @@ -58169,6 +58378,25 @@ snapshots: optionalDependencies: webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.6 + envinfo: 7.21.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + optionalDependencies: + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-cli@5.1.4(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 @@ -58352,7 +58580,7 @@ snapshots: webpack-dev-middleware: 1.12.2(webpack@3.8.1) yargs: 6.6.0 - webpack-dev-server@5.2.1(webpack-cli@4.10.0)(webpack@5.104.1): + webpack-dev-server@5.2.1(webpack-cli@5.1.4)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58383,16 +58611,15 @@ snapshots: webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - optional: true - webpack-dev-server@5.2.1(webpack-cli@5.1.4)(webpack@5.104.1): + webpack-dev-server@5.2.1(webpack-cli@6.0.1)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58423,15 +58650,15 @@ snapshots: webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.1(webpack-cli@6.0.1)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58455,22 +58682,23 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 + selfsigned: 5.5.0 serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate + optional: true - webpack-dev-server@5.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58494,7 +58722,46 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 + selfsigned: 5.5.0 + serve-index: 1.9.2 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.5(webpack@5.104.1) + ws: 8.19.0 + optionalDependencies: + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.8 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.10 + '@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.1 + connect-history-api-fallback: 2.0.0 + express: 4.22.1 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.3.0 + launch-editor: 2.12.0 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 + selfsigned: 5.5.0 serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 @@ -58652,7 +58919,7 @@ snapshots: watchpack: 1.7.5 webpack-sources: 1.4.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack@4.47.0(webpack-cli@6.0.1): dependencies: @@ -58842,7 +59109,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -58876,7 +59143,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index e0e3d34e709..4cde986c71c 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -15,7 +15,7 @@ "theme": "light" }, "engines": { - "vscode": "1.83.1" + "vscode": "^1.100.0" }, "categories": [ "Programming Languages", diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index da33d333c83..ecb9ca1e150 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -82,7 +82,7 @@ "@types/react-lottie": "1.2.5", "@types/lodash.debounce": "4.0.6", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.1" + "webpack-dev-server": "5.2.3" }, "author": "wso2", "license": "UNLICENSED", diff --git a/workspaces/ballerina/graphql-design-diagram/package.json b/workspaces/ballerina/graphql-design-diagram/package.json index 642fad75c60..497c88fc708 100644 --- a/workspaces/ballerina/graphql-design-diagram/package.json +++ b/workspaces/ballerina/graphql-design-diagram/package.json @@ -41,7 +41,7 @@ "@projectstorm/react-canvas-core": "6.7.4", "@projectstorm/geometry": "6.7.4", "@projectstorm/react-diagrams-core": "6.7.4", - "html-to-image": "1.10.8", + "html-to-image": "1.11.11", "@emotion/css": "11.13.5" }, "devDependencies": { diff --git a/workspaces/ballerina/persist-layer-diagram/package.json b/workspaces/ballerina/persist-layer-diagram/package.json index 752a16ac5e5..3a271cd7eae 100644 --- a/workspaces/ballerina/persist-layer-diagram/package.json +++ b/workspaces/ballerina/persist-layer-diagram/package.json @@ -28,7 +28,7 @@ "closest": "0.0.1", "dagre": "0.8.5", "file-loader": "6.2.0", - "html-to-image": "1.10.8", + "html-to-image": "1.11.11", "lodash": "4.17.23", "pathfinding": "0.4.18", "paths-js": "0.4.11", From 0f9fada19325b2601b52517b771a8fa013796999 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Tue, 10 Feb 2026 14:22:30 +0530 Subject: [PATCH 142/247] chore: update @types/vscode version to 1.100.0 in package.json files --- common/config/rush/pnpm-lock.yaml | 24 +++++++++---------- .../ballerina/ballerina-core/package.json | 2 +- .../ballerina-extension/package.json | 4 ++-- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 2a01fb5459b..9d2fecf45e3 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -426,8 +426,8 @@ importers: specifier: 18.2.0 version: 18.2.0 '@types/vscode': - specifier: 1.83.1 - version: 1.83.1 + specifier: 1.100.0 + version: 1.100.0 '@typescript-eslint/eslint-plugin': specifier: 8.32.1 version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) @@ -589,8 +589,8 @@ importers: specifier: 1.0.3 version: 1.0.3 '@types/vscode': - specifier: 1.83.1 - version: 1.83.1 + specifier: 1.100.0 + version: 1.100.0 '@types/vscode-notebook-renderer': specifier: 1.72.2 version: 1.72.2 @@ -11410,9 +11410,6 @@ packages: '@types/vscode@1.81.0': resolution: {integrity: sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==} - '@types/vscode@1.83.1': - resolution: {integrity: sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==} - '@types/vscode@1.84.0': resolution: {integrity: sha512-lCGOSrhT3cL+foUEqc8G1PVZxoDbiMmxgnUZZTEnHF4mC47eKAUtBGAuMLY6o6Ua8PAuNCoKXbqPmJd1JYnQfg==} @@ -40016,8 +40013,6 @@ snapshots: '@types/vscode@1.81.0': {} - '@types/vscode@1.83.1': {} - '@types/vscode@1.84.0': {} '@types/webpack-env@1.18.8': {} @@ -40931,8 +40926,8 @@ snapshots: '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: @@ -40946,8 +40941,8 @@ snapshots: '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: @@ -48893,7 +48888,10 @@ snapshots: pretty-format: 25.5.0 throat: 5.0.0 transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - utf-8-validate jest-leak-detector@25.5.0: dependencies: diff --git a/workspaces/ballerina/ballerina-core/package.json b/workspaces/ballerina/ballerina-core/package.json index d0b244499c1..6cdc7184063 100644 --- a/workspaces/ballerina/ballerina-core/package.json +++ b/workspaces/ballerina/ballerina-core/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "@types/node": "22.15.21", - "@types/vscode": "1.83.1", + "@types/vscode": "1.100.0", "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@types/react": "18.2.0", diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 4cde986c71c..dca54c302d1 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1201,7 +1201,7 @@ "test": "pnpm run test-compile && node ./out/test/runTest.js", "test:ai": "pnpm run test-compile && node ./out/test/runAiTest.js", "test:libs-integration": "pnpm run test-compile && node ./out/test/runLibsIntegrationTest.js", - "e2e-test-setup": "npx extest get-vscode -c 1.83.1 && npx extest get-chromedriver -c 1.83.1 && npx extest install-vsix -f $(ls vsix/*.vsix)", + "e2e-test-setup": "npx extest get-vscode -c 1.100.0 && npx extest get-chromedriver -c 1.100.0 && npx extest install-vsix -f $(ls vsix/*.vsix)", "preui-test": "node -e \"const fs = require('fs'); if (fs.existsSync('test-resou')) { fs.unlinkSync('test-resou'); }\"", "e2e-test": "pnpm run test-compile && npx extest run-tests 'out/ui-test/*.test.js' --mocha_config ui-test/.mocharc.js -o ui-test/settings.json", "test-coverage": "cross-env COVER_CONFIG=html pnpm run test", @@ -1268,7 +1268,7 @@ "@types/mocha": "10.0.3", "@types/node": "18.18.7", "@types/tcp-port-used": "1.0.3", - "@types/vscode": "1.83.1", + "@types/vscode": "1.100.0", "@types/vscode-notebook-renderer": "1.72.2", "adm-zip": "0.5.16", "axios": "1.12.0", From a4325c44f32301df143c2afb32b161b77a3e942e Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Wed, 4 Feb 2026 21:27:49 +0530 Subject: [PATCH 143/247] Add centralized approval view manager with chat overlay coordination Implements ApprovalViewManager singleton to manage approval view lifecycles, including opening, tracking, and cleanup. Introduces ApprovalOverlayState interface for type-safe chat overlay control via RPC notifications. --- .../src/rpc-types/visualizer/index.ts | 4 +- .../src/rpc-types/visualizer/interfaces.ts | 8 + .../src/rpc-types/visualizer/rpc-type.ts | 4 +- .../ballerina-core/src/state-machine-types.ts | 12 +- .../ballerina-extension/src/RPCLayer.ts | 10 +- .../src/features/ai/agent/AgentExecutor.ts | 13 +- .../features/ai/state/ApprovalViewManager.ts | 336 ++++++++++++++++++ .../rpc-managers/visualizer/rpc-handler.ts | 6 + .../rpc-managers/visualizer/rpc-manager.ts | 11 + .../ballerina-extension/src/stateMachine.ts | 5 + .../src/stateMachinePopup.ts | 3 + .../src/views/ai-panel/webview.ts | 4 + .../src/views/visualizer/webview.ts | 8 +- .../src/BallerinaRpcClient.ts | 8 +- .../src/rpc-clients/visualizer/rpc-client.ts | 12 + .../ballerina-visualizer/src/MainPanel.tsx | 9 + .../ballerina-visualizer/src/PopupPanel.tsx | 11 + .../views/AIPanel/components/AIChat/index.tsx | 20 +- .../AIPanel/components/BasePopup/index.tsx | 156 ++++++++ .../src/views/AIPanel/styles.tsx | 23 ++ .../src/views/BI/Connection/styles.ts | 15 + 21 files changed, 662 insertions(+), 16 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/BasePopup/index.tsx diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts index cbfefe9d229..d48d8e7e00f 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts @@ -19,7 +19,7 @@ import { HistoryEntry } from "../../history"; import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind } from "../../state-machine-types"; -import { AddToUndoStackRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, UndoRedoStateResponse } from "./interfaces"; +import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse } from "./interfaces"; export interface VisualizerAPI { openView: (params: OpenViewRequest) => void; @@ -37,4 +37,6 @@ export interface VisualizerAPI { getThemeKind: () => Promise<ColorThemeKind>; updateCurrentArtifactLocation: (params: UpdatedArtifactsResponse) => Promise<ProjectStructureArtifactResponse>; reviewAccepted: () => void; + handleApprovalPopupClose: (params: HandleApprovalPopupCloseRequest) => void; + reopenApprovalView: (params: ReopenApprovalViewRequest) => void; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts index dd0301a1fec..9ec49066897 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts @@ -59,3 +59,11 @@ export interface JoinProjectPathResponse { filePath: string; projectPath: string; } + +export interface HandleApprovalPopupCloseRequest { + requestId: string; +} + +export interface ReopenApprovalViewRequest { + requestId: string; +} diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts index ba0722f647e..e0ed47e17c0 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts @@ -20,7 +20,7 @@ import { HistoryEntry } from "../../history"; import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind } from "../../state-machine-types"; -import { AddToUndoStackRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, UndoRedoStateResponse } from "./interfaces"; +import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse } from "./interfaces"; import { NotificationType, RequestType } from "vscode-messenger-common"; const _preFix = "visualizer"; @@ -40,3 +40,5 @@ export const getThemeKind: RequestType<void, ColorThemeKind> = { method: `${_pre export const updateCurrentArtifactLocation: RequestType<UpdatedArtifactsResponse, ProjectStructureArtifactResponse> = { method: `${_preFix}/updateCurrentArtifactLocation` }; export const reviewAccepted: NotificationType<void> = { method: `${_preFix}/reviewAccepted` }; export const refreshReviewMode: NotificationType<void> = { method: `${_preFix}/refreshReviewMode` }; +export const handleApprovalPopupClose: NotificationType<HandleApprovalPopupCloseRequest> = { method: `${_preFix}/handleApprovalPopupClose` }; +export const reopenApprovalView: NotificationType<ReopenApprovalViewRequest> = { method: `${_preFix}/reopenApprovalView` }; diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 465de5ecf14..fc4a4ddff84 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -141,6 +141,7 @@ export interface VisualizerLocation { isGraphql?: boolean; rootDiagramId?: string; metadata?: VisualizerMetadata; + agentMetadata?: AgentMetadata; scope?: SCOPE; projectStructure?: ProjectStructureResponse; org?: string; @@ -164,6 +165,14 @@ export interface ArtifactData { identifier?: string; } +export interface AgentMetadata { +} + +export interface ApprovalOverlayState { + show: boolean; + message?: string; +} + export interface VisualizerMetadata { haveLS?: boolean; isBISupported?: boolean; @@ -379,6 +388,7 @@ export const popupStateChanged: NotificationType<PopupMachineStateValue> = { met export const getPopupVisualizerState: RequestType<void, PopupVisualizerLocation> = { method: 'getPopupVisualizerState' }; export const breakpointChanged: NotificationType<boolean> = { method: 'breakpointChanged' }; +export const approvalOverlayState: NotificationType<ApprovalOverlayState> = { method: 'approvalOverlayState' }; // ------------------> AI Related state types <----------------------- export type AIMachineStateValue = @@ -567,7 +577,7 @@ export enum TaskTypes { export interface Task { description: string; status: TaskStatus; - type : TaskTypes; + type: TaskTypes; } export interface Plan { diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index a43b3b1cfeb..4f7481c5bc0 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -19,7 +19,7 @@ import { WebviewView, WebviewPanel, window } from 'vscode'; import { Messenger } from 'vscode-messenger'; import { StateMachine } from './stateMachine'; -import { stateChanged, getVisualizerLocation, VisualizerLocation, projectContentUpdated, aiStateChanged, sendAIStateEvent, popupStateChanged, getPopupVisualizerState, PopupVisualizerLocation, breakpointChanged, AIMachineEventType, ArtifactData, onArtifactUpdatedNotification, onArtifactUpdatedRequest, currentThemeChanged, AIMachineSendableEvent, checkpointCaptured, CheckpointCapturedPayload, promptUpdated } from '@wso2/ballerina-core'; +import { stateChanged, getVisualizerLocation, VisualizerLocation, projectContentUpdated, aiStateChanged, sendAIStateEvent, popupStateChanged, getPopupVisualizerState, PopupVisualizerLocation, breakpointChanged, AIMachineEventType, ArtifactData, onArtifactUpdatedNotification, onArtifactUpdatedRequest, currentThemeChanged, AIMachineSendableEvent, checkpointCaptured, CheckpointCapturedPayload, promptUpdated, approvalOverlayState, ApprovalOverlayState } 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'; @@ -150,7 +150,8 @@ async function getContext(): Promise<VisualizerLocation> { package: context.package, dataMapperMetadata: context.dataMapperMetadata, artifactInfo: context.artifactInfo, - reviewData: context.reviewData + reviewData: context.reviewData, + agentMetadata: context.agentMetadata }); }); } @@ -164,6 +165,7 @@ async function getPopupContext(): Promise<PopupVisualizerLocation> { recentIdentifier: context.recentIdentifier, identifier: context.identifier, metadata: context.metadata, + agentMetadata: context.agentMetadata, dataMapperMetadata: context.dataMapperMetadata }); }); @@ -193,3 +195,7 @@ export function notifyBreakpointChange() { export function notifyCheckpointCaptured(payload: CheckpointCapturedPayload) { RPCLayer._messenger.sendNotification(checkpointCaptured, { type: 'webview', webviewType: AiPanelWebview.viewType }, payload); } + +export function notifyApprovalOverlayState(state: ApprovalOverlayState) { + RPCLayer._messenger.sendNotification(approvalOverlayState, { type: 'webview', webviewType: AiPanelWebview.viewType }, state); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index ce60265145b..4622c6fce49 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -17,7 +17,7 @@ */ import { AICommandExecutor, AICommandConfig, AIExecutionResult } from '../executors/base/AICommandExecutor'; -import { Command, GenerateAgentCodeRequest, ProjectSource, EVENT_TYPE, MACHINE_VIEW, refreshReviewMode, ExecutionContext } from '@wso2/ballerina-core'; +import { Command, GenerateAgentCodeRequest, ProjectSource, MACHINE_VIEW, refreshReviewMode, ExecutionContext } from '@wso2/ballerina-core'; import { ModelMessage, stepCountIs, streamText, TextStreamPart } from 'ai'; import { getAnthropicClient, getProviderCacheControl, ANTHROPIC_SONNET_4 } from '../utils/ai-client'; import { populateHistoryForAgent, getErrorMessage } from '../utils/ai-utils'; @@ -30,10 +30,10 @@ import { StreamContext } from './stream-handlers/stream-context'; import { checkCompilationErrors } from './tools/diagnostics-utils'; import { updateAndSaveChat } from '../utils/events'; import { chatStateStorage } from '../../../views/ai-panel/chatStateStorage'; -import { openView } from '../../../stateMachine'; import { RPCLayer } from '../../../RPCLayer'; import { VisualizerWebview } from '../../../views/visualizer/webview'; import * as path from 'path'; +import { approvalViewManager } from '../state/ApprovalViewManager'; /** * Determines which packages have been affected by analyzing modified files @@ -70,7 +70,7 @@ function determineAffectedPackages( for (const project of projects) { if (project.packagePath === "") { // Root package in workspace (edge case) - if (!modifiedFile.includes('/') || + if (!modifiedFile.includes('/') || !projects.some(p => p.packagePath && modifiedFile.startsWith(p.packagePath + '/'))) { // Root package is at the temp project path directly affectedPackages.add(tempProjectPath); @@ -80,7 +80,7 @@ function determineAffectedPackages( } } else { // Package with a specific path in workspace - if (modifiedFile.startsWith(project.packagePath + '/') || + if (modifiedFile.startsWith(project.packagePath + '/') || modifiedFile === project.packagePath) { // Map to temp package path: tempProjectPath + relative package path const tempPackagePath = path.join(tempProjectPath, project.packagePath); @@ -456,9 +456,8 @@ Generation stopped by user. The last in-progress task was not saved. Files have affectedPackagePaths: affectedPackagePaths, }); - // Automatically open review mode - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.ReviewMode }); - console.log("[AgentExecutor] Automatically opened review mode"); + // Open ReviewMode + approvalViewManager.openView(MACHINE_VIEW.ReviewMode); // Notify ReviewMode component to refresh its data setTimeout(() => { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts new file mode 100644 index 00000000000..a5f7f35055e --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts @@ -0,0 +1,336 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { MACHINE_VIEW, EVENT_TYPE, VisualizerLocation, PopupVisualizerLocation, AgentMetadata } from '@wso2/ballerina-core'; +import { AiPanelWebview } from '../../../views/ai-panel/webview'; +import { VisualizerWebview } from '../../../views/visualizer/webview'; +import { openView as openMainView, StateMachine } from '../../../stateMachine'; +import { openPopupView, StateMachinePopup } from '../../../stateMachinePopup'; +import { notifyApprovalOverlayState } from '../../../RPCLayer'; + +export type ApprovalType = 'credential' | 'task' | 'plan' | 'connector_spec'; + +interface OpenedApprovalView { + requestId: string; + viewType: 'popup' | 'main' | 'inline'; + approvalType: ApprovalType; + machineView: MACHINE_VIEW | null; + isAutoOpened: boolean; + hadExistingVisualizer: boolean; + timestamp: number; + isClosed?: boolean; + projectPath?: string; + agentMetadata?: AgentMetadata; +} + +/** + * Centralized manager for approval view lifecycles. + * Handles opening, tracking, and cleanup of approval views with chat overlay coordination. + */ +export class ApprovalViewManager { + private static instance: ApprovalViewManager; + private openedViews = new Map<string, OpenedApprovalView>(); + + private constructor() {} + + static getInstance(): ApprovalViewManager { + if (!this.instance) { + this.instance = new ApprovalViewManager(); + } + return this.instance; + } + + /** + * Register an inline approval shown in chat without opening a separate view. + */ + registerInlineApproval( + requestId: string, + approvalType: ApprovalType + ): void { + console.log(`[ApprovalViewManager] Registering inline ${approvalType} approval:`, requestId); + + this.openedViews.set(requestId, { + requestId, + viewType: 'inline', + approvalType, + machineView: null, + isAutoOpened: true, + hadExistingVisualizer: false, + timestamp: Date.now() + }); + } + + /** + * Open an approval view as popup (or main view if no visualizer exists). + */ + openApprovalViewPopup( + requestId: string, + approvalType: ApprovalType, + viewLocation: VisualizerLocation | PopupVisualizerLocation + ): void { + const isAutoOpened = true; + const machineView = viewLocation.view!; + const projectPath = viewLocation.projectPath; + const agentMetadata = 'agentMetadata' in viewLocation ? viewLocation.agentMetadata : undefined; + + const { viewType, hadExistingVisualizer } = this._openApprovalViewPopup( + machineView, + projectPath, + agentMetadata + ); + + console.log(`[ApprovalViewManager] Opening ${approvalType} view:`, { + requestId, + machineView, + viewType, + isAutoOpened, + hadExistingVisualizer + }); + + this.openedViews.set(requestId, { + requestId, + viewType, + approvalType, + machineView, + isAutoOpened, + hadExistingVisualizer, + timestamp: Date.now(), + projectPath, + agentMetadata + }); + + const overlayMessage = this.getOverlayMessage(approvalType); + this.sendChatOverlayNotification(true, overlayMessage); + } + + private sendChatOverlayNotification(show: boolean, message?: string): void { + try { + notifyApprovalOverlayState({ show, message }); + console.log(`[ApprovalViewManager] Chat overlay ${show ? 'enabled' : 'disabled'}`, message ? `with message: ${message}` : ''); + } catch (error) { + console.error('[ApprovalViewManager] Failed to send chat overlay notification:', error); + } + } + + private getOverlayMessage(approvalType: ApprovalType): string { + const messages: Record<ApprovalType, string> = { + 'credential': 'Waiting for credentials...', + 'task': 'Waiting for task approval...', + 'plan': 'Waiting for plan approval...', + 'connector_spec': 'Waiting for connector spec approval...' + }; + return messages[approvalType]; + } + + getView(requestId: string): OpenedApprovalView | undefined { + return this.openedViews.get(requestId); + } + + /** + * Check if there are any active approval views requiring chat overlay. + */ + hasActiveApprovals(): boolean { + return Array.from(this.openedViews.values()).some(view => !view.isClosed); + } + + /** + * Handle popup close by user. Preserves metadata for reopening and manages navigation. + */ + handlePopupClosed(requestId: string): void { + const view = this.openedViews.get(requestId); + if (!view) { return; } + + console.log(`[ApprovalViewManager] Popup closed by user:`, { + requestId, + hadExistingVisualizer: view.hadExistingVisualizer + }); + + view.isClosed = true; + + if (!this.hasActiveApprovals()) { + this.sendChatOverlayNotification(false); + } + + if (!view.hadExistingVisualizer) { + const ctx = StateMachine.context(); + openMainView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.PackageOverview, + projectPath: ctx.projectPath + }); + } + } + + cleanupView(requestId: string, clearMetadata: boolean = true): void { + const view = this.openedViews.get(requestId); + if (!view) { return; } + + console.log(`[ApprovalViewManager] Cleaning up ${view.approvalType} view:`, requestId); + + if (clearMetadata) { + this.clearViewMetadata(view); + } + + this.openedViews.delete(requestId); + this.sendChatOverlayNotification(false); + } + + cleanupAllViews(): void { + console.log('[ApprovalViewManager] Cleaning up all approval views'); + + const allViews = Array.from(this.openedViews.values()); + + for (const view of allViews) { + this.clearViewMetadata(view); + } + + this.openedViews.clear(); + this.sendChatOverlayNotification(false); + } + + private clearViewMetadata(view: OpenedApprovalView): void { + console.log(`[ApprovalViewManager] Clearing metadata for ${view.approvalType}:`, view.requestId); + + if (view.viewType === 'inline') { + return; + } + + if (view.viewType === 'popup') { + const ctx = StateMachinePopup.context(); + + if (ctx.view === view.machineView) { + StateMachinePopup.sendEvent(EVENT_TYPE.CLOSE_VIEW, { + view: null, + agentMetadata: undefined + }); + } + } else if (view.viewType === 'main') { + const ctx = StateMachine.context(); + + if (ctx.view === view.machineView) { + openMainView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.PackageOverview, + projectPath: ctx.projectPath + }); + } + } + } + + onVisualizerClosed(): void { + if (!this.hasActiveApprovals()) { + return; + } + + console.log('[ApprovalViewManager] VisualizerWebview closed, marking all views as closed'); + + for (const view of this.openedViews.values()) { + view.isClosed = true; + } + + this.sendChatOverlayNotification(false); + } + + getOpenViews(): OpenedApprovalView[] { + return Array.from(this.openedViews.values()); + } + + /** + * Opens approval view as popup if visualizer exists, otherwise as main view. + */ + private _openApprovalViewPopup( + machineView: MACHINE_VIEW, + projectPath: string, + agentMetadata?: AgentMetadata + ): { viewType: 'popup' | 'main', hadExistingVisualizer: boolean } { + const hadExistingVisualizer = !!VisualizerWebview.currentPanel; + const viewType: 'popup' | 'main' = hadExistingVisualizer ? 'popup' : 'main'; + + if (viewType === 'popup') { + openPopupView(EVENT_TYPE.OPEN_VIEW, { + view: machineView, + projectPath, + agentMetadata + }); + } else { + openMainView(EVENT_TYPE.OPEN_VIEW, { + view: machineView, + projectPath, + agentMetadata + }); + } + + return { viewType, hadExistingVisualizer }; + } + + /** + * Reopen a previously closed approval view. + */ + reopenApprovalViewPopup(requestId: string): void { + const view = this.openedViews.get(requestId); + + if (!view) { + console.error('[ApprovalViewManager] Cannot reopen - approval view not found:', requestId); + return; + } + + if (view.viewType === 'inline') { + console.log('[ApprovalViewManager] Inline approval - no view to reopen'); + return; + } + + if (!view.projectPath || !view.machineView) { + console.error('[ApprovalViewManager] Cannot reopen - missing required metadata:', requestId); + return; + } + + console.log(`[ApprovalViewManager] Reopening ${view.approvalType} view:`, { + requestId, + wasClosed: view.isClosed, + viewType: view.viewType + }); + + view.isClosed = false; + view.isAutoOpened = false; + + const overlayMessage = this.getOverlayMessage(view.approvalType); + this.sendChatOverlayNotification(true, overlayMessage); + + const { viewType, hadExistingVisualizer } = this._openApprovalViewPopup( + view.machineView, + view.projectPath, + view.agentMetadata + ); + view.viewType = viewType; + view.hadExistingVisualizer = hadExistingVisualizer; + } + + /** + * Open a view in main view (not as popup, no tracking). + * Only opens if AI panel is active. + */ + openView(machineView: MACHINE_VIEW): void { + if (!AiPanelWebview.currentPanel) { + console.log(`[ApprovalViewManager] Skipping ${machineView} open (AI panel closed)`); + return; + } + + console.log(`[ApprovalViewManager] Opening ${machineView} in main view`); + openMainView(EVENT_TYPE.OPEN_VIEW, { view: machineView }); + } +} + +export const approvalViewManager = ApprovalViewManager.getInstance(); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts index 32b05613080..b45287c51c0 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts @@ -26,12 +26,16 @@ import { goBack, goHome, goSelected, + handleApprovalPopupClose, + HandleApprovalPopupCloseRequest, HistoryEntry, joinProjectPath, JoinProjectPathRequest, openView, OpenViewRequest, redo, + reopenApprovalView, + ReopenApprovalViewRequest, resetUndoRedoStack, undo, undoRedoState, @@ -59,4 +63,6 @@ export function registerVisualizerRpcHandlers(messenger: Messenger) { messenger.onRequest(getThemeKind, () => rpcManger.getThemeKind()); messenger.onRequest(updateCurrentArtifactLocation, (args: UpdatedArtifactsResponse) => rpcManger.updateCurrentArtifactLocation(args)); messenger.onNotification(reviewAccepted, () => rpcManger.reviewAccepted()); + messenger.onNotification(handleApprovalPopupClose, (args: HandleApprovalPopupCloseRequest) => rpcManger.handleApprovalPopupClose(args)); + messenger.onNotification(reopenApprovalView, (args: ReopenApprovalViewRequest) => rpcManger.reopenApprovalView(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index 7a271dee1c2..7a74f439649 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -19,6 +19,7 @@ import { AddToUndoStackRequest, ColorThemeKind, EVENT_TYPE, + HandleApprovalPopupCloseRequest, HistoryEntry, JoinProjectPathRequest, JoinProjectPathResponse, @@ -26,6 +27,7 @@ import { OpenViewRequest, PopupVisualizerLocation, ProjectStructureArtifactResponse, + ReopenApprovalViewRequest, SHARED_COMMANDS, undo, UndoRedoStateResponse, @@ -37,6 +39,7 @@ import fs from "fs"; import { commands, Range, Uri, window, workspace, WorkspaceEdit } from "vscode"; import { URI, Utils } from "vscode-uri"; import { notifyCurrentWebview } from "../../RPCLayer"; +import { approvalViewManager } from "../../features/ai/state/ApprovalViewManager"; import { history, openView, StateMachine, undoRedoManager, updateView } from "../../stateMachine"; import { openPopupView } from "../../stateMachinePopup"; import { ArtifactNotificationHandler, ArtifactsUpdated } from "../../utils/project-artifacts-handler"; @@ -303,4 +306,12 @@ export class VisualizerRpcManager implements VisualizerAPI { } ); } + + handleApprovalPopupClose(params: HandleApprovalPopupCloseRequest): void { + approvalViewManager.handlePopupClosed(params.requestId); + } + + reopenApprovalView(params: ReopenApprovalViewRequest): void { + approvalViewManager.reopenApprovalViewPopup(params.requestId); + } } diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index 87e89eef813..00fe66ee434 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -310,6 +310,7 @@ const stateMachine = createMachine<MachineContext>( type: (context, event) => event.viewLocation?.type, isGraphql: (context, event) => event.viewLocation?.isGraphql, metadata: (context, event) => event.viewLocation?.metadata, + agentMetadata: (context, event) => event.viewLocation?.agentMetadata, addType: (context, event) => event.viewLocation?.addType, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, artifactInfo: (context, event) => event.viewLocation?.artifactInfo, @@ -375,6 +376,7 @@ const stateMachine = createMachine<MachineContext>( position: (context, event) => event.data.position, syntaxTree: (context, event) => event.data.syntaxTree, focusFlowDiagramView: (context, event) => event.data.focusFlowDiagramView, + agentMetadata: (context, event) => event.data.agentMetadata, dataMapperMetadata: (context, event) => event.data.dataMapperMetadata, reviewData: (context, event) => event.data.reviewData, isViewUpdateTransition: false @@ -399,6 +401,7 @@ const stateMachine = createMachine<MachineContext>( type: (context, event) => event.viewLocation?.type, isGraphql: (context, event) => event.viewLocation?.isGraphql, metadata: (context, event) => event.viewLocation?.metadata, + agentMetadata: (context, event) => event.viewLocation?.agentMetadata, addType: (context, event) => event.viewLocation?.addType, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, artifactInfo: (context, event) => event.viewLocation?.artifactInfo, @@ -424,6 +427,7 @@ const stateMachine = createMachine<MachineContext>( identifier: (context, event) => event.viewLocation.identifier, serviceType: (context, event) => event.viewLocation.serviceType, type: (context, event) => event.viewLocation?.type, + agentMetadata: (context, event) => event.viewLocation?.agentMetadata, isGraphql: (context, event) => event.viewLocation?.isGraphql, addType: (context, event) => event.viewLocation?.addType, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, @@ -652,6 +656,7 @@ const stateMachine = createMachine<MachineContext>( type: context?.type, isGraphql: context?.isGraphql, addType: context?.addType, + agentMetadata: context?.agentMetadata, dataMapperMetadata: context?.dataMapperMetadata, reviewData: context?.reviewData } diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachinePopup.ts b/workspaces/ballerina/ballerina-extension/src/stateMachinePopup.ts index b0506e90673..0764575e099 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachinePopup.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachinePopup.ts @@ -66,6 +66,7 @@ const stateMachinePopup = createMachine<PopupMachineContext>({ identifier: (context, event) => event.viewLocation.identifier, documentUri: (context, event) => event.viewLocation.documentUri, metadata: (context, event) => event.viewLocation.metadata, + agentMetadata: (context, event) => event.viewLocation?.agentMetadata, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata }) }, @@ -85,6 +86,7 @@ const stateMachinePopup = createMachine<PopupMachineContext>({ identifier: (context, event) => event.viewLocation.identifier, documentUri: (context, event) => event.viewLocation.documentUri, metadata: (context, event) => event.viewLocation.metadata, + agentMetadata: (context, event) => event.viewLocation?.agentMetadata, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata }) }, @@ -96,6 +98,7 @@ const stateMachinePopup = createMachine<PopupMachineContext>({ identifier: (context, event) => event.viewLocation.identifier, documentUri: (context, event) => event.viewLocation.documentUri, metadata: (context, event) => event.viewLocation.metadata, + agentMetadata: (context, event) => event.viewLocation?.agentMetadata, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata }) }, diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/webview.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/webview.ts index a22a7f477d1..d5cf9e0489a 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/webview.ts @@ -24,6 +24,7 @@ import { RPCLayer } from '../../RPCLayer'; import { extension } from '../../BalExtensionContext'; import { AIStateMachine } from './aiMachine'; import { AIMachineEventType } from '@wso2/ballerina-core'; +import { approvalManager } from '../../features/ai/state/ApprovalManager'; export class AiPanelWebview { public static currentPanel: AiPanelWebview | undefined; @@ -126,6 +127,9 @@ export class AiPanelWebview { } public dispose() { + + approvalManager.cancelAllPending("AI Panel closed"); + AiPanelWebview.currentPanel = undefined; AIStateMachine.sendEvent(AIMachineEventType.DISPOSE); this._panel?.dispose(); diff --git a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts index 4b13946ad73..6a70e71d062 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts @@ -28,6 +28,8 @@ import { LANGUAGE } from "../../core"; import { CodeData, MACHINE_VIEW } from "@wso2/ballerina-core"; import { refreshDataMapper } from "../../rpc-managers/data-mapper/utils"; import { AiPanelWebview } from "../ai-panel/webview"; +import { approvalViewManager } from "../../features/ai/state/ApprovalViewManager"; +import { StateMachinePopup } from "../../stateMachinePopup"; export class VisualizerWebview { public static currentPanel: VisualizerWebview | undefined; @@ -106,8 +108,10 @@ export class VisualizerWebview { vscode.commands.executeCommand('setContext', 'isBalVisualizerActive', this._panel?.active); // Refresh the webview when becomes active const state = StateMachine.state(); + const popupState = StateMachinePopup.state(); const machineReady = typeof state === 'object' && 'viewActive' in state && state.viewActive === "viewReady"; - if (this._panel?.active && machineReady) { + const popupActive = typeof popupState === 'object' && 'open' in popupState && popupState.open === "active"; + if (this._panel?.active && machineReady && !popupActive) { sendUpdateNotificationToWebview(true); } }); @@ -281,6 +285,8 @@ export class VisualizerWebview { } public dispose() { + approvalViewManager.onVisualizerClosed(); + VisualizerWebview.currentPanel = undefined; this._panel?.dispose(); diff --git a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts index f4cba7d1927..599835e60db 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts @@ -59,7 +59,9 @@ import { ProjectMigrationResult, onMigratedProject, refreshReviewMode, - onHideReviewActions + onHideReviewActions, + approvalOverlayState, + ApprovalOverlayState } from "@wso2/ballerina-core"; import { LangClientRpcClient } from "./rpc-clients/lang-client/rpc-client"; import { LibraryBrowserRpcClient } from "./rpc-clients/library-browser/rpc-client"; @@ -280,4 +282,8 @@ export class BallerinaRpcClient { onHideReviewActions(callback: () => void) { this.messenger.onNotification(onHideReviewActions, callback); } + + onApprovalOverlayState(callback: (data: ApprovalOverlayState) => void) { + this.messenger.onNotification(approvalOverlayState, callback); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts index 9e76681ec11..8ba1710a9b2 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts @@ -20,10 +20,12 @@ import { AddToUndoStackRequest, ColorThemeKind, + HandleApprovalPopupCloseRequest, HistoryEntry, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, + ReopenApprovalViewRequest, ProjectStructureArtifactResponse, UndoRedoStateResponse, UpdatedArtifactsResponse, @@ -35,9 +37,11 @@ import { goBack, goHome, goSelected, + handleApprovalPopupClose, joinProjectPath, openView, redo, + reopenApprovalView, resetUndoRedoStack, undo, undoRedoState, @@ -113,4 +117,12 @@ export class VisualizerRpcClient implements VisualizerAPI { reviewAccepted(): void { return this._messenger.sendNotification(reviewAccepted, HOST_EXTENSION); } + + handleApprovalPopupClose(params: HandleApprovalPopupCloseRequest): void { + return this._messenger.sendNotification(handleApprovalPopupClose, HOST_EXTENSION, params); + } + + reopenApprovalView(params: ReopenApprovalViewRequest): void { + return this._messenger.sendNotification(reopenApprovalView, HOST_EXTENSION, params); + } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 33a96ea173a..9be045c8df7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -668,6 +668,15 @@ const MainPanel = () => { rpcClient.getVisualizerRpcClient().goHome(); }; + const handleApprovalClose = (approvalData: any | undefined) => { + const requestId = approvalData?.requestId; + + if (requestId) { + console.log('[MainPanel] Approval view closed, notifying backend:', requestId); + rpcClient.getVisualizerRpcClient().handleApprovalPopupClose({ requestId }); + } + }; + const handlePopupClose = (id: string) => { closeModal(id); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx index a998858bd9f..b8627d6e102 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx @@ -67,6 +67,17 @@ const PopupPanel = (props: PopupPanelProps) => { fetchContext(); }, []); + const handleApprovalClose = (approvalData: any | undefined) => { + const requestId = approvalData?.requestId; + + if (requestId) { + console.log('[PopupPanel] Approval view closed, notifying backend:', requestId); + rpcClient.getVisualizerRpcClient().handleApprovalPopupClose({ requestId }); + } + + onClose(); + }; + const fetchContext = () => { rpcClient.getPopupVisualizerState().then((machineState: PopupVisualizerLocation) => { switch (machineState?.view) { 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 369b2dd9732..7cf41ad4c2f 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 @@ -34,6 +34,7 @@ import { DocGenerationType, FileChanges, CodeContext, + ApprovalOverlayState, } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; @@ -48,7 +49,7 @@ import RoleContainer from "../RoleContainter"; import CheckpointSeparator from "../CheckpointSeparator"; import { Attachment, AttachmentStatus, TaskApprovalRequest } from "@wso2/ballerina-core"; -import { AIChatView, Header, HeaderButtons, ChatMessage, Badge } from "../../styles"; +import { AIChatView, Header, HeaderButtons, ChatMessage, Badge, ApprovalOverlay, OverlayMessage } from "../../styles"; import ReferenceDropdown from "../ReferenceDropdown"; import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"; import MarkdownRenderer from "../MarkdownRenderer"; @@ -136,6 +137,7 @@ const AIChat: React.FC = () => { const [availableCheckpointIds, setAvailableCheckpointIds] = useState<Set<string>>(new Set()); const [approvalRequest, setApprovalRequest] = useState<TaskApprovalRequest | null>(null); + const [approvalOverlay, setApprovalOverlay] = useState<ApprovalOverlayState>({ show: false }); const [currentFileArray, setCurrentFileArray] = useState<SourceFile[]>([]); const [codeContext, setCodeContext] = useState<CodeContext | undefined>(undefined); @@ -277,6 +279,15 @@ const AIChat: React.FC = () => { rpcClient.onHideReviewActions(handleHideReviewActions); }, [rpcClient]); + useEffect(() => { + const handleApprovalOverlay = (data: ApprovalOverlayState) => { + console.log("[AIChat] Approval overlay notification:", data); + setApprovalOverlay(data); + }; + + rpcClient.onApprovalOverlayState(handleApprovalOverlay); + }, [rpcClient]); + /** * Effect: Load initial chat history from aiChatMachine context */ @@ -1331,7 +1342,12 @@ const AIChat: React.FC = () => { return ( <> {!showSettings && ( - <AIChatView> + <AIChatView style={{ position: "relative" }}> + {approvalOverlay.show && ( + <ApprovalOverlay> + <OverlayMessage>{approvalOverlay.message || 'Processing...'}</OverlayMessage> + </ApprovalOverlay> + )} <Header> <Badge> Remaining Free Usage: {"Unlimited"} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/BasePopup/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/BasePopup/index.tsx new file mode 100644 index 00000000000..39296810b88 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/BasePopup/index.tsx @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styled from "@emotion/styled"; +import { Button, Codicon, Overlay, ThemeColors, Typography } from "@wso2/ui-toolkit"; + +const PopupOverlay = styled(Overlay)` + z-index: 1999; +`; + +const PopupContainer = styled.div<{ width?: string; maxWidth?: string; height?: string }>` + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: ${(props: { width?: string }) => props.width || "80%"}; + max-width: ${(props: { maxWidth?: string }) => props.maxWidth || "800px"}; + height: ${(props: { height?: string }) => props.height || "auto"}; + max-height: 80vh; + min-height: 200px; + z-index: 2000; + background-color: ${ThemeColors.SURFACE_BRIGHT}; + border-radius: 10px; + overflow: hidden; + display: flex; + flex-direction: column; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); +`; + +const PopupHeader = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + gap: 16px; + border-bottom: 1px solid ${ThemeColors.OUTLINE_VARIANT}; +`; + +const BackButton = styled(Button)` + min-width: auto; + padding: 4px; +`; + +const HeaderTitleContainer = styled.div` + flex: 1; + display: flex; + flex-direction: column; + gap: 4px; +`; + +const PopupTitle = styled(Typography)` + font-size: 20px; + font-weight: 600; + color: ${ThemeColors.ON_SURFACE}; + margin: 0; +`; + +const PopupSubtitle = styled(Typography)` + font-size: 12px; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + margin: 0; +`; + +const CloseButton = styled(Button)` + min-width: auto; + padding: 4px; +`; + +const PopupContent = styled.div` + flex: 1; + overflow-y: auto; + padding: 16px 20px; + display: flex; + flex-direction: column; + gap: 16px; +`; + +const PopupFooter = styled.div` + padding: 16px 20px; + display: flex; + justify-content: flex-end; + gap: 8px; + border-top: 1px solid ${ThemeColors.OUTLINE_VARIANT}; +`; + +export interface BasePopupProps { + isOpen: boolean; + title: string; + subtitle?: string; + onClose: () => void; + onBack?: () => void; + children: React.ReactNode; + footer?: React.ReactNode; + width?: string; + maxWidth?: string; + height?: string; +} + +export const BasePopup: React.FC<BasePopupProps> = ({ + isOpen, + title, + subtitle, + onClose, + onBack, + children, + footer, + width, + maxWidth, + height, +}) => { + if (!isOpen) { + return null; + } + + return ( + <> + <PopupOverlay sx={{ background: `${ThemeColors.SURFACE_CONTAINER}`, opacity: `0.5` }} /> + <PopupContainer width={width} maxWidth={maxWidth} height={height}> + <PopupHeader> + {onBack && ( + <BackButton appearance="icon" onClick={onBack}> + <Codicon name="chevron-left" /> + </BackButton> + )} + <HeaderTitleContainer> + <PopupTitle variant="h2">{title}</PopupTitle> + {subtitle && <PopupSubtitle variant="body2">{subtitle}</PopupSubtitle>} + </HeaderTitleContainer> + <CloseButton appearance="icon" onClick={onClose}> + <Codicon name="close" /> + </CloseButton> + </PopupHeader> + <PopupContent>{children}</PopupContent> + {footer && <PopupFooter>{footer}</PopupFooter>} + </PopupContainer> + </> + ); +}; + +export default BasePopup; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/styles.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/styles.tsx index e05cab3ce56..33a7dbe2f5b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/styles.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/styles.tsx @@ -75,3 +75,26 @@ export const Badge = styled.div` export const ResetsInBadge = styled.div` font-size: 10px; `; + +export const ApprovalOverlay = styled.div` + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + pointer-events: all; +`; + +export const OverlayMessage = styled.div` + color: var(--vscode-foreground); + font-size: 14px; + padding: 16px 24px; + background: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; +`; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/styles.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/styles.ts index 9533291f0f1..a4b1c31711e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/styles.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Connection/styles.ts @@ -81,4 +81,19 @@ export const CloseButton = styled(Button)` padding: 4px; `; +export const PopupContent = styled.div` + flex: 1; + overflow-y: auto; + padding: 16px 20px; + display: flex; + flex-direction: column; + gap: 16px; +`; +export const PopupFooter = styled.div` + padding: 16px 20px; + display: flex; + justify-content: flex-end; + gap: 8px; + border-top: 1px solid ${ThemeColors.OUTLINE_VARIANT}; +`; From 6c2a419e45a0cd3122d9c90e65d65688b86d1c10 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Tue, 10 Feb 2026 14:53:50 +0530 Subject: [PATCH 144/247] chore: update axios version to 1.13.5 in package.json and pnpm-lock.yaml to fix vulnerability --- common/config/rush/pnpm-lock.yaml | 18 +++++++++--------- .../ballerina/ballerina-extension/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 9d2fecf45e3..78fa6908d7a 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -598,8 +598,8 @@ importers: specifier: 0.5.16 version: 0.5.16 axios: - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.13.5 + version: 1.13.5 chai: specifier: 4.3.10 version: 4.3.10 @@ -12668,8 +12668,8 @@ packages: axios@1.12.0: resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} - axios@1.13.4: - resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -39159,7 +39159,7 @@ snapshots: '@swagger-api/apidom-core': 1.4.0 '@swagger-api/apidom-error': 1.4.0 '@types/ramda': 0.30.2 - axios: 1.13.4 + axios: 1.13.5 minimatch: 7.4.6 process: 0.11.10 ramda: 0.30.1 @@ -40922,7 +40922,7 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: @@ -40937,7 +40937,7 @@ snapshots: '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: @@ -41614,7 +41614,7 @@ snapshots: transitivePeerDependencies: - debug - axios@1.13.4: + axios@1.13.5: dependencies: follow-redirects: 1.15.11(debug@3.2.7) form-data: 4.0.5 @@ -59141,7 +59141,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.104.1) + webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index dca54c302d1..64bab1b6b10 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1271,7 +1271,7 @@ "@types/vscode": "1.100.0", "@types/vscode-notebook-renderer": "1.72.2", "adm-zip": "0.5.16", - "axios": "1.12.0", + "axios": "1.13.5", "chai": "4.3.10", "copyfiles": "2.4.1", "cross-env": "7.0.3", From 9babc5f863d6cef013cadb2d6763de5bf4913a77 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Tue, 10 Feb 2026 15:15:47 +0530 Subject: [PATCH 145/247] chore: update axios version to 1.13.5 in multiple package.json files and pnpm-lock.yaml --- common/config/rush/pnpm-lock.yaml | 52 ++++++------------- .../api-designer-extension/package.json | 2 +- .../choreo/choreo-extension/package.json | 2 +- workspaces/mi/mi-extension/package.json | 2 +- .../wso2-platform-extension/package.json | 2 +- 5 files changed, 19 insertions(+), 41 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 78fa6908d7a..c7364217b64 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -68,8 +68,8 @@ importers: specifier: 0.5.14 version: 0.5.14 axios: - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.13.5 + version: 1.13.5 copyfiles: specifier: 2.4.1 version: 2.4.1 @@ -2751,8 +2751,8 @@ importers: specifier: workspace:* version: link:../../common-libs/playwright-vscode-tester axios: - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.13.5 + version: 1.13.5 copy-webpack-plugin: specifier: 13.0.0 version: 13.0.0(webpack@5.104.1) @@ -3767,8 +3767,8 @@ importers: specifier: 5.0.76 version: 5.0.76(zod@4.1.11) axios: - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.13.5 + version: 1.13.5 copyfiles: specifier: 2.4.1 version: 2.4.1 @@ -4367,8 +4367,8 @@ importers: specifier: workspace:* version: link:../../common-libs/playwright-vscode-tester axios: - specifier: 1.9.0 - version: 1.9.0 + specifier: 1.13.5 + version: 1.13.5 copy-webpack-plugin: specifier: 13.0.0 version: 13.0.0(webpack@5.104.1) @@ -12665,15 +12665,9 @@ packages: resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} - axios@1.12.0: - resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} - axios@1.13.5: resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} - 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'} @@ -40922,12 +40916,12 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: @@ -40937,12 +40931,12 @@ snapshots: '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: @@ -41606,14 +41600,6 @@ snapshots: axe-core@4.11.1: {} - axios@1.12.0: - dependencies: - follow-redirects: 1.15.11(debug@3.2.7) - form-data: 4.0.5 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.13.5: dependencies: follow-redirects: 1.15.11(debug@3.2.7) @@ -41622,14 +41608,6 @@ snapshots: transitivePeerDependencies: - debug - axios@1.9.0: - dependencies: - follow-redirects: 1.15.11(debug@3.2.7) - form-data: 4.0.5 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axobject-query@4.1.0: {} azure-devops-node-api@12.5.0: @@ -59141,7 +59119,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 5.1.4(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/workspaces/api-designer/api-designer-extension/package.json b/workspaces/api-designer/api-designer-extension/package.json index 058204dab32..7cf55d39eb9 100644 --- a/workspaces/api-designer/api-designer-extension/package.json +++ b/workspaces/api-designer/api-designer-extension/package.json @@ -123,7 +123,7 @@ "@types/xml2js": "0.4.12", "jsonix": "3.0.0", "lodash": "4.17.23", - "axios": "1.12.0", + "axios": "1.13.5", "@types/lodash": "4.14.199", "xstate": "4.38.3", "node-fetch": "2.6.7", diff --git a/workspaces/choreo/choreo-extension/package.json b/workspaces/choreo/choreo-extension/package.json index 3e7db9415bb..6c961e63588 100644 --- a/workspaces/choreo/choreo-extension/package.json +++ b/workspaces/choreo/choreo-extension/package.json @@ -195,7 +195,7 @@ "@types/which": "3.0.4", "@vscode/vsce": "3.7.0", "@wso2/playwright-vscode-tester": "workspace:*", - "axios": "1.12.0", + "axios": "1.13.5", "copyfiles": "2.4.1", "del-cli": "6.0.0", "mocha": "11.5.0", diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 7c4ebb1c8e3..12b81fc67e1 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -1089,7 +1089,7 @@ "@wso2/mi-syntax-tree": "workspace:*", "@wso2/playwright-vscode-tester": "workspace:*", "adm-zip": "0.5.16", - "axios": "1.12.0", + "axios": "1.13.5", "copyfiles": "2.4.1", "cors-anywhere": "0.4.4", "dotenv": "16.5.0", diff --git a/workspaces/wso2-platform/wso2-platform-extension/package.json b/workspaces/wso2-platform/wso2-platform-extension/package.json index e9b345a02b2..48192c797f8 100644 --- a/workspaces/wso2-platform/wso2-platform-extension/package.json +++ b/workspaces/wso2-platform/wso2-platform-extension/package.json @@ -247,7 +247,7 @@ "@types/which": "3.0.4", "@vscode/vsce": "3.7.0", "@wso2/playwright-vscode-tester": "workspace:*", - "axios": "1.9.0", + "axios": "1.13.5", "copyfiles": "2.4.1", "del-cli": "6.0.0", "mocha": "11.5.0", From 977c55b69862a577ed296f5153b37fada538b8ab Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Tue, 10 Feb 2026 15:34:04 +0530 Subject: [PATCH 146/247] Add type property to ListenerModelRequest and update ServiceConfigureView to manage listener types --- .../src/interfaces/extended-lang-client.ts | 1 + .../ServiceDesigner/ServiceConfigureView.tsx | 30 +++++++++++++++++-- 2 files changed, 29 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 4cd2cfe64c1..657a6851edb 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1308,6 +1308,7 @@ export interface ListenerModelRequest { packageName: string; moduleName: string; version: string; + type: string; }; filePath: string; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx index f4a97acd6c6..5201ee67f00 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx @@ -18,7 +18,7 @@ import { useEffect, useState, useRef } from "react"; import styled from "@emotion/styled"; -import { ConfigVariable, DIRECTORY_MAP, getPrimaryInputType, LineRange, ListenerModel, NodePosition, ProjectStructureArtifactResponse, ServiceModel } from "@wso2/ballerina-core"; +import { ConfigProperties, ConfigVariable, DIRECTORY_MAP, getPrimaryInputType, LineRange, ListenerModel, NodePosition, ProjectStructureArtifactResponse, ServiceModel } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Button, Codicon, Icon, LinkButton, ProgressRing, SidePanelBody, SplitView, TabPanel, ThemeColors, TreeView, TreeViewItem, Typography, View, ViewContent } from "@wso2/ui-toolkit"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; @@ -202,6 +202,7 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { const [isSaving, setIsSaving] = useState<boolean>(false); const [hasChanges, setHasChanges] = useState<boolean>(false); + const [existingListenerType, setExistingListenerType] = useState<string>(""); // Example: "Listener", "CdcListener" const [selectedListener, setSelectedListener] = useState<string | null>(null); @@ -558,6 +559,12 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { setIsSaving(false); } + const handleSetListenerType = (type: string) => { + if (!existingListenerType) { + setExistingListenerType(type); + } + } + return ( <View> <TopNavigationBar projectPath={props.projectPath} /> @@ -733,6 +740,7 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { filePath={listener.path} position={listener.position} onChange={handleListenerChange} + setListenerType={handleSetListenerType} /> </div> </AccordionContainer> @@ -747,6 +755,7 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { packageName={serviceModel.packageName} version={serviceModel.version} moduleName={serviceModel.moduleName} + type={existingListenerType} onAttachListener={handleOnAttachListener} attachedListeners={listeners.map(listener => listener.name)} /> @@ -776,10 +785,11 @@ interface ServiceConfigureListenerEditViewProps { filePath: string; position: NodePosition; onChange?: (data: ListenerModel, filePath: string, position: NodePosition) => void; + setListenerType?: (type: string) => void; } function ServiceConfigureListenerEditView(props: ServiceConfigureListenerEditViewProps) { - const { filePath, position, onChange } = props; + const { filePath, position, onChange, setListenerType } = props; const { rpcClient } = useRpcContext(); const [listenerModel, setListenerModel] = useState<ListenerModel>(undefined); @@ -792,9 +802,23 @@ function ServiceConfigureListenerEditView(props: ServiceConfigureListenerEditVie rpcClient.getServiceDesignerRpcClient().getListenerModelFromCode({ filePath, codedata: { lineRange } }).then(res => { console.log("Editing Listener Model: ", res.listener) setListenerModel(res.listener); + setListenerTypeFromProperties(res.listener.properties); }) }, [position]); + const setListenerTypeFromProperties = (properties: ConfigProperties) => { + // The canonical key for the listener type property in config is "listenerType" + // Find the object key where the property is for listenerType or label "Listener Type" + const listenerTypeKey = Object.keys(properties).find( + key => + (properties[key] as any).name === "listenerType" || + (properties[key] as any).metadata?.label === "Listener Type" + ); + if (listenerTypeKey && properties[listenerTypeKey]?.value) { + setListenerType(properties[listenerTypeKey].value); + } + }; + const onSubmit = async (value: ListenerModel) => { setSaving(true); const res = await rpcClient.getServiceDesignerRpcClient().updateListenerSourceCode({ filePath, listener: value }); @@ -858,6 +882,7 @@ interface AttachListenerModalProps { moduleName: string; packageName: string; version: string; + type: string; attachedListeners: string[]; onAttachListener: (listenerName: string) => void; } @@ -895,6 +920,7 @@ function AttachListenerModal(props: AttachListenerModalProps) { packageName: props.packageName, moduleName: props.moduleName, version: props.version, + type: props.type, }, filePath: props.filePath }; From bb87be42fc11ecd3262633ab577d287b3ee002ea Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Tue, 10 Feb 2026 20:18:36 +0530 Subject: [PATCH 147/247] Make type property optional in ListenerModelRequest interface --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 2 +- 1 file changed, 1 insertion(+), 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 657a6851edb..ebb2a08d09d 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1308,7 +1308,7 @@ export interface ListenerModelRequest { packageName: string; moduleName: string; version: string; - type: string; + type?: string; }; filePath: string; } From 62a174bc068857550dee4095e90365159daddc2b Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Tue, 10 Feb 2026 22:51:48 +0530 Subject: [PATCH 148/247] Update dependencies in package.json - upgraded @modelcontextprotocol/sdk to version 1.26.0 - added axios dependency at version ^1.13.5 - added hono dependency at version ^4.11.7 - added fast-xml-parser dependency at version 5.3.4 --- common/config/rush/.pnpmfile.cjs | 24 + common/config/rush/pnpm-lock.yaml | 2142 +++++++++++++++-------------- package.json | 7 +- 3 files changed, 1103 insertions(+), 1070 deletions(-) diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 973889d99a4..88819ceadc2 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -21,9 +21,15 @@ module.exports = { } // Security vulnerability fixes + if (pkg.dependencies['@modelcontextprotocol/sdk']) { + pkg.dependencies['@modelcontextprotocol/sdk'] = '^1.26.0'; + } if (pkg.dependencies['@isaacs/brace-expansion']) { pkg.dependencies['@isaacs/brace-expansion'] = '^5.0.1'; } + if (pkg.dependencies['axios']) { + pkg.dependencies['axios'] = '^1.13.5'; + } if (pkg.dependencies['brace-expansion']) { pkg.dependencies['brace-expansion'] = '^2.0.2'; } @@ -75,13 +81,25 @@ module.exports = { if (pkg.dependencies['fast-xml-parser']) { pkg.dependencies['fast-xml-parser'] = '5.3.4'; } + if (pkg.dependencies['hono']) { + pkg.dependencies['hono'] = '^4.11.7'; + } + if (pkg.dependencies['lodash']) { + pkg.dependencies['lodash'] = '4.17.23'; + } } if (pkg.devDependencies) { // Security vulnerability fixes for dev dependencies + if (pkg.devDependencies['@modelcontextprotocol/sdk']) { + pkg.devDependencies['@modelcontextprotocol/sdk'] = '^1.26.0'; + } if (pkg.devDependencies['@isaacs/brace-expansion']) { pkg.devDependencies['@isaacs/brace-expansion'] = '^5.0.1'; } + if (pkg.devDependencies['axios']) { + pkg.devDependencies['axios'] = '^1.13.5'; + } if (pkg.devDependencies['brace-expansion']) { pkg.devDependencies['brace-expansion'] = '^2.0.2'; } @@ -130,6 +148,12 @@ module.exports = { if (pkg.devDependencies['fast-xml-parser']) { pkg.devDependencies['fast-xml-parser'] = '5.3.4'; } + if (pkg.devDependencies['hono']) { + pkg.devDependencies['hono'] = '^4.11.7'; + } + if (pkg.devDependencies['lodash']) { + pkg.devDependencies['lodash'] = '4.17.23'; + } } return pkg; diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 710963c6cec..c2c624776da 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -77,8 +77,8 @@ importers: specifier: ~0.5.14 version: 0.5.16 axios: - specifier: ~1.12.0 - version: 1.12.2 + specifier: ^1.13.5 + version: 1.13.5 copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -102,7 +102,7 @@ importers: version: 2.6.13(encoding@0.1.13) node-loader: specifier: ~2.0.0 - version: 2.0.0(webpack@5.105.0) + version: 2.0.0(webpack@5.105.1) portfinder: specifier: ^1.0.32 version: 1.0.38 @@ -145,16 +145,16 @@ importers: version: 5.0.10 ts-loader: specifier: ^9.4.4 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@5.1.4) + version: 5.105.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.105.0) + version: 5.1.4(webpack@5.105.1) ../../workspaces/api-designer/api-designer-rpc-client: dependencies: @@ -291,7 +291,7 @@ importers: version: 4.14.202 '@types/node': specifier: ^20.10.6 - version: 20.19.31 + version: 20.19.33 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -309,31 +309,31 @@ importers: version: 2.4.1 css-loader: specifier: ^5.2.7 - version: 5.2.7(webpack@5.105.0) + version: 5.2.7(webpack@5.105.1) sass-loader: specifier: ^13.2.0 - version: 13.3.3(sass@1.97.3)(webpack@5.105.0) + version: 13.3.3(sass@1.97.3)(webpack@5.105.1) source-map-loader: specifier: ^4.0.1 - version: 4.0.2(webpack@5.105.0) + version: 4.0.2(webpack@5.105.1) style-loader: specifier: ^1.3.0 - version: 1.3.0(webpack@5.105.0) + version: 1.3.0(webpack@5.105.1) ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@5.1.4) + version: 5.105.1(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) ../../workspaces/apk/apk-extension: devDependencies: @@ -454,10 +454,10 @@ importers: dependencies: '@ai-sdk/amazon-bedrock': specifier: ^4.0.4 - version: 4.0.48(zod@4.1.11) + version: 4.0.55(zod@4.1.11) '@ai-sdk/anthropic': specifier: ^3.0.2 - version: 3.0.36(zod@4.1.11) + version: 3.0.41(zod@4.1.11) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -490,7 +490,7 @@ importers: version: link:../../wso2-platform/wso2-platform-core ai: specifier: ^6.0.7 - version: 6.0.70(zod@4.1.11) + version: 6.0.78(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -604,8 +604,8 @@ importers: specifier: ^0.5.16 version: 0.5.16 axios: - specifier: ^1.12.0 - version: 1.12.2 + specifier: ^1.13.5 + version: 1.13.5 chai: specifier: ^4.3.10 version: 4.5.0 @@ -653,7 +653,7 @@ importers: version: 1.0.2 ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.3) @@ -668,10 +668,10 @@ importers: version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.0) + version: 6.0.1(webpack@5.105.1) yarn: specifier: ^1.22.19 version: 1.22.22 @@ -774,7 +774,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1) '@storybook/addon-links': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -819,25 +819,25 @@ importers: version: 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.0) + version: 13.0.1(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) express: specifier: ^4.22.1 version: 4.22.1 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.105.0) + version: 9.1.0(typescript@5.8.3)(webpack@5.105.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -876,13 +876,13 @@ importers: version: 1.97.3 sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.105.0) + version: 16.0.7(sass@1.97.3)(webpack@5.105.1) storybook: specifier: ^8.6.14 version: 8.6.15(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) stylelint: specifier: ^16.19.1 version: 16.26.1(typescript@5.8.3) @@ -891,10 +891,10 @@ importers: version: 38.0.0(stylelint@16.26.1(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.105.0) + version: 8.0.0(webpack@5.105.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -912,13 +912,13 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + version: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -985,7 +985,7 @@ importers: version: 6.19.1 '@codemirror/commands': specifier: ~6.10.0 - version: 6.10.1 + version: 6.10.2 '@codemirror/lang-sql': specifier: ~6.10.0 version: 6.10.0 @@ -1063,7 +1063,7 @@ importers: version: 1.4.4 prosemirror-view: specifier: ~1.41.3 - version: 1.41.5 + version: 1.41.6 react: specifier: 18.2.0 version: 18.2.0 @@ -1085,7 +1085,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -1266,7 +1266,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -1278,28 +1278,28 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.105.0) + version: 16.0.7(sass@1.97.3)(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@5.1.4) + version: 5.105.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -1369,7 +1369,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1487,7 +1487,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1647,7 +1647,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -1659,13 +1659,13 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) react-hook-form: specifier: ~7.56.3 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1708,7 +1708,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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1) '@storybook/addon-links': specifier: ^6.5.9 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1729,34 +1729,34 @@ importers: version: 18.2.0 babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) graphql: specifier: ^16.11.0 version: 16.12.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.10.0(webpack@5.105.0) + version: 2.10.0(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@4.10.0) + version: 5.105.1(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1935,7 +1935,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) html-to-image: specifier: ^1.10.8 version: 1.11.11 @@ -1978,31 +1978,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) ../../workspaces/ballerina/record-creator: dependencies: @@ -2139,7 +2139,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2181,10 +2181,10 @@ importers: version: 11.13.5 '@emotion/react': specifier: ^11.9.3 - version: 11.14.0(@types/react@17.0.90)(react@19.1.0) + version: 11.14.0(@types/react@17.0.91)(react@19.1.0) '@emotion/styled': specifier: ^11.10.5 - version: 11.14.1(@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0))(@types/react@17.0.90)(react@19.1.0) + version: 11.14.1(@emotion/react@11.14.0(@types/react@17.0.91)(react@19.1.0))(@types/react@17.0.91)(react@19.1.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 version: 4.43.0 @@ -2239,7 +2239,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2254,7 +2254,7 @@ importers: version: 4.0.9 '@types/react': specifier: ^17.0.37 - version: 17.0.90 + version: 17.0.91 '@types/react-dom': specifier: 17.0.14 version: 17.0.14 @@ -2342,31 +2342,31 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.105.0) + version: 16.0.7(sass@1.97.3)(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@5.1.4) + version: 5.105.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) ../../workspaces/ballerina/type-diagram: dependencies: @@ -2411,7 +2411,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -2460,31 +2460,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) ../../workspaces/ballerina/type-editor: dependencies: @@ -2618,7 +2618,7 @@ importers: version: link:../../common-libs/playwright-vscode-tester copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.0) + version: 13.0.1(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2636,16 +2636,16 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.0) + version: 6.0.1(webpack@5.105.1) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2757,11 +2757,11 @@ importers: specifier: workspace:* version: link:../../common-libs/playwright-vscode-tester axios: - specifier: ^1.12.0 - version: 1.12.2 + specifier: ^1.13.5 + version: 1.13.5 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.0) + version: 13.0.1(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2773,10 +2773,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2785,10 +2785,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.0) + version: 6.0.1(webpack@5.105.1) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2879,10 +2879,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) path: specifier: ^0.12.7 version: 0.12.7 @@ -2891,34 +2891,34 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.105.0) + version: 16.0.7(sass@1.97.3)(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) tailwindcss: specifier: ^3.4.3 version: 3.4.19(yaml@2.8.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: @@ -3213,7 +3213,7 @@ importers: version: 3.7.1 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.0) + version: 13.0.1(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3231,16 +3231,16 @@ importers: version: 6.1.6 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + version: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.105.0) + version: 5.1.4(webpack@5.105.1) ../../workspaces/mi/mi-component-diagram: dependencies: @@ -3286,7 +3286,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3447,7 +3447,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -3459,13 +3459,13 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) react-hook-form: specifier: 7.56.4 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) ts-morph: specifier: ^22.0.0 version: 22.0.0 @@ -3711,7 +3711,7 @@ importers: dependencies: '@ai-sdk/anthropic': specifier: ^2.0.35 - version: 2.0.58(zod@3.25.76) + version: 2.0.60(zod@3.25.76) '@apidevtools/json-schema-ref-parser': specifier: 12.0.2 version: 12.0.2 @@ -3771,10 +3771,10 @@ importers: version: 0.5.16 ai: specifier: ^5.0.76 - version: 5.0.126(zod@3.25.76) + version: 5.0.129(zod@3.25.76) axios: - specifier: ~1.12.0 - version: 1.12.2 + specifier: ^1.13.5 + version: 1.13.5 copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3819,7 +3819,7 @@ importers: version: 3.3.2 node-loader: specifier: ~2.1.0 - version: 2.1.0(webpack@5.105.0) + version: 2.1.0(webpack@5.105.1) portfinder: specifier: ^1.0.37 version: 1.0.38 @@ -3925,7 +3925,7 @@ importers: version: 6.0.1 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -3934,10 +3934,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@4.10.0) + version: 5.105.1(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.105.0) + version: 4.10.0(webpack@5.105.1) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4016,7 +4016,7 @@ importers: version: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 - version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@tanstack/query-core': specifier: ^5.76.0 version: 5.90.20 @@ -4176,19 +4176,19 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.105.0) + version: 16.0.7(sass@1.97.3)(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4197,13 +4197,13 @@ importers: version: 3.17.5 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@5.1.4) + version: 5.105.1(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4277,7 +4277,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.983.0 + version: 3.986.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -4373,11 +4373,11 @@ importers: specifier: workspace:* version: link:../../common-libs/playwright-vscode-tester axios: - specifier: ^1.9.0 - version: 1.12.2 + specifier: ^1.13.5 + version: 1.13.5 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.0) + version: 13.0.1(webpack@5.105.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -4389,10 +4389,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -4401,10 +4401,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.0) + version: 6.0.1(webpack@5.105.1) webpack-permissions-plugin: specifier: ^1.0.10 version: 1.0.10 @@ -4516,10 +4516,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.1) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.1) path: specifier: ^0.12.7 version: 0.12.7 @@ -4528,66 +4528,66 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.97.3)(webpack@5.105.0) + version: 16.0.7(sass@1.97.3)(webpack@5.105.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.0) + version: 4.0.0(webpack@5.105.1) tailwindcss: specifier: ^4.1.7 version: 4.1.18 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/amazon-bedrock@4.0.48': - resolution: {integrity: sha512-eo4f+RGWnj4LAJRtqOl3nkEz27e6L5LYCesa7cTyzmuC0fKbGgcveK8/6u8Cbl6GYahpRzEdV+YsaCGRjBADcg==} + '@ai-sdk/amazon-bedrock@4.0.55': + resolution: {integrity: sha512-fdZZxlFllfpwjweGHg4iUTs1TMIhkqJjdufRydevxMnLQMrFSFUagw7ktuhgF+mzS0ufivY6fe9jqHtrfJjPtg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.58': - resolution: {integrity: sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ==} + '@ai-sdk/anthropic@2.0.60': + resolution: {integrity: sha512-hpabbvnTHIP7y85TeFwkDHPveOxsMaCWTRRd1vb9My2EtJBKXGBG4eZhcR+DU98z1lXOlPRu1oGZhVNPttDW8g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.36': - resolution: {integrity: sha512-GHQccfwC0j1JltN9M47RSlBpOyHoUam0mvbYMf8zpE0UD1tzIX5sDw2m/8nRlrTz6wGuKfaDxmoC3XH7uhTrXg==} + '@ai-sdk/anthropic@3.0.41': + resolution: {integrity: sha512-Wk/YHKyP/MmvQ63MFGRwmm3URM3ey7Tg62y0a7MT+7/8kMVZ40pUYidYO0hB9YB+dHe4z1ks006mNfGYy+wzkA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.32': - resolution: {integrity: sha512-FT24EjSPOm+esohJO1KGFMfcKQJS2cbxSEL6GlAojlcty5CAmzpDCTU2AQb8lK2szKwGOKAnMhtBnWk/QWajPQ==} + '@ai-sdk/gateway@2.0.35': + resolution: {integrity: sha512-fMzhC9artgY2s2GgXEWB+cECRJEHHoFJKzDpzsuneguNQ656vydPHhvDdoMjbWW+UtLc4nGf3VwlqG0t4FeQ/w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.33': - resolution: {integrity: sha512-elnzKRxkC8ZL3IvOdklavkYTBgJhjP9l8b5MO6WYz1MBoT/0WdJoG3Jp31Olwpzk4hIac7z27S6a4q7DkhzsZg==} + '@ai-sdk/gateway@3.0.39': + resolution: {integrity: sha512-SeCZBAdDNbWpVUXiYgOAqis22p5MEYfrjRw0hiBa5hM+7sDGYQpMinUjkM8kbPXMkY+AhKLrHleBl+SuqpzlgA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4598,8 +4598,8 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.13': - resolution: {integrity: sha512-HHG72BN4d+OWTcq2NwTxOm/2qvk1duYsnhCDtsbYwn/h/4zeqURu1S0+Cn0nY2Ysq9a9HGKvrYuMn9bgFhR2Og==} + '@ai-sdk/provider-utils@4.0.14': + resolution: {integrity: sha512-7bzKd9lgiDeXM7O4U4nQ8iTxguAOkg8LZGD9AfDVZYjO5cKYRwBPwVjboFcVrxncRHu0tYxZtXZtiLKpG4pEng==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4608,8 +4608,8 @@ packages: resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.7': - resolution: {integrity: sha512-VkPLrutM6VdA924/mG8OS+5frbVTcu6e046D2bgDo00tehBANR1QBJ/mPcZ9tXMFOsVcm6SQArOregxePzTFPw==} + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} '@alloc/quick-lru@5.2.0': @@ -4655,52 +4655,52 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.983.0': - resolution: {integrity: sha512-V40PT2irPh3lj+Z95tZI6batVrjaTrWEOXRNVBuoZSgpM3Ak1jiE9ZXwVLkMcbb9/GH4xVpB3EsGM7gbxmgFLQ==} + '@aws-sdk/client-s3@3.986.0': + resolution: {integrity: sha512-IcDJ8shVVvbxgMe8+dLWcv6uhSwmX65PHTVGX81BhWAElPnp3CL8w/5uzOPRo4n4/bqIk9eskGVEIicw2o+SrA==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.982.0': - resolution: {integrity: sha512-qJrIiivmvujdGqJ0ldSUvhN3k3N7GtPesoOI1BSt0fNXovVnMz4C/JmnkhZihU7hJhDvxJaBROLYTU+lpild4w==} + '@aws-sdk/client-sso@3.985.0': + resolution: {integrity: sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.6': - resolution: {integrity: sha512-pz4ZOw3BLG0NdF25HoB9ymSYyPbMiIjwQJ2aROXRhAzt+b+EOxStfFv8s5iZyP6Kiw7aYhyWxj5G3NhmkoOTKw==} + '@aws-sdk/core@3.973.7': + resolution: {integrity: sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.0': resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.4': - resolution: {integrity: sha512-/8dnc7+XNMmViEom2xsNdArQxQPSgy4Z/lm6qaFPTrMFesT1bV3PsBhb19n09nmxHdrtQskYmViddUIjUQElXg==} + '@aws-sdk/credential-provider-env@3.972.5': + resolution: {integrity: sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.6': - resolution: {integrity: sha512-5ERWqRljiZv44AIdvIRQ3k+EAV0Sq2WeJHvXuK7gL7bovSxOf8Al7MLH7Eh3rdovH4KHFnlIty7J71mzvQBl5Q==} + '@aws-sdk/credential-provider-http@3.972.7': + resolution: {integrity: sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.4': - resolution: {integrity: sha512-eRUg+3HaUKuXWn/lEMirdiA5HOKmEl8hEHVuszIDt2MMBUKgVX5XNGmb3XmbgU17h6DZ+RtjbxQpjhz3SbTjZg==} + '@aws-sdk/credential-provider-ini@3.972.5': + resolution: {integrity: sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.4': - resolution: {integrity: sha512-nLGjXuvWWDlQAp505xIONI7Gam0vw2p7Qu3P6on/W2q7rjJXtYjtpHbcsaOjJ/pAju3eTvEQuSuRedcRHVQIAQ==} + '@aws-sdk/credential-provider-login@3.972.5': + resolution: {integrity: sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.5': - resolution: {integrity: sha512-VWXKgSISQCI2GKN3zakTNHSiZ0+mux7v6YHmmbLQp/o3fvYUQJmKGcLZZzg2GFA+tGGBStplra9VFNf/WwxpYg==} + '@aws-sdk/credential-provider-node@3.972.6': + resolution: {integrity: sha512-DZ3CnAAtSVtVz+G+ogqecaErMLgzph4JH5nYbHoBMgBkwTUV+SUcjsjOJwdBJTHu3Dm6l5LBYekZoU2nDqQk2A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.4': - resolution: {integrity: sha512-TCZpWUnBQN1YPk6grvd5x419OfXjHvhj5Oj44GYb84dOVChpg/+2VoEj+YVA4F4E/6huQPNnX7UYbTtxJqgihw==} + '@aws-sdk/credential-provider-process@3.972.5': + resolution: {integrity: sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.4': - resolution: {integrity: sha512-wzsGwv9mKlwJ3vHLyembBvGE/5nPUIwRR2I51B1cBV4Cb4ql9nIIfpmHzm050XYTY5fqTOKJQnhLj7zj89VG8g==} + '@aws-sdk/credential-provider-sso@3.972.5': + resolution: {integrity: sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.4': - resolution: {integrity: sha512-hIzw2XzrG8jzsUSEatehmpkd5rWzASg5IHUfA+m01k/RtvfAML7ZJVVohuKdhAYx+wV2AThLiQJVzqn7F0khrw==} + '@aws-sdk/credential-provider-web-identity@3.972.5': + resolution: {integrity: sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.972.3': @@ -4711,8 +4711,8 @@ packages: resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.4': - resolution: {integrity: sha512-xOxsUkF3O3BtIe3tf54OpPo94eZepjFm3z0Dd2TZKbsPxMiRTFXurC04wJ58o/wPW9YHVO9VqZik3MfoPfrKlw==} + '@aws-sdk/middleware-flexible-checksums@3.972.5': + resolution: {integrity: sha512-SF/1MYWx67OyCrLA4icIpWUfCkdlOi8Y1KecQ9xYxkL10GMjVdPTGPnYhAg0dw5U43Y9PVUWhAV2ezOaG+0BLg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.972.3': @@ -4731,32 +4731,32 @@ packages: resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.6': - resolution: {integrity: sha512-Xq7wM6kbgJN1UO++8dvH/efPb1nTwWqFCpZCR7RCLOETP7xAUAhVo7JmsCnML5Di/iC4Oo5VrJ4QmkYcMZniLw==} + '@aws-sdk/middleware-sdk-s3@3.972.7': + resolution: {integrity: sha512-VtZ7tMIw18VzjG+I6D6rh2eLkJfTtByiFoCIauGDtTTPBEUMQUiGaJ/zZrPlCY6BsvLLeFKz3+E5mntgiOWmIg==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.3': resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.6': - resolution: {integrity: sha512-TehLN8W/kivl0U9HcS+keryElEWORROpghDXZBLfnb40DXM7hx/i+7OOjkogXQOF3QtUraJVRkHQ07bPhrWKlw==} + '@aws-sdk/middleware-user-agent@3.972.7': + resolution: {integrity: sha512-HUD+geASjXSCyL/DHPQc/Ua7JhldTcIglVAoCV8kiVm99IaFSlAbTvEnyhZwdE6bdFyTL+uIaWLaCFSRsglZBQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.982.0': - resolution: {integrity: sha512-VVkaH27digrJfdVrT64rjkllvOp4oRiZuuJvrylLXAKl18ujToJR7AqpDldL/LS63RVne3QWIpkygIymxFtliQ==} + '@aws-sdk/nested-clients@3.985.0': + resolution: {integrity: sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.972.3': resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.983.0': - resolution: {integrity: sha512-11FCcxI/WKRufKDdPgKPXtrhjDArhkOPb4mf66rICZUnPHlD8Cb7cjZZS/eFC+iuwoHBosrxo0hYsvK3s7DxGw==} + '@aws-sdk/signature-v4-multi-region@3.986.0': + resolution: {integrity: sha512-Upw+rw7wCH93E6QWxqpAqJLrUmJYVUAWrk4tCOBnkeuwzGERZvJFL5UQ6TAJFj9T18Ih+vNFaACh8J5aP4oTBw==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.982.0': - resolution: {integrity: sha512-v3M0KYp2TVHYHNBT7jHD9lLTWAdS9CaWJ2jboRKt0WAB65bA7iUEpR+k4VqKYtpQN4+8kKSc4w+K6kUNZkHKQw==} + '@aws-sdk/token-providers@3.985.0': + resolution: {integrity: sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.1': @@ -4767,12 +4767,12 @@ packages: resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.982.0': - resolution: {integrity: sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==} + '@aws-sdk/util-endpoints@3.985.0': + resolution: {integrity: sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.983.0': - resolution: {integrity: sha512-t/VbL2X3gvDEjC4gdySOeFFOZGQEBKwa23pRHeB7hBLBZ119BB/2OEFtTFWKyp3bnMQgxpeVeGS7/hxk6wpKJw==} + '@aws-sdk/util-endpoints@3.986.0': + resolution: {integrity: sha512-Mqi79L38qi1gCG3adlVdbNrSxvcm1IPDLiJPA3OBypY5ewxUyWbaA3DD4goG+EwET6LSFgZJcRSIh6KBNpP5pA==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.4': @@ -4782,8 +4782,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.3': resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} - '@aws-sdk/util-user-agent-node@3.972.4': - resolution: {integrity: sha512-3WFCBLiM8QiHDfosQq3Py+lIMgWlFWwFQliUHUqwEiRqLnKyhgbU3AKa7AWJF7lW2Oc/2kFNY4MlAYVnVc0i8A==} + '@aws-sdk/util-user-agent-node@3.972.5': + resolution: {integrity: sha512-GsUDF+rXyxDZkkJxUsDxnA67FG+kc5W1dnloCFLl6fWzceevsCYzJpASBzT+BPjwUgREE6FngfJYYYMQUY5fZQ==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -5667,8 +5667,8 @@ packages: '@cacheable/memory@2.0.7': resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} - '@cacheable/utils@2.3.3': - resolution: {integrity: sha512-JsXDL70gQ+1Vc2W/KUFfkAJzgb4puKwwKehNLuB+HrNKWf91O736kGfxn4KujXCCSuh6mRRL4XEB0PkAFjWS0A==} + '@cacheable/utils@2.3.4': + resolution: {integrity: sha512-knwKUJEYgIfwShABS1BX6JyJJTglAFcEU7EXqzTdiGCXur4voqkiJkdgZIQtWNFhynzDWERcTYv/sETMu3uJWA==} '@cnakazawa/watch@1.0.4': resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} @@ -5678,8 +5678,8 @@ packages: '@codemirror/autocomplete@6.19.1': resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} - '@codemirror/commands@6.10.1': - resolution: {integrity: sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==} + '@codemirror/commands@6.10.2': + resolution: {integrity: sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==} '@codemirror/lang-angular@0.1.4': resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} @@ -5801,8 +5801,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.26': - resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} + '@csstools/css-syntax-patches-for-csstree@1.0.27': + resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -6269,6 +6269,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -6514,8 +6518,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/base64@17.65.0': - resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} + '@jsonjoy.com/base64@17.67.0': + resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6526,8 +6530,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/buffers@17.65.0': - resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} + '@jsonjoy.com/buffers@17.67.0': + resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6538,8 +6542,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/codegen@17.65.0': - resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} + '@jsonjoy.com/codegen@17.67.0': + resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6598,8 +6602,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@17.65.0': - resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} + '@jsonjoy.com/json-pack@17.67.0': + resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6610,8 +6614,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pointer@17.65.0': - resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} + '@jsonjoy.com/json-pointer@17.67.0': + resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6622,8 +6626,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/util@17.65.0': - resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} + '@jsonjoy.com/util@17.67.0': + resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -10197,8 +10201,8 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@20.19.31': - resolution: {integrity: sha512-5jsi0wpncvTD33Sh1UCgacK37FFwDn+EG7wCmEvs62fCvBL+n8/76cAYDok21NF6+jaVWIqKwCZyX7Vbu8eB3A==} + '@types/node@20.19.33': + resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -10272,8 +10276,8 @@ packages: '@types/react-test-renderer@19.1.0': resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} - '@types/react@17.0.90': - resolution: {integrity: sha512-P9beVR/x06U9rCJzSxtENnOr4BrbJ6VrsrDTc+73TtHv9XHhryXKbjGRB+6oooB2r0G/pQkD/S4dHo/7jUfwFw==} + '@types/react@17.0.91': + resolution: {integrity: sha512-xauZca6qMeCU3Moy0KxCM9jtf1vyk6qRYK39Ryf3afUqwgNUjRIGoDdS9BcGWgAMGSg1hvP4XcmlYrM66PtqeA==} '@types/react@18.2.0': resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==} @@ -10526,8 +10530,8 @@ packages: resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typespec/ts-http-runtime@0.3.2': - resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==} + '@typespec/ts-http-runtime@0.3.3': + resolution: {integrity: sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==} engines: {node: '>=20.0.0'} '@uiw/codemirror-extensions-basic-setup@4.23.14': @@ -11013,14 +11017,14 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@5.0.126: - resolution: {integrity: sha512-eXR9ZuyojCGLf1JNj3iwyrABTEjX9pJd/SQ0OOLzcotrXoTjQ/2CJ5JwcUbRu0jzWlKCsXDH4kv57D1jOAQR8w==} + ai@5.0.129: + resolution: {integrity: sha512-IARdFetNTedDfqpByNMm9p0oHj7JS+SpOrbgLdQdyCiDe70Xk07wnKP4Lub1ckCrxkhAxY3yxOHllGEjbpXgpQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - ai@6.0.70: - resolution: {integrity: sha512-1Osgqs/HSCqKNQt+u5THWI4sBpHZefiQWZIPv+MRJfIx7tGX34IMtXBDs05tZ6yW2P06fmB03w94UkPXWfdieA==} + ai@6.0.78: + resolution: {integrity: sha512-eriIX/NLWfWNDeE/OJy8wmIp9fyaH7gnxTOCPT5bp0MNkvORstp1TwRUql9au8XjXzH7o2WApqbwgxJDDV0Rbw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -11447,8 +11451,8 @@ packages: resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -12012,8 +12016,8 @@ packages: boundary@2.0.0: resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} - bowser@2.13.1: - resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} boxen@1.3.0: resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} @@ -12251,11 +12255,11 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001768: - resolution: {integrity: sha512-hbETk3toYOs+9qGqR0x4Bz4lKFRs6UD9zc4iUtRNwWJ3tRGkFcBxGM/UocIhPFMwA15s1zmtQMgyjo6auN+OTw==} + caniuse-db@1.0.30001769: + resolution: {integrity: sha512-YUJlOqWziYAdXSnL60FU2Won9HqW/IY77M8xgDFMRj5+StEnycCnlKvORrMPAevdyfYd8W6pjQ2XaEiMyDocWA==} - caniuse-lite@1.0.30001768: - resolution: {integrity: sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==} + caniuse-lite@1.0.30001769: + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} canvas@3.2.1: resolution: {integrity: sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==} @@ -12578,8 +12582,8 @@ packages: codemirror: ^5.65.3 graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - codemirror@5.65.20: - resolution: {integrity: sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==} + codemirror@5.65.21: + resolution: {integrity: sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==} codemirror@6.0.2: resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} @@ -12969,9 +12973,9 @@ packages: peerDependencies: postcss: ^8.0.9 - css-functions-list@3.2.3: - resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} - engines: {node: '>=12 || >=16'} + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} css-loader@0.28.7: resolution: {integrity: sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==} @@ -15093,8 +15097,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hono@4.11.7: - resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} + hono@4.11.9: + resolution: {integrity: sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==} engines: {node: '>=16.9.0'} hookified@1.15.1: @@ -15929,9 +15933,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} @@ -16030,8 +16034,8 @@ packages: 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==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} jake@10.9.4: @@ -17072,8 +17076,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} lru-cache@4.1.5: @@ -19246,8 +19250,8 @@ packages: prosemirror-transform@1.11.0: resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} - prosemirror-view@1.41.5: - resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} + prosemirror-view@1.41.6: + resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==} protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} @@ -20323,11 +20327,11 @@ packages: sass-embedded: optional: true - sass-loader@16.0.6: - resolution: {integrity: sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==} + sass-loader@16.0.7: + resolution: {integrity: sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==} engines: {node: '>= 18.12.0'} peerDependencies: - '@rspack/core': 0.x || 1.x + '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 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: '*' @@ -20429,8 +20433,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -21959,8 +21963,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.20.0: - resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} + undici@7.21.0: + resolution: {integrity: sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==} engines: {node: '>=20.18.1'} unfetch@4.2.0: @@ -22710,8 +22714,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.105.0: - resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + webpack@5.105.1: + resolution: {integrity: sha512-Gdj3X74CLJJ8zy4URmK42W7wTZUJrqL+z8nyGEr4dTN0kb3nVs+ZvjbTOqRYPD7qX4tUmwyHL9Q9K6T1seW6Yw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -23129,39 +23133,39 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/amazon-bedrock@4.0.48(zod@4.1.11)': + '@ai-sdk/amazon-bedrock@4.0.55(zod@4.1.11)': dependencies: - '@ai-sdk/anthropic': 3.0.36(zod@4.1.11) - '@ai-sdk/provider': 3.0.7 - '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) + '@ai-sdk/anthropic': 3.0.41(zod@4.1.11) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) '@smithy/eventstream-codec': 4.2.8 '@smithy/util-utf8': 4.2.0 aws4fetch: 1.0.20 zod: 4.1.11 - '@ai-sdk/anthropic@2.0.58(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.60(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/anthropic@3.0.36(zod@4.1.11)': + '@ai-sdk/anthropic@3.0.41(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 3.0.7 - '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/gateway@2.0.32(zod@3.25.76)': + '@ai-sdk/gateway@2.0.35(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@vercel/oidc': 3.1.0 zod: 3.25.76 - '@ai-sdk/gateway@3.0.33(zod@4.1.11)': + '@ai-sdk/gateway@3.0.39(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 3.0.7 - '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) '@vercel/oidc': 3.1.0 zod: 4.1.11 @@ -23172,9 +23176,9 @@ snapshots: eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.13(zod@4.1.11)': + '@ai-sdk/provider-utils@4.0.14(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 4.1.11 @@ -23183,7 +23187,7 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.7': + '@ai-sdk/provider@3.0.8': dependencies: json-schema: 0.4.0 @@ -23257,29 +23261,29 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.983.0': + '@aws-sdk/client-s3@3.986.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.973.6 - '@aws-sdk/credential-provider-node': 3.972.5 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/credential-provider-node': 3.972.6 '@aws-sdk/middleware-bucket-endpoint': 3.972.3 '@aws-sdk/middleware-expect-continue': 3.972.3 - '@aws-sdk/middleware-flexible-checksums': 3.972.4 + '@aws-sdk/middleware-flexible-checksums': 3.972.5 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-location-constraint': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-sdk-s3': 3.972.6 + '@aws-sdk/middleware-sdk-s3': 3.972.7 '@aws-sdk/middleware-ssec': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.7 '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/signature-v4-multi-region': 3.983.0 + '@aws-sdk/signature-v4-multi-region': 3.986.0 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.983.0 + '@aws-sdk/util-endpoints': 3.986.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.4 + '@aws-sdk/util-user-agent-node': 3.972.5 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.22.1 '@smithy/eventstream-serde-browser': 4.2.8 @@ -23317,20 +23321,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.982.0': + '@aws-sdk/client-sso@3.985.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.7 '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.982.0 + '@aws-sdk/util-endpoints': 3.985.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.4 + '@aws-sdk/util-user-agent-node': 3.972.5 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.22.1 '@smithy/fetch-http-handler': 5.3.9 @@ -23360,7 +23364,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.6': + '@aws-sdk/core@3.973.7': dependencies: '@aws-sdk/types': 3.973.1 '@aws-sdk/xml-builder': 3.972.4 @@ -23381,17 +23385,17 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.4': + '@aws-sdk/credential-provider-env@3.972.5': dependencies: - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.6': + '@aws-sdk/credential-provider-http@3.972.7': dependencies: - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/types': 3.973.1 '@smithy/fetch-http-handler': 5.3.9 '@smithy/node-http-handler': 4.4.9 @@ -23402,16 +23406,16 @@ snapshots: '@smithy/util-stream': 4.5.11 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.4': + '@aws-sdk/credential-provider-ini@3.972.5': dependencies: - '@aws-sdk/core': 3.973.6 - '@aws-sdk/credential-provider-env': 3.972.4 - '@aws-sdk/credential-provider-http': 3.972.6 - '@aws-sdk/credential-provider-login': 3.972.4 - '@aws-sdk/credential-provider-process': 3.972.4 - '@aws-sdk/credential-provider-sso': 3.972.4 - '@aws-sdk/credential-provider-web-identity': 3.972.4 - '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/credential-provider-env': 3.972.5 + '@aws-sdk/credential-provider-http': 3.972.7 + '@aws-sdk/credential-provider-login': 3.972.5 + '@aws-sdk/credential-provider-process': 3.972.5 + '@aws-sdk/credential-provider-sso': 3.972.5 + '@aws-sdk/credential-provider-web-identity': 3.972.5 + '@aws-sdk/nested-clients': 3.985.0 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -23421,10 +23425,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.4': + '@aws-sdk/credential-provider-login@3.972.5': dependencies: - '@aws-sdk/core': 3.973.6 - '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/nested-clients': 3.985.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -23434,14 +23438,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.5': + '@aws-sdk/credential-provider-node@3.972.6': dependencies: - '@aws-sdk/credential-provider-env': 3.972.4 - '@aws-sdk/credential-provider-http': 3.972.6 - '@aws-sdk/credential-provider-ini': 3.972.4 - '@aws-sdk/credential-provider-process': 3.972.4 - '@aws-sdk/credential-provider-sso': 3.972.4 - '@aws-sdk/credential-provider-web-identity': 3.972.4 + '@aws-sdk/credential-provider-env': 3.972.5 + '@aws-sdk/credential-provider-http': 3.972.7 + '@aws-sdk/credential-provider-ini': 3.972.5 + '@aws-sdk/credential-provider-process': 3.972.5 + '@aws-sdk/credential-provider-sso': 3.972.5 + '@aws-sdk/credential-provider-web-identity': 3.972.5 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -23451,20 +23455,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.4': + '@aws-sdk/credential-provider-process@3.972.5': dependencies: - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.4': + '@aws-sdk/credential-provider-sso@3.972.5': dependencies: - '@aws-sdk/client-sso': 3.982.0 - '@aws-sdk/core': 3.973.6 - '@aws-sdk/token-providers': 3.982.0 + '@aws-sdk/client-sso': 3.985.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/token-providers': 3.985.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23473,10 +23477,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.4': + '@aws-sdk/credential-provider-web-identity@3.972.5': dependencies: - '@aws-sdk/core': 3.973.6 - '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/nested-clients': 3.985.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23502,12 +23506,12 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.972.4': + '@aws-sdk/middleware-flexible-checksums@3.972.5': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/crc64-nvme': 3.972.0 '@aws-sdk/types': 3.973.1 '@smithy/is-array-buffer': 4.2.0 @@ -23546,9 +23550,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.6': + '@aws-sdk/middleware-sdk-s3@3.972.7': dependencies: - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/types': 3.973.1 '@aws-sdk/util-arn-parser': 3.972.2 '@smithy/core': 3.22.1 @@ -23569,30 +23573,30 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.6': + '@aws-sdk/middleware-user-agent@3.972.7': dependencies: - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.982.0 + '@aws-sdk/util-endpoints': 3.985.0 '@smithy/core': 3.22.1 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.982.0': + '@aws-sdk/nested-clients@3.985.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.6 + '@aws-sdk/core': 3.973.7 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.7 '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.982.0 + '@aws-sdk/util-endpoints': 3.985.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.4 + '@aws-sdk/util-user-agent-node': 3.972.5 '@smithy/config-resolver': 4.4.6 '@smithy/core': 3.22.1 '@smithy/fetch-http-handler': 5.3.9 @@ -23630,19 +23634,19 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.983.0': + '@aws-sdk/signature-v4-multi-region@3.986.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.6 + '@aws-sdk/middleware-sdk-s3': 3.972.7 '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.982.0': + '@aws-sdk/token-providers@3.985.0': dependencies: - '@aws-sdk/core': 3.973.6 - '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/core': 3.973.7 + '@aws-sdk/nested-clients': 3.985.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23660,7 +23664,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.982.0': + '@aws-sdk/util-endpoints@3.985.0': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 @@ -23668,7 +23672,7 @@ snapshots: '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.983.0': + '@aws-sdk/util-endpoints@3.986.0': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 @@ -23684,12 +23688,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 - bowser: 2.13.1 + bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.972.4': + '@aws-sdk/util-user-agent-node@3.972.5': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/middleware-user-agent': 3.972.7 '@aws-sdk/types': 3.973.1 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 @@ -23740,7 +23744,7 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.2 + '@typespec/ts-http-runtime': 0.3.3 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -23752,7 +23756,7 @@ snapshots: '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.2 + '@typespec/ts-http-runtime': 0.3.3 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -23775,7 +23779,7 @@ snapshots: '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.2 + '@typespec/ts-http-runtime': 0.3.3 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -24828,12 +24832,12 @@ snapshots: '@cacheable/memory@2.0.7': dependencies: - '@cacheable/utils': 2.3.3 + '@cacheable/utils': 2.3.4 '@keyv/bigmap': 1.3.1(keyv@5.6.0) hookified: 1.15.1 keyv: 5.6.0 - '@cacheable/utils@2.3.3': + '@cacheable/utils@2.3.4': dependencies: hashery: 1.4.0 keyv: 5.6.0 @@ -24850,7 +24854,7 @@ snapshots: '@codemirror/view': 6.38.8 '@lezer/common': 1.5.1 - '@codemirror/commands@6.10.1': + '@codemirror/commands@6.10.2': dependencies: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.4 @@ -25123,7 +25127,7 @@ snapshots: '@codesandbox/sandpack-react@2.20.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@codemirror/autocomplete': 6.19.1 - '@codemirror/commands': 6.10.1 + '@codemirror/commands': 6.10.2 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 @@ -25157,7 +25161,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.26': {} + '@csstools/css-syntax-patches-for-csstree@1.0.27': {} '@csstools/css-tokenizer@3.0.4': {} @@ -25256,7 +25260,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0)': + '@emotion/react@11.14.0(@types/react@17.0.91)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 @@ -25268,7 +25272,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.0 optionalDependencies: - '@types/react': 17.0.90 + '@types/react': 17.0.91 transitivePeerDependencies: - supports-color @@ -25314,18 +25318,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0))(@types/react@17.0.90)(react@19.1.0)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.91)(react@19.1.0))(@types/react@17.0.91)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@17.0.90)(react@19.1.0) + '@emotion/react': 11.14.0(@types/react@17.0.91)(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.90 + '@types/react': 17.0.91 transitivePeerDependencies: - supports-color @@ -25619,8 +25623,8 @@ snapshots: '@radix-ui/react-visually-hidden': 1.2.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) '@types/codemirror': 5.60.17 clsx: 1.2.1 - codemirror: 5.65.20 - codemirror-graphql: 2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.20)(graphql@16.12.0) + codemirror: 5.65.21 + codemirror-graphql: 2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.21)(graphql@16.12.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 @@ -25675,9 +25679,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.6.0(react@18.2.0) - '@hono/node-server@1.19.9(hono@4.11.7)': + '@hono/node-server@1.19.9(hono@4.11.9)': dependencies: - hono: 4.11.7 + hono: 4.11.9 '@hookform/resolvers@2.9.11(react-hook-form@7.56.4(react@18.2.0))': dependencies: @@ -25730,6 +25734,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -26297,7 +26303,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -26305,7 +26311,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -26313,7 +26319,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -26367,10 +26373,10 @@ snapshots: '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': @@ -26385,13 +26391,13 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) hyperdyperid: 1.2.0 thingies: 2.5.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) @@ -26403,9 +26409,9 @@ snapshots: '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': @@ -26414,10 +26420,10 @@ snapshots: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) tslib: 2.8.1 '@juggle/resize-observer@3.4.0': {} @@ -26962,7 +26968,7 @@ snapshots: '@modelcontextprotocol/sdk@1.26.0': dependencies: - '@hono/node-server': 1.19.9(hono@4.11.7) + '@hono/node-server': 1.19.9(hono@4.11.9) ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -26972,7 +26978,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.11.7 + hono: 4.11.9 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -27084,12 +27090,12 @@ snapshots: '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.3 + semver: 7.7.4 '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.3 + semver: 7.7.4 '@npmcli/move-file@1.1.2': dependencies: @@ -27282,7 +27288,7 @@ snapshots: dependencies: playwright: 1.55.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27292,14 +27298,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27309,14 +27315,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-server: 5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27326,14 +27332,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@4.10.0) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27343,14 +27349,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27360,14 +27366,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack@5.105.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': dependencies: anser: 2.3.5 core-js-pure: 3.48.0 @@ -27376,11 +27382,11 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) webpack-hot-middleware: 2.26.1 '@projectstorm/geometry@6.7.4': {} @@ -30049,7 +30055,7 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30069,7 +30075,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -30094,7 +30100,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30114,7 +30120,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -30223,13 +30229,13 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-controls': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30245,7 +30251,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30257,13 +30263,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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-controls': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30279,7 +30285,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30871,33 +30877,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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - file-loader: 6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 3.6.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - raw-loader: 4.0.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + raw-loader: 4.0.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - terser-webpack-plugin: 4.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30933,33 +30939,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) - file-loader: 6.2.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) - raw-loader: 4.0.2(webpack@5.105.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.1) + raw-loader: 4.0.2(webpack@5.105.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.105.0) - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + style-loader: 1.3.0(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30995,33 +31001,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) - file-loader: 6.2.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) - raw-loader: 4.0.2(webpack@5.105.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.1) + raw-loader: 4.0.2(webpack@5.105.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.105.0) - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + style-loader: 1.3.0(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31057,33 +31063,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) - file-loader: 6.2.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) - raw-loader: 4.0.2(webpack@5.105.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.1) + raw-loader: 4.0.2(webpack@5.105.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.105.0) - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + style-loader: 1.3.0(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31119,33 +31125,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) - file-loader: 6.2.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.0) - raw-loader: 4.0.2(webpack@5.105.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.1) + raw-loader: 4.0.2(webpack@5.105.1) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.105.0) - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + style-loader: 1.3.0(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31178,27 +31184,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.105.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) + css-loader: 5.2.7(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.6(webpack@5.105.0) + html-webpack-plugin: 5.6.6(webpack@5.105.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 2.0.0(webpack@5.105.0) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + style-loader: 2.0.0(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31232,27 +31238,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.105.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) + css-loader: 5.2.7(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.6(webpack@5.105.0) + html-webpack-plugin: 5.6.6(webpack@5.105.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 2.0.0(webpack@5.105.0) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + style-loader: 2.0.0(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31289,30 +31295,30 @@ snapshots: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.105.0) + css-loader: 6.11.0(webpack@5.105.1) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.6(webpack@5.105.0) + html-webpack-plugin: 5.6.6(webpack@5.105.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - semver: 7.7.3 - style-loader: 3.3.4(webpack@5.105.0) - swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + semver: 7.7.4 + style-loader: 3.3.4(webpack@5.105.1) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31350,30 +31356,30 @@ snapshots: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) path-browserify: 1.0.1 process: 0.11.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - semver: 7.7.3 - style-loader: 3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + semver: 7.7.4 + style-loader: 3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31397,23 +31403,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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + css-loader: 6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) - html-webpack-plugin: 5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + html-webpack-plugin: 5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.7.3 + semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + style-loader: 3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware: 6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack-dev-middleware: 6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31433,23 +31439,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.105.0) + css-loader: 6.11.0(webpack@5.105.1) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.0) - html-webpack-plugin: 5.6.6(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1) + html-webpack-plugin: 5.6.6(webpack@5.105.1) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.7.3 + semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.105.0) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + style-loader: 3.3.4(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.105.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31540,7 +31546,7 @@ snapshots: prompts: 2.4.2 puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 - semver: 7.7.3 + semver: 7.7.4 strip-json-comments: 3.1.1 tempy: 1.0.1 ts-dedent: 2.2.0 @@ -31573,7 +31579,7 @@ snapshots: leven: 3.1.0 p-limit: 6.2.0 prompts: 2.4.2 - semver: 7.7.3 + semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) tiny-invariant: 1.3.3 ts-dedent: 2.2.0 @@ -31757,7 +31763,7 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.5.3) - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31781,11 +31787,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31809,11 +31815,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.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.105.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/channel-postmessage': 6.5.16 @@ -31837,7 +31843,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 @@ -31874,7 +31880,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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31882,7 +31888,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31899,7 +31905,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31939,7 +31945,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31947,7 +31953,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31964,7 +31970,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32004,7 +32010,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32012,7 +32018,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32029,7 +32035,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32069,7 +32075,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32077,7 +32083,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32094,7 +32100,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32134,7 +32140,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.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32142,7 +32148,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32159,7 +32165,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32245,7 +32251,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32287,7 +32293,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32311,7 +32317,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32353,7 +32359,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32377,7 +32383,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32419,7 +32425,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32441,7 +32447,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32483,7 +32489,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32505,7 +32511,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32547,7 +32553,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32599,7 +32605,7 @@ snapshots: pretty-hrtime: 1.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 - semver: 7.7.3 + semver: 7.7.4 telejson: 7.2.0 tiny-invariant: 1.3.3 ts-dedent: 2.2.0 @@ -32629,13 +32635,13 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -32653,13 +32659,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -32677,13 +32683,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32699,13 +32705,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.1) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32721,13 +32727,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.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.105.1) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32753,7 +32759,7 @@ snapshots: jsdoc-type-pratt-parser: 4.8.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.3 + semver: 7.7.4 util: 0.12.5 ws: 8.19.0 optionalDependencies: @@ -32921,7 +32927,7 @@ snapshots: memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - semver: 7.7.3 + semver: 7.7.4 store2: 2.14.4 telejson: 7.2.0 ts-dedent: 2.2.0 @@ -32941,7 +32947,7 @@ snapshots: memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - semver: 7.7.3 + semver: 7.7.4 store2: 2.14.4 telejson: 7.2.0 ts-dedent: 2.2.0 @@ -32956,23 +32962,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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 3.6.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32980,14 +32986,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.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33007,23 +33013,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.105.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.105.1) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33031,14 +33037,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.105.0) + style-loader: 1.3.0(webpack@5.105.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33058,23 +33064,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.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33082,14 +33088,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.105.0) + style-loader: 1.3.0(webpack@5.105.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33109,23 +33115,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.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33133,14 +33139,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.105.0) + style-loader: 1.3.0(webpack@5.105.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33160,23 +33166,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.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.0) + css-loader: 3.6.0(webpack@5.105.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.0) + html-webpack-plugin: 4.5.2(webpack@5.105.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) react: 19.1.0 @@ -33184,14 +33190,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.105.0) + style-loader: 1.3.0(webpack@5.105.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.0) + terser-webpack-plugin: 4.2.3(webpack@5.105.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 4.9.5 @@ -33211,21 +33217,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.105.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.105.1) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.105.0) + css-loader: 5.2.7(webpack@5.105.1) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.6(webpack@5.105.0) + html-webpack-plugin: 5.6.6(webpack@5.105.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33233,13 +33239,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.105.0) + style-loader: 2.0.0(webpack@5.105.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.105.1) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33260,21 +33266,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.105.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.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.105.0) + css-loader: 5.2.7(webpack@5.105.1) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.6(webpack@5.105.0) + html-webpack-plugin: 5.6.6(webpack@5.105.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33282,13 +33288,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.105.0) + style-loader: 2.0.0(webpack@5.105.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.105.1) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33346,12 +33352,12 @@ 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@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@storybook/core-webpack': 7.4.6(encoding@0.1.13) '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 @@ -33360,8 +33366,8 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-refresh: 0.11.0 - semver: 7.7.3 - webpack: 5.105.0(webpack-cli@5.1.4) + semver: 7.7.4 + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33383,12 +33389,12 @@ snapshots: dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@storybook/core-webpack': 7.4.6(encoding@0.1.13) '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 @@ -33397,8 +33403,8 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-refresh: 0.11.0 - semver: 7.7.3 - webpack: 5.105.0(webpack-cli@5.1.4) + semver: 7.7.4 + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33420,7 +33426,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33428,10 +33434,10 @@ snapshots: react-docgen: 7.1.1 react-dom: 18.2.0(react@18.2.0) resolve: 1.22.11 - semver: 7.7.3 + semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33446,7 +33452,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33454,10 +33460,10 @@ snapshots: react-docgen: 7.1.1 react-dom: 18.2.0(react@18.2.0) resolve: 1.22.11 - semver: 7.7.3 + semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33550,7 +33556,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.105.0)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33560,11 +33566,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33574,11 +33580,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33588,11 +33594,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33602,11 +33608,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.0)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33616,7 +33622,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -33770,15 +33776,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.0) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33805,7 +33811,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -33834,15 +33840,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.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.0) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33869,7 +33875,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -33894,19 +33900,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33933,7 +33939,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33956,19 +33962,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.0) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33995,7 +34001,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -34018,19 +34024,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.0))(webpack-hot-middleware@2.26.1)(webpack@5.105.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.1) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.0) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.1) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/estree': 0.0.51 @@ -34057,7 +34063,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 4.9.5 @@ -34891,7 +34897,7 @@ snapshots: '@swagger-api/apidom-core': 1.4.0 '@swagger-api/apidom-error': 1.4.0 '@types/ramda': 0.30.2 - axios: 1.12.2 + axios: 1.13.5 minimatch: 7.4.6 process: 0.11.10 ramda: 0.30.1 @@ -35481,7 +35487,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.19.31': + '@types/node@20.19.33': dependencies: undici-types: 6.21.0 @@ -35560,7 +35566,7 @@ snapshots: dependencies: '@types/react': 18.2.0 - '@types/react@17.0.90': + '@types/react@17.0.91': dependencies: '@types/prop-types': 15.7.15 '@types/scheduler': 0.16.8 @@ -35692,7 +35698,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35704,7 +35710,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35716,7 +35722,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35727,7 +35733,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35739,7 +35745,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35863,7 +35869,7 @@ snapshots: glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.23 - semver: 7.7.3 + semver: 7.7.4 tsutils: 3.21.0(typescript@3.9.10) optionalDependencies: typescript: 3.9.10 @@ -35877,7 +35883,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.3 + semver: 7.7.4 tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35892,7 +35898,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 2.4.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -35908,7 +35914,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) eslint: 9.39.2(jiti@2.6.1) eslint-scope: 5.1.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -35934,7 +35940,7 @@ snapshots: '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.1 - '@typespec/ts-http-runtime@0.3.2': + '@typespec/ts-http-runtime@0.3.3': dependencies: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -35945,7 +35951,7 @@ snapshots: '@uiw/codemirror-extensions-basic-setup@4.23.14(@codemirror/lint@6.8.5)': dependencies: '@codemirror/autocomplete': 6.19.1 - '@codemirror/commands': 6.10.1 + '@codemirror/commands': 6.10.2 '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 '@codemirror/search': 6.6.0 @@ -35955,7 +35961,7 @@ snapshots: '@uiw/react-codemirror@4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 - '@codemirror/commands': 6.10.1 + '@codemirror/commands': 6.10.2 '@codemirror/state': 6.5.4 '@codemirror/theme-one-dark': 6.1.3 '@codemirror/view': 6.38.8 @@ -36102,7 +36108,7 @@ snapshots: https-proxy-agent: 7.0.6 jszip: 3.10.1 ora: 8.2.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -36164,7 +36170,7 @@ snapshots: minimatch: 3.1.2 parse-semver: 1.1.1 read: 1.0.7 - semver: 7.7.3 + semver: 7.7.4 tmp: 0.2.5 typed-rest-client: 1.8.11 url-join: 4.0.1 @@ -36203,7 +36209,7 @@ snapshots: parse-semver: 1.1.1 read: 1.0.7 secretlint: 10.2.2 - semver: 7.7.3 + semver: 7.7.4 tmp: 0.2.5 typed-rest-client: 1.8.11 url-join: 4.0.1 @@ -36310,69 +36316,69 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.105.0)': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.105.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.1) - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.21.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.105.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.1) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: - webpack-cli: 4.10.0(webpack@5.105.0) + webpack-cli: 4.10.0(webpack@5.105.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.105.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.105.1)': dependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.1) '@xmldom/xmldom@0.7.13': {} @@ -36493,19 +36499,19 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.126(zod@3.25.76): + ai@5.0.129(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 2.0.32(zod@3.25.76) + '@ai-sdk/gateway': 2.0.35(zod@3.25.76) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ai@6.0.70(zod@4.1.11): + ai@6.0.78(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 3.0.33(zod@4.1.11) - '@ai-sdk/provider': 3.0.7 - '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) + '@ai-sdk/gateway': 3.0.39(zod@4.1.11) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) '@opentelemetry/api': 1.9.0 zod: 4.1.11 @@ -36897,7 +36903,7 @@ snapshots: autoprefixer@10.4.24(postcss@8.5.6): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 @@ -36906,7 +36912,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001768 + caniuse-db: 1.0.30001769 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -36915,7 +36921,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -36924,7 +36930,7 @@ snapshots: autoprefixer@9.8.8: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -36945,7 +36951,7 @@ snapshots: axe-core@4.11.1: {} - axios@1.12.2: + axios@1.13.5: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 @@ -37146,51 +37152,51 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.105.0): + babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.105.1): dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.0): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.1): dependencies: babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.0): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.0): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) babel-messages@6.23.0: dependencies: @@ -37859,7 +37865,7 @@ snapshots: boundary@2.0.0: {} - bowser@2.13.1: {} + bowser@2.14.1: {} boxen@1.3.0: dependencies: @@ -37915,18 +37921,18 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001768 + caniuse-db: 1.0.30001769 electron-to-chromium: 1.5.286 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 electron-to-chromium: 1.5.286 browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 electron-to-chromium: 1.5.286 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -38101,7 +38107,7 @@ snapshots: cacheable@2.3.2: dependencies: '@cacheable/memory': 2.0.7 - '@cacheable/utils': 2.3.3 + '@cacheable/utils': 2.3.4 hookified: 1.15.1 keyv: 5.6.0 qified: 0.6.0 @@ -38168,20 +38174,20 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001768 + caniuse-db: 1.0.30001769 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001768: {} + caniuse-db@1.0.30001769: {} - caniuse-lite@1.0.30001768: {} + caniuse-lite@1.0.30001769: {} canvas@3.2.1: dependencies: @@ -38303,7 +38309,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.20.0 + undici: 7.21.0 whatwg-mimetype: 4.0.0 chokidar@1.7.0: @@ -38530,20 +38536,20 @@ snapshots: code-point-at@1.1.0: {} - codemirror-graphql@2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.20)(graphql@16.12.0): + codemirror-graphql@2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.21)(graphql@16.12.0): dependencies: '@codemirror/language': 6.11.3 '@types/codemirror': 0.0.90 - codemirror: 5.65.20 + codemirror: 5.65.21 graphql: 16.12.0 graphql-language-service: 5.5.0(graphql@16.12.0) - codemirror@5.65.20: {} + codemirror@5.65.21: {} codemirror@6.0.2: dependencies: '@codemirror/autocomplete': 6.19.1 - '@codemirror/commands': 6.10.1 + '@codemirror/commands': 6.10.2 '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 '@codemirror/search': 6.6.0 @@ -38748,14 +38754,14 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.1(webpack@5.105.0): + copy-webpack-plugin@13.0.1(webpack@5.105.1): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -38896,7 +38902,7 @@ snapshots: create-storybook@8.6.15: dependencies: recast: 0.23.11 - semver: 7.7.3 + semver: 7.7.4 crelt@1.0.6: {} @@ -38954,7 +38960,7 @@ snapshots: dependencies: postcss: 8.5.6 - css-functions-list@3.2.3: {} + css-functions-list@3.3.3: {} css-loader@0.28.7: dependencies: @@ -38973,7 +38979,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + css-loader@3.6.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -38988,9 +38994,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@3.6.0(webpack@5.105.0): + css-loader@3.6.0(webpack@5.105.1): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -39005,9 +39011,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - css-loader@5.2.7(webpack@5.105.0): + css-loader@5.2.7(webpack@5.105.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -39018,10 +39024,10 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 schema-utils: 3.3.0 - semver: 7.7.3 - webpack: 5.105.0(webpack-cli@5.1.4) + semver: 7.7.4 + webpack: 5.105.1(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + css-loader@6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39030,11 +39036,11 @@ snapshots: 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.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - css-loader@6.11.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + css-loader@6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39043,11 +39049,11 @@ snapshots: 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.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@6.11.0(webpack@5.105.0): + css-loader@6.11.0(webpack@5.105.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39056,11 +39062,11 @@ snapshots: 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.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - css-loader@7.1.3(webpack@5.105.0): + css-loader@7.1.3(webpack@5.105.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39069,9 +39075,9 @@ snapshots: 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.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -40542,12 +40548,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-text-webpack-plugin@3.0.2(webpack@5.105.0): + extract-text-webpack-plugin@3.0.2(webpack@5.105.1): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -40707,23 +40713,23 @@ snapshots: minimatch: 3.1.2 proper-lockfile: 1.2.0 - file-loader@1.1.5(webpack@5.105.0): + file-loader@1.1.5(webpack@5.105.1): dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - file-loader@6.2.0(webpack@5.105.0): + file-loader@6.2.0(webpack@5.105.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -40923,7 +40929,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.105.0): + fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.105.1): dependencies: babel-code-frame: 6.26.0 chalk: 1.1.3 @@ -40934,7 +40940,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: @@ -40946,7 +40952,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.1): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40959,14 +40965,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40979,14 +40985,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40999,14 +41005,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41018,12 +41024,12 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41035,12 +41041,12 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.0): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.1): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41052,12 +41058,12 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.105.0): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.105.1): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41069,10 +41075,10 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -41413,7 +41419,7 @@ snapshots: glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 4.1.1 + jackspeak: 4.2.3 minimatch: 10.1.2 minipass: 7.1.2 package-json-from-dist: 1.0.1 @@ -41890,7 +41896,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hono@4.11.7: {} + hono@4.11.9: {} hookified@1.15.1: {} @@ -41969,7 +41975,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@2.29.0(webpack@5.105.0): + html-webpack-plugin@2.29.0(webpack@5.105.1): dependencies: bluebird: 3.7.2 html-minifier: 3.5.21 @@ -41977,9 +41983,9 @@ snapshots: lodash: 4.17.23 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + html-webpack-plugin@4.5.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -41990,9 +41996,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@4.5.2(webpack@5.105.0): + html-webpack-plugin@4.5.2(webpack@5.105.1): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -42003,9 +42009,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + html-webpack-plugin@5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42013,9 +42019,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - html-webpack-plugin@5.6.6(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + html-webpack-plugin@5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42023,9 +42029,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@5.6.6(webpack@5.105.0): + html-webpack-plugin@5.6.6(webpack@5.105.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42033,7 +42039,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) htmlparser2@10.1.0: dependencies: @@ -42694,7 +42700,7 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.1: {} + isexe@3.1.5: {} isobject@3.0.1: {} @@ -42770,7 +42776,7 @@ snapshots: '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -42865,9 +42871,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: + jackspeak@4.2.3: dependencies: - '@isaacs/cliui': 8.0.2 + '@isaacs/cliui': 9.0.0 jake@10.9.4: dependencies: @@ -43911,7 +43917,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -43936,7 +43942,7 @@ snapshots: jest-message-util: 30.2.0 jest-util: 30.2.0 pretty-format: 30.2.0 - semver: 7.7.3 + semver: 7.7.4 synckit: 0.11.12 transitivePeerDependencies: - supports-color @@ -44421,7 +44427,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.3 + semver: 7.7.4 jsprim@1.4.2: dependencies: @@ -44786,7 +44792,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.5: {} + lru-cache@11.2.6: {} lru-cache@4.1.5: dependencies: @@ -44817,7 +44823,7 @@ snapshots: macos-version@6.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 magic-string@0.25.9: dependencies: @@ -44848,7 +44854,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 make-error@1.3.6: {} @@ -45584,11 +45590,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.0): + mini-css-extract-plugin@2.10.0(webpack@5.105.1): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) minim@0.23.8: dependencies: @@ -45857,7 +45863,7 @@ snapshots: node-abi@3.87.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 node-abort-controller@3.1.1: {} @@ -45928,7 +45934,7 @@ snapshots: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.3 + semver: 7.7.4 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -45936,15 +45942,15 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.105.0): + node-loader@2.0.0(webpack@5.105.1): dependencies: loader-utils: 2.0.4 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - node-loader@2.1.0(webpack@5.105.0): + node-loader@2.1.0(webpack@5.105.1): dependencies: loader-utils: 2.0.4 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) node-notifier@5.4.5: dependencies: @@ -46000,13 +46006,13 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -46542,7 +46548,7 @@ snapshots: path-scurry@2.0.1: dependencies: - lru-cache: 11.2.5 + lru-cache: 11.2.6 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -46870,34 +46876,34 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): 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.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + semver: 7.7.4 + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.0): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.1): 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.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + semver: 7.7.4 + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.0): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.1): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.1(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -47428,13 +47434,13 @@ snapshots: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.5 + prosemirror-view: 1.41.6 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.5 + prosemirror-view: 1.41.6 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: @@ -47471,13 +47477,13 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.5 + prosemirror-view: 1.41.6 prosemirror-transform@1.11.0: dependencies: prosemirror-model: 1.25.4 - prosemirror-view@1.41.5: + prosemirror-view@1.41.6: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 @@ -47628,17 +47634,17 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + raw-loader@4.0.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - raw-loader@4.0.2(webpack@5.105.0): + raw-loader@4.0.2(webpack@5.105.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -48103,18 +48109,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.105.0) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.1) babel-preset-react-app: 3.1.2(babel-runtime@6.26.0) case-sensitive-paths-webpack-plugin: 2.1.1 chalk: 1.1.3 css-loader: 0.28.7 dotenv: 4.0.0 dotenv-expand: 4.2.0 - extract-text-webpack-plugin: 3.0.2(webpack@5.105.0) - file-loader: 1.1.5(webpack@5.105.0) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.0) + extract-text-webpack-plugin: 3.0.2(webpack@5.105.1) + file-loader: 1.1.5(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.1) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.105.0) + html-webpack-plugin: 2.29.0(webpack@5.105.1) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48125,7 +48131,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.105.0) + sw-precache-webpack-plugin: 0.11.4(webpack@5.105.1) ts-jest: 22.0.1(jest@20.0.4)(typescript@5.8.3) ts-loader: 2.3.7 tsconfig-paths-webpack-plugin: 2.0.0 @@ -48133,11 +48139,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.105.0) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.0)) - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) - webpack-manifest-plugin: 1.3.2(webpack@5.105.0) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.105.1) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.1)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + webpack-manifest-plugin: 1.3.2(webpack@5.105.1) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48157,18 +48163,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.105.0) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.1) babel-preset-react-app: 3.1.2(babel-runtime@6.26.0) case-sensitive-paths-webpack-plugin: 2.1.1 chalk: 1.1.3 css-loader: 0.28.7 dotenv: 4.0.0 dotenv-expand: 4.2.0 - extract-text-webpack-plugin: 3.0.2(webpack@5.105.0) - file-loader: 1.1.5(webpack@5.105.0) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.0) + extract-text-webpack-plugin: 3.0.2(webpack@5.105.1) + file-loader: 1.1.5(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.1) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.105.0) + html-webpack-plugin: 2.29.0(webpack@5.105.1) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48179,7 +48185,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.105.0) + sw-precache-webpack-plugin: 0.11.4(webpack@5.105.1) ts-jest: 22.0.1(jest@20.0.4)(typescript@5.8.3) ts-loader: 2.3.7 tsconfig-paths-webpack-plugin: 2.0.0 @@ -48187,11 +48193,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.105.0) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.0)) - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-dev-server: 5.2.3(webpack@5.105.0) - webpack-manifest-plugin: 1.3.2(webpack@5.105.0) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.105.1) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.1)) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-dev-server: 5.2.3(webpack@5.105.1) + webpack-manifest-plugin: 1.3.2(webpack@5.105.1) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48903,7 +48909,7 @@ snapshots: find-cache-dir: 3.3.2 fs-extra: 10.1.0 rollup: 4.57.1 - semver: 7.7.3 + semver: 7.7.4 tslib: 2.8.1 typescript: 5.8.3 @@ -49055,19 +49061,19 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@13.3.3(sass@1.97.3)(webpack@5.105.0): + sass-loader@13.3.3(sass@1.97.3)(webpack@5.105.1): dependencies: neo-async: 2.6.2 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: sass: 1.97.3 - sass-loader@16.0.6(sass@1.97.3)(webpack@5.105.0): + sass-loader@16.0.7(sass@1.97.3)(webpack@5.105.1): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.97.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sass@1.97.3: dependencies: @@ -49170,7 +49176,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.3: {} + semver@7.7.4: {} send@0.19.2: dependencies: @@ -49468,17 +49474,17 @@ snapshots: async: 2.6.4 loader-utils: 1.4.2 - source-map-loader@4.0.2(webpack@5.105.0): + source-map-loader@4.0.2(webpack@5.105.1): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - source-map-loader@5.0.0(webpack@5.105.0): + source-map-loader@5.0.0(webpack@5.105.1): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -49889,39 +49895,39 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + style-loader@1.3.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@1.3.0(webpack@5.105.0): + style-loader@1.3.0(webpack@5.105.1): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - style-loader@2.0.0(webpack@5.105.0): + style-loader@2.0.0(webpack@5.105.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + style-loader@3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - style-loader@3.3.4(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + style-loader@3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@3.3.4(webpack@5.105.0): + style-loader@3.3.4(webpack@5.105.1): dependencies: - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - style-loader@4.0.0(webpack@5.105.0): + style-loader@4.0.0(webpack@5.105.1): dependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) style-mod@4.1.3: {} @@ -49960,7 +49966,7 @@ snapshots: stylelint@16.26.1(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-syntax-patches-for-csstree': 1.0.26 + '@csstools/css-syntax-patches-for-csstree': 1.0.27 '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) @@ -49968,7 +49974,7 @@ snapshots: balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.8.3) - css-functions-list: 3.2.3 + css-functions-list: 3.3.3 css-tree: 3.1.0 debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 @@ -50065,10 +50071,10 @@ snapshots: svg-tags@1.0.0: {} - svg-url-loader@8.0.0(webpack@5.105.0): + svg-url-loader@8.0.0(webpack@5.105.1): dependencies: - file-loader: 6.2.0(webpack@5.105.0) - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + file-loader: 6.2.0(webpack@5.105.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: @@ -50127,12 +50133,12 @@ snapshots: svgpath@2.6.0: {} - sw-precache-webpack-plugin@0.11.4(webpack@5.105.0): + sw-precache-webpack-plugin@0.11.4(webpack@5.105.1): dependencies: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -50257,17 +50263,17 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1): dependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) symbol-tree@3.2.4: {} @@ -50433,7 +50439,7 @@ snapshots: ansi-escapes: 7.3.0 supports-hyperlinks: 3.2.0 - terser-webpack-plugin@4.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + terser-webpack-plugin@4.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50443,10 +50449,10 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.46.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-sources: 1.4.3 - terser-webpack-plugin@4.2.3(webpack@5.105.0): + terser-webpack-plugin@4.2.3(webpack@5.105.1): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50456,40 +50462,40 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.46.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) esbuild: 0.25.12 - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) @@ -50771,7 +50777,7 @@ snapshots: json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.3 + semver: 7.7.4 type-fest: 4.41.0 typescript: 5.8.3 yargs-parser: 21.1.1 @@ -50791,7 +50797,7 @@ snapshots: json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.3 + semver: 7.7.4 type-fest: 4.41.0 typescript: 5.8.3 yargs-parser: 21.1.1 @@ -50809,15 +50815,15 @@ snapshots: loader-utils: 1.4.2 semver: 5.7.2 - ts-loader@9.5.4(typescript@5.8.3)(webpack@5.105.0): + ts-loader@9.5.4(typescript@5.8.3)(webpack@5.105.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.19.0 micromatch: 4.0.8 - semver: 7.7.3 + semver: 7.7.4 source-map: 0.7.6 typescript: 5.8.3 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) ts-mixer@6.0.4: {} @@ -50952,7 +50958,7 @@ snapshots: 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.3 + semver: 7.7.4 shelljs: 0.8.5 tiny-glob: 0.2.9 ts-jest: 25.5.1(jest@25.5.4)(typescript@3.9.10) @@ -51249,7 +51255,7 @@ snapshots: commander: 2.19.0 source-map: 0.6.1 - uglifyjs-webpack-plugin@1.2.5(webpack@5.105.0): + uglifyjs-webpack-plugin@1.2.5(webpack@5.105.1): dependencies: cacache: 10.0.4 find-cache-dir: 1.0.0 @@ -51257,7 +51263,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -51274,7 +51280,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.20.0: {} + undici@7.21.0: {} unfetch@4.2.0: {} @@ -51546,30 +51552,30 @@ snapshots: url-join@4.0.1: {} - url-loader@0.6.2(file-loader@1.1.5(webpack@5.105.0)): + url-loader@0.6.2(file-loader@1.1.5(webpack@5.105.1)): dependencies: - file-loader: 1.1.5(webpack@5.105.0) + file-loader: 1.1.5(webpack@5.105.1) loader-utils: 1.4.2 mime: 1.6.0 schema-utils: 0.3.0 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - file-loader: 6.2.0(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.0))(webpack@5.105.0): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - file-loader: 6.2.0(webpack@5.105.0) + file-loader: 6.2.0(webpack@5.105.1) url-parse-lax@1.0.0: dependencies: @@ -51865,19 +51871,19 @@ snapshots: vscode-languageclient@7.0.0: dependencies: minimatch: 3.1.2 - semver: 7.7.3 + semver: 7.7.4 vscode-languageserver-protocol: 3.16.0 vscode-languageclient@8.1.0: dependencies: minimatch: 5.1.6 - semver: 7.7.3 + semver: 7.7.4 vscode-languageserver-protocol: 3.17.3 vscode-languageclient@9.0.1: dependencies: minimatch: 5.1.6 - semver: 7.7.3 + semver: 7.7.4 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-protocol@3.16.0: @@ -52007,10 +52013,10 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0): + webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3) colorette: 2.0.20 @@ -52020,15 +52026,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.1) - webpack-cli@4.10.0(webpack@5.105.0): + webpack-cli@4.10.0(webpack@5.105.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0) colorette: 2.0.20 @@ -52038,15 +52044,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.105.0(webpack-cli@4.10.0) + webpack: 5.105.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0): + webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.1) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52055,17 +52061,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) - webpack-cli@5.1.4(webpack@5.105.0): + webpack-cli@5.1.4(webpack@5.105.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.105.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.105.1) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52074,15 +52080,15 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0): + webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -52091,17 +52097,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.0) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) - webpack-cli@6.0.1(webpack@5.105.0): + webpack-cli@6.0.1(webpack@5.105.1): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -52110,28 +52116,28 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.1(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@3.7.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-log: 2.0.0 - webpack-dev-middleware@3.7.3(webpack@5.105.0): + webpack-dev-middleware@3.7.3(webpack@5.105.1): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-log: 2.0.0 - webpack-dev-middleware@4.3.0(webpack@5.105.0): + webpack-dev-middleware@4.3.0(webpack@5.105.1): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -52139,9 +52145,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + webpack-dev-middleware@6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52149,9 +52155,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware@6.1.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52159,9 +52165,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware@6.1.3(webpack@5.105.0): + webpack-dev-middleware@6.1.3(webpack@5.105.1): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52169,9 +52175,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.5(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@7.4.5(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 4.56.10 @@ -52180,10 +52186,10 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optional: true - webpack-dev-middleware@7.4.5(webpack@5.105.0): + webpack-dev-middleware@7.4.5(webpack@5.105.1): dependencies: colorette: 2.0.20 memfs: 4.56.10 @@ -52192,9 +52198,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.105.0): + webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.105.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52222,11 +52228,11 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.0) + webpack-dev-middleware: 7.4.5(webpack@5.105.1) ws: 8.19.0 optionalDependencies: - webpack: 5.105.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) transitivePeerDependencies: - bufferutil - debug @@ -52234,7 +52240,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.105.0): + webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.105.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52262,18 +52268,18 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.0) + webpack-dev-middleware: 7.4.5(webpack@5.105.1) ws: 8.19.0 optionalDependencies: - webpack: 5.105.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.105.0): + webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.105.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52301,18 +52307,18 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.0) + webpack-dev-middleware: 7.4.5(webpack@5.105.1) ws: 8.19.0 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52340,10 +52346,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-middleware: 7.4.5(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ws: 8.19.0 optionalDependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - bufferutil - debug @@ -52351,7 +52357,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.3(webpack@5.105.0): + webpack-dev-server@5.2.3(webpack@5.105.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52379,23 +52385,23 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.0) + webpack-dev-middleware: 7.4.5(webpack@5.105.1) ws: 8.19.0 optionalDependencies: - webpack: 5.105.0(webpack-cli@5.1.4) + webpack: 5.105.1(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-filter-warnings-plugin@1.2.1(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-filter-warnings-plugin@1.2.1(webpack@5.105.0): + webpack-filter-warnings-plugin@1.2.1(webpack@5.105.1): dependencies: - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -52408,11 +52414,11 @@ snapshots: ansi-colors: 3.2.4 uuid: 3.4.0 - webpack-manifest-plugin@1.3.2(webpack@5.105.0): + webpack-manifest-plugin@1.3.2(webpack@5.105.1): dependencies: fs-extra: 0.30.0 lodash: 4.17.23 - webpack: 5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -52447,7 +52453,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18)): + webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52471,7 +52477,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52479,7 +52485,7 @@ snapshots: - esbuild - uglify-js - webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): + webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52503,7 +52509,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52511,7 +52517,7 @@ snapshots: - esbuild - uglify-js - webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): + webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52535,17 +52541,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.105.0) + webpack-cli: 5.1.4(webpack@5.105.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): + webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52569,17 +52575,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.0(webpack-cli@4.10.0): + webpack@5.105.1(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52603,17 +52609,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.0(webpack-cli@5.1.4): + webpack@5.105.1(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52637,17 +52643,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.105.0) + webpack-cli: 5.1.4(webpack@5.105.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.0(webpack-cli@6.0.1): + webpack@5.105.1(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52671,11 +52677,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.105.0) + webpack-cli: 6.0.1(webpack@5.105.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -52793,7 +52799,7 @@ snapshots: which@5.0.0: dependencies: - isexe: 3.1.1 + isexe: 3.1.5 wide-align@1.1.5: dependencies: diff --git a/package.json b/package.json index b35aac73351..26073084bb5 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,9 @@ "name": "ballerina-vscode-extensions-mono-repo", "pnpm": { "overrides": { - "@modelcontextprotocol/sdk": "^1.25.2", + "@modelcontextprotocol/sdk": "^1.26.0", "@isaacs/brace-expansion": "5.0.1", + "axios": "^1.13.5", "brace-expansion": "^2.0.2", "http-proxy": "^1.18.1", "prismjs": "^1.30.0", @@ -22,7 +23,9 @@ "qs": "^6.14.1", "diff": "^8.0.3", "undici": "^7.18.2", - "lodash": "4.17.23" + "lodash": "4.17.23", + "hono": "^4.11.7", + "fast-xml-parser": "5.3.4" } }, "scripts": { From dc28fd66c20175621b2a4729799f983f8f9de659 Mon Sep 17 00:00:00 2001 From: gigara <info@gigara.info> Date: Wed, 11 Feb 2026 10:25:51 +0530 Subject: [PATCH 149/247] Update webpack-dev-server version to 5.2.3 --- common/config/rush/pnpm-lock.yaml | 216 +++++------------- .../api-designer-visualizer/package.json | 2 +- .../ballerina-low-code-diagram/package.json | 2 +- .../persist-layer-diagram/package.json | 2 +- .../ballerina/trace-visualizer/package.json | 2 +- .../ballerina/type-diagram/package.json | 2 +- .../choreo/choreo-webviews/package.json | 2 +- workspaces/mi/mi-visualizer/package.json | 2 +- .../wso2-platform-webviews/package.json | 2 +- 9 files changed, 66 insertions(+), 166 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index c7364217b64..513c228a1f8 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -273,7 +273,7 @@ importers: version: 7.4.0(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.0(@babel/core@7.29.0)(@swc/helpers@0.5.18)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1) + version: 7.4.0(@babel/core@7.29.0)(@swc/helpers@0.5.18)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/js-yaml': specifier: 4.0.9 version: 4.0.9 @@ -321,10 +321,10 @@ importers: version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 - version: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) ../../workspaces/apk/apk-extension: devDependencies: @@ -780,7 +780,7 @@ importers: version: 6.5.9(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/react': specifier: 6.5.16 - version: 6.5.16(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.9(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.9(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: 2.2.9 version: 2.2.9 @@ -909,10 +909,10 @@ importers: version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: 6.0.1 - version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -1993,10 +1993,10 @@ importers: version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: 6.0.1 - version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/ballerina/record-creator: dependencies: @@ -2357,10 +2357,10 @@ importers: version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 - version: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) ../../workspaces/ballerina/type-diagram: dependencies: @@ -2475,10 +2475,10 @@ importers: version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: 6.0.1 - version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/ballerina/type-editor: dependencies: @@ -2909,10 +2909,10 @@ importers: version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: 6.0.1 - version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: @@ -4010,7 +4010,7 @@ importers: version: 1.55.1 '@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.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + version: 0.6.0(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@tanstack/query-core': specifier: 5.76.0 version: 5.76.0 @@ -4194,10 +4194,10 @@ importers: version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 - version: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + specifier: ^5.2.3 + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) yaml: specifier: 2.8.0 version: 2.8.0 @@ -4546,10 +4546,10 @@ importers: version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: 6.0.1 - version: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: 5.2.1 - version: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + specifier: 5.2.3 + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) packages: @@ -11178,9 +11178,6 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node-forge@1.3.14': - resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} @@ -19505,10 +19502,6 @@ packages: resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} engines: {node: '>= 6.0.0'} - node-forge@1.3.3: - resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} - engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -22234,10 +22227,6 @@ packages: selfsigned@1.10.14: resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - selfsigned@5.5.0: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} @@ -24690,19 +24679,6 @@ packages: peerDependencies: webpack: ^2.2.0 || ^3.0.0 - webpack-dev-server@5.2.1: - resolution: {integrity: sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==} - engines: {node: '>= 18.12.0'} - hasBin: true - peerDependencies: - webpack: ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - webpack-dev-server@5.2.3: resolution: {integrity: sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==} engines: {node: '>= 18.12.0'} @@ -30548,7 +30524,7 @@ snapshots: '@types/webpack': 4.41.40 webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -30562,7 +30538,7 @@ snapshots: optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': @@ -30599,7 +30575,7 @@ snapshots: webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -30613,7 +30589,7 @@ snapshots: optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': @@ -30633,7 +30609,7 @@ snapshots: webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: anser: 2.3.5 core-js-pure: 3.48.0 @@ -30646,7 +30622,7 @@ snapshots: optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 '@popperjs/core@2.11.8': {} @@ -37382,11 +37358,11 @@ snapshots: '@storybook/postinstall@7.4.0': {} - '@storybook/preset-react-webpack@7.4.0(@babel/core@7.29.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)': + '@storybook/preset-react-webpack@7.4.0(@babel/core@7.29.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.29.0) '@babel/preset-react': 7.27.1(@babel/core@7.29.0) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/core-webpack': 7.4.0(encoding@0.1.13) '@storybook/docs-tools': 7.4.0(encoding@0.1.13) '@storybook/node-logger': 7.4.0 @@ -37739,10 +37715,10 @@ snapshots: - supports-color - typescript - '@storybook/react-webpack5@7.4.0(@babel/core@7.29.0)(@swc/helpers@0.5.18)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)': + '@storybook/react-webpack5@7.4.0(@babel/core@7.29.0)(@swc/helpers@0.5.18)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@storybook/builder-webpack5': 7.4.0(@swc/helpers@0.5.18)(encoding@0.1.13)(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/preset-react-webpack': 7.4.0(@babel/core@7.29.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1) + '@storybook/preset-react-webpack': 7.4.0(@babel/core@7.29.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@storybook/react': 7.4.0(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 @@ -37925,11 +37901,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.9(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.9(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.1)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.9(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) @@ -39773,10 +39749,6 @@ snapshots: '@types/node': 16.18.126 form-data: 4.0.5 - '@types/node-forge@1.3.14': - dependencies: - '@types/node': 16.18.126 - '@types/node@14.18.63': {} '@types/node@16.18.126': {} @@ -40948,13 +40920,6 @@ snapshots: optionalDependencies: webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack@5.104.1)': - dependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) - optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1)': dependencies: webpack: 5.104.1(webpack-cli@5.1.4) @@ -40967,12 +40932,12 @@ snapshots: webpack: 5.104.1(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack@5.104.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack@5.104.1)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1)': dependencies: webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: @@ -51515,8 +51480,6 @@ snapshots: node-forge@0.10.0: {} - node-forge@1.3.3: {} - node-gyp-build@4.8.4: optional: true @@ -55043,11 +55006,6 @@ snapshots: dependencies: node-forge: 0.10.0 - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.14 - node-forge: 1.3.3 - selfsigned@5.5.0: dependencies: '@peculiar/x509': 1.14.3 @@ -58335,25 +58293,6 @@ snapshots: webpack: 5.104.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.1)(webpack@5.104.1) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.6 - envinfo: 7.21.0 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-merge: 5.10.0 - optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@5.1.4)(webpack@5.104.1) - webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 @@ -58390,12 +58329,12 @@ snapshots: webpack: 5.104.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-cli@6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1): + webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.6.3 '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.1)(webpack@5.104.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -58407,7 +58346,7 @@ snapshots: webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.1(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) webpack-cli@6.0.1(webpack@5.104.1): dependencies: @@ -58556,46 +58495,7 @@ snapshots: webpack-dev-middleware: 1.12.2(webpack@3.8.1) yargs: 6.6.0 - webpack-dev-server@5.2.1(webpack-cli@5.1.4)(webpack@5.104.1): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.8 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.10 - '@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.1 - connect-history-api-fallback: 2.0.0 - express: 4.22.1 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.25) - ipaddr.js: 2.3.0 - launch-editor: 2.12.0 - open: 10.2.0 - p-retry: 6.2.1 - schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.2 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.104.1) - ws: 8.19.0 - optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.1)(webpack@5.104.1) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-dev-server@5.2.1(webpack-cli@6.0.1)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58619,22 +58519,23 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 + selfsigned: 5.5.0 serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate + optional: true - webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58665,16 +58566,15 @@ snapshots: webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - optional: true - webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.104.1): + webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -58705,8 +58605,8 @@ snapshots: webpack-dev-middleware: 7.4.5(webpack@5.104.1) ws: 8.19.0 optionalDependencies: - webpack: 5.104.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug @@ -58923,7 +58823,7 @@ snapshots: watchpack: 1.7.5 webpack-sources: 1.4.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)): dependencies: @@ -59051,7 +58951,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.1)(webpack@5.104.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/workspaces/api-designer/api-designer-visualizer/package.json b/workspaces/api-designer/api-designer-visualizer/package.json index dce8522bfce..f1a0c8cb822 100644 --- a/workspaces/api-designer/api-designer-visualizer/package.json +++ b/workspaces/api-designer/api-designer-visualizer/package.json @@ -45,7 +45,7 @@ "@storybook/react-webpack5": "7.4.0", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.1", + "webpack-dev-server": "5.2.3", "@babel/preset-typescript": "7.22.11", "@babel/plugin-syntax-flow": "7.22.5", "@types/lodash": "4.14.198", diff --git a/workspaces/ballerina/ballerina-low-code-diagram/package.json b/workspaces/ballerina/ballerina-low-code-diagram/package.json index dbbae11b54c..14e568138e1 100644 --- a/workspaces/ballerina/ballerina-low-code-diagram/package.json +++ b/workspaces/ballerina/ballerina-low-code-diagram/package.json @@ -102,7 +102,7 @@ "typescript": "5.8.3", "webpack": "5.104.1", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1" + "webpack-dev-server": "5.2.3" }, "repository": { "type": "git", diff --git a/workspaces/ballerina/persist-layer-diagram/package.json b/workspaces/ballerina/persist-layer-diagram/package.json index 3a271cd7eae..173c618fb89 100644 --- a/workspaces/ballerina/persist-layer-diagram/package.json +++ b/workspaces/ballerina/persist-layer-diagram/package.json @@ -52,7 +52,7 @@ "ts-loader": "9.4.1", "webpack": "5.104.1", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1" + "webpack-dev-server": "5.2.3" }, "author": "wso2", "license": "UNLICENSED" diff --git a/workspaces/ballerina/trace-visualizer/package.json b/workspaces/ballerina/trace-visualizer/package.json index f8f262d3f15..fa34b2763d7 100644 --- a/workspaces/ballerina/trace-visualizer/package.json +++ b/workspaces/ballerina/trace-visualizer/package.json @@ -35,7 +35,7 @@ "typescript": "5.8.3", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.1" + "webpack-dev-server": "5.2.3" }, "author": "wso2", "license": "UNLICENSED", diff --git a/workspaces/ballerina/type-diagram/package.json b/workspaces/ballerina/type-diagram/package.json index ac2074e46fb..d204e672e8f 100644 --- a/workspaces/ballerina/type-diagram/package.json +++ b/workspaces/ballerina/type-diagram/package.json @@ -54,7 +54,7 @@ "@types/uuid": "10.0.0", "webpack": "5.104.1", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1" + "webpack-dev-server": "5.2.3" }, "author": "wso2", "license": "UNLICENSED" diff --git a/workspaces/choreo/choreo-webviews/package.json b/workspaces/choreo/choreo-webviews/package.json index 7a4413f8d11..35bd6648103 100644 --- a/workspaces/choreo/choreo-webviews/package.json +++ b/workspaces/choreo/choreo-webviews/package.json @@ -51,7 +51,7 @@ "ts-loader": "9.5.2", "webpack": "5.104.1", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1", + "webpack-dev-server": "5.2.3", "source-map-loader": "5.0.0", "postcss": "8.5.4", "postcss-loader" :"8.1.1", diff --git a/workspaces/mi/mi-visualizer/package.json b/workspaces/mi/mi-visualizer/package.json index 035490f62f3..d463295f992 100644 --- a/workspaces/mi/mi-visualizer/package.json +++ b/workspaces/mi/mi-visualizer/package.json @@ -70,7 +70,7 @@ "@storybook/react-webpack5": "8.6.14", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.1", + "webpack-dev-server": "5.2.3", "@babel/preset-typescript": "7.27.1", "@babel/plugin-syntax-flow": "7.27.1", "@types/lodash": "4.17.17", diff --git a/workspaces/wso2-platform/wso2-platform-webviews/package.json b/workspaces/wso2-platform/wso2-platform-webviews/package.json index e1d74c46b94..440f6fe869e 100644 --- a/workspaces/wso2-platform/wso2-platform-webviews/package.json +++ b/workspaces/wso2-platform/wso2-platform-webviews/package.json @@ -57,7 +57,7 @@ "ts-loader": "9.5.2", "webpack": "5.104.1", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.1", + "webpack-dev-server": "5.2.3", "source-map-loader": "5.0.0", "postcss": "8.5.3", "postcss-loader" :"8.1.1", From aa18aa04bcd6b5361c73093ee4306c2245449e5c Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Wed, 11 Feb 2026 11:40:21 +0530 Subject: [PATCH 150/247] Skip formatting for DATA_MAPPER_CREATION and FUNCTION_CREATION --- .../rpc-managers/bi-diagram/rpc-manager.ts | 6 ++- .../src/utils/source-utils.ts | 49 ++++++++++--------- 2 files changed, 30 insertions(+), 25 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 01f06610d64..4169fd1b755 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 @@ -247,8 +247,10 @@ export class BiDiagramRpcManager implements BIDiagramAPI { const artifacts = await updateSourceCode({ textEdits: model.textEdits, description: this.getSourceDescription(params) }); resolve({ artifacts }); } else { - const artifactData = params.artifactData || this.getArtifactDataFromNodeKind(params.flowNode.codedata.node); - const artifacts = await updateSourceCode({ textEdits: model.textEdits, artifactData, description: this.getSourceDescription(params)}, params.isHelperPaneChange); + const nodeKind = params.flowNode.codedata.node; + const skipFormatting = nodeKind === 'DATA_MAPPER_CREATION' || nodeKind === 'FUNCTION_CREATION'; + const artifactData = params.artifactData || this.getArtifactDataFromNodeKind(nodeKind); + const artifacts = await updateSourceCode({ textEdits: model.textEdits, artifactData, description: this.getSourceDescription(params)}, params.isHelperPaneChange, skipFormatting); resolve({ artifacts }); } }) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index d5d312c5dda..4fc8af02188 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -41,7 +41,7 @@ export interface UpdateSourceCodeRequest { skipUpdateViewOnTomlUpdate?: boolean; // This is used to skip updating the view on toml updates in certain scenarios. } -export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCodeRequest, isChangeFromHelperPane?: boolean): Promise<ProjectStructureArtifactResponse[]> { +export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCodeRequest, isChangeFromHelperPane?: boolean, skipFormatting?: boolean): Promise<ProjectStructureArtifactResponse[]> { try { let tomlFilesUpdated = false; StateMachine.setEditMode(); @@ -135,33 +135,36 @@ export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCode 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 + if (!skipFormatting) { + 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 + ); + undoRedoManager?.addFileToBatch(fileUri.fsPath, formattedSource.newText, formattedSource.newText); } - }); - 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 - ); - undoRedoManager?.addFileToBatch(fileUri.fsPath, formattedSource.newText, formattedSource.newText); } + // Apply all formatted changes at once + await workspace.applyEdit(formattedWorkspaceEdit); } + undoRedoManager?.commitBatchOperation(updateSourceCodeRequest.description ? updateSourceCodeRequest.description : (updateSourceCodeRequest.artifactData ? `Change in ${updateSourceCodeRequest.artifactData?.artifactType} ${updateSourceCodeRequest.artifactData?.identifier}` : "Update Source Code")); - // Apply all formatted changes at once - await workspace.applyEdit(formattedWorkspaceEdit); // Handle missing dependencies after all changes are applied if (updateSourceCodeRequest.resolveMissingDependencies) { From e45d7c1762b2e37d468619f43ed4264fc4659942 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Wed, 11 Feb 2026 15:27:33 +0530 Subject: [PATCH 151/247] skip only applying formatted text when skipFormatted flag is set --- .../src/utils/source-utils.ts | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index 4fc8af02188..3fa703f099e 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -135,36 +135,36 @@ export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCode await workspace.applyEdit(workspaceEdit); // <-------- Format the document after applying all changes using the native formatting API--------> - if (!skipFormatting) { - 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 - ); - undoRedoManager?.addFileToBatch(fileUri.fsPath, formattedSource.newText, formattedSource.newText); + 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 + ); + undoRedoManager?.addFileToBatch(fileUri.fsPath, formattedSource.newText, formattedSource.newText); } - // Apply all formatted changes at once - await workspace.applyEdit(formattedWorkspaceEdit); } undoRedoManager?.commitBatchOperation(updateSourceCodeRequest.description ? updateSourceCodeRequest.description : (updateSourceCodeRequest.artifactData ? `Change in ${updateSourceCodeRequest.artifactData?.artifactType} ${updateSourceCodeRequest.artifactData?.identifier}` : "Update Source Code")); + if (!skipFormatting) { //TODO: Remove the skipFormatting flag once LS APIs are updated to give already formatted text edits + // Apply all formatted changes at once + await workspace.applyEdit(formattedWorkspaceEdit); + } // Handle missing dependencies after all changes are applied if (updateSourceCodeRequest.resolveMissingDependencies) { From 8352e15c8105dd935f199824c300aa6486b58029 Mon Sep 17 00:00:00 2001 From: ChamodA <chamoda@wso2.com> Date: Wed, 11 Feb 2026 15:39:57 +0530 Subject: [PATCH 152/247] Remove redundant onClick wrappers --- .../ExpressionEditor/components/Common/Completions.tsx | 6 +----- .../ui-toolkit/src/components/LinkButton/LinkButton.tsx | 5 +---- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/Completions.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/Completions.tsx index 41d0d35dbf2..ea524296e00 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/Completions.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/Completions.tsx @@ -130,17 +130,13 @@ const DefaultCompletionItem = (props: DefaultCompletionDropdownItemProps) => { itemRef.current.classList.add('hovered'); } - const handleClick = () => { - onClick(); - } - return ( <DropdownItemContainer ref={itemRef} className="hovered" id="default-completion" onMouseEnter={handleMouseEnter} - onClick={handleClick} + onClick={onClick} > {getDefaultCompletion()} </DropdownItemContainer> diff --git a/workspaces/common-libs/ui-toolkit/src/components/LinkButton/LinkButton.tsx b/workspaces/common-libs/ui-toolkit/src/components/LinkButton/LinkButton.tsx index 4287a25f369..eb3e7003829 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/LinkButton/LinkButton.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/LinkButton/LinkButton.tsx @@ -53,11 +53,8 @@ export interface LinkButtonProps { export const LinkButton: React.FC<PropsWithChildren<LinkButtonProps>> = (props: PropsWithChildren<LinkButtonProps>) => { const { id, className, children, sx, onClick } = props; - const handleComponentClick = () => { - onClick(); - } return ( - <LinkContainer id={id} className={className} sx={sx} onClick={handleComponentClick}> + <LinkContainer id={id} className={className} sx={sx} onClick={onClick}> {children} </LinkContainer> ); From c743e34c9b022b81668ab00350aa6bc8e53ec33c Mon Sep 17 00:00:00 2001 From: gigara <info@gigara.info> Date: Wed, 11 Feb 2026 16:04:08 +0530 Subject: [PATCH 153/247] update lock --- common/config/rush/pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 513c228a1f8..95b255cace4 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -4196,7 +4196,7 @@ importers: specifier: 5.1.4 version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: - specifier: ^5.2.3 + specifier: 5.2.3 version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) yaml: specifier: 2.8.0 From 023156fd2fc1abc0e4aed1756ecab6f8d99edb76 Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth <vellummyilumvinoth1999@gmail.com> Date: Thu, 5 Feb 2026 11:17:09 +0530 Subject: [PATCH 154/247] Migrate to New libraries API --- .../src/rpc-types/ai-panel/interfaces.ts | 6 ------ .../src/core/extended-language-client.ts | 6 ++---- .../src/features/ai/agent/AgentExecutor.ts | 2 +- .../src/features/ai/agent/tools/healthcare-library.ts | 2 +- .../src/features/ai/utils/libs/function-registry.ts | 11 ++++------- .../src/features/ai/utils/libs/libraries.ts | 6 ++---- 6 files changed, 10 insertions(+), 23 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 85f647e0fce..a5456c2c3f2 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 @@ -306,11 +306,6 @@ export interface GenerateAgentCodeRequest { codeContext?: CodeContext; } -export type LibraryMode = "CORE" | "HEALTHCARE"; - -export interface CopilotAllLibrariesRequest { - mode: LibraryMode; -} export interface MinifiedLibrary { name: string; description: string; @@ -321,7 +316,6 @@ export interface CopilotCompactLibrariesResponse { export interface CopilotFilterLibrariesRequest { libNames: string[]; - mode: LibraryMode; } export interface CopilotFilterLibrariesResponse { 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 6838b76d00f..f94425440a1 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -227,13 +227,11 @@ import { DeleteConfigVariableRequestV2, DeleteConfigVariableResponseV2, ResourceReturnTypesRequest, - ResourceReturnTypesResponse, JsonToTypeRequest, JsonToTypeResponse, McpToolsRequest, McpToolsResponse, CopilotCompactLibrariesResponse, - CopilotAllLibrariesRequest, CopilotFilterLibrariesResponse, CopilotFilterLibrariesRequest, GetConfigVariableNodeTemplateRequest, @@ -1422,8 +1420,8 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest<OpenAPIClientDeleteResponse>(EXTENDED_APIS.OPEN_API_CLIENT_DELETE, params); } - async getCopilotCompactLibraries(params: CopilotAllLibrariesRequest): Promise<CopilotCompactLibrariesResponse> { - return this.sendRequest<CopilotCompactLibrariesResponse>(EXTENDED_APIS.COPILOT_ALL_LIBRARIES, params); + async getCopilotCompactLibraries(): Promise<CopilotCompactLibrariesResponse> { + return this.sendRequest<CopilotCompactLibrariesResponse>(EXTENDED_APIS.COPILOT_ALL_LIBRARIES); } async getCopilotFilteredLibraries(params: CopilotFilterLibrariesRequest): Promise<CopilotFilterLibrariesResponse> { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index 4622c6fce49..8790dcdbded 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -182,7 +182,7 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { ]; // Get libraries for library provider tool - const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); + const allLibraries = await getAllLibraries(); const libraryDescriptions = allLibraries.length > 0 ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") : "- No libraries available"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts index 1f6047caee3..61d2f86c074 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts @@ -164,7 +164,7 @@ export async function getRelevantLibrariesAndFunctions( } export async function getSelectedLibraries(prompt: string, generationType: GenerationType): Promise<string[]> { - const allLibraries = await getAllLibraries(generationType); + const allLibraries = await getAllLibraries(); if (allLibraries.length === 0) { return []; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts index ef6c86198d1..380b7bee1dd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts @@ -32,14 +32,13 @@ import { getAnthropicClient, ANTHROPIC_HAIKU } from "../ai-client"; import { GenerationType } from "./libraries"; // import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; import { langClient } from "../../activator"; -import { getGenerationMode } from "../ai-utils"; // Constants for type definitions const TYPE_RECORD = 'Record'; const TYPE_CONSTRUCTOR = 'Constructor'; export async function selectRequiredFunctions(prompt: string, selectedLibNames: string[], generationType: GenerationType): Promise<Library[]> { - const selectedLibs: Library[] = await getMaximizedSelectedLibs(selectedLibNames, generationType); + const selectedLibs: Library[] = await getMaximizedSelectedLibs(selectedLibNames); const functionsResponse: GetFunctionResponse[] = await getRequiredFunctions(selectedLibNames, prompt, selectedLibs, generationType); let typeLibraries: Library[] = []; if (generationType === GenerationType.HEALTHCARE_GENERATION) { @@ -329,10 +328,9 @@ function filteredNormalFunctions(functions?: RemoteFunction[], generationType?: })); } -export async function getMaximizedSelectedLibs(libNames: string[], generationType: GenerationType): Promise<Library[]> { +export async function getMaximizedSelectedLibs(libNames: string[]): Promise<Library[]> { const result = (await langClient.getCopilotFilteredLibraries({ - libNames: libNames, - mode: getGenerationMode(generationType), + libNames: libNames })) as { libraries: Library[] }; return result.libraries as Library[]; } @@ -708,8 +706,7 @@ async function getExternalRecords( if (!library) { console.warn(`Library ${libName} is not found in the context. Fetching library details.`); const result = (await langClient.getCopilotFilteredLibraries({ - libNames: [libName], - mode: getGenerationMode(GenerationType.CODE_GENERATION), + libNames: [libName] })) as { libraries: Library[] }; if (result.libraries && result.libraries.length > 0) { library = result.libraries[0]; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts index ce9be84388b..7fb35bf44a8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts @@ -33,9 +33,7 @@ export enum GenerationType { HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", } -export async function getAllLibraries(generationType: GenerationType): Promise<MinifiedLibrary[]> { - const result = (await langClient.getCopilotCompactLibraries({ - mode: getGenerationMode(generationType), - })) as { libraries: MinifiedLibrary[] }; +export async function getAllLibraries(): Promise<MinifiedLibrary[]> { + const result = (await langClient.getCopilotCompactLibraries()) as { libraries: MinifiedLibrary[] }; return result.libraries as MinifiedLibrary[]; } From c48427ccf13e8f28664bd2d6ef4f32ee0fac0c91 Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth <vellummyilumvinoth1999@gmail.com> Date: Thu, 5 Feb 2026 15:56:04 +0530 Subject: [PATCH 155/247] Add external library search tool --- .../src/rpc-types/ai-panel/interfaces.ts | 12 ++ .../src/core/extended-language-client.ts | 9 +- .../src/features/ai/agent/tool-registry.ts | 4 + .../ai/agent/tools/external-library-search.ts | 154 ++++++++++++++++++ .../ai/agent/tools/library-provider.ts | 35 +++- 5 files changed, 204 insertions(+), 10 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.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 a5456c2c3f2..f477b8055ab 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 @@ -322,6 +322,18 @@ export interface CopilotFilterLibrariesResponse { libraries: any[]; } +export interface CopilotSearchPackagesByPromptRequest { + userPrompt: string; +} + +export interface CopilotSearchPackagesByPromptResponse { + libraries: MinifiedLibrary[]; +} + +export interface ExternalLibrarySearchResult { + libraries: MinifiedLibrary[]; +} + // ================================== // Doc Generation Related Interfaces // ================================== 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 f94425440a1..8e095c6f0cb 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -281,7 +281,9 @@ import { PersistClientGenerateRequest, PersistClientGenerateResponse, WSDLApiClientGenerationRequest, - WSDLApiClientGenerationResponse + WSDLApiClientGenerationResponse, + CopilotSearchPackagesByPromptRequest, + CopilotSearchPackagesByPromptResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -473,6 +475,7 @@ enum EXTENDED_APIS { PUBLISH_ARTIFACTS = 'designModelService/publishArtifacts', COPILOT_ALL_LIBRARIES = 'copilotLibraryManager/getLibrariesList', COPILOT_FILTER_LIBRARIES = 'copilotLibraryManager/getFilteredLibraries', + COPILOT_SEARCH_PACKAGES_BY_PROMPT = 'copilotLibraryManager/searchPackagesByPrompt', GET_MIGRATION_TOOLS = 'projectService/getMigrationTools', TIBCO_TO_BI = 'projectService/importTibco', MULE_TO_BI = 'projectService/importMule', @@ -1428,6 +1431,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest<CopilotFilterLibrariesResponse>(EXTENDED_APIS.COPILOT_FILTER_LIBRARIES, params); } + async getCopilotPackagesByPrompt(params: CopilotSearchPackagesByPromptRequest): Promise<CopilotSearchPackagesByPromptResponse> { + return this.sendRequest<CopilotSearchPackagesByPromptResponse>(EXTENDED_APIS.COPILOT_SEARCH_PACKAGES_BY_PROMPT, params); + } + async getMigrationTools(): Promise<GetMigrationToolsResponse> { return this.sendRequest<GetMigrationToolsResponse>(EXTENDED_APIS.GET_MIGRATION_TOOLS); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts index 9de1be76dd7..824541c6d3d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts @@ -39,6 +39,7 @@ import { getLibraryProviderTool } from './tools/library-provider'; import { LIBRARY_PROVIDER_TOOL, GenerationType } from '../utils/libs/libraries'; import { getHealthcareLibraryProviderTool, HEALTHCARE_LIBRARY_PROVIDER_TOOL } from './tools/healthcare-library'; import { createConnectorGeneratorTool, CONNECTOR_GENERATOR_TOOL } from './tools/connector-generator'; +import { EXTERNAL_LIBRARY_SEARCH_TOOL, getExternalLibrarySearchTool } from './tools/external-library-search'; export interface ToolRegistryOptions { eventHandler: CopilotEventHandler; @@ -68,6 +69,9 @@ export function createToolRegistry(opts: ToolRegistryOptions) { generationType, eventHandler ), + [EXTERNAL_LIBRARY_SEARCH_TOOL]: getExternalLibrarySearchTool( + eventHandler + ), [HEALTHCARE_LIBRARY_PROVIDER_TOOL]: getHealthcareLibraryProviderTool( libraryDescriptions, eventHandler diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts new file mode 100644 index 00000000000..326133f9de1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts @@ -0,0 +1,154 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { tool, jsonSchema } from "ai"; +import { CopilotEventHandler } from "../../utils/events"; +import { langClient } from "../../activator"; +import { CopilotSearchPackagesByPromptRequest, CopilotSearchPackagesByPromptResponse, ExternalLibrarySearchResult, MinifiedLibrary } from "@wso2/ballerina-core"; + +export const EXTERNAL_LIBRARY_SEARCH_TOOL = "ExternalLibrarySearchTool"; + +const ExternalLibrarySearchToolSchema = jsonSchema<{ + userPrompt: string; +}>({ + type: "object", + properties: { + userPrompt: { + type: "string", + description: "User query to search for relevant external library names from Ballerina Central", + }, + }, + required: ["userPrompt"], +}); + +function emitExternalLibrarySearchResult( + eventHandler: CopilotEventHandler, + toolName: string, + libraries: MinifiedLibrary[] +): void { + const libraryNames = libraries.map(lib => lib.name); + eventHandler({ + type: "tool_result", + toolName, + toolOutput: libraryNames + }); +} + +export async function ExternalLibrarySearchTool( + params: { userPrompt: string }, + eventHandler: CopilotEventHandler +): Promise<ExternalLibrarySearchResult> { + try { + // Emit tool_call event + eventHandler({ + type: "tool_call", + toolName: EXTERNAL_LIBRARY_SEARCH_TOOL, + }); + + const startTime = Date.now(); + + // Call the LS API to search for packages by prompt + const request: CopilotSearchPackagesByPromptRequest = { + userPrompt: params.userPrompt + }; + + const response: CopilotSearchPackagesByPromptResponse = + await langClient.getCopilotPackagesByPrompt(request); + + const libraryNames = response.libraries.map(lib => lib.name); + console.log( + `[ExternalLibrarySearchTool] Found ${response.libraries.length} libraries: ${libraryNames.join( + ", " + )}, took ${(Date.now() - startTime) / 1000}s` + ); + + // Emit tool_result event + emitExternalLibrarySearchResult(eventHandler, EXTERNAL_LIBRARY_SEARCH_TOOL, response.libraries); + + return { libraries: response.libraries }; + } catch (error) { + console.error(`[ExternalLibrarySearchTool] Error searching libraries: ${error}`); + + // Emit error result + eventHandler({ + type: "tool_result", + toolName: EXTERNAL_LIBRARY_SEARCH_TOOL, + toolOutput: [] + }); + + return { libraries: [] }; + } +} + +export function getExternalLibrarySearchTool( + eventHandler: CopilotEventHandler +) { + return tool({ + description: `Searches for external Ballerina libraries from Ballerina Central based on a user query. + +**Purpose:** +This tool searches Ballerina Central to find relevant external libraries (packages not listed in the core Ballerina libraries) that match the user's requirements. Returns both library names AND descriptions for better context. + +It searches for external libraries, primarily: +- **ballerinax/*** - Extended/connector packages (e.g., ballerinax/stripe, ballerinax/aws.s3, ballerinax/github) +- **xlibb/*** - C library bindings (e.g., xlibb/docreader) +- Any other organization packages available in Ballerina Central + +Note: Core Ballerina libraries (ballerina/*) are typically pre-loaded and don't require searching, but if a ballerina/* package is not in the pre-loaded list, this tool can find it. + +**When to use this tool:** +- When the user's query requires libraries starting with **ballerinax/** or **xlibb/** (external libraries) +- When you need to discover what external packages are available for a specific use case +- Before calling LibraryProviderTool with external library names +- For third-party connectors, service integrations, or C library bindings + +**Important:** +- This tool returns library names WITH descriptions for better selection context +- After getting libraries from this tool, you MUST call LibraryProviderTool to get the detailed library information (functions, types, etc.) +- This tool searches ALL packages from Ballerina Central that are not already in the pre-loaded core library list + +**Workflow for external libraries:** +1. First, call this tool (ExternalLibrarySearchTool) with the user query to get relevant libraries with descriptions +2. Review the library names and descriptions to select the most appropriate ones +3. Then, call LibraryProviderTool with the selected library names to get detailed library information (functions, types, clients, etc.) + +**Example:** +User query: "I need to integrate with Stripe payment gateway" +1. Call ExternalLibrarySearchTool with userPrompt: "Stripe payment gateway integration" + → Returns: [ + { name: "ballerinax/stripe", description: "Connects to Stripe API for payment processing" } + ] +2. Call LibraryProviderTool with libraryNames: ["ballerinax/stripe"] to get full library details with functions and types + +**Tool Response:** +Returns an array of library objects with name and description: +[ + { name: "ballerinax/stripe", description: "Stripe payment connector..." }, + { name: "ballerinax/aws.s3", description: "AWS S3 connector..." }, + { name: "xlibb/docreader", description: "Document reader C library binding..." } +] + +Note: Core libraries (ballerina/*) are typically pre-loaded and don't require searching. +`, + inputSchema: ExternalLibrarySearchToolSchema, + execute: async (input: { userPrompt: string }) => { + console.log( + `[ExternalLibrarySearchTool] Called with prompt: ${input.userPrompt}` + ); + return await ExternalLibrarySearchTool(input, eventHandler); + }, + }); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts index 49b85d1da8e..3cbbbdb1ed7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts @@ -21,6 +21,7 @@ import { Library } from "../../utils/libs/library-types"; import { selectRequiredFunctions } from "../../utils/libs/function-registry"; import { CopilotEventHandler } from "../../utils/events"; import { LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; +import { EXTERNAL_LIBRARY_SEARCH_TOOL } from "./external-library-search"; /** * Emits tool_result event for library provider with filtering @@ -107,25 +108,41 @@ export function getLibraryProviderTool( description: `Fetches detailed information about Ballerina libraries along with their API documentation, including services, clients, functions, and types. This tool analyzes a user query and returns **only the relevant** services, clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. -Available libraries: +**This tool has a single purpose: fetch library descriptions. However, there are two cases for how to obtain library names:** + +## Case 1: Core Ballerina Libraries (Direct Usage) +For core Ballerina libraries (packages starting with **ballerina/**) listed below, you can directly call this tool with the library names. + +Available core libraries: <AVAILABLE LIBRARIES> ${libraryDescriptions} </AVAILABLE LIBRARIES> -Before calling this tool: -- Review all library names and their descriptions. -- Analyze the user query provided in the user message to identify the relevant Ballerina libraries which can be utilized to fulfill the query. -- Select the minimal set of libraries that can fulfill the query based on their descriptions. +**Workflow for core libraries:** +1. Review the library names and descriptions above +2. Analyze the user query to identify relevant core Ballerina libraries (ballerina/*) +3. Call this tool directly with the selected library names and user prompt + +## Case 2: External Libraries (Two-Step Process) +For external libraries NOT listed in the core libraries above, you MUST follow a two-step process. -# Example -**Query**: Write an integration to read GitHub issues, summarize them, and post the summary to a Slack channel. -**Tool Call**: Call with libraryNames: ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] +**External libraries include:** +- **ballerinax/*** - Extended/connector packages +- **xlibb/*** - C library bindings +- Any other organization packages available in Ballerina Central +**Workflow for external libraries:** +1. **FIRST**: Call ${EXTERNAL_LIBRARY_SEARCH_TOOL} with the user prompt to search for relevant external libraries from Ballerina Central + - This searches across ballerinax/*, xlibb/*, and any other organization packages +2. **THEN**: Call this tool ${LIBRARY_PROVIDER_TOOL} with the library names returned from step 1 + +**How to decide which case applies:** +- If the library starts with **ballerina/** and is in the "Available core libraries" list above → Use Case 1 (direct call) +- If the library starts with **ballerinax/**, **xlibb/**, or any other organization → Use Case 2 (search first) Tool Response: Tool responds with the following information about the requested libraries: name, description, type definitions (records, objects, enums, type aliases), clients (if any), functions and services (if any). - `, inputSchema: LibraryProviderToolSchema, execute: async (input: { libraryNames: string[]; userPrompt: string }) => { From 8682689297cfc920582627ac6fcd8ac0ffa19904 Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Fri, 6 Feb 2026 14:31:08 +0530 Subject: [PATCH 156/247] Adds library mode filtering for copilot APIs Introduces a mode parameter to copilot library requests, enabling filtering by core, healthcare, or all libraries. Unifies search and retrieval endpoints to support mode-based queries, enhancing library selection flexibility. --- .../src/rpc-types/ai-panel/interfaces.ts | 11 ++++++++--- .../src/core/extended-language-client.ts | 16 ++++++++-------- .../src/features/ai/utils/libs/libraries.ts | 3 ++- 3 files changed, 18 insertions(+), 12 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 f477b8055ab..e0ba42ed703 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 @@ -306,6 +306,11 @@ export interface GenerateAgentCodeRequest { codeContext?: CodeContext; } +export type LibraryMode = "CORE" | "HEALTHCARE" | "ALL"; + +export interface CopilotAllLibrariesRequest { + mode: LibraryMode; +} export interface MinifiedLibrary { name: string; description: string; @@ -322,11 +327,11 @@ export interface CopilotFilterLibrariesResponse { libraries: any[]; } -export interface CopilotSearchPackagesByPromptRequest { - userPrompt: string; +export interface CopilotSearchLibrariesBySearchRequest { + keywords: string[]; } -export interface CopilotSearchPackagesByPromptResponse { +export interface CopilotSearchLibrariesBySearchResponse { libraries: MinifiedLibrary[]; } 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 8e095c6f0cb..d465a8a93ed 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -231,7 +231,7 @@ import { JsonToTypeResponse, McpToolsRequest, McpToolsResponse, - CopilotCompactLibrariesResponse, + CopilotCompactLibrariesResponse,CopilotAllLibrariesRequest, CopilotFilterLibrariesResponse, CopilotFilterLibrariesRequest, GetConfigVariableNodeTemplateRequest, @@ -282,8 +282,8 @@ import { PersistClientGenerateResponse, WSDLApiClientGenerationRequest, WSDLApiClientGenerationResponse, - CopilotSearchPackagesByPromptRequest, - CopilotSearchPackagesByPromptResponse + CopilotSearchLibrariesBySearchRequest, + CopilotSearchLibrariesBySearchResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -475,7 +475,7 @@ enum EXTENDED_APIS { PUBLISH_ARTIFACTS = 'designModelService/publishArtifacts', COPILOT_ALL_LIBRARIES = 'copilotLibraryManager/getLibrariesList', COPILOT_FILTER_LIBRARIES = 'copilotLibraryManager/getFilteredLibraries', - COPILOT_SEARCH_PACKAGES_BY_PROMPT = 'copilotLibraryManager/searchPackagesByPrompt', + COPILOT_SEARCH_LIBRARIES = 'copilotLibraryManager/getLibrariesBySearch', GET_MIGRATION_TOOLS = 'projectService/getMigrationTools', TIBCO_TO_BI = 'projectService/importTibco', MULE_TO_BI = 'projectService/importMule', @@ -1423,16 +1423,16 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest<OpenAPIClientDeleteResponse>(EXTENDED_APIS.OPEN_API_CLIENT_DELETE, params); } - async getCopilotCompactLibraries(): Promise<CopilotCompactLibrariesResponse> { - return this.sendRequest<CopilotCompactLibrariesResponse>(EXTENDED_APIS.COPILOT_ALL_LIBRARIES); + async getCopilotCompactLibraries(params: CopilotAllLibrariesRequest): Promise<CopilotCompactLibrariesResponse> { + return this.sendRequest<CopilotCompactLibrariesResponse>(EXTENDED_APIS.COPILOT_ALL_LIBRARIES, params); } async getCopilotFilteredLibraries(params: CopilotFilterLibrariesRequest): Promise<CopilotFilterLibrariesResponse> { return this.sendRequest<CopilotFilterLibrariesResponse>(EXTENDED_APIS.COPILOT_FILTER_LIBRARIES, params); } - async getCopilotPackagesByPrompt(params: CopilotSearchPackagesByPromptRequest): Promise<CopilotSearchPackagesByPromptResponse> { - return this.sendRequest<CopilotSearchPackagesByPromptResponse>(EXTENDED_APIS.COPILOT_SEARCH_PACKAGES_BY_PROMPT, params); + async getCopilotLibrariesBySearch(params: CopilotSearchLibrariesBySearchRequest): Promise<CopilotSearchLibrariesBySearchResponse> { + return this.sendRequest<CopilotSearchLibrariesBySearchResponse>(EXTENDED_APIS.COPILOT_SEARCH_LIBRARIES, params); } async getMigrationTools(): Promise<GetMigrationToolsResponse> { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts index 7fb35bf44a8..6b436f0801b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { MinifiedLibrary } from "@wso2/ballerina-core"; +import { LibraryMode, MinifiedLibrary } from "@wso2/ballerina-core"; import { langClient } from "../../activator"; import { getGenerationMode } from "../ai-utils"; @@ -31,6 +31,7 @@ export const LIBRARY_PROVIDER_TOOL = "LibraryProviderTool"; export enum GenerationType { CODE_GENERATION = "CODE_GENERATION", HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", + ALL = "ALL" } export async function getAllLibraries(): Promise<MinifiedLibrary[]> { From 13d79089654e186c73ed9801af6a88f7edecf51f Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Mon, 9 Feb 2026 11:56:13 +0530 Subject: [PATCH 157/247] Add two-tool library discovery system - Split library discovery into LibrarySearchTool and LibraryGetTool - Add toolCallId support for parallel tool call tracking - Add optional searchDescription parameter for contextual UI messages - Update UI to display tool-specific status with unique IDs - Disable loader auto turn off for tool in segment component --- .../src/rpc-types/ai-panel/interfaces.ts | 4 - .../ballerina-core/src/state-machine-types.ts | 2 + .../src/core/extended-language-client.ts | 3 +- .../src/features/ai/agent/AgentExecutor.ts | 9 +- .../src/features/ai/agent/prompts.ts | 16 +- .../src/features/ai/agent/tool-registry.ts | 15 +- .../ai/agent/tools/connector-generator.ts | 13 +- .../ai/agent/tools/external-library-search.ts | 154 ------------- .../ai/agent/tools/healthcare-library.ts | 10 +- .../{library-provider.ts => library-get.ts} | 97 ++++---- .../features/ai/agent/tools/library-search.ts | 210 ++++++++++++++++++ .../src/features/ai/utils/ai-utils.ts | 6 +- .../src/features/ai/utils/events.ts | 4 +- .../src/features/ai/utils/libs/libraries.ts | 3 - .../views/AIPanel/components/AIChat/index.tsx | 99 ++++++--- .../AIPanel/components/AIChat/segment.ts | 4 +- 16 files changed, 367 insertions(+), 282 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts rename workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/{library-provider.ts => library-get.ts} (52%) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-search.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 e0ba42ed703..2ebaa0aff25 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 @@ -335,10 +335,6 @@ export interface CopilotSearchLibrariesBySearchResponse { libraries: MinifiedLibrary[]; } -export interface ExternalLibrarySearchResult { - libraries: MinifiedLibrary[]; -} - // ================================== // Doc Generation Related Interfaces // ================================== diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index fc4a4ddff84..cc7c3c8551d 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -292,12 +292,14 @@ export interface ToolCall { type: "tool_call"; toolName: string; toolInput?: any; + toolCallId?: string; } export interface ToolResult { type: "tool_result"; toolName: string; toolOutput?: any; + toolCallId?: string; } export interface EvalsToolResult { 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 d465a8a93ed..d69484e0cbf 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -231,7 +231,8 @@ import { JsonToTypeResponse, McpToolsRequest, McpToolsResponse, - CopilotCompactLibrariesResponse,CopilotAllLibrariesRequest, + CopilotCompactLibrariesResponse, + CopilotAllLibrariesRequest, CopilotFilterLibrariesResponse, CopilotFilterLibrariesRequest, GetConfigVariableNodeTemplateRequest, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index 8790dcdbded..f15aab168a6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -23,7 +23,7 @@ import { getAnthropicClient, getProviderCacheControl, ANTHROPIC_SONNET_4 } from import { populateHistoryForAgent, getErrorMessage } from '../utils/ai-utils'; import { sendAgentDidOpenForFreshProjects } from '../utils/project/ls-schema-notifications'; import { getSystemPrompt, getUserPrompt } from './prompts'; -import { GenerationType, getAllLibraries } from '../utils/libs/libraries'; +import { GenerationType } from '../utils/libs/libraries'; import { createToolRegistry } from './tool-registry'; import { getProjectSource, cleanupTempProject } from '../utils/project/temp-project'; import { StreamContext } from './stream-handlers/stream-context'; @@ -181,19 +181,12 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { }, ]; - // Get libraries for library provider tool - const allLibraries = await getAllLibraries(); - const libraryDescriptions = allLibraries.length > 0 - ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") - : "- No libraries available"; - // Create tools const tools = createToolRegistry({ eventHandler: this.config.eventHandler, tempProjectPath, modifiedFiles, projects, - libraryDescriptions, generationType: GenerationType.CODE_GENERATION, workspaceId: this.config.executionContext.projectPath, generationId: this.config.generationId, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts index af8bb6f8bf0..2c43f9c9662 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts @@ -15,7 +15,8 @@ // under the License. import { DIAGNOSTICS_TOOL_NAME } from "./tools/diagnostics"; -import { LIBRARY_PROVIDER_TOOL } from "../utils/libs/libraries"; +import { LIBRARY_GET_TOOL } from "./tools/library-get"; +import { LIBRARY_SEARCH_TOOL } from "./tools/library-search"; import { TASK_WRITE_TOOL_NAME } from "./tools/task-writer"; import { FILE_BATCH_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from "./tools/text-editor"; import { CONNECTOR_GENERATOR_TOOL } from "./tools/connector-generator"; @@ -92,8 +93,9 @@ This plan will be visible to the user and the execution will be guided on the ta - Mark task as in_progress using ${TASK_WRITE_TOOL_NAME} and immediately start implementation in parallel (single message with multiple tool calls) - Implement the task completely (write the Ballerina code) - When implementing external API integrations: - - First check ${LIBRARY_PROVIDER_TOOL} for known services (Stripe, GitHub, etc.) - - If NOT available, call ${CONNECTOR_GENERATOR_TOOL} to generate connector from OpenAPI spec + - First use ${LIBRARY_SEARCH_TOOL} with relevant keywords to discover available libraries + - Then use ${LIBRARY_GET_TOOL} to fetch full details for the discovered libraries + - If NO suitable library is found, call ${CONNECTOR_GENERATOR_TOOL} to generate connector from OpenAPI spec - Before marking the task as completed, use the ${DIAGNOSTICS_TOOL_NAME} tool to check for compilation errors and fix them. Introduce a a new subtask if needed to fix errors. - Mark task as completed using ${TASK_WRITE_TOOL_NAME} (send ALL tasks) - The tool will wait for TASK COMPLETION APPROVAL from the user @@ -113,8 +115,8 @@ In the <system-reminder> tags, you will see if Edit mode is enabled. When its en ### Step 1: Create High-Level Design Create a very high-level and concise design plan for the given user requirement. Avoid using ${TASK_WRITE_TOOL_NAME} tool in this mode. -### Step 2: Identify nescessary libraries -Identify the libraries required to implement the user requirement. Use the ${LIBRARY_PROVIDER_TOOL} tool to get the information about the libraries. +### Step 2: Identify necessary libraries +Identify the libraries required to implement the user requirement. Use ${LIBRARY_SEARCH_TOOL} to discover relevant libraries, then use ${LIBRARY_GET_TOOL} to fetch their full details. ### Step 3: Write the code Write/modify the Ballerina code to implement the user requirement. Use the ${FILE_BATCH_EDIT_TOOL_NAME}, ${FILE_SINGLE_EDIT_TOOL_NAME}, ${FILE_WRITE_TOOL_NAME} tools to write/modify the code. @@ -131,8 +133,8 @@ Once the code is written and validated, provide a very concise summary of the ov When generating Ballerina code strictly follow these syntax and structure guidelines: ## Library Usage and Importing libraries -- Only use the libraries received from user query or the ${LIBRARY_PROVIDER_TOOL} tool or langlibs. -- Examine the library API documentation provided by the ${LIBRARY_PROVIDER_TOOL} carefully. Strictly follow the type definitions, function signatures, and all the other details provided when writing the code. +- Only use the libraries received from user query or discovered via ${LIBRARY_SEARCH_TOOL} and fetched via ${LIBRARY_GET_TOOL}, or langlibs. +- Examine the library API documentation provided by ${LIBRARY_GET_TOOL} carefully. Strictly follow the type definitions, function signatures, and all the other details provided when writing the code. - Each .bal file must include its own import statements for any external library references. - Do not import default langlibs (lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map). - For packages with dots in names, use aliases: \`import org/package.one as one;\` diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts index 824541c6d3d..abfc0266bb9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts @@ -35,18 +35,17 @@ import { FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from './tools/text-editor'; -import { getLibraryProviderTool } from './tools/library-provider'; -import { LIBRARY_PROVIDER_TOOL, GenerationType } from '../utils/libs/libraries'; +import { getLibraryGetTool, LIBRARY_GET_TOOL } from './tools/library-get'; +import { GenerationType } from '../utils/libs/libraries'; import { getHealthcareLibraryProviderTool, HEALTHCARE_LIBRARY_PROVIDER_TOOL } from './tools/healthcare-library'; import { createConnectorGeneratorTool, CONNECTOR_GENERATOR_TOOL } from './tools/connector-generator'; -import { EXTERNAL_LIBRARY_SEARCH_TOOL, getExternalLibrarySearchTool } from './tools/external-library-search'; +import { LIBRARY_SEARCH_TOOL, getLibrarySearchTool } from './tools/library-search'; export interface ToolRegistryOptions { eventHandler: CopilotEventHandler; tempProjectPath: string; modifiedFiles: string[]; projects: ProjectSource[]; - libraryDescriptions: string; generationType: GenerationType; workspaceId: string; generationId: string; @@ -54,7 +53,7 @@ export interface ToolRegistryOptions { } export function createToolRegistry(opts: ToolRegistryOptions) { - const { eventHandler, tempProjectPath, modifiedFiles, projects, libraryDescriptions, generationType, workspaceId, generationId, threadId } = opts; + const { eventHandler, tempProjectPath, modifiedFiles, projects, generationType, workspaceId, generationId, threadId } = opts; return { [TASK_WRITE_TOOL_NAME]: createTaskWriteTool( eventHandler, @@ -64,16 +63,14 @@ export function createToolRegistry(opts: ToolRegistryOptions) { generationId, threadId || 'default' ), - [LIBRARY_PROVIDER_TOOL]: getLibraryProviderTool( - libraryDescriptions, + [LIBRARY_GET_TOOL]: getLibraryGetTool( generationType, eventHandler ), - [EXTERNAL_LIBRARY_SEARCH_TOOL]: getExternalLibrarySearchTool( + [LIBRARY_SEARCH_TOOL]: getLibrarySearchTool( eventHandler ), [HEALTHCARE_LIBRARY_PROVIDER_TOOL]: getHealthcareLibraryProviderTool( - libraryDescriptions, eventHandler ), [CONNECTOR_GENERATOR_TOOL]: createConnectorGeneratorTool( diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts index c87a4f64a11..04c3793e255 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts @@ -32,7 +32,7 @@ import { import { CopilotEventHandler } from "../../utils/events"; import { langClient } from "../../activator"; import { applyTextEdits } from "../utils"; -import { LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; +import { LIBRARY_GET_TOOL } from "./library-get"; import { approvalManager } from '../../state/ApprovalManager'; import { sendAiSchemaDidOpen } from "../../utils/project/ls-schema-notifications"; @@ -43,14 +43,19 @@ const SpecFetcherInputSchema = z.object({ serviceDescription: z.string().optional().describe("Optional description of what the service is for"), }); + + export function createConnectorGeneratorTool(eventHandler: CopilotEventHandler, tempProjectPath: string, projectName?: string, modifiedFiles?: string[]) { return tool({ + // TODO: Since LIBRARY_SEARCH_TOOL and LIBRARY_GET_TOOL workflow changed, verify this tool's use case ordering aligns with agent behavior description: ` -Generates a connector for an external service by deriving the service contract from user-provided specifications. Use this tool only when the service contract is unclear or missing, and the target service is not a well-established platform with an existing SDK or connector +Generates a connector for an external service by deriving the service contract from user-provided OpenAPI specifications. Use this tool when: -1. The target service is custom, internal, or niche, and unlikely to be covered by existing libraries. -2. When the ${LIBRARY_PROVIDER_TOOL} does not have a connector for the target service. +1. Target service is custom, internal, or niche +2. User request is ambiguous and needs a custom connector +3. User explicitly requests to create a custom connector +4. After searching with LIBRARY_SEARCH_TOOL, no suitable connector is found The tool will: 1. Request OpenAPI spec from user (supports JSON and YAML formats) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts deleted file mode 100644 index 326133f9de1..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/external-library-search.ts +++ /dev/null @@ -1,154 +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 { tool, jsonSchema } from "ai"; -import { CopilotEventHandler } from "../../utils/events"; -import { langClient } from "../../activator"; -import { CopilotSearchPackagesByPromptRequest, CopilotSearchPackagesByPromptResponse, ExternalLibrarySearchResult, MinifiedLibrary } from "@wso2/ballerina-core"; - -export const EXTERNAL_LIBRARY_SEARCH_TOOL = "ExternalLibrarySearchTool"; - -const ExternalLibrarySearchToolSchema = jsonSchema<{ - userPrompt: string; -}>({ - type: "object", - properties: { - userPrompt: { - type: "string", - description: "User query to search for relevant external library names from Ballerina Central", - }, - }, - required: ["userPrompt"], -}); - -function emitExternalLibrarySearchResult( - eventHandler: CopilotEventHandler, - toolName: string, - libraries: MinifiedLibrary[] -): void { - const libraryNames = libraries.map(lib => lib.name); - eventHandler({ - type: "tool_result", - toolName, - toolOutput: libraryNames - }); -} - -export async function ExternalLibrarySearchTool( - params: { userPrompt: string }, - eventHandler: CopilotEventHandler -): Promise<ExternalLibrarySearchResult> { - try { - // Emit tool_call event - eventHandler({ - type: "tool_call", - toolName: EXTERNAL_LIBRARY_SEARCH_TOOL, - }); - - const startTime = Date.now(); - - // Call the LS API to search for packages by prompt - const request: CopilotSearchPackagesByPromptRequest = { - userPrompt: params.userPrompt - }; - - const response: CopilotSearchPackagesByPromptResponse = - await langClient.getCopilotPackagesByPrompt(request); - - const libraryNames = response.libraries.map(lib => lib.name); - console.log( - `[ExternalLibrarySearchTool] Found ${response.libraries.length} libraries: ${libraryNames.join( - ", " - )}, took ${(Date.now() - startTime) / 1000}s` - ); - - // Emit tool_result event - emitExternalLibrarySearchResult(eventHandler, EXTERNAL_LIBRARY_SEARCH_TOOL, response.libraries); - - return { libraries: response.libraries }; - } catch (error) { - console.error(`[ExternalLibrarySearchTool] Error searching libraries: ${error}`); - - // Emit error result - eventHandler({ - type: "tool_result", - toolName: EXTERNAL_LIBRARY_SEARCH_TOOL, - toolOutput: [] - }); - - return { libraries: [] }; - } -} - -export function getExternalLibrarySearchTool( - eventHandler: CopilotEventHandler -) { - return tool({ - description: `Searches for external Ballerina libraries from Ballerina Central based on a user query. - -**Purpose:** -This tool searches Ballerina Central to find relevant external libraries (packages not listed in the core Ballerina libraries) that match the user's requirements. Returns both library names AND descriptions for better context. - -It searches for external libraries, primarily: -- **ballerinax/*** - Extended/connector packages (e.g., ballerinax/stripe, ballerinax/aws.s3, ballerinax/github) -- **xlibb/*** - C library bindings (e.g., xlibb/docreader) -- Any other organization packages available in Ballerina Central - -Note: Core Ballerina libraries (ballerina/*) are typically pre-loaded and don't require searching, but if a ballerina/* package is not in the pre-loaded list, this tool can find it. - -**When to use this tool:** -- When the user's query requires libraries starting with **ballerinax/** or **xlibb/** (external libraries) -- When you need to discover what external packages are available for a specific use case -- Before calling LibraryProviderTool with external library names -- For third-party connectors, service integrations, or C library bindings - -**Important:** -- This tool returns library names WITH descriptions for better selection context -- After getting libraries from this tool, you MUST call LibraryProviderTool to get the detailed library information (functions, types, etc.) -- This tool searches ALL packages from Ballerina Central that are not already in the pre-loaded core library list - -**Workflow for external libraries:** -1. First, call this tool (ExternalLibrarySearchTool) with the user query to get relevant libraries with descriptions -2. Review the library names and descriptions to select the most appropriate ones -3. Then, call LibraryProviderTool with the selected library names to get detailed library information (functions, types, clients, etc.) - -**Example:** -User query: "I need to integrate with Stripe payment gateway" -1. Call ExternalLibrarySearchTool with userPrompt: "Stripe payment gateway integration" - → Returns: [ - { name: "ballerinax/stripe", description: "Connects to Stripe API for payment processing" } - ] -2. Call LibraryProviderTool with libraryNames: ["ballerinax/stripe"] to get full library details with functions and types - -**Tool Response:** -Returns an array of library objects with name and description: -[ - { name: "ballerinax/stripe", description: "Stripe payment connector..." }, - { name: "ballerinax/aws.s3", description: "AWS S3 connector..." }, - { name: "xlibb/docreader", description: "Document reader C library binding..." } -] - -Note: Core libraries (ballerina/*) are typically pre-loaded and don't require searching. -`, - inputSchema: ExternalLibrarySearchToolSchema, - execute: async (input: { userPrompt: string }) => { - console.log( - `[ExternalLibrarySearchTool] Called with prompt: ${input.userPrompt}` - ); - return await ExternalLibrarySearchTool(input, eventHandler); - }, - }); -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts index 61d2f86c074..61cb3c7aa1b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts @@ -15,7 +15,8 @@ // under the License. import { generateObject, ModelMessage, tool } from "ai"; -import { GenerationType, getAllLibraries, LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; +import { GenerationType, getAllLibraries } from "../../utils/libs/libraries"; +import { LIBRARY_GET_TOOL } from "./library-get"; import { jsonSchema } from "ai"; import { Library } from "../../utils/libs/library-types"; import { selectRequiredFunctions } from "../../utils/libs/function-registry"; @@ -95,14 +96,13 @@ export async function HealthcareLibraryProviderTool( //TODO: Improve this description export function getHealthcareLibraryProviderTool( - _libraryDescriptions: string, eventHandler: CopilotEventHandler ) { return tool({ description: `Fetches detailed information about healthcare-specific Ballerina libraries along with their API documentation, including services, clients, functions, and filtered type definitions. ** NOTE: -1. This Tool only has knowledge on healthcare libraries, you want general libraries, use ${LIBRARY_PROVIDER_TOOL} to retrieve those. +1. This Tool only has knowledge on healthcare libraries, you want general libraries, use ${LIBRARY_GET_TOOL} to retrieve those. This tool is specifically designed for healthcare integration use cases (FHIR, HL7v2, etc.) and provides: 1. **Automatically includes mandatory healthcare libraries** (FHIR R4, HL7v2 commons, etc.) even if not explicitly requested @@ -163,8 +163,8 @@ export async function getRelevantLibrariesAndFunctions( return relevantTrimmedFuncs; } -export async function getSelectedLibraries(prompt: string, generationType: GenerationType): Promise<string[]> { - const allLibraries = await getAllLibraries(); +export async function getSelectedLibraries(prompt: string, libraryType: GenerationType): Promise<string[]> { + const allLibraries = await getAllLibraries(libraryType); if (allLibraries.length === 0) { return []; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-get.ts similarity index 52% rename from workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-get.ts index 3cbbbdb1ed7..ad80cc2a92d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-get.ts @@ -1,4 +1,4 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. // WSO2 LLC. licenses this file to you under the Apache License, // Version 2.0 (the "License"); you may not use this file except @@ -20,17 +20,18 @@ import { jsonSchema } from "ai"; import { Library } from "../../utils/libs/library-types"; import { selectRequiredFunctions } from "../../utils/libs/function-registry"; import { CopilotEventHandler } from "../../utils/events"; -import { LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; -import { EXTERNAL_LIBRARY_SEARCH_TOOL } from "./external-library-search"; + +export const LIBRARY_GET_TOOL = "LibraryGetTool"; /** - * Emits tool_result event for library provider with filtering + * Emits tool_result event for library get with filtering */ function emitLibraryToolResult( eventHandler: CopilotEventHandler, toolName: string, libraries: Library[], - requestedLibraryNames: string[] + requestedLibraryNames: string[], + toolCallId: string ): void { const libraryNames = libraries.map(lib => lib.name); const filteredNames = libraryNames.filter(name => requestedLibraryNames.includes(name)); @@ -38,11 +39,12 @@ function emitLibraryToolResult( eventHandler({ type: "tool_result", toolName, - toolOutput: filteredNames + toolOutput: filteredNames, + toolCallId }); } -const LibraryProviderToolSchema = jsonSchema<{ +const LibraryGetToolSchema = jsonSchema<{ libraryNames: string[]; userPrompt: string; }>({ @@ -61,46 +63,48 @@ const LibraryProviderToolSchema = jsonSchema<{ required: ["libraryNames", "userPrompt"], }); -export async function LibraryProviderTool( +export async function LibraryGetTool( params: { libraryNames: string[]; userPrompt: string }, generationType: GenerationType, - eventHandler: CopilotEventHandler + eventHandler: CopilotEventHandler, + toolCallId: string ): Promise<Library[]> { try { - // Emit tool_call event + // Emit tool_call event with ID from AI SDK eventHandler({ type: "tool_call", - toolName: LIBRARY_PROVIDER_TOOL, + toolName: LIBRARY_GET_TOOL, + toolCallId }); const startTime = Date.now(); const libraries = await selectRequiredFunctions(params.userPrompt, params.libraryNames, generationType); console.log( - `[LibraryProviderTool] Fetched ${libraries.length} libraries: ${libraries + `[LibraryGetTool] Fetched ${libraries.length} libraries: ${libraries .map((lib) => lib.name) .join(", ")}, took ${(Date.now() - startTime) / 1000}s` ); - // Emit tool_result event with filtered library names - emitLibraryToolResult(eventHandler, LIBRARY_PROVIDER_TOOL, libraries, params.libraryNames); + // Emit tool_result event with filtered library names and ID + emitLibraryToolResult(eventHandler, LIBRARY_GET_TOOL, libraries, params.libraryNames, toolCallId); return libraries; } catch (error) { - console.error(`[LibraryProviderTool] Error fetching libraries: ${error}`); + console.error(`[LibraryGetTool] Error fetching libraries: ${error}`); - // Emit error result + // Emit error result with same ID eventHandler({ type: "tool_result", - toolName: LIBRARY_PROVIDER_TOOL, - toolOutput: [] + toolName: LIBRARY_GET_TOOL, + toolOutput: [], + toolCallId }); return []; } } -export function getLibraryProviderTool( - libraryDescriptions: string, +export function getLibraryGetTool( generationType: GenerationType, eventHandler: CopilotEventHandler ) { @@ -108,50 +112,33 @@ export function getLibraryProviderTool( description: `Fetches detailed information about Ballerina libraries along with their API documentation, including services, clients, functions, and types. This tool analyzes a user query and returns **only the relevant** services, clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. -**This tool has a single purpose: fetch library descriptions. However, there are two cases for how to obtain library names:** - -## Case 1: Core Ballerina Libraries (Direct Usage) -For core Ballerina libraries (packages starting with **ballerina/**) listed below, you can directly call this tool with the library names. - -Available core libraries: -<AVAILABLE LIBRARIES> -${libraryDescriptions} -</AVAILABLE LIBRARIES> - -**Workflow for core libraries:** -1. Review the library names and descriptions above -2. Analyze the user query to identify relevant core Ballerina libraries (ballerina/*) -3. Call this tool directly with the selected library names and user prompt +Before calling this tool: +- First use LibrarySearchTool to discover available libraries based on keywords +- Review the library names and descriptions returned from the search +- Analyze the user query to identify the relevant Ballerina libraries which can be utilized to fulfill the query +- Select the minimal set of libraries that can fulfill the query based on their descriptions -## Case 2: External Libraries (Two-Step Process) -For external libraries NOT listed in the core libraries above, you MUST follow a two-step process. - -**External libraries include:** -- **ballerinax/*** - Extended/connector packages -- **xlibb/*** - C library bindings -- Any other organization packages available in Ballerina Central - -**Workflow for external libraries:** -1. **FIRST**: Call ${EXTERNAL_LIBRARY_SEARCH_TOOL} with the user prompt to search for relevant external libraries from Ballerina Central - - This searches across ballerinax/*, xlibb/*, and any other organization packages -2. **THEN**: Call this tool ${LIBRARY_PROVIDER_TOOL} with the library names returned from step 1 - -**How to decide which case applies:** -- If the library starts with **ballerina/** and is in the "Available core libraries" list above → Use Case 1 (direct call) -- If the library starts with **ballerinax/**, **xlibb/**, or any other organization → Use Case 2 (search first) +# Example +**Query**: Write an integration to read GitHub issues, summarize them, and post the summary to a Slack channel. +**Step 1**: Call LibrarySearchTool with keywords: ["GitHub", "Slack", "OpenAI"] +**Step 2**: Call this tool with libraryNames: ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] Tool Response: Tool responds with the following information about the requested libraries: name, description, type definitions (records, objects, enums, type aliases), clients (if any), functions and services (if any). + `, - inputSchema: LibraryProviderToolSchema, - execute: async (input: { libraryNames: string[]; userPrompt: string }) => { + inputSchema: LibraryGetToolSchema, + execute: async (input: { libraryNames: string[]; userPrompt: string }, context?: { toolCallId?: string }) => { + // Extract toolCallId from AI SDK context + const toolCallId = context?.toolCallId || `fallback-${Date.now()}`; + console.log( - `[LibraryProviderTool] Called with ${input.libraryNames.length} libraries: ${input.libraryNames.join( + `[LibraryGetTool] Called with ${input.libraryNames.length} libraries: ${input.libraryNames.join( ", " - )} and prompt: ${input.userPrompt}` + )} and prompt: ${input.userPrompt} [toolCallId: ${toolCallId}]` ); - return await LibraryProviderTool(input, generationType, eventHandler); + return await LibraryGetTool(input, generationType, eventHandler, toolCallId); }, }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-search.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-search.ts new file mode 100644 index 00000000000..e47a3b00672 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-search.ts @@ -0,0 +1,210 @@ +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { tool, jsonSchema } from "ai"; +import { CopilotEventHandler } from "../../utils/events"; +import { langClient } from "../../activator"; +import { CopilotSearchLibrariesBySearchRequest, CopilotSearchLibrariesBySearchResponse, MinifiedLibrary } from "@wso2/ballerina-core"; + +export const LIBRARY_SEARCH_TOOL = "LibrarySearchTool"; + +// Maximum number of keywords allowed for library search +const MAX_SEARCH_KEYWORDS = 10; + +const LibrarySearchToolSchema = jsonSchema<{ + keywords: string[]; + searchDescription?: string; +}>({ + type: "object", + properties: { + keywords: { + type: "array", + items: { type: "string" }, + description: `Array of search keywords to find relevant Ballerina libraries. Keywords are weighted by order - first keyword has highest weight, subsequent keywords have decreasing weight. Maximum ${MAX_SEARCH_KEYWORDS} keywords allowed. Examples: ["GitHub", "API", "integration"], ["Stripe", "payment", "gateway"], ["HTTP", "REST", "service"]`, + minItems: 1, + maxItems: MAX_SEARCH_KEYWORDS, + }, + searchDescription: { + type: "string", + description: "Optional user-friendly description of what libraries are being searched for (e.g., 'payment processing libraries', 'GitHub API connectors', 'email sending services'). This will be shown to the user during the search to provide context about what is being looked for.", + }, + }, + required: ["keywords"], +}); + +function emitLibrarySearchResult( + eventHandler: CopilotEventHandler, + toolName: string, + libraries: MinifiedLibrary[], + toolCallId: string, + searchDescription?: string +): void { + const libraryNames = libraries.map(lib => lib.name); + eventHandler({ + type: "tool_result", + toolName, + toolOutput: { + libraries: libraryNames, + searchDescription + }, + toolCallId + }); +} + +export async function LibrarySearchTool( + params: { keywords: string[]; searchDescription?: string }, + eventHandler: CopilotEventHandler, + toolCallId: string +): Promise<CopilotSearchLibrariesBySearchResponse> { + try { + // Emit tool_call event with ID and description + eventHandler({ + type: "tool_call", + toolName: LIBRARY_SEARCH_TOOL, + toolInput: { + keywords: params.keywords, + searchDescription: params.searchDescription + }, + toolCallId + }); + + const startTime = Date.now(); + + // Validate keyword count + const keywords = params.keywords.slice(0, MAX_SEARCH_KEYWORDS); + if (keywords.length === 0) { + console.warn(`[LibrarySearchTool] No keywords provided`); + return { libraries: [] }; + } + + const request: CopilotSearchLibrariesBySearchRequest = { + keywords + }; + + const response: CopilotSearchLibrariesBySearchResponse = + await langClient.getCopilotLibrariesBySearch(request); + + const libraryNames = response.libraries.map(lib => lib.name); + console.log( + `[LibrarySearchTool] Searched with keywords: [${keywords.join(", ")}], found ${response.libraries.length} libraries: ${libraryNames.join( + ", " + )}, took ${(Date.now() - startTime) / 1000}s` + ); + + // Emit tool_result event with same ID and description + emitLibrarySearchResult(eventHandler, LIBRARY_SEARCH_TOOL, response.libraries, toolCallId, params.searchDescription); + + return { libraries: response.libraries }; + } catch (error) { + console.error(`[LibrarySearchTool] Error searching libraries: ${error}`); + + // Emit error result with same ID and description + eventHandler({ + type: "tool_result", + toolName: LIBRARY_SEARCH_TOOL, + toolOutput: { + libraries: [], + searchDescription: params.searchDescription + }, + toolCallId + }); + + return { libraries: [] }; + } +} + +export function getLibrarySearchTool( + eventHandler: CopilotEventHandler +) { + return tool({ + description: `Searches for Ballerina libraries from Ballerina Central based on weighted keywords. + +**Purpose:** +This tool discovers relevant Ballerina libraries using keyword-based search. It searches against library names, descriptions, and function names. Keywords are weighted by order - the first keyword has the highest weight, with decreasing weight for subsequent keywords. + +**Scope - ALL Ballerina Libraries:** +- **ballerina/*** - Standard/core libraries (e.g., ballerina/http, ballerina/io, ballerina/sql) +- **ballerinax/*** - Extended/connector packages (e.g., ballerinax/stripe, ballerinax/aws.s3, ballerinax/github) +- **xlibb/*** - C library bindings (e.g., xlibb/docreader) +- Other organization packages available in Ballerina Central + +**Keyword Guidelines:** +- Provide 1-${MAX_SEARCH_KEYWORDS} keywords ordered by importance +- First keyword = most important (highest weight in search) +- Subsequent keywords = less important (decreasing weight) +- Use specific terms (e.g., "Stripe", "GitHub", "PostgreSQL") before generic ones (e.g., "payment", "API", "database") + +**When to use this tool:** +- To discover which libraries are available for a specific use case or integration +- Before calling LibraryProviderTool to retrieve full library details +- When the user query mentions integrations, services, connectors, or specific functionality +- Whenever you need to find relevant libraries but don't know the exact library names + +**Important - Two-Step Workflow:** +1. First, call THIS tool (LibrarySearchTool) with weighted keywords to discover relevant libraries +2. Review the returned library names and descriptions +3. Select the most appropriate libraries (typically 1-5 libraries) +4. Then, call LibraryProviderTool with the selected library names to get detailed API documentation (functions, types, clients, services, etc.) + +**Example Workflows:** + +Example 1 - Stripe Integration: +User query: "I need to integrate with Stripe payment gateway" +Keywords: ["Stripe", "payment", "gateway"] // "Stripe" has highest weight +Call LibrarySearchTool with keywords: ["Stripe", "payment", "gateway"] +→ Returns: [ + { name: "ballerinax/stripe", description: "Connects to Stripe API for payment processing" } + ] +Then call LibraryProviderTool with libraryNames: ["ballerinax/stripe"] + +Example 2 - GitHub API: +User query: "Create a GitHub integration to list issues" +Keywords: ["GitHub", "API", "issues"] // "GitHub" has highest weight +Call LibrarySearchTool with keywords: ["GitHub", "API", "issues"] +→ Returns: [ + { name: "ballerinax/github", description: "GitHub API connector for repository management" } + ] +Then call LibraryProviderTool with libraryNames: ["ballerinax/github"] + +Example 3 - HTTP Service: +User query: "Create a REST API" +Keywords: ["HTTP", "REST", "API"] // "HTTP" has highest weight +Call LibrarySearchTool with keywords: ["HTTP", "REST", "API"] +→ Returns: [ + { name: "ballerina/http", description: "HTTP client and server implementation" } + ] +Then call LibraryProviderTool with libraryNames: ["ballerina/http"] + +**Tool Response Format:** +Returns an array of library objects, each containing name and description: +[ + { name: "ballerinax/stripe", description: "Stripe payment connector for processing payments..." }, + { name: "ballerinax/aws.s3", description: "AWS S3 connector for object storage operations..." }, + { name: "ballerina/http", description: "HTTP client and server implementation..." } +] +`, + inputSchema: LibrarySearchToolSchema, + execute: async (input: { keywords: string[]; searchDescription?: string }, context?: { toolCallId?: string }) => { + // Extract toolCallId from AI SDK context + const toolCallId = context?.toolCallId || `fallback-${Date.now()}`; + + console.log( + `[LibrarySearchTool] Called with keywords: [${input.keywords.join(", ")}] [toolCallId: ${toolCallId}] [description: ${input.searchDescription || 'none'}]` + ); + return await LibrarySearchTool(input, eventHandler, toolCallId); + }, + }); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts index 9a1c1c0aa18..ea3166cc05f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts @@ -233,20 +233,22 @@ export function sendIntermidateStateNotification(intermediaryState: Documentatio sendAIPanelNotification(msg); } -export function sendToolCallNotification(toolName: string, toolInput?: any): void { +export function sendToolCallNotification(toolName: string, toolInput?: any, toolCallId?: string): void { const msg: ToolCall = { type: "tool_call", toolName: toolName, toolInput: toolInput, + toolCallId: toolCallId, }; sendAIPanelNotification(msg); } -export function sendToolResultNotification(toolName: string, toolOutput?: any): void { +export function sendToolResultNotification(toolName: string, toolOutput?: any, toolCallId?: string): void { const msg: ToolResult = { type: "tool_result", toolName: toolName, toolOutput: toolOutput, + toolCallId: toolCallId, }; sendAIPanelNotification(msg); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts index f4893ac6c28..7da57209cb7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts @@ -75,10 +75,10 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler sendMessagesNotification(event.messages); break; case "tool_call": - sendToolCallNotification(event.toolName, event.toolInput); + sendToolCallNotification(event.toolName, event.toolInput, event.toolCallId); break; case "tool_result": - sendToolResultNotification(event.toolName, event.toolOutput); + sendToolResultNotification(event.toolName, event.toolOutput, event.toolCallId); break; case "task_approval_request": console.log("[Event Handler] Task approval request received:", event); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts index 6b436f0801b..2f2485f22f1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts @@ -19,9 +19,6 @@ import { langClient } from "../../activator"; import { getGenerationMode } from "../ai-utils"; - -export const LIBRARY_PROVIDER_TOOL = "LibraryProviderTool"; - // export async function getRelevantLibs(params: GenerateCodeParams): Promise<Library[]> { // // const prompt = getReadmeQuery(params); // const selectedLibs: string[] = await getSelectedLibraries(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 7cf41ad4c2f..28e400ace3a 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 @@ -353,14 +353,31 @@ const AIChat: React.FC = () => { return newMessages; }); } else if (type === "tool_call") { - if (response.toolName == "LibraryProviderTool") { - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content += `\n\n<toolcall>Analyzing request & selecting libraries...</toolcall>`; - } - return newMessages; - }); + if (response.toolName === "LibrarySearchTool") { + const toolCallId = response?.toolCallId; + const toolInput = response.toolInput; + const searchDescription = toolInput?.searchDescription; + const displayMessage = searchDescription + ? `Searching for ${searchDescription}...` + : "Searching for libraries..."; + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content += + `\n\n<toolcall id="${toolCallId}">${displayMessage}</toolcall>`; + } + return newMessages; + }); + } else if (response.toolName === "LibraryGetTool") { + const toolCallId = response?.toolCallId; + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content += + `\n\n<toolcall id="${toolCallId}">Fetching library details...</toolcall>`; + } + return newMessages; + }); } else if (response.toolName == "HealthcareLibraryProviderTool") { setMessages((prevMessages) => { const newMessages = [...prevMessages]; @@ -401,29 +418,59 @@ const AIChat: React.FC = () => { }); } } else if (type === "tool_result") { - if (response.toolName == "LibraryProviderTool") { - const libraryNames = response.toolOutput; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - if (libraryNames.length === 0) { + if (response.toolName === "LibrarySearchTool") { + const toolCallId = response.toolCallId; + const toolOutput = response.toolOutput; + const searchDescription = toolOutput?.searchDescription; + + // Build the original message to replace + const originalMessage = searchDescription + ? `Searching for ${searchDescription}...` + : "Searching for libraries..."; + + // Build the completion message + const completionMessage = searchDescription + ? `${searchDescription.charAt(0).toUpperCase() + searchDescription.slice(1)} search completed` + : "Library search completed"; + + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { newMessages[newMessages.length - 1].content = newMessages[ newMessages.length - 1 ].content.replace( - `<toolcall>Analyzing request & selecting libraries...</toolcall>`, - `<toolresult>No relevant libraries found.</toolresult>` - ); - } else { - newMessages[newMessages.length - 1].content = newMessages[ - newMessages.length - 1 - ].content.replace( - `<toolcall>Analyzing request & selecting libraries...</toolcall>`, - `<toolresult>Fetched libraries: [${libraryNames.join(", ")}]</toolresult>` + `<toolcall id="${toolCallId}">${originalMessage}</toolcall>`, + `<toolresult id="${toolCallId}">${completionMessage}</toolresult>`, ); } - } - return newMessages; - }); + return newMessages; + }); + } else if (response.toolName === "LibraryGetTool") { + const toolCallId = response.toolCallId; + const libraryNames = response.toolOutput || []; + if (toolCallId) { + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + if (libraryNames.length === 0) { + newMessages[newMessages.length - 1].content = newMessages[ + newMessages.length - 1 + ].content.replace( + `<toolcall id="${toolCallId}">Fetching library details...</toolcall>`, + `<toolresult id="${toolCallId}">No relevant libraries found</toolresult>` + ); + } else { + newMessages[newMessages.length - 1].content = newMessages[ + newMessages.length - 1 + ].content.replace( + `<toolcall id="${toolCallId}">Fetching library details...</toolcall>`, + `<toolresult id="${toolCallId}">Fetched libraries: [${libraryNames.join(", ")}]</toolresult>` + ); + } + } + return newMessages; + }); + } } else if (response.toolName == "HealthcareLibraryProviderTool") { const libraryNames = response.toolOutput; setMessages((prevMessages) => { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts index c1cec54dfd1..f7d5ad6bd7e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts @@ -86,7 +86,7 @@ export function splitContent(content: string): Segment[] { // Combined regex to capture either <code ...>```<language> code ```</code> or <progress>Text</progress> // Using matchAll for stateless iteration to avoid regex lastIndex corruption during streaming const regexPattern = - /<code\s+filename="([^"]+)"(?:\s+type=("test"|"ai_map"|"type_creator"))?>\s*```(\w+)\s*([\s\S]*?)```\s*<\/code>|<progress>([\s\S]*?)<\/progress>|<toolcall>([\s\S]*?)<\/toolcall>|<toolresult>([\s\S]*?)<\/toolresult>|<todo>([\s\S]*?)<\/todo>|<attachment>([\s\S]*?)<\/attachment>|<scenario>([\s\S]*?)<\/scenario>|<button\s+type="([^"]+)">([\s\S]*?)<\/button>|<inlineCode>([\s\S]*?)<inlineCode>|<references>([\s\S]*?)<references>|<connectorgenerator>([\s\S]*?)<\/connectorgenerator>|<reviewactions>([\s\S]*?)<\/reviewactions>/g; + /<code\s+filename="([^"]+)"(?:\s+type=("test"|"ai_map"|"type_creator"))?>\s*```(\w+)\s*([\s\S]*?)```\s*<\/code>|<progress>([\s\S]*?)<\/progress>|<toolcall(?:\s+[^>]*)?>([\s\S]*?)<\/toolcall>|<toolresult(?:\s+[^>]*)?>([\s\S]*?)<\/toolresult>|<todo>([\s\S]*?)<\/todo>|<attachment>([\s\S]*?)<\/attachment>|<scenario>([\s\S]*?)<\/scenario>|<button\s+type="([^"]+)">([\s\S]*?)<\/button>|<inlineCode>([\s\S]*?)<inlineCode>|<references>([\s\S]*?)<references>|<connectorgenerator>([\s\S]*?)<\/connectorgenerator>|<reviewactions>([\s\S]*?)<\/reviewactions>/g; // Convert to array to avoid stateful regex iteration issues const matches = Array.from(content.matchAll(regexPattern)); @@ -94,7 +94,7 @@ export function splitContent(content: string): Segment[] { function updateLastProgressSegmentLoading(failed: boolean = false) { const lastSegment = segments[segments.length - 1]; - if (lastSegment && (lastSegment.type === SegmentType.Progress || lastSegment.type === SegmentType.ToolCall)) { + if (lastSegment && (lastSegment.type === SegmentType.Progress)) { lastSegment.loading = false; lastSegment.failed = failed; } From 0e5b2949970a81f0db4621f9e07c20f6e9342c9d Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Mon, 9 Feb 2026 17:28:53 +0530 Subject: [PATCH 158/247] Refine LLM prompts to prevent field value modifications in function filtering --- .../ai/agent/tools/connector-generator.ts | 7 ++++--- .../features/ai/utils/libs/function-registry.ts | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts index 04c3793e255..87c5721d891 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts @@ -35,6 +35,7 @@ import { applyTextEdits } from "../utils"; import { LIBRARY_GET_TOOL } from "./library-get"; import { approvalManager } from '../../state/ApprovalManager'; import { sendAiSchemaDidOpen } from "../../utils/project/ls-schema-notifications"; +import { LIBRARY_SEARCH_TOOL } from "./library-search"; export const CONNECTOR_GENERATOR_TOOL = "ConnectorGeneratorTool"; @@ -53,9 +54,9 @@ Generates a connector for an external service by deriving the service contract f Use this tool when: 1. Target service is custom, internal, or niche -2. User request is ambiguous and needs a custom connector -3. User explicitly requests to create a custom connector -4. After searching with LIBRARY_SEARCH_TOOL, no suitable connector is found +2. User request is ambiguous and needs a SaaS connector +3. User explicitly requests to create a SaaS connector +4. After searching with ${LIBRARY_SEARCH_TOOL}, no suitable connector is found The tool will: 1. Request OpenAPI spec from user (supports JSON and YAML formats) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts index 380b7bee1dd..50e78c45b87 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts @@ -200,9 +200,11 @@ async function getSuggestedFunctions( const getLibSystemPrompt = `You are an AI assistant tasked with filtering and removing unwanted functions and clients from a provided set of libraries and clients based on a user query. The provided libraries are a subset of the full requirements for the query. Your goal is to return ONLY the relevant libraries, clients, and functions from the provided context that match the user's needs. -Rules: -1. Use ONLY the libraries listed in Library_Context_JSON. -2. Do NOT create or infer new libraries or functions.`; +CRITICAL RULES: +1. Use ONLY items from Library_Context_JSON - do not create or infer new ones. +2. Your ONLY task is selection - include or exclude items, NEVER modify field values. +3. Copy all field values EXACTLY as provided - preserve every character including backslashes and special characters. +4. For resource functions: "accessor" and "paths" are SEPARATE fields - NEVER combine them.`; const getLibUserPrompt = `You will be provided with a list of libraries, clients, and their functions, and a user query. @@ -220,9 +222,16 @@ To process the user query and filter the libraries, clients, and functions, foll 2. Review the provided libraries, clients, and functions in Library_Context_JSON. 3. Select only the libraries, clients, and functions that directly match the query's needs. 4. Exclude any irrelevant libraries, clients, or functions. -5. If no relevant functions are found, return an empty array for the libraries. +5. If no relevant functions are found, return an empty array for libraries. 6. Organize the remaining relevant information. +CRITICAL - Field Preservation: +- For resource functions: "accessor" contains ONLY the HTTP method (e.g., "post", "get") - do NOT put path info in it. +- The "paths" field is separate - do NOT merge with accessor. +- Copy all values exactly - preserve backslashes, dots, and special characters. + +Return the filtered subset with IDENTICAL field values. + Now, based on the provided libraries, clients, and functions, and the user query, please filter and return the relevant information. `; From be05ed7d3f244f3446e1769d20d026e99cd44016 Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Tue, 10 Feb 2026 10:41:51 +0530 Subject: [PATCH 159/247] Refactor repetitive setMessages pattern in AIChat component Introduced updateLastMessage helper to eliminate boilerplate code for message updates. Refactored LibrarySearchTool and LibraryGetTool handlers to use the new helper, reducing code duplication. --- .../views/AIPanel/components/AIChat/index.tsx | 133 +++++++----------- 1 file changed, 51 insertions(+), 82 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 28e400ace3a..dd3a0c046f7 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 @@ -118,6 +118,17 @@ function formatFileNameForDisplay(filePath: string): string { const AIChat: React.FC = () => { const { rpcClient } = useRpcContext(); const [messages, setMessages] = useState<Array<{ role: string; content: string; type: string; checkpointId?: string; messageId?: string }>>([]); + + // Helper function to update the last message + const updateLastMessage = (updater: (content: string) => string) => { + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content = updater(newMessages[newMessages.length - 1].content); + } + return newMessages; + }); + }; const [isLoading, setIsLoading] = useState(false); const [lastQuestionIndex, setLastQuestionIndex] = useState(-1); const [isCodeLoading, setIsCodeLoading] = useState(false); @@ -360,24 +371,16 @@ const AIChat: React.FC = () => { const displayMessage = searchDescription ? `Searching for ${searchDescription}...` : "Searching for libraries..."; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content += - `\n\n<toolcall id="${toolCallId}">${displayMessage}</toolcall>`; - } - return newMessages; - }); + + updateLastMessage((content) => + content + `\n\n<toolcall id="${toolCallId}">${displayMessage}</toolcall>` + ); } else if (response.toolName === "LibraryGetTool") { const toolCallId = response?.toolCallId; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content += - `\n\n<toolcall id="${toolCallId}">Fetching library details...</toolcall>`; - } - return newMessages; - }); + + updateLastMessage((content) => + content + `\n\n<toolcall id="${toolCallId}">Fetching library details...</toolcall>` + ); } else if (response.toolName == "HealthcareLibraryProviderTool") { setMessages((prevMessages) => { const newMessages = [...prevMessages]; @@ -421,79 +424,45 @@ const AIChat: React.FC = () => { if (response.toolName === "LibrarySearchTool") { const toolCallId = response.toolCallId; const toolOutput = response.toolOutput; - const searchDescription = toolOutput?.searchDescription; - - // Build the original message to replace - const originalMessage = searchDescription - ? `Searching for ${searchDescription}...` - : "Searching for libraries..."; - - // Build the completion message - const completionMessage = searchDescription - ? `${searchDescription.charAt(0).toUpperCase() + searchDescription.slice(1)} search completed` - : "Library search completed"; - - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content = newMessages[ - newMessages.length - 1 - ].content.replace( - `<toolcall id="${toolCallId}">${originalMessage}</toolcall>`, - `<toolresult id="${toolCallId}">${completionMessage}</toolresult>`, - ); - } - return newMessages; - }); + const searchDescription = toolOutput?.searchDescription; + + // Build the original message to replace + const originalMessage = searchDescription + ? `Searching for ${searchDescription}...` + : "Searching for libraries..."; + + // Build the completion message + const completionMessage = searchDescription + ? `${searchDescription.charAt(0).toUpperCase() + searchDescription.slice(1)} search completed` + : "Library search completed"; + + updateLastMessage((content) => + content.replace( + `<toolcall id="${toolCallId}">${originalMessage}</toolcall>`, + `<toolresult id="${toolCallId}">${completionMessage}</toolresult>` + ) + ); } else if (response.toolName === "LibraryGetTool") { const toolCallId = response.toolCallId; const libraryNames = response.toolOutput || []; if (toolCallId) { - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - if (libraryNames.length === 0) { - newMessages[newMessages.length - 1].content = newMessages[ - newMessages.length - 1 - ].content.replace( - `<toolcall id="${toolCallId}">Fetching library details...</toolcall>`, - `<toolresult id="${toolCallId}">No relevant libraries found</toolresult>` - ); - } else { - newMessages[newMessages.length - 1].content = newMessages[ - newMessages.length - 1 - ].content.replace( - `<toolcall id="${toolCallId}">Fetching library details...</toolcall>`, - `<toolresult id="${toolCallId}">Fetched libraries: [${libraryNames.join(", ")}]</toolresult>` - ); - } - } - return newMessages; - }); + const searchPattern = `<toolcall id="${toolCallId}">Fetching library details...</toolcall>`; + const resultMessage = libraryNames.length === 0 + ? "No relevant libraries found" + : `Fetched libraries: [${libraryNames.join(", ")}]`; + const replacement = `<toolresult id="${toolCallId}">${resultMessage}</toolresult>`; + + updateLastMessage((content) => content.replace(searchPattern, replacement)); } } else if (response.toolName == "HealthcareLibraryProviderTool") { const libraryNames = response.toolOutput; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - if (libraryNames.length === 0) { - newMessages[newMessages.length - 1].content = newMessages[ - newMessages.length - 1 - ].content.replace( - `<toolcall>Analyzing request & selecting healthcare libraries...</toolcall>`, - `<toolresult>No relevant healthcare libraries found.</toolresult>` - ); - } else { - newMessages[newMessages.length - 1].content = newMessages[ - newMessages.length - 1 - ].content.replace( - `<toolcall>Analyzing request & selecting healthcare libraries...</toolcall>`, - `<toolresult>Fetched healthcare libraries: [${libraryNames.join(", ")}]</toolresult>` - ); - } - } - return newMessages; - }); + const searchPattern = `<toolcall>Analyzing request & selecting healthcare libraries...</toolcall>`; + const resultMessage = libraryNames.length === 0 + ? "No relevant healthcare libraries found." + : `Fetched healthcare libraries: [${libraryNames.join(", ")}]`; + const replacement = `<toolresult>${resultMessage}</toolresult>`; + + updateLastMessage((content) => content.replace(searchPattern, replacement)); } else if (response.toolName == "TaskWrite") { const taskOutput = response.toolOutput; From 632b381fdc15c1839a1dbe08324e98bd973846da Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Wed, 11 Feb 2026 14:20:39 +0530 Subject: [PATCH 160/247] Add helper function to convert GenerationType to LibraryMode and normalize library objects - Add getLibraryModeFromGenerationType() helper to properly map GenerationType enum to LibraryMode type - Normalize library objects returned from getCopilotFilteredLibraries with default empty arrays for missing fields - Replace type casting with explicit conversion for better type safety --- .../ai/utils/libs/function-registry.ts | 13 ++++++++++++- .../src/features/ai/utils/libs/libraries.ts | 18 ++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts index 50e78c45b87..44fe02353fd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts @@ -341,7 +341,18 @@ export async function getMaximizedSelectedLibs(libNames: string[]): Promise<Libr const result = (await langClient.getCopilotFilteredLibraries({ libNames: libNames })) as { libraries: Library[] }; - return result.libraries as Library[]; + const normalizedLibraries: Library[] = result.libraries.map(lib => { + return { + name: lib.name, + description: lib.description, + clients: lib.clients ? lib.clients : [], + functions: lib.functions ? lib.functions : [], + typeDefs: lib.typeDefs ? lib.typeDefs : [], + services: lib.services ? lib.services : [], + }; + }); + + return normalizedLibraries; } export async function toMaximizedLibrariesFromLibJson( diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts index 2f2485f22f1..f380a729e56 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts @@ -31,7 +31,21 @@ export enum GenerationType { ALL = "ALL" } -export async function getAllLibraries(): Promise<MinifiedLibrary[]> { - const result = (await langClient.getCopilotCompactLibraries()) as { libraries: MinifiedLibrary[] }; +export function getLibraryModeFromGenerationType(generationType: GenerationType): LibraryMode { + switch (generationType) { + case GenerationType.CODE_GENERATION: + return "CORE"; + case GenerationType.HEALTHCARE_GENERATION: + return "HEALTHCARE"; + case GenerationType.ALL: + default: + return "ALL"; + } +} + +export async function getAllLibraries(generationType: GenerationType): Promise<MinifiedLibrary[]> { + const result = (await langClient.getCopilotCompactLibraries({ + mode: getLibraryModeFromGenerationType(generationType), + })) as { libraries: MinifiedLibrary[] }; return result.libraries as MinifiedLibrary[]; } From 6678f9456cf2ab5baeff50f17feedb672a0a5c02 Mon Sep 17 00:00:00 2001 From: Senith Uthsara <senithkarunarathneu@gmail.com> Date: Thu, 12 Feb 2026 13:30:14 +0530 Subject: [PATCH 161/247] Fix doc field in function forms and implement expanded simple text mode --- .../src/components/editors/EditorFactory.tsx | 5 ++- .../editors/ExpandedEditor/ExpandedEditor.tsx | 4 +- .../ExpandedEditor/modes/SimpleStringMode.tsx | 42 +++++++++++++++++++ .../editors/ExpandedEditor/modes/types.ts | 3 +- .../ChipExpressionEditor/types.ts | 3 +- .../src/components/editors/TextAreaEditor.tsx | 6 ++- .../src/views/BI/FunctionForm/index.tsx | 2 +- 7 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx 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 00ac3bf8413..4a5fa3e2f2a 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -45,6 +45,7 @@ import { ActionExpressionEditor } from "./ActionExpressionEditor"; import { CheckBoxConditionalEditor } from "./CheckBoxConditionalEditor"; import { ActionTypeEditor } from "./ActionTypeEditor"; import { AutoCompleteEditor } from "./AutoCompleteEditor"; +import { InputMode } from "./MultiModeExpressionEditor/ChipExpressionEditor/types"; interface FormFieldEditorProps { field: FormField; @@ -111,8 +112,8 @@ export const EditorFactory = (props: FormFieldEditorProps) => { return <ChoiceForm field={field} recordTypeFields={recordTypeFields} />; } else if (field.type === "DROPDOWN_CHOICE") { return <DropdownChoiceForm field={field} />; - } else if (field.type === "TEXTAREA" || field.type === "STRING") { - return <TextAreaEditor field={field} />; + } else if (field.type === "TEXTAREA" || field.type === "STRING" || field.type === "DOC_TEXT") { + return <TextAreaEditor field={field} inputMode={InputMode.SIMPLE_TEXT} />; } else if (field.type === "FLAG" && !showWithExpressionEditor) { return <CheckBoxEditor field={field} />; } else if (field.type === "EXPRESSION" && field.key === "resourcePath") { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx index 073e80ebd4e..bde88bea564 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx @@ -31,6 +31,7 @@ import { LineRange } from "@wso2/ballerina-core/lib/interfaces/common"; import { DiagnosticMessage } from "@wso2/ballerina-core"; import { InputMode } from "../MultiModeExpressionEditor/ChipExpressionEditor/types"; import { FieldError } from "react-hook-form"; +import { SimpleStringMode } from "./modes/SimpleStringMode"; interface ExpandedPromptEditorProps { isOpen: boolean; @@ -150,7 +151,8 @@ const MODE_COMPONENTS: Record<EditorMode, React.ComponentType<any>> = { [InputMode.TEXT]: TextMode, [InputMode.PROMPT]: PromptMode, [InputMode.EXP]: ExpressionMode, - [InputMode.TEMPLATE]: TemplateMode + [InputMode.TEMPLATE]: TemplateMode, + [InputMode.SIMPLE_TEXT]: SimpleStringMode }; export const ExpandedEditor: React.FC<ExpandedPromptEditorProps> = ({ diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx new file mode 100644 index 00000000000..63cb3dc73ad --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx @@ -0,0 +1,42 @@ +/** + * 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 { AutoResizeTextArea } from "@wso2/ui-toolkit"; +import { ExpressionContainer } from "./styles"; +import { EditorModeExpressionProps } from "./types"; + +export const SimpleStringMode = (props: EditorModeExpressionProps) => { + + const handleChange = (newValue: string) => { + props.onChange(newValue, newValue.length); + } + + return ( + <ExpressionContainer> + <AutoResizeTextArea + placeholder="Enter text here..." + value={props.value} + onTextChange={handleChange} + resize="vertical" + sx={{ width: "100%", flex: 1, minHeight: "100%" }} + growRange={{ start: 38, offset: 50 }} + /> + </ExpressionContainer> + ) +}; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/types.ts index c7110c18387..4d1eb03307d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/types.ts @@ -87,7 +87,8 @@ export const EXPANDABLE_MODES = [ InputMode.TEXT, InputMode.PROMPT, InputMode.EXP, - InputMode.TEMPLATE + InputMode.TEMPLATE, + InputMode.SIMPLE_TEXT ] as const; export type EditorMode = typeof EXPANDABLE_MODES[number]; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/types.ts index 6e0bb514fe1..2340c4f9934 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/types.ts @@ -29,7 +29,8 @@ export enum InputMode { TEXT_ARRAY = "Text Array", PROMPT = "Prompt", MAP = "Map", - MAP_EXP = "Mapping" + MAP_EXP = "Mapping", + SIMPLE_TEXT = "Info" }; export const INPUT_MODE_MAP = { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextAreaEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextAreaEditor.tsx index 347a5bf2b97..2a0d5f4481a 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextAreaEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TextAreaEditor.tsx @@ -22,7 +22,7 @@ import { AutoResizeTextArea } from "@wso2/ui-toolkit"; import { useFormContext } from "../../context"; import { S } from "./ExpressionEditor"; import { Controller } from "react-hook-form"; -import { ExpandedEditor } from "./ExpandedEditor"; +import { EditorMode, ExpandedEditor } from "./ExpandedEditor"; import styled from "@emotion/styled"; import { ExpandIcon } from "./MultiModeExpressionEditor/ChipExpressionEditor/components/FloatingButtonIcons"; import { FloatingToggleButton } from "./MultiModeExpressionEditor/ChipExpressionEditor/components/FloatingToggleButton"; @@ -32,6 +32,7 @@ interface TextAreaEditorProps { field: FormField; handleOnFieldFocus?: (key: string) => void; autoFocus?: boolean; + inputMode?: EditorMode; } const TextAreaContainer = styled.div` @@ -49,7 +50,7 @@ const TextAreaContainer = styled.div` `; export function TextAreaEditor(props: TextAreaEditorProps) { - const { field, handleOnFieldFocus, autoFocus } = props; + const { field, handleOnFieldFocus, autoFocus, inputMode } = props; const { form } = useFormContext(); const { control, setValue, watch } = form; const [isExpandedModalOpen, setIsExpandedModalOpen] = useState(false); @@ -114,6 +115,7 @@ export function TextAreaEditor(props: TextAreaEditorProps) { onClose={() => setIsExpandedModalOpen(false)} onSave={handleSaveExpandedMode} onChange={onChange} + mode={inputMode} /> </TextAreaContainer> )} 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 07b44fb2603..1263930ecb9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FunctionForm/index.tsx @@ -112,7 +112,7 @@ export function FunctionForm(props: FunctionFormProps) { fields.forEach((field) => { const primaryInputType = getPrimaryInputType(field.types) if (field.key === "functionNameDescription" || field.key === "typeDescription") { - field.type = "TEXTAREA"; + field.type = "DOC_TEXT"; } if (field.key === "parameters" && primaryInputType && isTemplateType(primaryInputType)) { if ((primaryInputType.template as any).value.parameterDescription) { From c7e6849e80b49f85955ef68389da8ac2e9883d15 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Thu, 12 Feb 2026 21:57:30 +0530 Subject: [PATCH 162/247] Update copyright year in SimpleStringMode.tsx Updated copyright year from 2025 to 2026. --- .../editors/ExpandedEditor/modes/SimpleStringMode.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx index 63cb3dc73ad..1a877c3b395 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/SimpleStringMode.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except @@ -39,4 +39,4 @@ export const SimpleStringMode = (props: EditorModeExpressionProps) => { /> </ExpressionContainer> ) -}; \ No newline at end of file +}; From cd42b916cfe9af853d623d291c8b95e49eaeec16 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Wed, 28 Jan 2026 01:08:38 +0530 Subject: [PATCH 163/247] Add telemetry tracking for BI Copilot --- .../src/features/ai/agent/AgentExecutor.ts | 86 ++++++++++++++++++- .../src/features/ai/agent/index.ts | 31 +++++++ .../agent/stream-handlers/stream-context.ts | 6 ++ .../src/features/ai/utils/feedback.ts | 64 ++++++++++++++ .../src/features/telemetry/activator.ts | 13 +-- .../telemetry/common/project-metrics.ts | 81 +++++++++++++++++ .../src/features/telemetry/components.ts | 2 + .../src/features/telemetry/events.ts | 9 ++ .../src/features/telemetry/index.ts | 46 ++++++++-- .../ballerina-extension/src/utils/ai/auth.ts | 26 +++++- .../src/logger/telemetry-wrapper.ts | 16 ++-- 11 files changed, 355 insertions(+), 25 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index f15aab168a6..3688de0d67c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -34,6 +34,17 @@ import { RPCLayer } from '../../../RPCLayer'; import { VisualizerWebview } from '../../../views/visualizer/webview'; import * as path from 'path'; import { approvalViewManager } from '../state/ApprovalViewManager'; +import { + sendTelemetryEvent, + sendTelemetryException, + TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED, + TM_EVENT_BALLERINA_AI_GENERATION_ABORTED, + TM_EVENT_BALLERINA_AI_GENERATION_FAILED, + CMP_BALLERINA_AI_GENERATION +} from "../../telemetry"; +import { extension } from "../../../BalExtensionContext"; +import { getProjectMetrics } from "../../telemetry/common/project-metrics"; +import { workspace } from 'vscode'; /** * Determines which packages have been affected by analyzing modified files @@ -136,6 +147,7 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { const tempProjectPath = this.config.executionContext.tempProjectPath!; const params = this.config.params; // Access params from config const modifiedFiles: string[] = []; + const generationStartTime = Date.now(); try { // 1. Get project sources from temp directory @@ -194,7 +206,7 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { }); // Stream LLM response - const { fullStream, response } = streamText({ + const { fullStream, response, usage } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxOutputTokens: 8192, temperature: 0, @@ -216,7 +228,9 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { messageId: this.config.generationId, userMessageContent, response, + usage, ctx: this.config.executionContext, + generationStartTime, }; // Process stream events - NATIVE V6 PATTERN @@ -272,6 +286,22 @@ Generation stopped by user. The last in-progress task was not saved. Files have chatStateStorage.declineAllReviews(workspaceId, threadId); } + // Send telemetry for generation abort + const abortTime = Date.now(); + sendTelemetryEvent( + extension.ballerinaExtInstance, + TM_EVENT_BALLERINA_AI_GENERATION_ABORTED, + CMP_BALLERINA_AI_GENERATION, + { + projectId: this.config.executionContext.projectPath || 'unknown', + messageId: this.config.generationId, + generationStartTime: generationStartTime.toString(), + abortTime: abortTime.toString(), + durationMs: (abortTime - generationStartTime).toString(), + modifiedFilesCount: modifiedFiles.length.toString(), + } + ); + // Note: Abort event is sent by base class handleExecutionError() } @@ -366,6 +396,25 @@ Generation stopped by user. The last in-progress task was not saved. Files have }); } + // Send telemetry for generation failed + const errorTime = Date.now(); + sendTelemetryException( + extension.ballerinaExtInstance, + error, + CMP_BALLERINA_AI_GENERATION, + { + event: TM_EVENT_BALLERINA_AI_GENERATION_FAILED, + projectId: context.ctx.projectPath || 'unknown', + messageId: context.messageId, + errorMessage: getErrorMessage(error), + errorType: error.name || 'Unknown', + errorCode: (error as any)?.code || 'N/A', + generationStartTime: context.generationStartTime.toString(), + errorTime: errorTime.toString(), + durationMs: (errorTime - context.generationStartTime).toString(), + } + ); + context.eventHandler({ type: "error", content: getErrorMessage(error) @@ -387,6 +436,41 @@ Generation stopped by user. The last in-progress task was not saved. Files have diagnostics: finalDiagnostics.diagnostics }); + // Send telemetry for generation completion + const generationEndTime = Date.now(); + const isPlanModeEnabled = workspace.getConfiguration('ballerina.ai').get<boolean>('planMode', false); + const finalProjectMetrics = await getProjectMetrics(tempProjectPath); + + // Extract final error codes for telemetry + const finalErrorCodes = finalDiagnostics.diagnostics?.map(d => d.code || 'unknown') || []; + + // Get token usage from streamText result + const tokenUsage = await context.usage; + const inputTokens = tokenUsage.inputTokens || 0; + const outputTokens = tokenUsage.outputTokens || 0; + const totalTokens = tokenUsage.outputTokens || 0; + + sendTelemetryEvent( + extension.ballerinaExtInstance, + TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED, + CMP_BALLERINA_AI_GENERATION, + { + projectId: context.ctx.projectPath || 'unknown', + messageId: context.messageId, + modifiedFilesCount: context.modifiedFiles.length.toString(), + generationStartTime: context.generationStartTime.toString(), + generationEndTime: generationEndTime.toString(), + durationMs: (generationEndTime - context.generationStartTime).toString(), + isPlanMode: isPlanModeEnabled.toString(), + finalCompilationErrorCodes: finalErrorCodes.join(','), + outputFileCount: finalProjectMetrics.fileCount.toString(), + outputLineCount: finalProjectMetrics.lineCount.toString(), + inputTokens: inputTokens.toString(), + outputTokens: outputTokens.toString(), + totalTokens: totalTokens.toString(), + } + ); + // Update chat state storage await this.updateChatState(context, assistantMessages, tempProjectPath); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts index a4178bce660..f9df51a5287 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts @@ -21,6 +21,13 @@ import { chatStateStorage } from '../../../views/ai-panel/chatStateStorage'; import { AICommandConfig } from "../executors/base/AICommandExecutor"; import { createWebviewEventHandler } from "../utils/events"; import { AgentExecutor } from './AgentExecutor'; +import { + sendTelemetryEvent, + TM_EVENT_BALLERINA_AI_GENERATION_SUBMITTED, + CMP_BALLERINA_AI_GENERATION +} from "../../telemetry"; +import { extension } from "../../../BalExtensionContext"; +import { getProjectMetrics } from "../../telemetry/common/project-metrics"; // ================================== // Agent Generation Functions @@ -83,6 +90,30 @@ export async function generateAgent(params: GenerateAgentCodeRequest): Promise<b existingTempPath: pendingReview?.reviewState.tempProjectPath }); + // Get project metrics and chat history for telemetry + const projectMetrics = await getProjectMetrics(workspaceId); + const chatHistory = chatStateStorage.getChatHistoryForLLM(workspaceId, threadId); + + // Send telemetry event for query submission + sendTelemetryEvent( + extension.ballerinaExtInstance, + TM_EVENT_BALLERINA_AI_GENERATION_SUBMITTED, + CMP_BALLERINA_AI_GENERATION, + { + projectId: workspaceId || 'unknown', + messageId: config.generationId, + command: Command.Agent, + isPlanMode: (params.isPlanMode ?? false).toString(), + inputFileCount: projectMetrics.fileCount.toString(), + inputLineCount: projectMetrics.lineCount.toString(), + hasFileAttachments: (params.fileAttachmentContents?.length > 0).toString(), + fileAttachmentCount: (params.fileAttachmentContents?.length || 0).toString(), + hasCodeContext: (!!params.codeContext).toString(), + hasChatHistory: (chatHistory.length > 0).toString(), + chatHistoryLength: chatHistory.length.toString(), + } + ); + await new AgentExecutor(config).run(); return true; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts index d78bd5d737d..7dcf8d52557 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts @@ -38,6 +38,12 @@ export interface StreamContext { // Response promise (for message history and abort/finish handling) response: StreamTextResult<any, any>['response']; + // Token usage promise (for telemetry) + usage: StreamTextResult<any, any>['usage']; + // Execution context (for workspace integration) ctx: ExecutionContext; + + // Telemetry tracking + generationStartTime: number; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts new file mode 100644 index 00000000000..5d779a24d5e --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts @@ -0,0 +1,64 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { SubmitFeedbackRequest } from "@wso2/ballerina-core"; +import { fetchWithAuth } from "./ai-client"; +import { OLD_BACKEND_URL } from "../utils"; +import { extension } from "../../../BalExtensionContext"; +import { sendTelemetryEvent, TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, CMP_BALLERINA_AI_GENERATION } from "../../telemetry"; +import { cleanDiagnosticMessages } from "../../../rpc-managers/ai-panel/utils"; + +export async function submitFeedback(content: SubmitFeedbackRequest): Promise<boolean> { + try { + sendTelemetryEvent( + extension.ballerinaExtInstance, + TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, + CMP_BALLERINA_AI_GENERATION, + { + feedbackType: content.positive ? 'positive' : 'negative', + hasFeedbackText: content.feedbackText ? 'true' : 'false', + feedbackTextLength: content.feedbackText?.length.toString() || '0', + hasChatThread: content.messages.length > 0 ? 'true' : 'false', + chatThread: JSON.stringify(content.messages), + } + ); + + const payload = { + feedback: content.feedbackText, + positive: content.positive, + messages: content.messages, + diagnostics: cleanDiagnosticMessages(content.diagnostics) + }; + + const response = await fetchWithAuth(`${OLD_BACKEND_URL}/feedback`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(payload) + }); + + if (response.ok) { + return true; + } else { + console.error("Failed to submit feedback"); + return false; + } + } catch (error) { + console.error("Error submitting feedback:", error); + return false; + } +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/activator.ts index 6b989cf1e25..c6b18be8998 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/activator.ts @@ -35,25 +35,28 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { const langClient = <ExtendedLangClient>ballerinaExtInstance.langClient; // Start listening telemtry events from language server - langClient.onNotification('telemetry/event', (event: LSTelemetryEvent) => { + langClient.onNotification('telemetry/event', async (event: LSTelemetryEvent) => { let props: { [key: string]: string; }; switch (event.type) { case TM_EVENT_TYPE_ERROR: const errorEvent: LSErrorTelemetryEvent = <LSErrorTelemetryEvent>event; - props = getTelemetryProperties(ballerinaExtInstance, event.component, getMessageObject(TM_EVENT_TYPE_ERROR)); + props = await getTelemetryProperties(ballerinaExtInstance, event.component, + getMessageObject(TM_EVENT_TYPE_ERROR)); props["ballerina.langserver.error.description"] = errorEvent.message; props["ballerina.langserver.error.stacktrace"] = errorEvent.errorStackTrace; props["ballerina.langserver.error.message"] = errorEvent.errorMessage; - reporter.sendTelemetryEvent(TM_ERROR_LANG_SERVER, props); + // TODO: Enable once when the language server telemerty complete + // reporter.sendTelemetryEvent(TM_ERROR_LANG_SERVER, props); break; case TM_EVENT_TYPE_FEATURE_USAGE: const usageEvent: LSFeatureUsageTelemetryEvent = <LSFeatureUsageTelemetryEvent>event; - props = getTelemetryProperties(ballerinaExtInstance, event.component, + props = await getTelemetryProperties(ballerinaExtInstance, event.component, getMessageObject(TM_EVENT_TYPE_FEATURE_USAGE)); props["ballerina.langserver.feature.name"] = usageEvent.featureName; props["ballerina.langserver.feature.class"] = usageEvent.featureClass; props["ballerina.langserver.feature.message"] = usageEvent.featureMessage; - reporter.sendTelemetryEvent(TM_FEATURE_USAGE_LANG_SERVER, props); + // TODO: Enable once when the language server telemerty complete + // reporter.sendTelemetryEvent(TM_FEATURE_USAGE_LANG_SERVER, props); break; default: // Do nothing diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts new file mode 100644 index 00000000000..059b5af0060 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts @@ -0,0 +1,81 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as vscode from 'vscode'; +import * as fs from 'fs'; + +export interface ProjectMetrics { + fileCount: number; + lineCount: number; +} + +export async function getProjectMetrics(workspacePath?: string): Promise<ProjectMetrics> { + // If a specific workspace path is provided, use it; otherwise use workspace folders + if (workspacePath) { + const files = await vscode.workspace.findFiles( + new vscode.RelativePattern(workspacePath, '**/*.bal'), + new vscode.RelativePattern(workspacePath, '**/target/**') + ); + + let totalFileCount = 0; + let totalLineCount = 0; + + for (const fileUri of files) { + try { + totalFileCount++; + const fileContent = await fs.promises.readFile(fileUri.fsPath, 'utf8'); + const lineCount = fileContent.split('\n').length; + totalLineCount += lineCount; + } catch (error) { + console.warn(`Failed to read file ${fileUri.fsPath}:`, error); + } + } + + return { + fileCount: totalFileCount, + lineCount: totalLineCount + }; + } + + const workspaceFolders = vscode.workspace.workspaceFolders; + + if (!workspaceFolders || workspaceFolders.length === 0) { + return { fileCount: 0, lineCount: 0 }; + } + const files = await vscode.workspace.findFiles( + '**/*.bal', + '**/target/**' + ); + + let totalFileCount = 0; + let totalLineCount = 0; + + for (const fileUri of files) { + try { + totalFileCount++; + const fileContent = await fs.promises.readFile(fileUri.fsPath, 'utf8'); + const lineCount = fileContent.split('\n').length; + totalLineCount += lineCount; + } catch (error) { + console.warn(`Failed to read file ${fileUri.fsPath}:`, error); + } + } + + return { + fileCount: totalFileCount, + lineCount: totalLineCount + }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/components.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/components.ts index d4bd5337dca..58446de600e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/components.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/components.ts @@ -45,3 +45,5 @@ export const CMP_CHOREO_AUTHENTICATION = "component.choreo.authentication"; export const CMP_PERF_ANALYZER = "component.perf.analyzer"; export const CMP_NOTEBOOK = "component.notebook"; export const CMP_OPEN_VSCODE_URL = "component.open.vscode.url"; + +export const CMP_BALLERINA_AI_GENERATION = "ballerina.ai.generation"; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts index 0fd9cb3b98b..078240d03ac 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts @@ -122,3 +122,12 @@ export const TM_EVENT_OPEN_REPO_CHANGE_PATH = "vscode.open.repo.change.path"; export const TM_EVENT_OPEN_REPO_CANCELED = "vscode.open.repo.canceled"; export const TM_EVENT_OPEN_REPO_NEW_FOLDER = "vscode.open.exist.repo.new.folder"; export const TM_EVENT_OPEN_REPO_SAME_FOLDER = "vscode.open.exist.repo.same.folder"; + + +// events for AI features +export const TM_EVENT_BALLERINA_AI_GENERATION_SUBMITTED = "ballerina.ai.generation.submitted"; +export const TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED = "ballerina.ai.generation.completed"; +export const TM_EVENT_BALLERINA_AI_GENERATION_FAILED = "ballerina.ai.generation.failed"; +export const TM_EVENT_BALLERINA_AI_GENERATION_ABORTED = "ballerina.ai.generation.aborted"; +export const TM_EVENT_BALLERINA_AI_GENERATION_REVERTED = "ballerina.ai.generation.reverted"; +export const TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK = "ballerina.ai.generation.feedback"; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts index 1b7ebd0bb55..1da7ffe73cd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts @@ -18,9 +18,11 @@ import TelemetryReporter from "vscode-extension-telemetry"; import { BallerinaExtension } from "../../core"; +import { getLoginMethod, getBiIntelId } from "../../utils/ai/auth"; //Ballerina-VSCode-Extention repo key as default -const DEFAULT_KEY = "3a82b093-5b7b-440c-9aa2-3b8e8e5704e7"; +// const DEFAULT_KEY = "3a82b093-5b7b-440c-9aa2-3b8e8e5704e7"; +const DEFAULT_KEY = "612e5d1b-923a-413c-a009-1f1214c16e2d"; const INSTRUMENTATION_KEY = process.env.CODE_SERVER_ENV && process.env.VSCODE_CHOREO_INSTRUMENTATION_KEY ? process.env.VSCODE_CHOREO_INSTRUMENTATION_KEY : DEFAULT_KEY; const isWSO2User = process.env.VSCODE_CHOREO_USER_EMAIL ? process.env.VSCODE_CHOREO_USER_EMAIL.endsWith('@wso2.com') : false; const isAnonymous = process.env.VSCODE_CHOREO_USER_EMAIL ? process.env.VSCODE_CHOREO_USER_EMAIL.endsWith('@choreo.dev') : false; @@ -29,6 +31,20 @@ const CHOREO_COMPONENT_ID = process.env.VSCODE_CHOREO_COMPONENT_ID ? process.env const CHOREO_PROJECT_ID = process.env.VSCODE_CHOREO_PROJECT_ID ? process.env.VSCODE_CHOREO_PROJECT_ID : ''; const CHOREO_ORG_ID = process.env.VSCODE_CHOREO_ORG_ID ? process.env.VSCODE_CHOREO_ORG_ID : ''; +// Whitelist of component names +const WHITELISTED_COMPONENTS = new Set([ + 'ballerina.ai.generation', +]); + +// Whitelist of specific event names +const WHITELISTED_EVENTS = new Set([ + 'editor-workspace-ballerina-extension-activate', +]); + +export function shouldSendToAppInsights(eventName: string, componentName: string): boolean { + return WHITELISTED_EVENTS.has(eventName) || WHITELISTED_COMPONENTS.has(componentName); +} + export function createTelemetryReporter(ext: BallerinaExtension): TelemetryReporter { const reporter = new TelemetryReporter(ext.getID(), ext.getVersion(), INSTRUMENTATION_KEY); if (ext.context) { @@ -37,26 +53,36 @@ export function createTelemetryReporter(ext: BallerinaExtension): TelemetryRepor return reporter; } -export function sendTelemetryEvent(extension: BallerinaExtension, eventName: string, componentName: string, +export async function sendTelemetryEvent(extension: BallerinaExtension, eventName: string, componentName: string, customDimensions: { [key: string]: string; } = {}, measurements: { [key: string]: number; } = {}) { // temporarily disabled in codeserver due to GDPR issue if (extension.isTelemetryEnabled() && !extension.getCodeServerContext().codeServerEnv) { - extension.telemetryReporter.sendTelemetryEvent(eventName, getTelemetryProperties(extension, componentName, - customDimensions), measurements); + // Only send whitelisted AI telemetry events to Application Insights + if (shouldSendToAppInsights(eventName, componentName)) { + extension.telemetryReporter.sendTelemetryEvent(eventName, await getTelemetryProperties(extension, componentName, + customDimensions), measurements); + } } } -export function sendTelemetryException(extension: BallerinaExtension, error: Error, componentName: string, +export async function sendTelemetryException(extension: BallerinaExtension, error: Error, componentName: string, params: { [key: string]: string } = {}) { // temporarily disabled in codeserver due to GDPR issue if (extension.isTelemetryEnabled() && !extension.getCodeServerContext().codeServerEnv) { - extension.telemetryReporter.sendTelemetryException(error, getTelemetryProperties(extension, componentName, - params)); + // Only send whitelisted AI telemetry exceptions to Application Insights + if (shouldSendToAppInsights('', componentName)) { + extension.telemetryReporter.sendTelemetryException(error, await getTelemetryProperties(extension, componentName, + params)); + } } } -export function getTelemetryProperties(extension: BallerinaExtension, component: string, params: { [key: string]: string; } = {}) - : { [key: string]: string; } { +export async function getTelemetryProperties(extension: BallerinaExtension, component: string, params: { [key: string]: string; } = {}) + : Promise<{ [key: string]: string; }> { + + const userType = await getLoginMethod(); + const biIntelId = await getBiIntelId(); + return { ...params, 'ballerina.version': extension ? extension.ballerinaVersion : '', @@ -69,6 +95,8 @@ export function getTelemetryProperties(extension: BallerinaExtension, component: 'component': CHOREO_COMPONENT_ID, 'project': CHOREO_PROJECT_ID, 'org': CHOREO_ORG_ID, + 'loginMethod': userType, + 'biIntelId': biIntelId, }; } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index ae521dc1807..ea36238dc98 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -102,7 +102,7 @@ vscode.authentication.onDidChangeSessions(async e => { await extension.context.secrets.delete('GITHUB_COPILOT_TOKEN'); await extension.context.secrets.delete('GITHUB_TOKEN'); } else { - //it could be a login(which we havent captured) or a logout + //it could be a login(which we havent captured) or a logout // vscode.window.showInformationMessage( // 'WSO2 Integrator: BI supports completions with GitHub Copilot.', // 'Login with GitHub Copilot' @@ -179,7 +179,7 @@ export const getAccessToken = async (): Promise<AuthCredentials | undefined> => // Priority 2: Check stored credentials if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { - resolve({loginMethod: LoginMethod.ANTHROPIC_KEY, secrets: {apiKey: process.env.ANTHROPIC_API_KEY.trim()}}); + resolve({ loginMethod: LoginMethod.ANTHROPIC_KEY, secrets: { apiKey: process.env.ANTHROPIC_API_KEY.trim() } }); return; } const credentials = await getAuthCredentials(); @@ -256,6 +256,26 @@ export const getAwsBedrockCredentials = async (): Promise<{ return credentials.secrets; }; +// ================================== +// Unique user identifier for BIIntel +// ================================== +export const getBiIntelId = async (): Promise<string | undefined> => { + try { + const credentials = await getAuthCredentials(); + if (!credentials || credentials.loginMethod !== LoginMethod.BI_INTEL) { + return undefined; + } + + const { accessToken } = credentials.secrets; + const decoded = jwtDecode<JwtPayload>(accessToken); + return decoded.sub; + } catch (error) { + console.error('Error decoding JWT token:', error); + return undefined; + } +}; + + export const getRefreshedAccessToken = async (): Promise<string> => { return new Promise(async (resolve, reject) => { const CommonReqHeaders = { @@ -324,7 +344,7 @@ export const exchangeStsToken = async (choreoStsToken: string): Promise<DevantEn }); const { access_token, expires_in } = response.data; - const devantEnv: DevantEnvSecrets = { + const devantEnv: DevantEnvSecrets = { accessToken: access_token, expiresAt: Date.now() + (expires_in * 1000) // Convert seconds to milliseconds }; diff --git a/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts b/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts index 0536592a1a6..f51a7ddc6a2 100644 --- a/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts +++ b/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts @@ -33,17 +33,19 @@ export class TelemetryWrapper implements IChildLogger { } public fatal(msg: string, ...args: any[]): void { this.logger.fatal(msg, args); - this.reporter.sendTelemetryErrorEvent("vscode-error-occurred", { - message: msg, - }); + // TODO: Enable once when the language server telemerty complete + // this.reporter.sendTelemetryErrorEvent("vscode-error-occurred", { + // message: msg, + // }); } public error(message: string, error?: Error): void { this.logger.error(message, error); - this.reporter.sendDangerousTelemetryErrorEvent("vscode-error-occurred", { - message: message, - error: error ? error.toString() : "", - }); + // TODO: Enable once when the language server telemerty complete + // this.reporter.sendDangerousTelemetryErrorEvent("vscode-error-occurred", { + // message: message, + // error: error ? error.toString() : "", + // }); } public warn(message: string, error?: Error): void { From 0306abfeafe6a6d227bd3d18123c2801811326ae Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Thu, 29 Jan 2026 00:20:50 +0530 Subject: [PATCH 164/247] Add kept generation and feedback msg telemetry --- .../src/features/ai/agent/AgentExecutor.ts | 6 +- .../src/features/ai/utils/feedback.ts | 5 +- .../features/ai/utils/generation-response.ts | 34 ++++++++++ .../telemetry/common/project-metrics.ts | 2 +- .../src/features/telemetry/events.ts | 2 +- .../src/rpc-managers/ai-panel/rpc-manager.ts | 67 ++++++++++--------- 6 files changed, 77 insertions(+), 39 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index 3688de0d67c..54cfa56b0fd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -441,15 +441,13 @@ Generation stopped by user. The last in-progress task was not saved. Files have const isPlanModeEnabled = workspace.getConfiguration('ballerina.ai').get<boolean>('planMode', false); const finalProjectMetrics = await getProjectMetrics(tempProjectPath); - // Extract final error codes for telemetry - const finalErrorCodes = finalDiagnostics.diagnostics?.map(d => d.code || 'unknown') || []; - // Get token usage from streamText result const tokenUsage = await context.usage; const inputTokens = tokenUsage.inputTokens || 0; const outputTokens = tokenUsage.outputTokens || 0; const totalTokens = tokenUsage.outputTokens || 0; + // Send telemetry for generation complete sendTelemetryEvent( extension.ballerinaExtInstance, TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED, @@ -460,9 +458,7 @@ Generation stopped by user. The last in-progress task was not saved. Files have modifiedFilesCount: context.modifiedFiles.length.toString(), generationStartTime: context.generationStartTime.toString(), generationEndTime: generationEndTime.toString(), - durationMs: (generationEndTime - context.generationStartTime).toString(), isPlanMode: isPlanModeEnabled.toString(), - finalCompilationErrorCodes: finalErrorCodes.join(','), outputFileCount: finalProjectMetrics.fileCount.toString(), outputLineCount: finalProjectMetrics.lineCount.toString(), inputTokens: inputTokens.toString(), diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts index 5d779a24d5e..08c08abcd53 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts @@ -1,4 +1,4 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. // WSO2 LLC. licenses this file to you under the Apache License, // Version 2.0 (the "License"); you may not use this file except @@ -29,6 +29,7 @@ export async function submitFeedback(content: SubmitFeedbackRequest): Promise<bo CMP_BALLERINA_AI_GENERATION, { feedbackType: content.positive ? 'positive' : 'negative', + feedbackMessage: content.feedbackText || '', hasFeedbackText: content.feedbackText ? 'true' : 'false', feedbackTextLength: content.feedbackText?.length.toString() || '0', hasChatThread: content.messages.length > 0 ? 'true' : 'false', @@ -61,4 +62,4 @@ export async function submitFeedback(content: SubmitFeedbackRequest): Promise<bo console.error("Error submitting feedback:", error); return false; } -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts new file mode 100644 index 00000000000..6d0467acea5 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts @@ -0,0 +1,34 @@ +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { extension } from "../../../BalExtensionContext"; +import { + sendTelemetryEvent, + TM_EVENT_BALLERINA_AI_GENERATION_KEPT, + CMP_BALLERINA_AI_GENERATION +} from "../../telemetry"; + +export function sendGenerationKeptTelemetry(projectId: string, messageId: string): void { + sendTelemetryEvent( + extension.ballerinaExtInstance, + TM_EVENT_BALLERINA_AI_GENERATION_KEPT, + CMP_BALLERINA_AI_GENERATION, + { + projectId, + messageId, + } + ); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts index 059b5af0060..7be8782d30e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts @@ -1,4 +1,4 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. // WSO2 LLC. licenses this file to you under the Apache License, // Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts index 078240d03ac..7ebe83bd042 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts @@ -129,5 +129,5 @@ export const TM_EVENT_BALLERINA_AI_GENERATION_SUBMITTED = "ballerina.ai.generati export const TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED = "ballerina.ai.generation.completed"; export const TM_EVENT_BALLERINA_AI_GENERATION_FAILED = "ballerina.ai.generation.failed"; export const TM_EVENT_BALLERINA_AI_GENERATION_ABORTED = "ballerina.ai.generation.aborted"; -export const TM_EVENT_BALLERINA_AI_GENERATION_REVERTED = "ballerina.ai.generation.reverted"; +export const TM_EVENT_BALLERINA_AI_GENERATION_KEPT = "ballerina.ai.generation.kept"; export const TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK = "ballerina.ai.generation.feedback"; \ No newline at end of file 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 9b46f21f63c..3a648c9b4db 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 @@ -57,6 +57,8 @@ import { openChatWindowWithCommand } from "../../features/ai/data-mapper/index"; import { generateDocumentationForService } from "../../features/ai/documentation/generator"; import { generateOpenAPISpec } from "../../features/ai/openapi/index"; import { OLD_BACKEND_URL } from "../../features/ai/utils"; +import { submitFeedback as submitFeedbackUtil } from "../../features/ai/utils/feedback"; +import { sendGenerationKeptTelemetry } from "../../features/ai/utils/generation-response"; import { fetchWithAuth } from "../../features/ai/utils/ai-client"; import { getLLMDiagnosticArrayAsString } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; @@ -92,7 +94,7 @@ export class AiPanelRpcManager implements AIPanelAPI { async getDefaultPrompt(): Promise<AIPanelPrompt> { let defaultPrompt: AIPanelPrompt = extension.aiChatDefaultPrompt; - + // Normalize code context to use relative paths if (defaultPrompt && 'codeContext' in defaultPrompt && defaultPrompt.codeContext) { defaultPrompt = { @@ -100,7 +102,7 @@ export class AiPanelRpcManager implements AIPanelAPI { codeContext: normalizeCodeContext(defaultPrompt.codeContext) }; } - + return new Promise((resolve) => { resolve(defaultPrompt); }); @@ -236,34 +238,36 @@ export class AiPanelRpcManager implements AIPanelAPI { } async submitFeedback(content: SubmitFeedbackRequest): Promise<boolean> { - return new Promise(async (resolve) => { - try { - const payload = { - feedback: content.feedbackText, - positive: content.positive, - messages: content.messages, - diagnostics: cleanDiagnosticMessages(content.diagnostics) - }; - - 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 { - console.error("Failed to submit feedback"); - resolve(false); - } - } catch (error) { - console.error("Error submitting feedback:", error); - resolve(false); - } - }); + return await submitFeedbackUtil(content); + // return new Promise(async (resolve) => { + // try { + // + // const payload = { + // feedback: content.feedbackText, + // positive: content.positive, + // messages: content.messages, + // diagnostics: cleanDiagnosticMessages(content.diagnostics) + // }; + + // 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 { + // console.error("Failed to submit feedback"); + // resolve(false); + // } + // } catch (error) { + // console.error("Error submitting feedback:", error); + // resolve(false); + // } + // }); } async generateOpenAPI(params: GenerateOpenAPIRequest): Promise<void> { @@ -488,6 +492,9 @@ export class AiPanelRpcManager implements AIPanelAPI { chatStateStorage.acceptAllReviews(workspaceId, threadId); console.log("[Review Actions] Marked all under_review generations as accepted"); + // Send telemetry for generation kept + sendGenerationKeptTelemetry(workspaceId, latestReview.id); + // Clear affectedPackagePaths from all completed reviews to prevent stale data for (const generation of underReviewGenerations) { chatStateStorage.updateReviewState(workspaceId, threadId, generation.id, { From f3622f1c5536fea006f5461ec875e6b89b7ef199 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Thu, 29 Jan 2026 12:01:31 +0530 Subject: [PATCH 165/247] Add missing documentation comments --- .../src/features/ai/utils/feedback.ts | 31 ++++------------ .../features/ai/utils/generation-response.ts | 19 ++++++++++ .../src/features/telemetry/events.ts | 1 + .../src/rpc-managers/ai-panel/rpc-manager.ts | 35 +++---------------- 4 files changed, 31 insertions(+), 55 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts index 08c08abcd53..4c0bf26fc59 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts @@ -15,12 +15,15 @@ // under the License. import { SubmitFeedbackRequest } from "@wso2/ballerina-core"; -import { fetchWithAuth } from "./ai-client"; -import { OLD_BACKEND_URL } from "../utils"; import { extension } from "../../../BalExtensionContext"; import { sendTelemetryEvent, TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, CMP_BALLERINA_AI_GENERATION } from "../../telemetry"; -import { cleanDiagnosticMessages } from "../../../rpc-managers/ai-panel/utils"; +/** + * Submits user feedback for AI-generated content to the backend. + * + * @param content - The feedback request payload + * @returns True if feedback was submitted successfully, false otherwise + */ export async function submitFeedback(content: SubmitFeedbackRequest): Promise<boolean> { try { sendTelemetryEvent( @@ -36,28 +39,6 @@ export async function submitFeedback(content: SubmitFeedbackRequest): Promise<bo chatThread: JSON.stringify(content.messages), } ); - - const payload = { - feedback: content.feedbackText, - positive: content.positive, - messages: content.messages, - diagnostics: cleanDiagnosticMessages(content.diagnostics) - }; - - const response = await fetchWithAuth(`${OLD_BACKEND_URL}/feedback`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(payload) - }); - - if (response.ok) { - return true; - } else { - console.error("Failed to submit feedback"); - return false; - } } catch (error) { console.error("Error submitting feedback:", error); return false; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts index 6d0467acea5..59876833030 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts @@ -18,9 +18,16 @@ import { extension } from "../../../BalExtensionContext"; import { sendTelemetryEvent, TM_EVENT_BALLERINA_AI_GENERATION_KEPT, + TM_EVENT_BALLERINA_AI_GENERATION_DISCARD, CMP_BALLERINA_AI_GENERATION } from "../../telemetry"; +/** + * Sends a telemetry event when the user keeps an AI-generated response. + * + * @param projectId - The project identifier + * @param messageId - The message identifier for the kept generation + */ export function sendGenerationKeptTelemetry(projectId: string, messageId: string): void { sendTelemetryEvent( extension.ballerinaExtInstance, @@ -32,3 +39,15 @@ export function sendGenerationKeptTelemetry(projectId: string, messageId: string } ); } + +export function sendGenerationDiscardTelemetry(projectId: string, messageId: string){ + sendTelemetryEvent( + extension.ballerinaExtInstance, + TM_EVENT_BALLERINA_AI_GENERATION_DISCARD, + CMP_BALLERINA_AI_GENERATION, + { + projectId, + messageId, + } + ); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts index 7ebe83bd042..a9e7168dbdb 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/events.ts @@ -130,4 +130,5 @@ export const TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED = "ballerina.ai.generati export const TM_EVENT_BALLERINA_AI_GENERATION_FAILED = "ballerina.ai.generation.failed"; export const TM_EVENT_BALLERINA_AI_GENERATION_ABORTED = "ballerina.ai.generation.aborted"; export const TM_EVENT_BALLERINA_AI_GENERATION_KEPT = "ballerina.ai.generation.kept"; +export const TM_EVENT_BALLERINA_AI_GENERATION_DISCARD = "ballerina.ai.generation.discard"; export const TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK = "ballerina.ai.generation.feedback"; \ No newline at end of file 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 3a648c9b4db..e4cffca624a 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 @@ -58,7 +58,7 @@ import { generateDocumentationForService } from "../../features/ai/documentation import { generateOpenAPISpec } from "../../features/ai/openapi/index"; import { OLD_BACKEND_URL } from "../../features/ai/utils"; import { submitFeedback as submitFeedbackUtil } from "../../features/ai/utils/feedback"; -import { sendGenerationKeptTelemetry } from "../../features/ai/utils/generation-response"; +import { sendGenerationKeptTelemetry, sendGenerationDiscardTelemetry } from "../../features/ai/utils/generation-response"; import { fetchWithAuth } from "../../features/ai/utils/ai-client"; import { getLLMDiagnosticArrayAsString } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; @@ -239,35 +239,6 @@ export class AiPanelRpcManager implements AIPanelAPI { async submitFeedback(content: SubmitFeedbackRequest): Promise<boolean> { return await submitFeedbackUtil(content); - // return new Promise(async (resolve) => { - // try { - // - // const payload = { - // feedback: content.feedbackText, - // positive: content.positive, - // messages: content.messages, - // diagnostics: cleanDiagnosticMessages(content.diagnostics) - // }; - - // 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 { - // console.error("Failed to submit feedback"); - // resolve(false); - // } - // } catch (error) { - // console.error("Error submitting feedback:", error); - // resolve(false); - // } - // }); } async generateOpenAPI(params: GenerateOpenAPIRequest): Promise<void> { @@ -547,6 +518,10 @@ export class AiPanelRpcManager implements AIPanelAPI { chatStateStorage.declineAllReviews(workspaceId, threadId); console.log("[Review Actions] Marked all under_review generations as declined"); + // Send telemetry for generation discard + const latestReview = underReviewGenerations[underReviewGenerations.length - 1]; + sendGenerationDiscardTelemetry(workspaceId, latestReview.id); + // Clear affectedPackagePaths from all completed reviews to prevent stale data for (const generation of underReviewGenerations) { chatStateStorage.updateReviewState(workspaceId, threadId, generation.id, { From 70c059432309639bbeddaa1642305889e2060e91 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Thu, 29 Jan 2026 22:07:37 +0530 Subject: [PATCH 166/247] Refactor AI generation telemetry properties --- .../src/features/ai/agent/AgentExecutor.ts | 9 +++------ .../src/features/ai/agent/index.ts | 7 ++----- .../src/features/ai/utils/generation-response.ts | 12 +++++++----- .../src/features/telemetry/index.ts | 3 +-- .../src/rpc-managers/ai-panel/rpc-manager.ts | 4 ++-- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index 54cfa56b0fd..d1fec9121da 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -293,7 +293,6 @@ Generation stopped by user. The last in-progress task was not saved. Files have TM_EVENT_BALLERINA_AI_GENERATION_ABORTED, CMP_BALLERINA_AI_GENERATION, { - projectId: this.config.executionContext.projectPath || 'unknown', messageId: this.config.generationId, generationStartTime: generationStartTime.toString(), abortTime: abortTime.toString(), @@ -404,7 +403,6 @@ Generation stopped by user. The last in-progress task was not saved. Files have CMP_BALLERINA_AI_GENERATION, { event: TM_EVENT_BALLERINA_AI_GENERATION_FAILED, - projectId: context.ctx.projectPath || 'unknown', messageId: context.messageId, errorMessage: getErrorMessage(error), errorType: error.name || 'Unknown', @@ -445,7 +443,7 @@ Generation stopped by user. The last in-progress task was not saved. Files have const tokenUsage = await context.usage; const inputTokens = tokenUsage.inputTokens || 0; const outputTokens = tokenUsage.outputTokens || 0; - const totalTokens = tokenUsage.outputTokens || 0; + const totalTokens = tokenUsage.totalTokens || 0; // Send telemetry for generation complete sendTelemetryEvent( @@ -453,14 +451,13 @@ Generation stopped by user. The last in-progress task was not saved. Files have TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED, CMP_BALLERINA_AI_GENERATION, { - projectId: context.ctx.projectPath || 'unknown', messageId: context.messageId, modifiedFilesCount: context.modifiedFiles.length.toString(), generationStartTime: context.generationStartTime.toString(), generationEndTime: generationEndTime.toString(), isPlanMode: isPlanModeEnabled.toString(), - outputFileCount: finalProjectMetrics.fileCount.toString(), - outputLineCount: finalProjectMetrics.lineCount.toString(), + totalFilesAfterGeneration: finalProjectMetrics.fileCount.toString(), + totalLinesAfterGeneration: finalProjectMetrics.lineCount.toString(), inputTokens: inputTokens.toString(), outputTokens: outputTokens.toString(), totalTokens: totalTokens.toString(), diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts index f9df51a5287..498a8e18d60 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts @@ -100,15 +100,12 @@ export async function generateAgent(params: GenerateAgentCodeRequest): Promise<b TM_EVENT_BALLERINA_AI_GENERATION_SUBMITTED, CMP_BALLERINA_AI_GENERATION, { - projectId: workspaceId || 'unknown', messageId: config.generationId, command: Command.Agent, isPlanMode: (params.isPlanMode ?? false).toString(), - inputFileCount: projectMetrics.fileCount.toString(), - inputLineCount: projectMetrics.lineCount.toString(), + totalFilesBeforeGeneration: projectMetrics.fileCount.toString(), + totalLinesBeforeGeneration: projectMetrics.lineCount.toString(), hasFileAttachments: (params.fileAttachmentContents?.length > 0).toString(), - fileAttachmentCount: (params.fileAttachmentContents?.length || 0).toString(), - hasCodeContext: (!!params.codeContext).toString(), hasChatHistory: (chatHistory.length > 0).toString(), chatHistoryLength: chatHistory.length.toString(), } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts index 59876833030..0bba162c715 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts @@ -25,28 +25,30 @@ import { /** * Sends a telemetry event when the user keeps an AI-generated response. * - * @param projectId - The project identifier * @param messageId - The message identifier for the kept generation */ -export function sendGenerationKeptTelemetry(projectId: string, messageId: string): void { +export function sendGenerationKeptTelemetry(messageId: string): void { sendTelemetryEvent( extension.ballerinaExtInstance, TM_EVENT_BALLERINA_AI_GENERATION_KEPT, CMP_BALLERINA_AI_GENERATION, { - projectId, messageId, } ); } -export function sendGenerationDiscardTelemetry(projectId: string, messageId: string){ +/** + * Sends a telemetry event when the user discard an AI-generated response. + * + * @param messageId - The message identifier for the kept generation + */ +export function sendGenerationDiscardTelemetry(messageId: string): void { sendTelemetryEvent( extension.ballerinaExtInstance, TM_EVENT_BALLERINA_AI_GENERATION_DISCARD, CMP_BALLERINA_AI_GENERATION, { - projectId, messageId, } ); diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts index 1da7ffe73cd..0ba397d71bb 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts @@ -21,8 +21,7 @@ import { BallerinaExtension } from "../../core"; import { getLoginMethod, getBiIntelId } from "../../utils/ai/auth"; //Ballerina-VSCode-Extention repo key as default -// const DEFAULT_KEY = "3a82b093-5b7b-440c-9aa2-3b8e8e5704e7"; -const DEFAULT_KEY = "612e5d1b-923a-413c-a009-1f1214c16e2d"; +const DEFAULT_KEY = "3a82b093-5b7b-440c-9aa2-3b8e8e5704e7"; const INSTRUMENTATION_KEY = process.env.CODE_SERVER_ENV && process.env.VSCODE_CHOREO_INSTRUMENTATION_KEY ? process.env.VSCODE_CHOREO_INSTRUMENTATION_KEY : DEFAULT_KEY; const isWSO2User = process.env.VSCODE_CHOREO_USER_EMAIL ? process.env.VSCODE_CHOREO_USER_EMAIL.endsWith('@wso2.com') : false; const isAnonymous = process.env.VSCODE_CHOREO_USER_EMAIL ? process.env.VSCODE_CHOREO_USER_EMAIL.endsWith('@choreo.dev') : false; 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 e4cffca624a..94bf7bc56c0 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 @@ -464,7 +464,7 @@ export class AiPanelRpcManager implements AIPanelAPI { console.log("[Review Actions] Marked all under_review generations as accepted"); // Send telemetry for generation kept - sendGenerationKeptTelemetry(workspaceId, latestReview.id); + sendGenerationKeptTelemetry(latestReview.id); // Clear affectedPackagePaths from all completed reviews to prevent stale data for (const generation of underReviewGenerations) { @@ -520,7 +520,7 @@ export class AiPanelRpcManager implements AIPanelAPI { // Send telemetry for generation discard const latestReview = underReviewGenerations[underReviewGenerations.length - 1]; - sendGenerationDiscardTelemetry(workspaceId, latestReview.id); + sendGenerationDiscardTelemetry(latestReview.id); // Clear affectedPackagePaths from all completed reviews to prevent stale data for (const generation of underReviewGenerations) { From f842d11a77f46271195ac92e137eb763c57468b3 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Fri, 30 Jan 2026 13:47:01 +0530 Subject: [PATCH 167/247] Use dot notation for telemetry properties --- .../src/features/ai/agent/AgentExecutor.ts | 46 +++++++++---------- .../src/features/ai/agent/index.ts | 16 +++---- .../src/features/ai/utils/feedback.ts | 12 ++--- .../features/ai/utils/generation-response.ts | 4 +- .../src/features/telemetry/index.ts | 4 +- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index d1fec9121da..7b1e90212cc 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -293,11 +293,11 @@ Generation stopped by user. The last in-progress task was not saved. Files have TM_EVENT_BALLERINA_AI_GENERATION_ABORTED, CMP_BALLERINA_AI_GENERATION, { - messageId: this.config.generationId, - generationStartTime: generationStartTime.toString(), - abortTime: abortTime.toString(), - durationMs: (abortTime - generationStartTime).toString(), - modifiedFilesCount: modifiedFiles.length.toString(), + 'message.id': this.config.generationId, + 'generation.start_time': generationStartTime.toString(), + 'generation.abort_time': abortTime.toString(), + 'generation.duration_ms': (abortTime - generationStartTime).toString(), + 'generation.modified_files_count': modifiedFiles.length.toString(), } ); @@ -402,14 +402,14 @@ Generation stopped by user. The last in-progress task was not saved. Files have error, CMP_BALLERINA_AI_GENERATION, { - event: TM_EVENT_BALLERINA_AI_GENERATION_FAILED, - messageId: context.messageId, - errorMessage: getErrorMessage(error), - errorType: error.name || 'Unknown', - errorCode: (error as any)?.code || 'N/A', - generationStartTime: context.generationStartTime.toString(), - errorTime: errorTime.toString(), - durationMs: (errorTime - context.generationStartTime).toString(), + 'event.name': TM_EVENT_BALLERINA_AI_GENERATION_FAILED, + 'message.id': context.messageId, + 'error.message': getErrorMessage(error), + 'error.type': error.name || 'Unknown', + 'error.code': (error as any)?.code || 'N/A', + 'generation.start_time': context.generationStartTime.toString(), + 'generation.error_time': errorTime.toString(), + 'generation.duration_ms': (errorTime - context.generationStartTime).toString(), } ); @@ -451,16 +451,16 @@ Generation stopped by user. The last in-progress task was not saved. Files have TM_EVENT_BALLERINA_AI_GENERATION_COMPLETED, CMP_BALLERINA_AI_GENERATION, { - messageId: context.messageId, - modifiedFilesCount: context.modifiedFiles.length.toString(), - generationStartTime: context.generationStartTime.toString(), - generationEndTime: generationEndTime.toString(), - isPlanMode: isPlanModeEnabled.toString(), - totalFilesAfterGeneration: finalProjectMetrics.fileCount.toString(), - totalLinesAfterGeneration: finalProjectMetrics.lineCount.toString(), - inputTokens: inputTokens.toString(), - outputTokens: outputTokens.toString(), - totalTokens: totalTokens.toString(), + 'message.id': context.messageId, + 'generation.modified_files_count': context.modifiedFiles.length.toString(), + 'generation.start_time': context.generationStartTime.toString(), + 'generation.end_time': generationEndTime.toString(), + 'plan_mode': isPlanModeEnabled.toString(), + 'project.files_after': finalProjectMetrics.fileCount.toString(), + 'project.lines_after': finalProjectMetrics.lineCount.toString(), + 'tokens.input': inputTokens.toString(), + 'tokens.output': outputTokens.toString(), + 'tokens.total': totalTokens.toString(), } ); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts index 498a8e18d60..fd0b413395b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts @@ -100,14 +100,14 @@ export async function generateAgent(params: GenerateAgentCodeRequest): Promise<b TM_EVENT_BALLERINA_AI_GENERATION_SUBMITTED, CMP_BALLERINA_AI_GENERATION, { - messageId: config.generationId, - command: Command.Agent, - isPlanMode: (params.isPlanMode ?? false).toString(), - totalFilesBeforeGeneration: projectMetrics.fileCount.toString(), - totalLinesBeforeGeneration: projectMetrics.lineCount.toString(), - hasFileAttachments: (params.fileAttachmentContents?.length > 0).toString(), - hasChatHistory: (chatHistory.length > 0).toString(), - chatHistoryLength: chatHistory.length.toString(), + 'message.id': config.generationId, + 'command': Command.Agent, + 'plan_mode': (params.isPlanMode ?? false).toString(), + 'project.files_before': projectMetrics.fileCount.toString(), + 'project.lines_before': projectMetrics.lineCount.toString(), + 'file_attachments': (params.fileAttachmentContents?.length > 0).toString(), + 'chat.has_history': (chatHistory.length > 0).toString(), + 'chat.history_length': chatHistory.length.toString(), } ); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts index 4c0bf26fc59..441939ef3a0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts @@ -31,12 +31,12 @@ export async function submitFeedback(content: SubmitFeedbackRequest): Promise<bo TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, CMP_BALLERINA_AI_GENERATION, { - feedbackType: content.positive ? 'positive' : 'negative', - feedbackMessage: content.feedbackText || '', - hasFeedbackText: content.feedbackText ? 'true' : 'false', - feedbackTextLength: content.feedbackText?.length.toString() || '0', - hasChatThread: content.messages.length > 0 ? 'true' : 'false', - chatThread: JSON.stringify(content.messages), + 'feedback.type': content.positive ? 'positive' : 'negative', + 'feedback.message': content.feedbackText || '', + 'feedback.has_text': content.feedbackText ? 'true' : 'false', + 'feedback.text_length': content.feedbackText?.length.toString() || '0', + 'chat.has_thread': content.messages.length > 0 ? 'true' : 'false', + 'chat.thread': JSON.stringify(content.messages), } ); } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts index 0bba162c715..674eb4bad67 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts @@ -33,7 +33,7 @@ export function sendGenerationKeptTelemetry(messageId: string): void { TM_EVENT_BALLERINA_AI_GENERATION_KEPT, CMP_BALLERINA_AI_GENERATION, { - messageId, + 'message.id': messageId, } ); } @@ -49,7 +49,7 @@ export function sendGenerationDiscardTelemetry(messageId: string): void { TM_EVENT_BALLERINA_AI_GENERATION_DISCARD, CMP_BALLERINA_AI_GENERATION, { - messageId, + 'message.id': messageId, } ); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts index 0ba397d71bb..ab188ec35f9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts @@ -94,8 +94,8 @@ export async function getTelemetryProperties(extension: BallerinaExtension, comp 'component': CHOREO_COMPONENT_ID, 'project': CHOREO_PROJECT_ID, 'org': CHOREO_ORG_ID, - 'loginMethod': userType, - 'biIntelId': biIntelId, + 'user.login_method': userType, + 'user.bi_intel_id': biIntelId, }; } From 6b768442c3ad4292544f8f9363770894f46c21ff Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Tue, 3 Feb 2026 13:58:59 +0530 Subject: [PATCH 168/247] Remove duration from abort telemetry and fix doc typo --- .../src/features/ai/agent/AgentExecutor.ts | 1 - .../src/features/ai/utils/generation-response.ts | 2 +- .../wso2-platform-extension/src/logger/telemetry-wrapper.ts | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index 7b1e90212cc..215136a0819 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -296,7 +296,6 @@ Generation stopped by user. The last in-progress task was not saved. Files have 'message.id': this.config.generationId, 'generation.start_time': generationStartTime.toString(), 'generation.abort_time': abortTime.toString(), - 'generation.duration_ms': (abortTime - generationStartTime).toString(), 'generation.modified_files_count': modifiedFiles.length.toString(), } ); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts index 674eb4bad67..304e31256a5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts @@ -41,7 +41,7 @@ export function sendGenerationKeptTelemetry(messageId: string): void { /** * Sends a telemetry event when the user discard an AI-generated response. * - * @param messageId - The message identifier for the kept generation + * @param messageId - The message identifier for the discarded generation */ export function sendGenerationDiscardTelemetry(messageId: string): void { sendTelemetryEvent( diff --git a/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts b/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts index f51a7ddc6a2..100538216fc 100644 --- a/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts +++ b/workspaces/wso2-platform/wso2-platform-extension/src/logger/telemetry-wrapper.ts @@ -33,7 +33,7 @@ export class TelemetryWrapper implements IChildLogger { } public fatal(msg: string, ...args: any[]): void { this.logger.fatal(msg, args); - // TODO: Enable once when the language server telemerty complete + // TODO: Enable once when the language server telemetry complete // this.reporter.sendTelemetryErrorEvent("vscode-error-occurred", { // message: msg, // }); @@ -41,7 +41,7 @@ export class TelemetryWrapper implements IChildLogger { public error(message: string, error?: Error): void { this.logger.error(message, error); - // TODO: Enable once when the language server telemerty complete + // TODO: Enable once when the language server telemetry complete // this.reporter.sendDangerousTelemetryErrorEvent("vscode-error-occurred", { // message: message, // error: error ? error.toString() : "", From c29a80cd8ac8845fa917507f60384062689c11a9 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Tue, 3 Feb 2026 14:46:33 +0530 Subject: [PATCH 169/247] Refactor getProjectMetrics to remove duplicate code paths --- .../telemetry/common/project-metrics.ts | 50 ++++--------------- 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts index 7be8782d30e..ecd8378a4e6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-metrics.ts @@ -23,59 +23,27 @@ export interface ProjectMetrics { } export async function getProjectMetrics(workspacePath?: string): Promise<ProjectMetrics> { - // If a specific workspace path is provided, use it; otherwise use workspace folders - if (workspacePath) { - const files = await vscode.workspace.findFiles( - new vscode.RelativePattern(workspacePath, '**/*.bal'), - new vscode.RelativePattern(workspacePath, '**/target/**') - ); + const includePattern = workspacePath + ? new vscode.RelativePattern(workspacePath, '**/*.bal') + : '**/*.bal'; + const excludePattern = workspacePath + ? new vscode.RelativePattern(workspacePath, '**/target/**') + : '**/target/**'; - let totalFileCount = 0; - let totalLineCount = 0; + const files = await vscode.workspace.findFiles(includePattern, excludePattern); - for (const fileUri of files) { - try { - totalFileCount++; - const fileContent = await fs.promises.readFile(fileUri.fsPath, 'utf8'); - const lineCount = fileContent.split('\n').length; - totalLineCount += lineCount; - } catch (error) { - console.warn(`Failed to read file ${fileUri.fsPath}:`, error); - } - } - - return { - fileCount: totalFileCount, - lineCount: totalLineCount - }; - } - - const workspaceFolders = vscode.workspace.workspaceFolders; - - if (!workspaceFolders || workspaceFolders.length === 0) { - return { fileCount: 0, lineCount: 0 }; - } - const files = await vscode.workspace.findFiles( - '**/*.bal', - '**/target/**' - ); - - let totalFileCount = 0; let totalLineCount = 0; - for (const fileUri of files) { try { - totalFileCount++; const fileContent = await fs.promises.readFile(fileUri.fsPath, 'utf8'); - const lineCount = fileContent.split('\n').length; - totalLineCount += lineCount; + totalLineCount += fileContent.split('\n').length; } catch (error) { console.warn(`Failed to read file ${fileUri.fsPath}:`, error); } } return { - fileCount: totalFileCount, + fileCount: files.length, lineCount: totalLineCount }; } \ No newline at end of file From 74db7a3be39910024fc53536ea7abd8eb5bcf0e7 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Tue, 3 Feb 2026 15:47:48 +0530 Subject: [PATCH 170/247] Add fallback empty strings for user telemetry properties --- .../ballerina-extension/src/features/telemetry/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts index ab188ec35f9..14834db27ba 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/index.ts @@ -94,8 +94,8 @@ export async function getTelemetryProperties(extension: BallerinaExtension, comp 'component': CHOREO_COMPONENT_ID, 'project': CHOREO_PROJECT_ID, 'org': CHOREO_ORG_ID, - 'user.login_method': userType, - 'user.bi_intel_id': biIntelId, + 'user.login_method': userType ?? '', + 'user.bi_intel_id': biIntelId ?? '', }; } From 5fe7a69ac9de63d4241ed613ed961b9377182d25 Mon Sep 17 00:00:00 2001 From: Yasith Rashan <y.rashan22@gmail.com> Date: Fri, 13 Feb 2026 08:34:48 +0530 Subject: [PATCH 171/247] Add hashed project ID telemetry and util --- .../src/features/ai/agent/AgentExecutor.ts | 6 ++ .../src/features/ai/agent/index.ts | 5 +- .../agent/stream-handlers/stream-context.ts | 1 + .../src/features/ai/utils/feedback.ts | 6 ++ .../features/ai/utils/generation-response.ts | 14 ++++- .../features/telemetry/common/project-id.ts | 61 +++++++++++++++++++ 6 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-id.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts index 215136a0819..d330e6ce1cf 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -44,6 +44,7 @@ import { } from "../../telemetry"; import { extension } from "../../../BalExtensionContext"; import { getProjectMetrics } from "../../telemetry/common/project-metrics"; +import { getHashedProjectId } from "../../telemetry/common/project-id"; import { workspace } from 'vscode'; /** @@ -148,6 +149,7 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { const params = this.config.params; // Access params from config const modifiedFiles: string[] = []; const generationStartTime = Date.now(); + const projectId = await getHashedProjectId(this.config.executionContext.projectPath); try { // 1. Get project sources from temp directory @@ -231,6 +233,7 @@ export class AgentExecutor extends AICommandExecutor<GenerateAgentCodeRequest> { usage, ctx: this.config.executionContext, generationStartTime, + projectId, }; // Process stream events - NATIVE V6 PATTERN @@ -294,6 +297,7 @@ Generation stopped by user. The last in-progress task was not saved. Files have CMP_BALLERINA_AI_GENERATION, { 'message.id': this.config.generationId, + 'project.id': projectId, 'generation.start_time': generationStartTime.toString(), 'generation.abort_time': abortTime.toString(), 'generation.modified_files_count': modifiedFiles.length.toString(), @@ -403,6 +407,7 @@ Generation stopped by user. The last in-progress task was not saved. Files have { 'event.name': TM_EVENT_BALLERINA_AI_GENERATION_FAILED, 'message.id': context.messageId, + 'project.id': context.projectId, 'error.message': getErrorMessage(error), 'error.type': error.name || 'Unknown', 'error.code': (error as any)?.code || 'N/A', @@ -451,6 +456,7 @@ Generation stopped by user. The last in-progress task was not saved. Files have CMP_BALLERINA_AI_GENERATION, { 'message.id': context.messageId, + 'project.id': context.projectId, 'generation.modified_files_count': context.modifiedFiles.length.toString(), 'generation.start_time': context.generationStartTime.toString(), 'generation.end_time': generationEndTime.toString(), diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts index fd0b413395b..94222509d10 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts @@ -28,6 +28,7 @@ import { } from "../../telemetry"; import { extension } from "../../../BalExtensionContext"; import { getProjectMetrics } from "../../telemetry/common/project-metrics"; +import { getHashedProjectId } from "../../telemetry/common/project-id"; // ================================== // Agent Generation Functions @@ -90,8 +91,9 @@ export async function generateAgent(params: GenerateAgentCodeRequest): Promise<b existingTempPath: pendingReview?.reviewState.tempProjectPath }); - // Get project metrics and chat history for telemetry + // Get project metrics, project ID, and chat history for telemetry const projectMetrics = await getProjectMetrics(workspaceId); + const projectId = await getHashedProjectId(workspaceId); const chatHistory = chatStateStorage.getChatHistoryForLLM(workspaceId, threadId); // Send telemetry event for query submission @@ -102,6 +104,7 @@ export async function generateAgent(params: GenerateAgentCodeRequest): Promise<b { 'message.id': config.generationId, 'command': Command.Agent, + 'project.id': projectId, 'plan_mode': (params.isPlanMode ?? false).toString(), 'project.files_before': projectMetrics.fileCount.toString(), 'project.lines_before': projectMetrics.lineCount.toString(), diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts index 7dcf8d52557..21b2e74abff 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts @@ -46,4 +46,5 @@ export interface StreamContext { // Telemetry tracking generationStartTime: number; + projectId: string; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts index 441939ef3a0..3f4bfe6ce4b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/feedback.ts @@ -16,7 +16,9 @@ import { SubmitFeedbackRequest } from "@wso2/ballerina-core"; import { extension } from "../../../BalExtensionContext"; +import { StateMachine } from "../../../stateMachine"; import { sendTelemetryEvent, TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, CMP_BALLERINA_AI_GENERATION } from "../../telemetry"; +import { getHashedProjectId } from "../../telemetry/common/project-id"; /** * Submits user feedback for AI-generated content to the backend. @@ -26,11 +28,15 @@ import { sendTelemetryEvent, TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, CMP_BALL */ export async function submitFeedback(content: SubmitFeedbackRequest): Promise<boolean> { try { + const projectPath = StateMachine.context()?.projectPath || ''; + const projectId = await getHashedProjectId(projectPath); + sendTelemetryEvent( extension.ballerinaExtInstance, TM_EVENT_BALLERINA_AI_GENERATION_FEEDBACK, CMP_BALLERINA_AI_GENERATION, { + 'project.id': projectId, 'feedback.type': content.positive ? 'positive' : 'negative', 'feedback.message': content.feedbackText || '', 'feedback.has_text': content.feedbackText ? 'true' : 'false', diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts index 304e31256a5..9db4adb1a2f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/generation-response.ts @@ -15,25 +15,31 @@ // under the License. import { extension } from "../../../BalExtensionContext"; +import { StateMachine } from "../../../stateMachine"; import { sendTelemetryEvent, TM_EVENT_BALLERINA_AI_GENERATION_KEPT, TM_EVENT_BALLERINA_AI_GENERATION_DISCARD, CMP_BALLERINA_AI_GENERATION } from "../../telemetry"; +import { getHashedProjectId } from "../../telemetry/common/project-id"; /** * Sends a telemetry event when the user keeps an AI-generated response. * * @param messageId - The message identifier for the kept generation */ -export function sendGenerationKeptTelemetry(messageId: string): void { +export async function sendGenerationKeptTelemetry(messageId: string): Promise<void> { + const projectPath = StateMachine.context()?.projectPath || ''; + const projectId = await getHashedProjectId(projectPath); + sendTelemetryEvent( extension.ballerinaExtInstance, TM_EVENT_BALLERINA_AI_GENERATION_KEPT, CMP_BALLERINA_AI_GENERATION, { 'message.id': messageId, + 'project.id': projectId, } ); } @@ -43,13 +49,17 @@ export function sendGenerationKeptTelemetry(messageId: string): void { * * @param messageId - The message identifier for the discarded generation */ -export function sendGenerationDiscardTelemetry(messageId: string): void { +export async function sendGenerationDiscardTelemetry(messageId: string): Promise<void> { + const projectPath = StateMachine.context()?.projectPath || ''; + const projectId = await getHashedProjectId(projectPath); + sendTelemetryEvent( extension.ballerinaExtInstance, TM_EVENT_BALLERINA_AI_GENERATION_DISCARD, CMP_BALLERINA_AI_GENERATION, { 'message.id': messageId, + 'project.id': projectId, } ); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-id.ts b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-id.ts new file mode 100644 index 00000000000..f228b7bae9b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/telemetry/common/project-id.ts @@ -0,0 +1,61 @@ +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import * as path from 'path'; +import { parseTomlToConfig } from '../../config-generator/utils'; +import { BALLERINA_TOML } from '../../../utils/project-utils'; + +const projectIdCache = new Map<string, string>(); + +/** + * Generates a stable, anonymized project identifier by hashing + * the project path combined with the package name from Ballerina.toml. + * + * @param projectPath - Absolute path to the Ballerina project + * @returns SHA-256 hashed project ID, or empty string if projectPath is falsy + */ +export async function getHashedProjectId(projectPath: string): Promise<string> { + if (!projectPath) { + return ''; + } + + const cached = projectIdCache.get(projectPath); + if (cached) { + return cached; + } + + let packageName = ''; + const ballerinaTomlPath = path.join(projectPath, 'Ballerina.toml'); + + try { + if (fs.existsSync(ballerinaTomlPath)) { + const tomlContent = await fs.promises.readFile(ballerinaTomlPath, 'utf-8'); + const tomlObj: BALLERINA_TOML = parseTomlToConfig(tomlContent) as BALLERINA_TOML; + packageName = tomlObj?.package?.name || ''; + } + } catch (error) { + console.warn(`[project-id] Failed to read Ballerina.toml from ${projectPath}:`, error); + } + + const hashInput = projectPath + packageName; + const hashedId = crypto.createHash('sha256').update(hashInput).digest('hex'); + + projectIdCache.set(projectPath, hashedId); + + return hashedId; +} From 8dbdef5bcfd9a9910d365063c91ecd61d43ed61d Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 09:27:50 +0530 Subject: [PATCH 172/247] Add support for latex in chat window interface --- common/config/rush/pnpm-lock.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 4fa74a1f0b6..c063c9a808f 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -39732,6 +39732,8 @@ snapshots: '@types/katex@0.16.8': {} + '@types/katex@0.16.8': {} + '@types/linkify-it@5.0.0': {} '@types/lodash.camelcase@4.3.0': @@ -48933,10 +48935,7 @@ snapshots: pretty-format: 25.5.0 throat: 5.0.0 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate jest-leak-detector@25.5.0: dependencies: @@ -54515,7 +54514,7 @@ snapshots: unist-util-visit-parents: 6.0.2 vfile: 6.0.3 - rehype-raw@6.1.0: + rehype-raw@6.1.1: dependencies: '@types/hast': 2.3.10 hast-util-raw: 7.2.3 From 877ac8c970a3652f8804d890eeea874430490d83 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 17 Jan 2026 09:29:58 +0530 Subject: [PATCH 173/247] Add support for markdown+latex formating in json viewer in logs --- .../ballerina/trace-visualizer/src/components/JsonViewer.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx index 27047321959..c0fff34b6a6 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/JsonViewer.tsx @@ -398,7 +398,6 @@ function preprocessLatex(text: string): string { // Check if text might contain markdown syntax function mightContainMarkdown(text: string): boolean { if (!text || typeof text !== 'string') return false; - // Check for common markdown patterns with more lenient matching const markdownPatterns = [ /^#{1,6}\s+.+/m, // Headers (# Header) From bb84b4ecd07997cc6b6d292162ac310f839c78a6 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 4 Feb 2026 11:41:18 +0530 Subject: [PATCH 174/247] Add session traces view in trace visualizer --- .../src/rpc-types/agent-chat/index.ts | 5 +- .../src/rpc-types/agent-chat/interfaces.ts | 6 +- .../src/rpc-types/agent-chat/rpc-type.ts | 3 +- .../features/tracing/trace-details-webview.ts | 189 ++++++++- .../src/features/tracing/trace-server.ts | 34 +- .../rpc-managers/agent-chat/rpc-handler.ts | 3 + .../rpc-managers/agent-chat/rpc-manager.ts | 24 +- .../src/rpc-clients/agent-chat/rpc-client.ts | 6 + .../Components/ChatInterface.tsx | 33 +- .../Components/ExecutionTimeline.tsx | 7 +- .../trace-visualizer/src/SessionOverview.tsx | 373 ++++++++++++++++++ .../trace-visualizer/src/TraceDetails.tsx | 113 +++++- .../trace-visualizer/src/TraceVisualizer.tsx | 166 ++++++++ .../ballerina/trace-visualizer/src/index.tsx | 24 +- .../ballerina/trace-visualizer/src/utils.tsx | 89 +++++ 15 files changed, 1022 insertions(+), 53 deletions(-) create mode 100644 workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx create mode 100644 workspaces/ballerina/trace-visualizer/src/TraceVisualizer.tsx diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts index 2116e85932d..b46c7372b21 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts @@ -16,16 +16,17 @@ * under the License. */ -import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, ExecutionStep } from "./interfaces"; +import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, ExecutionStep, SessionInput } from "./interfaces"; export interface AgentChatAPI { getChatMessage: (params: ChatReqMessage) => Promise<ChatRespMessage>; abortChatRequest: () => void; getTracingStatus: () => Promise<TraceStatus>; showTraceView: (params: TraceInput) => Promise<void>; + showSessionOverview: (params: SessionInput) => Promise<void>; getChatHistory: () => Promise<ChatHistoryResponse>; clearChatHistory: () => Promise<ClearChatResponse>; getAgentStatus: () => Promise<AgentStatusResponse>; } -export type { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, ExecutionStep }; +export type { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, ExecutionStep, SessionInput }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index 24833b6289a..ca6143f8fda 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -45,7 +45,7 @@ export interface TraceInput { message?: string; traceId?: string; focusSpanId?: string; - openWithSidebarCollapsed?: boolean; + sessionId?: string; } export interface ChatHistoryMessage { @@ -68,3 +68,7 @@ export interface AgentStatusResponse { export interface ClearChatResponse { newSessionId: string; } + +export interface SessionInput { + sessionId?: string; +} diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts index 932beb1c1a3..b3f92098658 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts @@ -17,7 +17,7 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse } from "./interfaces"; +import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse, SessionInput } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "agent-chat"; @@ -25,6 +25,7 @@ export const getChatMessage: RequestType<ChatReqMessage, ChatRespMessage> = { me export const abortChatRequest: NotificationType<void> = { method: `${_preFix}/abortChatRequest` }; export const getTracingStatus: RequestType<void, TraceStatus> = { method: `${_preFix}/getTracingStatus` }; export const showTraceView: NotificationType<TraceInput> = { method: `${_preFix}/showTraceView` }; +export const showSessionOverview: NotificationType<SessionInput> = { method: `${_preFix}/showSessionOverview` }; export const getChatHistory: RequestType<void, ChatHistoryResponse> = { method: `${_preFix}/getChatHistory` }; export const clearChatHistory: RequestType<void, ClearChatResponse> = { method: `${_preFix}/clearChatHistory` }; export const getAgentStatus: RequestType<void, AgentStatusResponse> = { method: `${_preFix}/getAgentStatus` }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 59fdafda538..10f99891e33 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -21,7 +21,7 @@ import * as path from 'path'; import * as os from 'os'; import { Uri, ViewColumn, Webview } from 'vscode'; import { extension } from '../../BalExtensionContext'; -import { Trace } from './trace-server'; +import { Trace, TraceServer } from './trace-server'; import { getLibraryWebViewContent, getComposerWebViewOptions, WebViewOptions } from '../../utils/webview-utils'; // TraceData interface matching the trace-visualizer component @@ -68,12 +68,14 @@ export class TraceDetailsWebview { private _trace: Trace | undefined; private _isAgentChat: boolean = false; private _focusSpanId: string | undefined; - private _openWithSidebarCollapsed: boolean = false; + private _sessionId: string | undefined; + private _traceUpdateUnsubscribe: (() => void) | undefined; private constructor() { this._panel = TraceDetailsWebview.createWebview(); this._panel.onDidDispose(() => this.dispose(), null, this._disposables); this.setupMessageHandler(); + this.subscribeToTraceUpdates(); } private setupMessageHandler(): void { @@ -92,7 +94,7 @@ export class TraceDetailsWebview { data: traceData, isAgentChat: this._isAgentChat, focusSpanId: this._focusSpanId, - openWithSidebarCollapsed: this._openWithSidebarCollapsed, + sessionId: this._sessionId, }); } break; @@ -101,6 +103,16 @@ export class TraceDetailsWebview { await this.exportTrace(message.data); } break; + case 'requestSessionTraces': + if (message.sessionId) { + await this.handleSessionTracesRequest(message.sessionId); + } + break; + case 'exportSession': + if (message.data) { + await this.exportSession(message.data.sessionTraces, message.data.sessionId); + } + break; } }, null, @@ -108,6 +120,36 @@ export class TraceDetailsWebview { ); } + private subscribeToTraceUpdates(): void { + this._traceUpdateUnsubscribe = TraceServer.onTracesUpdated(() => { + if (!this._trace && this._sessionId && this._panel) { + this.refreshSessionTraces(); + } + }); + } + + private async refreshSessionTraces(): Promise<void> { + if (!this._sessionId || !this._panel) { + return; + } + + try { + const sessionTraces = TraceServer.getTracesBySessionId(this._sessionId); + const traces = sessionTraces.map(trace => this.convertTraceToTraceData(trace)); + + // Send updated traces to the webview with isUpdate flag + // This prevents forcing the view mode change on updates + this._panel.webview.postMessage({ + command: 'sessionTraces', + traces, + sessionId: this._sessionId, + isUpdate: true + }); + } catch (error) { + console.error('Failed to refresh session traces:', error); + } + } + private static createWebview(): vscode.WebviewPanel { const panel = vscode.window.createWebviewPanel( 'ballerina.trace-details', @@ -129,7 +171,7 @@ export class TraceDetailsWebview { return panel; } - public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string, openWithSidebarCollapsed?: boolean): void { + public static show(trace: Trace, isAgentChat: boolean = false, focusSpanId?: string, sessionId?: string): void { if (!TraceDetailsWebview.instance || !TraceDetailsWebview.instance._panel) { // Create new instance if it doesn't exist or was disposed TraceDetailsWebview.instance = new TraceDetailsWebview(); @@ -140,7 +182,7 @@ export class TraceDetailsWebview { instance._trace = trace; instance._isAgentChat = isAgentChat; instance._focusSpanId = focusSpanId; - instance._openWithSidebarCollapsed = openWithSidebarCollapsed; + instance._sessionId = sessionId; // Update title based on isAgentChat flag if (instance._panel) { @@ -153,8 +195,25 @@ export class TraceDetailsWebview { instance.updateWebview(); } + public static async showSessionOverview(sessionId: string): Promise<void> { + // Create or reuse webview instance + if (!TraceDetailsWebview.instance || !TraceDetailsWebview.instance._panel) { + TraceDetailsWebview.instance = new TraceDetailsWebview(); + } + + const instance = TraceDetailsWebview.instance; + instance._trace = null; + instance._isAgentChat = true; + instance._sessionId = sessionId; + + vscode.commands.executeCommand('workbench.action.closeSidebar'); + + instance._panel!.reveal(ViewColumn.One); + instance.updateWebview(); + } + private updateWebview(): void { - if (!this._panel || !this._trace) { + if (!this._panel) { return; } @@ -162,13 +221,13 @@ export class TraceDetailsWebview { // Send trace data immediately after updating HTML (in case webview is already loaded) // The webview will also request it if needed - const traceData = this.convertTraceToTraceData(this._trace); + const traceData = this._trace ? this.convertTraceToTraceData(this._trace) : null; this._panel.webview.postMessage({ command: 'traceData', data: traceData, isAgentChat: this._isAgentChat, focusSpanId: this._focusSpanId, - openWithSidebarCollapsed: this._openWithSidebarCollapsed, + sessionId: this._sessionId }); } @@ -239,7 +298,66 @@ export class TraceDetailsWebview { } } - private getWebviewContent(trace: Trace, webView: Webview): string { + private async handleSessionTracesRequest(sessionId: string): Promise<void> { + try { + const sessionTraces = TraceServer.getTracesBySessionId(sessionId); + + // Convert to TraceData format + const traces = sessionTraces.map(trace => this.convertTraceToTraceData(trace)); + + // Send to webview + this._panel?.webview.postMessage({ + command: 'sessionTraces', + traces, + sessionId + }); + } catch (error) { + vscode.window.showErrorMessage(`Failed to fetch session traces: ${error}`); + } + } + + private async exportSession(sessionTraces: TraceData[], sessionId: string): Promise<void> { + try { + const fileName = `session-${sessionId}.json`; + const wf = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; + let defaultUri: vscode.Uri; + + if (wf) { + const tracesDirPath = path.join(wf.uri.fsPath, 'traces'); + const tracesDirUri = vscode.Uri.file(tracesDirPath); + try { + await vscode.workspace.fs.createDirectory(tracesDirUri); + } catch (e) { + // Ignore errors + } + + defaultUri = vscode.Uri.file(path.join(tracesDirPath, fileName)); + } else { + defaultUri = vscode.Uri.file(path.join(os.homedir(), fileName)); + } + + const fileUri = await vscode.window.showSaveDialog({ + defaultUri, + filters: { + 'JSON Files': ['json'], + 'All Files': ['*'] + } + }); + + if (fileUri) { + const jsonContent = JSON.stringify({ + sessionId, + traces: sessionTraces + }, null, 2); + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + vscode.window.showInformationMessage(`Session exported to ${fileUri.fsPath}`); + } + } catch (error) { + vscode.window.showErrorMessage(`Failed to export session: ${error}`); + } + } + + private getWebviewContent(trace: Trace | null, webView: Webview): string { const body = `<div class="container" id="webview-container"></div>`; const bodyCss = ``; const styles = ` @@ -255,16 +373,38 @@ export class TraceDetailsWebview { let traceData = null; let isAgentChat = false; let focusSpanId = undefined; - let openWithSidebarCollapsed = false; + let sessionId = false; + + // Expose API for React components to communicate with extension + window.traceVisualizerAPI = { + requestSessionTraces: (sessionId) => { + vscode.postMessage({ + command: 'requestSessionTraces', + sessionId: sessionId + }); + }, + exportSession: (sessionTraces, sessionId) => { + vscode.postMessage({ + command: 'exportSession', + data: { sessionTraces, sessionId } + }); + }, + exportTrace: (traceData) => { + vscode.postMessage({ + command: 'exportTrace', + data: traceData + }); + } + }; function renderTraceDetails() { - if (window.traceVisualizer && window.traceVisualizer.renderWebview && traceData) { + if (window.traceVisualizer && window.traceVisualizer.renderWebview) { const container = document.getElementById("webview-container"); if (container) { - window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId, openWithSidebarCollapsed); + window.traceVisualizer.renderWebview(traceData, isAgentChat, container, focusSpanId, sessionId); } - } else if (!traceData) { - // Request trace data from extension + } else if (!traceData && !sessionId) { + // Request trace data from extension only if we don't have sessionId vscode.postMessage({ command: 'requestTraceData' }); } else { console.error("TraceVisualizer not loaded"); @@ -280,7 +420,7 @@ export class TraceDetailsWebview { traceData = message.data; isAgentChat = message.isAgentChat || false; focusSpanId = message.focusSpanId; - openWithSidebarCollapsed = message.openWithSidebarCollapsed || false; + sessionId = message.sessionId || false; renderTraceDetails(); break; } @@ -296,6 +436,19 @@ export class TraceDetailsWebview { } }); + // Listen for session export requests from React component + window.addEventListener('exportSession', (event) => { + if (event.detail && event.detail.sessionTraces && event.detail.currentSessionId) { + vscode.postMessage({ + command: 'exportSession', + data: { + sessionTraces: event.detail.sessionTraces, + sessionId: event.detail.currentSessionId + } + }); + } + }); + function loadedScript() { // Request trace data when script is loaded vscode.postMessage({ command: 'requestTraceData' }); @@ -315,6 +468,12 @@ export class TraceDetailsWebview { public dispose(): void { + // Unsubscribe from trace updates + if (this._traceUpdateUnsubscribe) { + this._traceUpdateUnsubscribe(); + this._traceUpdateUnsubscribe = undefined; + } + this._panel?.dispose(); while (this._disposables.length) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-server.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-server.ts index d29a8fb1f8f..f73e3d4a9bf 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-server.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-server.ts @@ -70,6 +70,8 @@ export interface TraceServer { getTraceByLastSeen(lastSeen: Date): Trace; onTracesUpdated(callback: () => void): () => void; onTracesCleared(callback: () => void): () => void; + getTracesBySessionId(sessionId: string): Trace[]; + getSessionIds(): string[]; } @@ -339,7 +341,7 @@ app.post('/v1/traces', async (req, res) => { const extractResourceName = (resource: any): string => { if (resource.name) { return resource.name; } if (resource.attributes) { - const serviceNameAttr = resource.attributes.find((attr: any) => + const serviceNameAttr = resource.attributes.find((attr: any) => attr.key === 'service.name' || attr.key === 'service_name' ); if (serviceNameAttr) { @@ -350,7 +352,7 @@ app.post('/v1/traces', async (req, res) => { }; // Helper function to process resource attributes - const processAttributes = (attributes: any[]): Array<{key: string; value: string}> => { + const processAttributes = (attributes: any[]): Array<{ key: string; value: string }> => { if (!attributes || !Array.isArray(attributes)) { return []; } return attributes.map((attr: any) => ({ key: attr.key || '', @@ -369,7 +371,7 @@ app.post('/v1/traces', async (req, res) => { // Process resource and scope const resourceName = extractResourceName(resourceSpan.resource); const scopeName = scopeSpan.scope?.name || 'Unknown Scope'; - + traceMap.set(traceId, { spans: [], resource: { @@ -465,7 +467,7 @@ export const TraceServer: TraceServer = { resolve(); return; } - + server = app.listen(port, () => { resolve(); }); @@ -522,5 +524,29 @@ export const TraceServer: TraceServer = { onTracesCleared: (callback: () => void) => { traceEvents.on('tracesCleared', callback); return () => traceEvents.off('tracesCleared', callback); + }, + getTracesBySessionId: (sessionId: string) => { + return Array.from(traceStore.values()).filter(trace => + trace.spans.some(span => { + const conversationId = span.attributes?.find( + attr => attr.key === 'gen_ai.conversation.id' + )?.value; + return conversationId === sessionId; + }) + ); + }, + getSessionIds: () => { + const sessionIds = new Set<string>(); + for (const trace of traceStore.values()) { + for (const span of trace.spans) { + const conversationId = span.attributes?.find( + attr => attr.key === 'gen_ai.conversation.id' + )?.value; + if (conversationId) { + sessionIds.add(conversationId); + } + } + } + return Array.from(sessionIds); } }; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts index b92592eb749..458cec8ffb3 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts @@ -23,7 +23,9 @@ import { getChatMessage, getTracingStatus, showTraceView, + showSessionOverview, TraceInput, + SessionInput, getChatHistory, clearChatHistory, getAgentStatus @@ -37,6 +39,7 @@ export function registerAgentChatRpcHandlers(messenger: Messenger) { messenger.onNotification(abortChatRequest, () => rpcManger.abortChatRequest()); messenger.onRequest(getTracingStatus, () => rpcManger.getTracingStatus()); messenger.onNotification(showTraceView, (args: TraceInput) => rpcManger.showTraceView(args)); + messenger.onNotification(showSessionOverview, (args: SessionInput) => rpcManger.showSessionOverview(args)); messenger.onRequest(getChatHistory, () => rpcManger.getChatHistory()); messenger.onRequest(clearChatHistory, () => rpcManger.clearChatHistory()); messenger.onRequest(getAgentStatus, () => rpcManger.getAgentStatus()); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 1105ca4010c..4e019e1a629 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -26,7 +26,8 @@ import { ChatHistoryMessage, ChatHistoryResponse, AgentStatusResponse, - ClearChatResponse + ClearChatResponse, + SessionInput } from "@wso2/ballerina-core"; import * as vscode from 'vscode'; import { extension } from '../../BalExtensionContext'; @@ -425,7 +426,7 @@ export class AgentChatRpcManager implements AgentChatAPI { } // Open the trace details webview with isAgentChat=true and optional focusSpanId - TraceDetailsWebview.show(trace, true, params.focusSpanId, params.openWithSidebarCollapsed); + TraceDetailsWebview.show(trace, true, params.focusSpanId, extension.agentChatContext?.chatSessionId); } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Failed to show trace details'; vscode.window.showErrorMessage(`Error: ${errorMessage}`); @@ -433,6 +434,25 @@ export class AgentChatRpcManager implements AgentChatAPI { } } + async showSessionOverview(params: SessionInput): Promise<void> { + try { + // Use provided sessionId or fall back to current session + const sessionId = params.sessionId || extension.agentChatContext?.chatSessionId; + + if (!sessionId) { + const errorMessage = 'No active session found'; + vscode.window.showErrorMessage(errorMessage); + throw new Error(errorMessage); + } + + await TraceDetailsWebview.showSessionOverview(sessionId); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Failed to show session overview'; + vscode.window.showErrorMessage(`Error: ${errorMessage}`); + throw error; + } + } + async getChatHistory(): Promise<ChatHistoryResponse> { return new Promise(async (resolve) => { const sessionId = extension.agentChatContext?.chatSessionId; diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts index a188f336d61..72b02b5ff1b 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts @@ -25,7 +25,9 @@ import { getChatMessage, getTracingStatus, showTraceView, + showSessionOverview, TraceInput, + SessionInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, @@ -60,6 +62,10 @@ export class AgentChatRpcClient implements AgentChatAPI { return this._messenger.sendRequest(showTraceView, HOST_EXTENSION, params); } + showSessionOverview(params: SessionInput): Promise<void> { + return this._messenger.sendRequest(showSessionOverview, HOST_EXTENSION, params); + } + getChatHistory(): Promise<ChatHistoryResponse> { return this._messenger.sendRequest(getChatHistory, HOST_EXTENSION); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 63831e5d275..c708326e8e1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -187,9 +187,11 @@ const ChatHeader = styled.div` top: 0; display: flex; justify-content: flex-end; + align-items: center; padding: 12px 8px 8px; z-index: 2; border-bottom: 1px solid var(--vscode-panel-border); + gap: 8px; `; const ClearChatButton = styled.button` @@ -320,6 +322,9 @@ const ChatInterface: React.FC = () => { const messagesEndRef = useRef<HTMLDivElement>(null); + // Check if we have any traces (to enable/disable Session Logs button) + const hasTraces = messages.some(msg => !msg.isUser && msg.traceId); + // Load chat history and check tracing status on mount useEffect(() => { const loadChatHistory = async () => { @@ -434,8 +439,9 @@ const ChatInterface: React.FC = () => { return; } - // Call the RPC method to show the trace view using the traceId - await rpcClient.getAgentChatRpcClient().showTraceView({ traceId: message.traceId }); + await rpcClient.getAgentChatRpcClient().showTraceView({ + traceId: message.traceId + }); } catch (error) { console.error('Failed to show trace view:', error); } @@ -468,20 +474,35 @@ const ChatInterface: React.FC = () => { try { await rpcClient.getAgentChatRpcClient().showTraceView({ traceId, - focusSpanId: spanId, - openWithSidebarCollapsed: true + focusSpanId: spanId }); } catch (error) { console.error('Failed to show trace view:', error); } }; + const handleShowSessionLogs = async () => { + try { + await rpcClient.getAgentChatRpcClient().showSessionOverview({}); + } catch (error) { + console.error('Failed to show session overview:', error); + } + }; + return ( <ChatWrapper> {messages.length > 0 && ( <ChatHeader> + <div> + {isTracingEnabled && hasTraces && ( + <ClearChatButton onClick={handleShowSessionLogs} disabled={isLoading} title="View traces for the entire conversation"> + <span className="codicon codicon-list-tree" /> + Session Logs + </ClearChatButton> + )} + </div> <ClearChatButton onClick={handleClearChat} disabled={isLoading}> - <span className="codicon codicon-clear-all" /> + <Icon name="bi-delete" sx={{ fontSize: 16, width: 16, height: 16 }} iconSx={{ fontSize: "16px" }} /> Clear Chat </ClearChatButton> </ChatHeader> @@ -546,7 +567,7 @@ const ChatInterface: React.FC = () => { </MessageContainer> {!msg.isUser && isTracingEnabled && msg.traceId && ( <MessageActionsContainer> - <ShowLogsButton onClick={() => handleShowLogs(idx)}> + <ShowLogsButton onClick={() => handleShowLogs(idx)} title="View trace logs for this message"> View Logs </ShowLogsButton> </MessageActionsContainer> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx index 26c66f05c8d..29d4d07cfcb 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx @@ -171,6 +171,9 @@ export function ExecutionTimeline({ steps, traceId, onViewInTrace }: ExecutionTi return null; } + // Filter out steps with invoke operation type + const filteredSteps = steps.filter(step => step.operationType !== 'invoke'); + const getIconName = (operationType: string) => { switch (operationType) { case 'invoke': return 'bi-ai-agent'; @@ -199,14 +202,14 @@ export function ExecutionTimeline({ steps, traceId, onViewInTrace }: ExecutionTi return ( <TimelineContainer> <TimelineHeader onClick={() => setOpen(!open)} aria-expanded={open}> - <TimelineTitle>Execution Steps ({steps.length})</TimelineTitle> + <TimelineTitle>Execution Steps ({filteredSteps.length})</TimelineTitle> <ToggleIcon isOpen={open}> <Codicon name="chevron-right" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> </ToggleIcon> </TimelineHeader> {open && ( <TimelineList> - {steps.map((step, index) => ( + {filteredSteps.map((step, index) => ( <TimelineItem key={step.spanId}> <ConnectorColumn isLast={index === steps.length - 1}> <Dot operationType={step.operationType} /> diff --git a/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx b/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx new file mode 100644 index 00000000000..058e0d9e36a --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx @@ -0,0 +1,373 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useMemo } from "react"; +import styled from "@emotion/styled"; +import { Icon } from "@wso2/ui-toolkit"; +import { TraceData } from "./index"; +import { formatDate, getAttributeValue, extractUserMessage, extractAgentResponse, calculateTotalInputTokens, calculateTotalOutputTokens, calculateTraceLatency, formatDuration, formatNumber } from "./utils"; +import { SearchInput } from "./components/SearchInput"; + +interface SessionOverviewProps { + sessionTraces: TraceData[]; + sessionId: string; + onSelectTrace: (traceId: string) => void; + onExportSession: () => void; +} + +interface TraceRowData { + traceId: string; + timestamp: string; + userMessage: string; + agentResponse: string; + latency: number | null; + inputTokens: number; + outputTokens: number; +} + +const Container = styled.div` + display: flex; + flex-direction: column; + height: 100vh; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + font-family: var(--vscode-font-family); + overflow: hidden; +`; + +const Header = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + padding: 24px 24px 16px 24px; + border-bottom: 1px solid var(--vscode-panel-border); +`; + +const HeaderLeft = styled.div` + display: flex; + flex-direction: column; + gap: 4px; +`; + +const Title = styled.h1` + margin: 0; + font-size: 20px; + font-weight: 600; + color: var(--vscode-foreground); + display: flex; + align-items: center; + gap: 8px; +`; + +const TraceCount = styled.span` + font-size: 14px; + color: var(--vscode-descriptionForeground); + font-weight: 400; +`; + +const SessionTitle = styled.span` + color: var(--vscode-textLink-activeForeground); +`; + +const Subtitle = styled.div` + font-size: 13px; + color: var(--vscode-descriptionForeground); +`; + +const HeaderRight = styled.div` + display: flex; + gap: 8px; +`; + +const ExportButton = styled.button` + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: transparent; + border: 1px solid var(--vscode-button-border); + color: var(--vscode-foreground); + border-radius: 4px; + cursor: pointer; + font-size: 13px; + transition: background-color 0.15s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + +const SearchContainer = styled.div` + padding: 16px 24px; + border-bottom: 1px solid var(--vscode-panel-border); +`; + +const TableContainer = styled.div` + flex: 1; + overflow-y: auto; + overflow-x: auto; +`; + +const Table = styled.table` + width: 100%; + border-collapse: collapse; + font-size: 13px; +`; + +const TableHead = styled.thead` + position: sticky; + top: 0; + background-color: var(--vscode-editor-background); + z-index: 1; + border-bottom: 1px solid var(--vscode-panel-border); +`; + +const TableHeader = styled.th` + text-align: left; + padding: 12px 24px; + font-weight: 600; + color: var(--vscode-descriptionForeground); + text-transform: uppercase; + font-size: 11px; + letter-spacing: 0.5px; + border-bottom: 1px solid var(--vscode-panel-border); + white-space: nowrap; +`; + +const TableBody = styled.tbody``; + +const TableRow = styled.tr` + cursor: pointer; + transition: background-color 0.15s ease; + border-bottom: 1px solid var(--vscode-panel-border); + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + background-color: var(--vscode-list-activeSelectionBackground); + } +`; + +const TableCell = styled.td` + padding: 12px 24px; + color: var(--vscode-foreground); + vertical-align: top; + max-width: 400px; +`; + +const TimestampCell = styled(TableCell)` + white-space: nowrap; + color: var(--vscode-descriptionForeground); + font-size: 12px; +`; + +const TraceIdCell = styled(TableCell)` + font-family: var(--vscode-editor-font-family); + color: var(--vscode-textLink-foreground); + white-space: nowrap; +`; + +const MessageCell = styled(TableCell)` + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +const NumericCell = styled(TableCell)` + white-space: nowrap; + text-align: right; + font-family: var(--vscode-editor-font-family); + color: var(--vscode-descriptionForeground); + font-size: 12px; +`; + +const EmptyState = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + gap: 12px; + color: var(--vscode-descriptionForeground); + padding: 48px; +`; + +const EmptyStateIcon = styled.div` + font-size: 48px; + opacity: 0.5; +`; + +const EmptyStateTitle = styled.div` + font-size: 16px; + font-weight: 600; +`; + +const EmptyStateSubtitle = styled.div` + font-size: 13px; +`; + +export function SessionOverview({ sessionTraces, sessionId, onSelectTrace, onExportSession }: SessionOverviewProps) { + const [searchQuery, setSearchQuery] = useState(""); + + // Extract trace row data + const traceRows: TraceRowData[] = useMemo(() => { + return sessionTraces.map(trace => { + // Find the invoke_agent span + const invokeSpan = trace.spans.find(span => { + const operationName = getAttributeValue(span.attributes, 'gen_ai.operation.name'); + return operationName?.startsWith('invoke_agent'); + }); + + const timestamp = trace.firstSeen; + const userMessage = invokeSpan ? extractUserMessage(invokeSpan) : ''; + const agentResponse = invokeSpan ? extractAgentResponse(invokeSpan) : ''; + + // Calculate latency and token counts + const latency = calculateTraceLatency(trace.spans); + const inputTokens = calculateTotalInputTokens(trace.spans); + const outputTokens = calculateTotalOutputTokens(trace.spans); + + return { + traceId: trace.traceId, + timestamp, + userMessage, + agentResponse, + latency, + inputTokens, + outputTokens + }; + }); + }, [sessionTraces]); + + // Filter traces based on search query + const filteredRows = useMemo(() => { + if (!searchQuery) return traceRows; + + const query = searchQuery.toLowerCase(); + return traceRows.filter(row => + row.traceId.toLowerCase().includes(query) || + row.userMessage.toLowerCase().includes(query) || + row.agentResponse.toLowerCase().includes(query) + ); + }, [traceRows, searchQuery]); + + // Extract session title from first trace's attributes + const sessionTitle = useMemo(() => { + if (sessionTraces.length === 0) return null; + + // Look for a session name attribute + const firstTrace = sessionTraces[0]; + for (const span of firstTrace.spans) { + const title = getAttributeValue(span.attributes, 'gen_ai.conversation.name'); + if (title) return title; + } + + return null; + }, [sessionTraces]); + + return ( + <Container> + <Header> + <HeaderLeft> + <Title> + Session Traces + <TraceCount>({sessionTraces.length} traces)</TraceCount> + {sessionTitle && ( + <> + <SessionTitle>{sessionTitle}</SessionTitle> + </> + )} + </Title> + <Subtitle>Session ID: {sessionId}</Subtitle> + </HeaderLeft> + <HeaderRight> + <ExportButton onClick={onExportSession} title="Export session traces"> + <Icon + name="bi-download" + sx={{ fontSize: '16px', width: '16px', height: '16px' }} + iconSx={{ display: 'flex' }} + /> + Export + </ExportButton> + </HeaderRight> + </Header> + + <SearchContainer> + <SearchInput + value={searchQuery} + onChange={setSearchQuery} + placeholder="Search traces by message or ID..." + /> + </SearchContainer> + + <TableContainer> + {filteredRows.length === 0 ? ( + <EmptyState> + <EmptyStateIcon> + <Icon + name="bi-search" + sx={{ fontSize: '48px', width: '48px', height: '48px' }} + iconSx={{ display: 'flex' }} + /> + </EmptyStateIcon> + <EmptyStateTitle> + {searchQuery ? 'No traces found' : 'No traces in this session'} + </EmptyStateTitle> + <EmptyStateSubtitle> + {searchQuery ? 'Try different keywords' : 'Traces will appear here when available'} + </EmptyStateSubtitle> + </EmptyState> + ) : ( + <Table> + <TableHead> + <tr> + <TableHeader>Timestamp</TableHeader> + <TableHeader>Trace ID</TableHeader> + <TableHeader>Input</TableHeader> + <TableHeader>Output</TableHeader> + <TableHeader style={{ textAlign: 'right' }}>Latency</TableHeader> + <TableHeader style={{ textAlign: 'right' }}>Input Tokens</TableHeader> + <TableHeader style={{ textAlign: 'right' }}>Output Tokens</TableHeader> + </tr> + </TableHead> + <TableBody> + {filteredRows.map(row => ( + <TableRow key={row.traceId} onClick={() => onSelectTrace(row.traceId)}> + <TimestampCell>{formatDate(row.timestamp)}</TimestampCell> + <TraceIdCell>{row.traceId}</TraceIdCell> + <MessageCell title={row.userMessage}>{row.userMessage || '-'}</MessageCell> + <MessageCell title={row.agentResponse}>{row.agentResponse || '-'}</MessageCell> + <NumericCell>{row.latency !== null ? formatDuration(row.latency) : '-'}</NumericCell> + <NumericCell>{formatNumber(row.inputTokens)}</NumericCell> + <NumericCell>{formatNumber(row.outputTokens)}</NumericCell> + </TableRow> + ))} + </TableBody> + </Table> + )} + </TableContainer> + </Container> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index 4527c8647ff..ce57222f09d 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -38,14 +38,14 @@ import { const MIN_SIDEBAR_WIDTH = 260; const SNAP_THRESHOLD = 100; const MIN_DETAILS_PANEL_WIDTH = 250; -const MAX_INITIAL_SIDEBAR_WIDTH = 350; +const MAX_INITIAL_SIDEBAR_WIDTH = 300; const MAX_SIDEBAR_PERCENTAGE = 0.6; interface TraceDetailsProps { traceData: TraceData; isAgentChat: boolean; focusSpanId?: string; - openWithSidebarCollapsed?: boolean; + onViewSession?: () => void; } // ============================================================================ @@ -156,6 +156,58 @@ const DetailsPanel = styled.div` background-color: var(--vscode-editor-background); height: 100%; overflow-y: auto; + padding: 0; + display: flex; + flex-direction: column; +`; + +const BreadcrumbContainer = styled.div` + display: flex; + align-items: center; + gap: 8px; + padding: 12px 12px; + border-bottom: 1px solid var(--vscode-panel-border); + background-color: var(--vscode-editor-background); + font-size: 12px; + color: var(--vscode-descriptionForeground); + flex-shrink: 0; +`; + +const BreadcrumbItem = styled.button<{ isClickable?: boolean }>` + display: flex; + align-items: center; + gap: 4px; + background: transparent; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + border: none; + padding: 0; + color: ${(props: { isClickable: boolean; }) => props.isClickable ? 'var(--vscode-textLink-foreground)' : 'var(--vscode-foreground)'}; + cursor: ${(props: { isClickable: boolean; }) => props.isClickable ? 'pointer' : 'default'}; + font-size: 12px; + font-family: var(--vscode-font-family); + + &:hover { + ${(props: { isClickable: boolean; }) => props.isClickable && ` + text-decoration: underline; + color: var(--vscode-textLink-activeForeground); + `} + + i::before { + text-decoration: none; + } + } +`; + +const BreadcrumbSeparator = styled.span` + color: var(--vscode-descriptionForeground); + font-size: 12px; +`; + +const DetailsPanelContent = styled.div` + flex: 1; + overflow-y: auto; padding: 24px 16px; `; @@ -201,7 +253,7 @@ const ActionButton = styled.button` // COMPONENT DEFINITIONS // ============================================================================ -export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSidebarCollapsed }: TraceDetailsProps) { +export function TraceDetails({ traceData, isAgentChat, focusSpanId, onViewSession }: TraceDetailsProps) { const [selectedSpanId, setSelectedSpanId] = useState<string | null>(null); const [showFullTrace] = useState<boolean>(false); @@ -209,7 +261,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide const [userAdvancedModePreference, setUserAdvancedModePreference] = useState<boolean>(false); const [viewMode, setViewMode] = useState<'tree' | 'timeline'>('tree'); - const [isSidebarVisible, setIsSidebarVisible] = useState<boolean>(!openWithSidebarCollapsed); + const [isSidebarVisible, setIsSidebarVisible] = useState<boolean>(!(isAgentChat && focusSpanId !== undefined)); const [expandedSpans, setExpandedSpans] = useState<Set<string>>(new Set()); const [expandedAdvancedSpanGroups, setExpandedAdvancedSpanGroups] = useState<Set<string>>(new Set()); @@ -220,7 +272,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide const [isResizing, setIsResizing] = useState<boolean>(false); const containerRef = useRef<HTMLDivElement>(null); const hasAutoExpandedRef = useRef<boolean>(false); - const hasFocusedRef = useRef<boolean>(false); + const lastFocusedSpanIdRef = useRef<string | null>(null); const [searchQuery, setSearchQuery] = useState(""); // Calculate total span counts (memoized for immediate availability) @@ -537,7 +589,13 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide // Auto-focus on specific span if focusSpanId is provided useEffect(() => { - if (focusSpanId && traceData.spans.length > 0 && !hasFocusedRef.current) { + // If focusSpanId is undefined, clear the last focused ref to allow normal auto-selection + if (!focusSpanId) { + lastFocusedSpanIdRef.current = null; + return; + } + + if (traceData.spans.length > 0 && focusSpanId !== lastFocusedSpanIdRef.current) { setExpandedSpans(prev => { // Expand all parent spans to make the focused span visible FIRST const span = traceData.spans.find(s => s.spanId === focusSpanId); @@ -558,7 +616,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide return newExpanded; }); setSelectedSpanId(focusSpanId); - setTimeout(() => { + const timeoutId = setTimeout(() => { const spanElement = document.querySelector(`[data-span-id="${focusSpanId}"]`); if (spanElement) { spanElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); @@ -566,12 +624,25 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide console.error('[TraceDetails] Could not find span element to scroll to'); } }, 500); - hasFocusedRef.current = true; + lastFocusedSpanIdRef.current = focusSpanId; + + return () => clearTimeout(timeoutId); } }, [focusSpanId, traceData.spans.length]); const selectedSpan = selectedSpanId ? spanMap.get(selectedSpanId) : null; + // Extract session ID from trace data + const sessionId = useMemo(() => { + for (const span of traceData.spans) { + const conversationId = span.attributes?.find(attr => attr.key === 'gen_ai.conversation.id')?.value; + if (conversationId) { + return conversationId; + } + } + return null; + }, [traceData.spans]); + // Handle resize drag const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => { const target = e.currentTarget; @@ -692,7 +763,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide // Select first AI span when in agent chat view, or fallback to first generic span useEffect(() => { // Don't auto-select if we have a focusSpanId or are focusing - let the focus effect handle it - if (focusSpanId || hasFocusedRef.current) { + if (focusSpanId || lastFocusedSpanIdRef.current) { return; } @@ -846,18 +917,30 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, openWithSide )} </SpanViewContainer> {selectedSpan && ( - <> - <DetailsPanelContainer> - <DetailsPanel> + <DetailsPanelContainer> + <DetailsPanel> + {onViewSession && ( + <BreadcrumbContainer> + <BreadcrumbItem isClickable onClick={onViewSession}> + <Icon name="bi-back" sx={{ fontSize: '12px', width: '12px', height: '12px' }} iconSx={{ fontSize: "12px" }} /> + Session Traces + </BreadcrumbItem> + <BreadcrumbSeparator>/</BreadcrumbSeparator> + <BreadcrumbItem isClickable={false}> + Trace: {traceData.traceId} + </BreadcrumbItem> + </BreadcrumbContainer> + )} + <DetailsPanelContent> <SpanDetails spanData={selectedSpan} spanName={selectedSpan.name} totalInputTokens={totalInputTokens} totalOutputTokens={totalOutputTokens} /> - </DetailsPanel> - </DetailsPanelContainer> - </> + </DetailsPanelContent> + </DetailsPanel> + </DetailsPanelContainer> )} </TraceLogsContainer> ); diff --git a/workspaces/ballerina/trace-visualizer/src/TraceVisualizer.tsx b/workspaces/ballerina/trace-visualizer/src/TraceVisualizer.tsx new file mode 100644 index 00000000000..7b5a126de0e --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/TraceVisualizer.tsx @@ -0,0 +1,166 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useEffect } from "react"; +import { TraceData } from "./index"; +import { TraceDetails } from "./TraceDetails"; +import { SessionOverview } from "./SessionOverview"; +import { ErrorBoundary } from "@wso2/ui-toolkit/lib/components/ErrorBoundary/ErrorBoundary"; + +declare global { + interface Window { + vscode?: { + postMessage(message: any): void; + }; + } +} + +interface TraceVisualizerProps { + initialTraceData?: TraceData; + isAgentChat: boolean; + focusSpanId?: string; + sessionId?: string; +} + +type ViewMode = 'overview' | 'details'; + +export function TraceVisualizer({ + initialTraceData, + isAgentChat, + focusSpanId, + sessionId +}: TraceVisualizerProps) { + const [viewMode, setViewMode] = useState<ViewMode>(initialTraceData ? 'details' : 'overview'); + const [currentTraceData, setCurrentTraceData] = useState<TraceData | undefined>(initialTraceData); + const [sessionTraces, setSessionTraces] = useState<TraceData[]>([]); + const [currentSessionId, setCurrentSessionId] = useState<string | undefined>(sessionId); + const [currentFocusSpanId, setCurrentFocusSpanId] = useState<string | undefined>(focusSpanId); + + // Update current trace data when initialTraceData changes + useEffect(() => { + if (initialTraceData) { + setCurrentTraceData(initialTraceData); + setViewMode('details'); + } + }, [initialTraceData]); + + // Update focus span ID when it changes + useEffect(() => { + setCurrentFocusSpanId(focusSpanId); + }, [focusSpanId]); + + // Request session traces when sessionId is provided without initial trace data + useEffect(() => { + if (sessionId && !initialTraceData && window.vscode) { + window.vscode.postMessage({ + command: 'requestSessionTraces', + sessionId: sessionId + }); + } + }, [sessionId, initialTraceData]); + + // Listen for messages from the extension + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + const message = event.data; + switch (message.command) { + case 'sessionTraces': + setSessionTraces(message.traces); + setCurrentSessionId(message.sessionId); + if (!message.isUpdate) { + setViewMode('overview'); + } + break; + case 'traceDetails': + setCurrentTraceData(message.trace); + setViewMode('details'); + break; + } + }; + + window.addEventListener('message', handleMessage); + return () => window.removeEventListener('message', handleMessage); + }, []); + + const handleViewSession = () => { + if (!currentTraceData) return; + + // Extract session ID from the current trace + let extractedSessionId: string | undefined; + for (const span of currentTraceData.spans) { + const conversationId = span.attributes?.find(attr => attr.key === 'gen_ai.conversation.id')?.value; + if (conversationId) { + extractedSessionId = conversationId; + break; + } + } + + if (extractedSessionId) { + // Request session traces from extension + if (window.vscode) { + window.vscode.postMessage({ + command: 'requestSessionTraces', + sessionId: extractedSessionId + }); + } + } + }; + + const handleSelectTrace = (traceId: string) => { + // Find the trace in session traces + const trace = sessionTraces.find(t => t.traceId === traceId); + if (trace) { + setCurrentTraceData(trace); + setCurrentFocusSpanId(undefined); + setViewMode('details'); + } + }; + + const handleExportSession = () => { + // Dispatch custom event to communicate with webview script + window.dispatchEvent(new CustomEvent('exportSession', { + detail: { sessionTraces, currentSessionId } + })); + }; + + if (viewMode === 'overview' && sessionTraces.length > 0 && currentSessionId) { + return ( + <SessionOverview + sessionTraces={sessionTraces} + sessionId={currentSessionId} + onSelectTrace={handleSelectTrace} + onExportSession={handleExportSession} + /> + ); + } + + if (viewMode === 'details' && currentTraceData) { + return ( + <TraceDetails + key={currentTraceData.traceId} + traceData={currentTraceData} + isAgentChat={isAgentChat} + focusSpanId={currentFocusSpanId} + onViewSession={handleViewSession} + /> + ); + } + + // Loading or empty state + return <div>Loading...</div>; +} diff --git a/workspaces/ballerina/trace-visualizer/src/index.tsx b/workspaces/ballerina/trace-visualizer/src/index.tsx index e66c5f7a135..6618ce74b7e 100644 --- a/workspaces/ballerina/trace-visualizer/src/index.tsx +++ b/workspaces/ballerina/trace-visualizer/src/index.tsx @@ -18,7 +18,7 @@ import React from "react"; import { createRoot } from "react-dom/client"; -import { TraceDetails } from "./TraceDetails"; +import { TraceVisualizer } from "./TraceVisualizer"; export interface TraceData { traceId: string; @@ -60,16 +60,30 @@ export interface AttributeData { declare global { interface Window { traceVisualizer: { - renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openWithSidebarCollapsed?: boolean) => void; + renderWebview: (traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, sessionId?: string) => void; + }; + traceVisualizerAPI?: { + requestSessionTraces: (sessionId: string) => void; + exportSession: (sessionTraces: TraceData[], sessionId: string) => void; + exportTrace: (traceData: TraceData) => void; }; } } -export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, openWithSidebarCollapsed?: boolean) { - const root = createRoot(target); +// Store root instances by target element to reuse them +const rootMap = new WeakMap<HTMLElement, ReturnType<typeof createRoot>>(); + +export function renderWebview(traceData: TraceData, isAgentChat: boolean, target: HTMLElement, focusSpanId?: string, sessionId?: string) { + // Get existing root or create a new one + let root = rootMap.get(target); + if (!root) { + root = createRoot(target); + rootMap.set(target, root); + } + root.render( <React.StrictMode> - <TraceDetails traceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} openWithSidebarCollapsed={openWithSidebarCollapsed} /> + <TraceVisualizer initialTraceData={traceData} isAgentChat={isAgentChat} focusSpanId={focusSpanId} sessionId={sessionId} /> </React.StrictMode> ); } diff --git a/workspaces/ballerina/trace-visualizer/src/utils.tsx b/workspaces/ballerina/trace-visualizer/src/utils.tsx index eaaac25e204..be5406c6f6a 100644 --- a/workspaces/ballerina/trace-visualizer/src/utils.tsx +++ b/workspaces/ballerina/trace-visualizer/src/utils.tsx @@ -386,3 +386,92 @@ export function getSpanColor(type: string): string { return 'var(--vscode-badge-background)'; } } + +/** + * Extracts the session ID from a trace + */ +export function getSessionId(span: SpanData): string | undefined { + return getAttributeValue(span.attributes, 'gen_ai.conversation.id'); +} + +/** + * Extracts the user message from an invoke_agent span + */ +export function extractUserMessage(span: SpanData): string { + const inputMessages = getAttributeValue(span.attributes, 'gen_ai.input.messages'); + if (!inputMessages) return ''; + return inputMessages; +} + +/** + * Extracts the agent response from an invoke_agent span + */ +export function extractAgentResponse(span: SpanData): string { + const outputMessages = getAttributeValue(span.attributes, 'gen_ai.output.messages'); + if (!outputMessages) return ''; + return outputMessages; +} + +/** + * Calculates total input tokens from all spans with "Chat" operation + */ +export function calculateTotalInputTokens(spans: SpanData[]): number { + return spans.reduce((total, span) => { + const operationName = getAttributeValue(span.attributes, 'gen_ai.operation.name'); + if (operationName?.toLowerCase().includes('chat')) { + const inputRaw = getAttributeValue(span.attributes, 'gen_ai.usage.input_tokens') || '0'; + const inputTokens = Number.parseInt(inputRaw); + const safeInput = Number.isFinite(inputTokens) && !Number.isNaN(inputTokens) ? inputTokens : 0; + return total + safeInput; + } + return total; + }, 0); +} + +/** + * Calculates total output tokens from all spans with "Chat" operation + */ +export function calculateTotalOutputTokens(spans: SpanData[]): number { + return spans.reduce((total, span) => { + const operationName = getAttributeValue(span.attributes, 'gen_ai.operation.name'); + if (operationName?.toLowerCase().includes('chat')) { + const outputRaw = getAttributeValue(span.attributes, 'gen_ai.usage.output_tokens') || '0'; + const outputTokens = Number.parseInt(outputRaw); + const safeOutput = Number.isFinite(outputTokens) && !Number.isNaN(outputTokens) ? outputTokens : 0; + return total + safeOutput; + } + return total; + }, 0); +} + +/** + * Calculates the total latency of a trace (from first span start to last span end) + */ +export function calculateTraceLatency(spans: SpanData[]): number | null { + if (spans.length === 0) return null; + + let earliestStart: number | null = null; + let latestEnd: number | null = null; + + for (const span of spans) { + const range = getSpanTimeRange(span); + if (range) { + if (earliestStart === null || range.start < earliestStart) { + earliestStart = range.start; + } + if (latestEnd === null || range.end > latestEnd) { + latestEnd = range.end; + } + } + } + + if (earliestStart === null || latestEnd === null) return null; + return latestEnd - earliestStart; +} + +/** + * Formats a number with comma separators for thousands + */ +export function formatNumber(num: number): string { + return num.toLocaleString('en-US'); +} From fc7833a58442ca97d986d94449c6a6ec1551aada Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 4 Feb 2026 16:03:23 +0530 Subject: [PATCH 175/247] Implement evalset export functionality in trace visualizer --- .../src/features/tracing/trace-converter.ts | 256 ++++++++++++++++++ .../features/tracing/trace-details-webview.ts | 126 +++++++++ .../trace-visualizer/src/SessionOverview.tsx | 23 +- .../trace-visualizer/src/TraceDetails.tsx | 24 +- .../src/components/ExportDropdown.tsx | 142 ++++++++++ .../ballerina/trace-visualizer/src/index.tsx | 2 + 6 files changed, 556 insertions(+), 17 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts create mode 100644 workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts new file mode 100644 index 00000000000..3763949e642 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -0,0 +1,256 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// --- Type Definitions (matching Ballerina records) --- + +type Role = 'system' | 'user' | 'assistant' | 'function'; + +interface ChatUserMessage { + role: 'user'; + content: string | any; + name?: string; +} + +interface ChatSystemMessage { + role: 'system'; + content: string | any; + name?: string; +} + +interface ChatAssistantMessage { + role: 'assistant'; + content?: string | null; + name?: string; + toolCalls?: FunctionCall[]; +} + +interface ChatFunctionMessage { + role: 'function'; + content?: string | null; + name: string; + id?: string; +} + +type ChatMessage = ChatUserMessage | ChatSystemMessage | ChatAssistantMessage | ChatFunctionMessage; + +interface FunctionCall { + name: string; + arguments?: { [key: string]: any }; + id?: string; +} + +interface ToolSchema { + name: string; + description: string; + parametersSchema?: { [key: string]: any }; +} + +interface Iteration { + history: ChatMessage[]; + output: ChatAssistantMessage | ChatFunctionMessage | any; + startTime: string; + endTime: string; +} + +interface EvalsetTrace { + id: string; + userMessage: ChatUserMessage; + iterations: Iteration[]; + output: ChatAssistantMessage | any; + tools: ToolSchema[]; + startTime: string; + endTime: string; +} + +// TraceData interface (from trace-details-webview.ts) +interface TraceData { + traceId: string; + spans: SpanData[]; + resource: ResourceData; + scope: ScopeData; + firstSeen: string; + lastSeen: string; +} + +interface SpanData { + spanId: string; + traceId: string; + parentSpanId: string; + name: string; + kind: string | number; + startTime?: string; + endTime?: string; + attributes?: AttributeData[]; +} + +interface ResourceData { + name: string; + attributes: AttributeData[]; +} + +interface ScopeData { + name: string; + version?: string; + attributes?: AttributeData[]; +} + +interface AttributeData { + key: string; + value: string; +} + +// --- Helper Functions --- + +/** + * Helper to extract a value from the span's attribute list by key. + */ +function getAttribute(span: SpanData, key: string): string | null { + if (!span.attributes) return null; + const attr = span.attributes.find((a: AttributeData) => a.key === key); + return attr ? attr.value : null; +} + +/** + * Parses a JSON string safely, returning null or a default if parsing fails. + */ +function safeJsonParse(jsonString: string | null): any { + if (!jsonString) return null; + try { + return JSON.parse(jsonString); + } catch (e) { + // If it's not JSON, return the raw string or handle appropriately + return jsonString; + } +} + +// --- Main Conversion Logic --- + +/** + * Converts a TraceData object to an EvalsetTrace format. + */ +export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { + const spans = traceData.spans; + const rootSpan = spans.find((s: SpanData) => s.kind === 2 || s.kind === '2'); + + // Find the span containing the GenAI interaction attributes + const aiSpan = spans.find((s: SpanData) => + s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.messages') + ); + + if (!rootSpan || !aiSpan) { + throw new Error("Could not find required Root or AI spans in trace."); + } + + // Extract Data + const traceId = traceData.traceId; + const startTime = rootSpan.startTime || traceData.firstSeen; + const endTime = rootSpan.endTime || traceData.lastSeen; + + // Extract Tools + const toolSpan = spans.find((s: SpanData) => + s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.tools') + ); + const toolsStr = getAttribute(toolSpan, 'gen_ai.input.tools'); + const toolsData = safeJsonParse(toolsStr); + const tools: ToolSchema[] = []; + + if (Array.isArray(toolsData)) { + toolsData.forEach((t: any) => { + tools.push({ + name: t.name, + description: t.description, + parametersSchema: t.parameters + }); + }); + } + + // Extract History & Messages + const inputMessagesStr = getAttribute(aiSpan, 'gen_ai.input.messages'); + const outputMessagesStr = getAttribute(aiSpan, 'gen_ai.output.messages'); + + // Parse the input messages (History) + let rawHistory = safeJsonParse(inputMessagesStr); + + // Handle case where history might be a single string + if (typeof rawHistory === 'string') { + rawHistory = [{ role: 'user', content: rawHistory }]; + } + + // Map raw OpenAI-style messages to our ChatMessage types + const history: ChatMessage[] = (rawHistory || []).map((msg: any) => { + const base: any = { + role: msg.role, + content: msg.content + }; + + if (msg.name) base.name = msg.name; + if (msg.toolCalls) base.toolCalls = msg.toolCalls; + if (msg.id) base.id = msg.id; + + return base as ChatMessage; + }); + + // Determine User Message (Trigger) + // We assume the last user message in the history is the current trigger + const lastUserMsg = [...history].reverse().find(m => m.role === 'user'); + const userMessage: ChatUserMessage = lastUserMsg + ? (lastUserMsg as ChatUserMessage) + : { role: 'user', content: 'Unknown input' }; + + // Determine Output + let outputObj: ChatAssistantMessage; + const parsedOutput = safeJsonParse(outputMessagesStr); + + if (parsedOutput && typeof parsedOutput === 'object' && parsedOutput.role) { + outputObj = parsedOutput; + } else { + // Construct a generic assistant message if raw string + outputObj = { + role: 'assistant', + content: outputMessagesStr + }; + } + + // Construct Iteration + const iteration: Iteration = { + startTime: aiSpan.startTime || startTime, + endTime: aiSpan.endTime || endTime, + history: history, + output: outputObj + }; + + // Assemble Final Trace Object + const evalsetTrace: EvalsetTrace = { + id: traceId, + userMessage: userMessage, + iterations: [iteration], + output: outputObj, + tools: tools, + startTime: startTime, + endTime: endTime + }; + + return evalsetTrace; +} + +/** + * Converts multiple TraceData objects to a combined evalset format. + */ +export function convertTracesToEvalset(traces: TraceData[]): EvalsetTrace[] { + return traces.map(trace => convertTraceToEvalset(trace)); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 10f99891e33..f099e192a23 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -23,6 +23,7 @@ import { Uri, ViewColumn, Webview } from 'vscode'; import { extension } from '../../BalExtensionContext'; import { Trace, TraceServer } from './trace-server'; import { getLibraryWebViewContent, getComposerWebViewOptions, WebViewOptions } from '../../utils/webview-utils'; +import { convertTraceToEvalset, convertTracesToEvalset } from './trace-converter'; // TraceData interface matching the trace-visualizer component interface TraceData { @@ -113,6 +114,16 @@ export class TraceDetailsWebview { await this.exportSession(message.data.sessionTraces, message.data.sessionId); } break; + case 'exportTraceAsEvalset': + if (message.data) { + await this.exportTraceAsEvalset(message.data); + } + break; + case 'exportSessionAsEvalset': + if (message.data) { + await this.exportSessionAsEvalset(message.data.sessionTraces, message.data.sessionId); + } + break; } }, null, @@ -357,6 +368,86 @@ export class TraceDetailsWebview { } } + private async exportTraceAsEvalset(traceData: TraceData): Promise<void> { + try { + const fileName = `trace-${traceData.traceId}.evalset.json`; + const wf = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; + let defaultUri: vscode.Uri; + + if (wf) { + const evaluationsDirPath = path.join(wf.uri.fsPath, 'evalsets'); + const evaluationsDirUri = vscode.Uri.file(evaluationsDirPath); + try { + await vscode.workspace.fs.createDirectory(evaluationsDirUri); + } catch (e) { + // Ignore errors and fall back to workspace root + } + + defaultUri = vscode.Uri.file(path.join(evaluationsDirPath, fileName)); + } else { + defaultUri = vscode.Uri.file(path.join(os.homedir(), fileName)); + } + + const fileUri = await vscode.window.showSaveDialog({ + defaultUri, + filters: { + 'Evalset Files': ['evalset.json'], + 'JSON Files': ['json'], + 'All Files': ['*'] + } + }); + + if (fileUri) { + const evalsetTrace = convertTraceToEvalset(traceData); + const jsonContent = JSON.stringify(evalsetTrace, null, 2); + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + vscode.window.showInformationMessage(`Trace exported as evalset to ${fileUri.fsPath}`); + } + } catch (error) { + vscode.window.showErrorMessage(`Failed to export trace as evalset: ${error}`); + } + } + + private async exportSessionAsEvalset(sessionTraces: TraceData[], sessionId: string): Promise<void> { + try { + const fileName = `session-${sessionId}.evalset.json`; + const wf = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; + let defaultUri: vscode.Uri; + + if (wf) { + const evaluationsDirPath = path.join(wf.uri.fsPath, 'evalsets'); + const evaluationsDirUri = vscode.Uri.file(evaluationsDirPath); + try { + await vscode.workspace.fs.createDirectory(evaluationsDirUri); + } catch (e) { + // Ignore errors + } + + defaultUri = vscode.Uri.file(path.join(evaluationsDirPath, fileName)); + } else { + defaultUri = vscode.Uri.file(path.join(os.homedir(), fileName)); + } + + const fileUri = await vscode.window.showSaveDialog({ + defaultUri, + filters: { + 'Evalset Files': ['evalset.json'], + 'JSON Files': ['json'], + 'All Files': ['*'] + } + }); + + if (fileUri) { + const evalsetTraces = convertTracesToEvalset(sessionTraces); + const jsonContent = JSON.stringify(evalsetTraces, null, 2); + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + vscode.window.showInformationMessage(`Session exported as evalset to ${fileUri.fsPath}`); + } + } catch (error) { + vscode.window.showErrorMessage(`Failed to export session as evalset: ${error}`); + } + } + private getWebviewContent(trace: Trace | null, webView: Webview): string { const body = `<div class="container" id="webview-container"></div>`; const bodyCss = ``; @@ -394,6 +485,18 @@ export class TraceDetailsWebview { command: 'exportTrace', data: traceData }); + }, + exportTraceAsEvalset: (traceData) => { + vscode.postMessage({ + command: 'exportTraceAsEvalset', + data: traceData + }); + }, + exportSessionAsEvalset: (sessionTraces, sessionId) => { + vscode.postMessage({ + command: 'exportSessionAsEvalset', + data: { sessionTraces, sessionId } + }); } }; @@ -449,6 +552,29 @@ export class TraceDetailsWebview { } }); + // Listen for evalset export requests from React component + window.addEventListener('exportTraceAsEvalset', (event) => { + if (event.detail && event.detail.traceData) { + vscode.postMessage({ + command: 'exportTraceAsEvalset', + data: event.detail.traceData + }); + } + }); + + // Listen for session evalset export requests from React component + window.addEventListener('exportSessionAsEvalset', (event) => { + if (event.detail && event.detail.sessionTraces && event.detail.currentSessionId) { + vscode.postMessage({ + command: 'exportSessionAsEvalset', + data: { + sessionTraces: event.detail.sessionTraces, + sessionId: event.detail.currentSessionId + } + }); + } + }); + function loadedScript() { // Request trace data when script is loaded vscode.postMessage({ command: 'requestTraceData' }); diff --git a/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx b/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx index 058e0d9e36a..fd838879d6f 100644 --- a/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx +++ b/workspaces/ballerina/trace-visualizer/src/SessionOverview.tsx @@ -22,6 +22,7 @@ import { Icon } from "@wso2/ui-toolkit"; import { TraceData } from "./index"; import { formatDate, getAttributeValue, extractUserMessage, extractAgentResponse, calculateTotalInputTokens, calculateTotalOutputTokens, calculateTraceLatency, formatDuration, formatNumber } from "./utils"; import { SearchInput } from "./components/SearchInput"; +import { ExportDropdown } from "./components/ExportDropdown"; interface SessionOverviewProps { sessionTraces: TraceData[]; @@ -231,6 +232,13 @@ const EmptyStateSubtitle = styled.div` export function SessionOverview({ sessionTraces, sessionId, onSelectTrace, onExportSession }: SessionOverviewProps) { const [searchQuery, setSearchQuery] = useState(""); + const handleExportAsEvalset = () => { + // Use the traceVisualizerAPI if available + if (window.traceVisualizerAPI?.exportSessionAsEvalset) { + window.traceVisualizerAPI.exportSessionAsEvalset(sessionTraces, sessionId); + } + }; + // Extract trace row data const traceRows: TraceRowData[] = useMemo(() => { return sessionTraces.map(trace => { @@ -303,14 +311,13 @@ export function SessionOverview({ sessionTraces, sessionId, onSelectTrace, onExp <Subtitle>Session ID: {sessionId}</Subtitle> </HeaderLeft> <HeaderRight> - <ExportButton onClick={onExportSession} title="Export session traces"> - <Icon - name="bi-download" - sx={{ fontSize: '16px', width: '16px', height: '16px' }} - iconSx={{ display: 'flex' }} - /> - Export - </ExportButton> + <ExportDropdown + onExportJson={onExportSession} + onExportEvalset={handleExportAsEvalset} + buttonText="Export" + showIcon={true} + compact={false} + /> </HeaderRight> </Header> diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index ce57222f09d..c6a0d2b72f4 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -25,6 +25,7 @@ import { WaterfallView } from "./components/WaterfallView"; import { TraceEmptyState } from "./components/TraceEmptyState"; import { SpanTree, AISpanTreeContainer } from "./components/SpanTree"; import { SearchInput } from "./components/SearchInput"; +import { ExportDropdown } from "./components/ExportDropdown"; import { timeContainsSpan, sortSpansByUmbrellaFirst, @@ -798,6 +799,13 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, onViewSessio })); }; + const handleExportAsEvalset = () => { + // Use the traceVisualizerAPI if available + if (window.traceVisualizerAPI?.exportTraceAsEvalset) { + window.traceVisualizerAPI.exportTraceAsEvalset(traceData); + } + }; + const renderTraceLogs = () => { if (traceData.spans.length === 0) { return ( @@ -838,15 +846,13 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, onViewSessio > Timeline </ModeToggleButton> - <ModeToggleButton onClick={handleExportTrace} title="Export trace as JSON"> - <Icon name="bi-download" - sx={{ fontSize: '16px', width: '16px', height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} - iconSx={{ fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> - </ModeToggleButton> - {/* Only show the toggle button in agent chat context with AI spans. - When opened from trace tree view (!isAgentChat), always show all spans - and hide the toggle button. - */} + <ExportDropdown + onExportJson={handleExportTrace} + onExportEvalset={handleExportAsEvalset} + buttonText="" + showIcon={true} + compact={true} + /> {isAgentChat && hasAISpans && ( <ModeToggleButton onClick={() => setUserAdvancedModePreference(!userAdvancedModePreference)} diff --git a/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx b/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx new file mode 100644 index 00000000000..a35787c5ae7 --- /dev/null +++ b/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx @@ -0,0 +1,142 @@ +import React, { useState, useRef, useEffect } from 'react'; +import styled from '@emotion/styled'; +import { Icon } from "@wso2/ui-toolkit"; + +const DropdownContainer = styled.div` + position: relative; + display: inline-block; +`; + +interface DropdownButtonProps { + compact?: boolean; +} + +const DropdownButton = styled.button<DropdownButtonProps>` + display: flex; + align-items: center; + gap: 6px; + padding: ${(props: DropdownButtonProps) => props.compact ? '4px 8px' : '6px 12px'}; + background: transparent; + border: 1px solid ${(props: DropdownButtonProps) => props.compact ? 'var(--vscode-panel-border)' : 'var(--vscode-button-border)'}; + color: var(--vscode-foreground); + border-radius: 4px; + cursor: pointer; + font-size: 13px; + transition: background-color 0.15s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:active { + transform: scale(0.98); + } +`; + +const DropdownMenu = styled.div` + position: absolute; + top: 100%; + right: 0; + margin-top: 2px; + background: var(--vscode-dropdown-background); + border: 1px solid var(--vscode-dropdown-border); + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + min-width: 160px; + z-index: 1000; +`; + +const MenuItem = styled.button` + display: block; + width: 100%; + padding: 8px 12px; + background: transparent; + border: none; + color: var(--vscode-foreground); + text-align: left; + cursor: pointer; + font-size: 13px; + white-space: nowrap; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } + + &:first-child { + border-radius: 4px 4px 0 0; + } + + &:last-child { + border-radius: 0 0 4px 4px; + } +`; + +interface ExportDropdownProps { + onExportJson: () => void; + onExportEvalset: () => void; + buttonText?: string; + showIcon?: boolean; + compact?: boolean; +} + +export function ExportDropdown({ + onExportJson, + onExportEvalset, + buttonText = "Export", + showIcon = true, + compact = false +}: ExportDropdownProps) { + const [isOpen, setIsOpen] = useState(false); + const dropdownRef = useRef<HTMLDivElement>(null); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + }; + + if (isOpen) { + document.addEventListener('mousedown', handleClickOutside); + } + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [isOpen]); + + const handleExportJson = () => { + onExportJson(); + setIsOpen(false); + }; + + const handleExportEvalset = () => { + onExportEvalset(); + setIsOpen(false); + }; + + return ( + <DropdownContainer ref={dropdownRef}> + <DropdownButton onClick={() => setIsOpen(!isOpen)} title="Export" compact={compact}> + {showIcon && ( + <Icon + name="bi-download" + sx={{ fontSize: '16px', width: '16px', height: '16px' }} + iconSx={{ display: 'flex' }} + /> + )} + {buttonText} + </DropdownButton> + {isOpen && ( + <DropdownMenu> + <MenuItem onClick={handleExportJson}> + Export as JSON + </MenuItem> + <MenuItem onClick={handleExportEvalset}> + Export as Evalset + </MenuItem> + </DropdownMenu> + )} + </DropdownContainer> + ); +} diff --git a/workspaces/ballerina/trace-visualizer/src/index.tsx b/workspaces/ballerina/trace-visualizer/src/index.tsx index 6618ce74b7e..c569f860af0 100644 --- a/workspaces/ballerina/trace-visualizer/src/index.tsx +++ b/workspaces/ballerina/trace-visualizer/src/index.tsx @@ -66,6 +66,8 @@ declare global { requestSessionTraces: (sessionId: string) => void; exportSession: (sessionTraces: TraceData[], sessionId: string) => void; exportTrace: (traceData: TraceData) => void; + exportTraceAsEvalset: (traceData: TraceData) => void; + exportSessionAsEvalset: (sessionTraces: TraceData[], sessionId: string) => void; }; } } From 44c7b60da4467573f38661f86cc313c2ec162ef8 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 4 Feb 2026 22:09:43 +0530 Subject: [PATCH 176/247] Refactor trace export functionality to include EvalSet and EvalCase structures --- .../src/features/tracing/trace-converter.ts | 10 ++-- .../features/tracing/trace-details-webview.ts | 53 +++++++++++++++++-- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 3763949e642..c6edc37c3f7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -120,7 +120,7 @@ interface AttributeData { * Helper to extract a value from the span's attribute list by key. */ function getAttribute(span: SpanData, key: string): string | null { - if (!span.attributes) return null; + if (!span.attributes) { return null; } const attr = span.attributes.find((a: AttributeData) => a.key === key); return attr ? attr.value : null; } @@ -129,7 +129,7 @@ function getAttribute(span: SpanData, key: string): string | null { * Parses a JSON string safely, returning null or a default if parsing fails. */ function safeJsonParse(jsonString: string | null): any { - if (!jsonString) return null; + if (!jsonString) { return null; } try { return JSON.parse(jsonString); } catch (e) { @@ -198,9 +198,9 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { content: msg.content }; - if (msg.name) base.name = msg.name; - if (msg.toolCalls) base.toolCalls = msg.toolCalls; - if (msg.id) base.id = msg.id; + if (msg.name) { base.name = msg.name; } + if (msg.toolCalls) { base.toolCalls = msg.toolCalls; } + if (msg.id) { base.id = msg.id; } return base as ChatMessage; }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index f099e192a23..a685c3b255e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -19,6 +19,7 @@ import * as vscode from 'vscode'; import * as path from 'path'; import * as os from 'os'; +import * as crypto from 'crypto'; import { Uri, ViewColumn, Webview } from 'vscode'; import { extension } from '../../BalExtensionContext'; import { Trace, TraceServer } from './trace-server'; @@ -62,6 +63,21 @@ interface AttributeData { value: string; } +// New Interface for the Case Object +interface EvalCase { + id: string; + name: string; + traces: any[]; // Array of trace objects +} + +interface EvalSet { + id: string; + name?: string; + description?: string; + cases: EvalCase[]; // Updated to use the EvalCase object + created_on: number; +} + export class TraceDetailsWebview { private static instance: TraceDetailsWebview | undefined; private _panel: vscode.WebviewPanel | undefined; @@ -399,7 +415,23 @@ export class TraceDetailsWebview { if (fileUri) { const evalsetTrace = convertTraceToEvalset(traceData); - const jsonContent = JSON.stringify(evalsetTrace, null, 2); + + // Construct the Case Object + const evalCase: EvalCase = { + id: crypto.randomUUID(), + name: `Case - ${traceData.traceId.substring(0, 8)}`, + traces: [evalsetTrace] + }; + + const evalSet: EvalSet = { + id: crypto.randomUUID(), + name: `Trace ${traceData.traceId}`, + description: "Single trace export", + cases: [evalCase], // Add the Case object to the array + created_on: Date.now() / 1000.0 + }; + + const jsonContent = JSON.stringify(evalSet, null, 2); await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); vscode.window.showInformationMessage(`Trace exported as evalset to ${fileUri.fsPath}`); } @@ -439,7 +471,23 @@ export class TraceDetailsWebview { if (fileUri) { const evalsetTraces = convertTracesToEvalset(sessionTraces); - const jsonContent = JSON.stringify(evalsetTraces, null, 2); + + // Construct the Case Object + const evalCase: EvalCase = { + id: crypto.randomUUID(), + name: `Case - ${sessionId.substring(0, 8)}`, + traces: evalsetTraces + }; + + const evalSet: EvalSet = { + id: crypto.randomUUID(), + name: `Session ${sessionId}`, + description: "Session export", + cases: [evalCase], // Add the Case object to the array + created_on: Date.now() / 1000.0 + }; + + const jsonContent = JSON.stringify(evalSet, null, 2); await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); vscode.window.showInformationMessage(`Session exported as evalset to ${fileUri.fsPath}`); } @@ -618,4 +666,3 @@ export class TraceDetailsWebview { } } } - From f70e1f0f7fa7e71d067637de986133d8cd8db81c Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 4 Feb 2026 22:10:43 +0530 Subject: [PATCH 177/247] Add Evalset viewer functionality and integrate with state machine --- .../ballerina-core/src/state-machine-types.ts | 25 +- .../ballerina-extension/package.json | 7 + .../ballerina-extension/src/RPCLayer.ts | 1 + .../src/features/test-explorer/activator.ts | 35 ++- .../test-explorer/evalset-tree-view.ts | 224 ++++++++++++++++++ .../features/tracing/trace-details-webview.ts | 32 +-- .../ballerina-extension/src/stateMachine.ts | 7 +- .../ballerina-visualizer/src/MainPanel.tsx | 10 + .../src/views/EvalsetViewer.tsx | 85 +++++++ 9 files changed, 399 insertions(+), 27 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index cc7c3c8551d..92e0dfe4fe4 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -101,7 +101,8 @@ export enum MACHINE_VIEW { ResolveMissingDependencies = "Resolve Missing Dependencies", ServiceFunctionForm = "Service Function Form", BISamplesView = "BI Samples View", - ReviewMode = "Review Mode SKIP" + ReviewMode = "Review Mode SKIP", + EvalsetViewer = "Evalset Viewer" } export interface MachineEvent { @@ -151,6 +152,7 @@ export interface VisualizerLocation { dataMapperMetadata?: DataMapperMetadata; artifactInfo?: ArtifactInfo; reviewData?: ReviewModeData; + evalsetData?: EvalsetData; } export interface ArtifactInfo { @@ -201,6 +203,27 @@ export interface ReviewModeData { onReject?: string; } +export interface EvalCase { + id: string; + name: string; + traces: any[]; + created_on: string; +} + +export interface EvalSet { + id: string; + name?: string; + description?: string; + cases: EvalCase[]; + created_on: string; +} + +export interface EvalsetData { + filePath: string; + content: EvalSet; + caseId?: string; +} + export interface PopupVisualizerLocation extends VisualizerLocation { recentIdentifier?: string; artifactType?: DIRECTORY_MAP; diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 5161b949230..01de2f4ee2a 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -744,6 +744,13 @@ } ], "views": { + "test": [ + { + "id": "ballerina-evalsets", + "name": "Eval Sets", + "when": "isBIProject || isBallerinaProject" + } + ], "ballerina-traceView": [ { "id": "ballerina-traceView", diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 4f7481c5bc0..09114d0d95b 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -152,6 +152,7 @@ async function getContext(): Promise<VisualizerLocation> { artifactInfo: context.artifactInfo, reviewData: context.reviewData, agentMetadata: context.agentMetadata + evalsetData: context.evalsetData }); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index ce5727aed37..7d8b1e4e23a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -17,7 +17,7 @@ * under the License. */ -import { tests, workspace, TestRunProfileKind, TestController, Uri } from "vscode"; +import { tests, workspace, TestRunProfileKind, TestController, Uri, window, commands } from "vscode"; import { BallerinaExtension } from "../../core"; import { runHandler } from "./runner"; import { activateEditBiTest } from "./commands"; @@ -25,10 +25,34 @@ import { discoverTestFunctionsInProject, handleFileChange as handleTestFileUpdat import { getCurrentBallerinaProject, getWorkspaceRoot } from "../../utils/project-utils"; import { checkIsBallerinaPackage, checkIsBallerinaWorkspace } from "../../utils"; import { PROJECT_TYPE } from "../project"; +import { EvalsetTreeDataProvider } from "./evalset-tree-view"; +import { openView } from "../../stateMachine"; +import { EvalSet, EVENT_TYPE, MACHINE_VIEW } from "@wso2/ballerina-core"; +import * as fs from 'fs'; export let testController: TestController; export async function activate(ballerinaExtInstance: BallerinaExtension) { + // Register command to open evalset viewer + const openEvalsetCommand = commands.registerCommand('ballerina.openEvalsetViewer', async (uri: Uri, caseId?: string) => { + try { + const content = await fs.promises.readFile(uri.fsPath, 'utf-8'); + const evalsetData = JSON.parse(content) as EvalSet; + + openView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.EvalsetViewer, + evalsetData: { + filePath: uri.fsPath, + content: evalsetData, + caseId: caseId + } + }); + } catch (error) { + console.error('Error opening evalset:', error); + window.showErrorMessage(`Failed to open evalset: ${error}`); + } + }); + testController = tests.createTestController('ballerina-integrator-tests', 'WSO2 Integrator: BI Tests'); const workspaceRoot = getWorkspaceRoot(); @@ -46,6 +70,13 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { return; } + // Create and register Evalset TreeView + const evalsetTreeDataProvider = new EvalsetTreeDataProvider(); + const evalsetTreeView = window.createTreeView('ballerina-evalsets', { + treeDataProvider: evalsetTreeDataProvider, + showCollapseAll: true + }); + // Create test profiles to display. testController.createRunProfile('Run Tests', TestRunProfileKind.Run, runHandler, true); testController.createRunProfile('Debug Tests', TestRunProfileKind.Debug, runHandler, true); @@ -62,7 +93,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { discoverTestFunctionsInProject(ballerinaExtInstance, testController); // Register the test controller and file watcher with the extension context - ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher); + ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand); activateEditBiTest(); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts new file mode 100644 index 00000000000..713b5c3a5fd --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts @@ -0,0 +1,224 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as vscode from 'vscode'; +import * as fs from 'fs'; +import * as path from 'path'; + +// Interface matching the EvalCase object structure +interface EvalCaseJson { + id: string; + name: string; + traces: any[]; +} + +// Interface matching the new EvalSet JSON structure +interface EvalSetJson { + id: string; + name?: string; + description?: string; + cases: EvalCaseJson[]; // Array of Case objects + created_on?: number; +} + +/** + * Represents an evalset file node in the tree view + */ +class EvalsetFileNode { + constructor( + public readonly uri: vscode.Uri, + public readonly label: string, + public readonly caseCount: number, + public readonly description?: string + ) { } +} + +/** + * Represents a single case within an evalset + */ +class EvalsetCaseNode { + constructor( + public readonly parentUri: vscode.Uri, + public readonly caseIndex: number, + public readonly label: string, + public readonly caseId: string, + public readonly traceCount: number + ) { } +} + +type EvalsetNode = EvalsetFileNode | EvalsetCaseNode; + +/** + * TreeDataProvider for displaying evalsets + */ +export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetNode> { + private _onDidChangeTreeData: vscode.EventEmitter<EvalsetNode | undefined | null | void> = + new vscode.EventEmitter<EvalsetNode | undefined | null | void>(); + readonly onDidChangeTreeData: vscode.Event<EvalsetNode | undefined | null | void> = + this._onDidChangeTreeData.event; + + private fileWatcher: vscode.FileSystemWatcher | undefined; + + constructor() { + this.setupFileWatcher(); + } + + private setupFileWatcher(): void { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return; + } + + // Watch all evalset files in workspace + const pattern = '**/evalsets/**/*.evalset.json'; + this.fileWatcher = vscode.workspace.createFileSystemWatcher(pattern); + + // Refresh on file changes + this.fileWatcher.onDidCreate(() => this.refresh()); + this.fileWatcher.onDidChange(() => this.refresh()); + this.fileWatcher.onDidDelete(() => this.refresh()); + } + + refresh(): void { + this._onDidChangeTreeData.fire(); + } + + getTreeItem(element: EvalsetNode): vscode.TreeItem { + if (element instanceof EvalsetFileNode) { + const item = new vscode.TreeItem( + element.label, + vscode.TreeItemCollapsibleState.Collapsed + ); + item.tooltip = element.description || `EvalSet with ${element.caseCount} cases`; + item.description = `${element.caseCount} case${element.caseCount !== 1 ? 's' : ''}`; + item.iconPath = new vscode.ThemeIcon('library'); + item.contextValue = 'evalsetFile'; + item.resourceUri = element.uri; + return item; + } else { + const item = new vscode.TreeItem( + element.label, + vscode.TreeItemCollapsibleState.None + ); + item.tooltip = `Case ID: ${element.caseId} (${element.traceCount} traces)`; + + item.iconPath = new vscode.ThemeIcon('beaker'); + item.contextValue = 'evalsetCase'; + item.resourceUri = element.parentUri; + + item.command = { + command: 'ballerina.openEvalsetViewer', + title: 'Open Evalset Case', + arguments: [element.parentUri, element.caseId] + }; + return item; + } + } + + async getChildren(element?: EvalsetNode): Promise<EvalsetNode[]> { + if (!element) { + // Root level - return all evalset files + return this.getEvalsetFiles(); + } else if (element instanceof EvalsetFileNode) { + // Return cases for this evalset file + return this.getCasesForFile(element.uri); + } + + return []; + } + + /** + * Get all evalset files in the workspace + */ + private async getEvalsetFiles(): Promise<EvalsetFileNode[]> { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return []; + } + + const evalsetFiles = await vscode.workspace.findFiles('**/evalsets/**/*.evalset.json'); + const nodes: EvalsetFileNode[] = []; + + for (const uri of evalsetFiles) { + try { + const content = await fs.promises.readFile(uri.fsPath, 'utf-8'); + const evalsetData: EvalSetJson = JSON.parse(content); + + // Validation for new format + if (!evalsetData.cases || !Array.isArray(evalsetData.cases)) { + continue; + } + + const caseCount = evalsetData.cases.length; + const label = evalsetData.name || path.basename(uri.fsPath, '.evalset.json'); + const description = evalsetData.description || ''; + + nodes.push(new EvalsetFileNode(uri, label, caseCount, description)); + } catch (error) { + console.error(`Failed to parse evalset file ${uri.fsPath}:`, error); + } + } + + return nodes; + } + + /** + * Get cases for a specific evalset file + */ + private async getCasesForFile(uri: vscode.Uri): Promise<EvalsetCaseNode[]> { + try { + const content = await fs.promises.readFile(uri.fsPath, 'utf-8'); + const evalsetData: EvalSetJson = JSON.parse(content); + const nodes: EvalsetCaseNode[] = []; + + if (!evalsetData.cases || !Array.isArray(evalsetData.cases)) { + return []; + } + + evalsetData.cases.forEach((caseObj: EvalCaseJson, index: number) => { + // Ensure traces is an array + const traceCount = Array.isArray(caseObj.traces) ? caseObj.traces.length : 0; + + // Use the name defined in the case object, fallback to generated name + const label = caseObj.name || `Case ${index + 1}`; + const caseId = caseObj.id || `case-${index + 1}`; + + nodes.push(new EvalsetCaseNode( + uri, + index, + label, + caseId, + traceCount + )); + }); + + return nodes; + } catch (error) { + console.error(`Failed to get cases for ${uri.fsPath}:`, error); + return []; + } + } + + /** + * Dispose resources + */ + dispose(): void { + this.fileWatcher?.dispose(); + this._onDidChangeTreeData.dispose(); + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index a685c3b255e..a2edc2412a4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -25,6 +25,7 @@ import { extension } from '../../BalExtensionContext'; import { Trace, TraceServer } from './trace-server'; import { getLibraryWebViewContent, getComposerWebViewOptions, WebViewOptions } from '../../utils/webview-utils'; import { convertTraceToEvalset, convertTracesToEvalset } from './trace-converter'; +import { EvalCase, EvalSet } from '@wso2/ballerina-core'; // TraceData interface matching the trace-visualizer component interface TraceData { @@ -63,21 +64,6 @@ interface AttributeData { value: string; } -// New Interface for the Case Object -interface EvalCase { - id: string; - name: string; - traces: any[]; // Array of trace objects -} - -interface EvalSet { - id: string; - name?: string; - description?: string; - cases: EvalCase[]; // Updated to use the EvalCase object - created_on: number; -} - export class TraceDetailsWebview { private static instance: TraceDetailsWebview | undefined; private _panel: vscode.WebviewPanel | undefined; @@ -416,19 +402,19 @@ export class TraceDetailsWebview { if (fileUri) { const evalsetTrace = convertTraceToEvalset(traceData); - // Construct the Case Object const evalCase: EvalCase = { id: crypto.randomUUID(), name: `Case - ${traceData.traceId.substring(0, 8)}`, - traces: [evalsetTrace] + traces: [evalsetTrace], + created_on: new Date().toISOString() }; const evalSet: EvalSet = { id: crypto.randomUUID(), name: `Trace ${traceData.traceId}`, description: "Single trace export", - cases: [evalCase], // Add the Case object to the array - created_on: Date.now() / 1000.0 + cases: [evalCase], + created_on: new Date().toISOString() }; const jsonContent = JSON.stringify(evalSet, null, 2); @@ -472,19 +458,19 @@ export class TraceDetailsWebview { if (fileUri) { const evalsetTraces = convertTracesToEvalset(sessionTraces); - // Construct the Case Object const evalCase: EvalCase = { id: crypto.randomUUID(), name: `Case - ${sessionId.substring(0, 8)}`, - traces: evalsetTraces + traces: evalsetTraces, + created_on: new Date().toISOString() }; const evalSet: EvalSet = { id: crypto.randomUUID(), name: `Session ${sessionId}`, description: "Session export", - cases: [evalCase], // Add the Case object to the array - created_on: Date.now() / 1000.0 + cases: [evalCase], + created_on: new Date().toISOString() }; const jsonContent = JSON.stringify(evalSet, null, 2); diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index 00fe66ee434..4d7baeb5acf 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -316,6 +316,7 @@ const stateMachine = createMachine<MachineContext>( artifactInfo: (context, event) => event.viewLocation?.artifactInfo, rootDiagramId: (context, event) => event.viewLocation?.rootDiagramId, reviewData: (context, event) => event.viewLocation?.reviewData, + evalsetData: (context, event) => event.viewLocation?.evalsetData, isViewUpdateTransition: false }), (context, event) => notifyTreeView( @@ -379,6 +380,7 @@ const stateMachine = createMachine<MachineContext>( agentMetadata: (context, event) => event.data.agentMetadata, dataMapperMetadata: (context, event) => event.data.dataMapperMetadata, reviewData: (context, event) => event.data.reviewData, + evalsetData: (context, event) => event.data.evalsetData, isViewUpdateTransition: false }) } @@ -407,6 +409,7 @@ const stateMachine = createMachine<MachineContext>( artifactInfo: (context, event) => event.viewLocation?.artifactInfo, rootDiagramId: (context, event) => event.viewLocation?.rootDiagramId, reviewData: (context, event) => event.viewLocation?.reviewData, + evalsetData: (context, event) => event.viewLocation?.evalsetData, isViewUpdateTransition: false }), (context, event) => notifyTreeView( @@ -432,6 +435,7 @@ const stateMachine = createMachine<MachineContext>( addType: (context, event) => event.viewLocation?.addType, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, reviewData: (context, event) => event.viewLocation?.reviewData, + evalsetData: (context, event) => event.viewLocation?.evalsetData, isViewUpdateTransition: true }), (context, event) => notifyTreeView( @@ -658,7 +662,8 @@ const stateMachine = createMachine<MachineContext>( addType: context?.addType, agentMetadata: context?.agentMetadata, dataMapperMetadata: context?.dataMapperMetadata, - reviewData: context?.reviewData + reviewData: context?.reviewData, + evalsetData: context?.evalsetData } }); return resolve(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 9be045c8df7..2acff2a7619 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -85,6 +85,7 @@ import { SamplesView } from "./views/BI/SamplesView"; import { ReviewMode } from "./views/ReviewMode"; import AddConnectionPopup from "./views/BI/Connection/AddConnectionPopup"; import EditConnectionPopup from "./views/BI/Connection/EditConnectionPopup"; +import { EvalsetViewer } from "./views/EvalsetViewer"; const globalStyles = css` *, @@ -631,6 +632,15 @@ const MainPanel = () => { <ReviewMode /> ); break; + case MACHINE_VIEW.EvalsetViewer: + setViewComponent( + <EvalsetViewer + filePath={value?.evalsetData.filePath} + content={value?.evalsetData.content} + caseId={value?.evalsetData?.caseId} + /> + ); + break; default: setNavActive(false); setViewComponent(<LoadingRing />); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx new file mode 100644 index 00000000000..407789258db --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styled from "@emotion/styled"; +import { EvalSet } from "@wso2/ballerina-core"; + +const Container = styled.div` + padding: 20px; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + font-family: var(--vscode-font-family); + height: 100%; + overflow-y: auto; +`; + +const Header = styled.div` + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 1px solid var(--vscode-panel-border); +`; + +const Title = styled.h1` + font-size: 1.5em; + font-weight: 600; + margin: 0 0 10px 0; + color: var(--vscode-foreground); +`; + +const Subtitle = styled.p` + font-size: 13px; + color: var(--vscode-descriptionForeground); + margin: 0; +`; + +const ContentSection = styled.div` + background-color: var(--vscode-textCodeBlock-background); + padding: 15px; + border-radius: 4px; + border: 1px solid var(--vscode-panel-border); +`; + +const Preformatted = styled.pre` + margin: 0; + font-family: var(--vscode-editor-font-family); + font-size: var(--vscode-editor-font-size); + white-space: pre-wrap; + word-break: break-word; + color: var(--vscode-editor-foreground); +`; + +interface EvalsetViewerProps { + filePath: string; + content: EvalSet; + caseId?: string; +} + +export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ filePath, content, caseId }) => { + return ( + <Container> + <Header> + <Title>{filePath}</Title> + <Subtitle>Case: {caseId}</Subtitle> + </Header> + <ContentSection> + <Preformatted>{JSON.stringify(content, null, 2)}</Preformatted> + </ContentSection> + </Container> + ); +}; From ce6886cb5c6e5bbc76cb92ea7bf6e6fd25609e74 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 5 Feb 2026 12:02:34 +0530 Subject: [PATCH 178/247] Add Evalset types, viewer, and tool calls timeline components --- .../ballerina-core/src/state-machine-types.ts | 62 +++++- .../test-explorer/evalset-tree-view.ts | 2 +- .../src/features/tracing/trace-converter.ts | 107 ++++----- .../features/tracing/trace-details-webview.ts | 20 +- .../ballerina-visualizer/src/MainPanel.tsx | 1 + .../Components/ChatInterface.tsx | 30 ++- .../Components/ToolCallsTimeline.tsx | 203 ++++++++++++++++++ .../src/views/EvalCaseViewer.tsx | 173 +++++++++++++++ .../src/views/EvalsetViewer.tsx | 33 ++- 9 files changed, 554 insertions(+), 77 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ToolCallsTimeline.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 92e0dfe4fe4..54d5a5909f3 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -203,10 +203,70 @@ export interface ReviewModeData { onReject?: string; } +// --- Evalset Trace Types --- +export type EvalRole = 'system' | 'user' | 'assistant' | 'function'; + +export interface EvalChatUserMessage { + role: 'user'; + content: string | any; + name?: string; +} + +export interface EvalChatSystemMessage { + role: 'system'; + content: string | any; + name?: string; +} + +export interface EvalChatAssistantMessage { + role: 'assistant'; + content?: string | null; + name?: string; + toolCalls?: EvalFunctionCall[]; +} + +export interface EvalChatFunctionMessage { + role: 'function'; + content?: string | null; + name: string; + id?: string; +} + +export type EvalChatMessage = EvalChatUserMessage | EvalChatSystemMessage | EvalChatAssistantMessage | EvalChatFunctionMessage; + +export interface EvalFunctionCall { + name: string; + arguments?: { [key: string]: any }; + id?: string; +} + +export interface EvalToolSchema { + name: string; + description: string; + parametersSchema?: { [key: string]: any }; +} + +export interface EvalIteration { + history: EvalChatMessage[]; + output: EvalChatAssistantMessage | EvalChatFunctionMessage | any; + startTime: string; + endTime: string; +} + +export interface EvalsetTrace { + id: string; + userMessage: EvalChatUserMessage; + iterations: EvalIteration[]; + output: EvalChatAssistantMessage | any; + tools: EvalToolSchema[]; + startTime: string; + endTime: string; +} + export interface EvalCase { id: string; name: string; - traces: any[]; + traces: EvalsetTrace[]; created_on: string; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts index 713b5c3a5fd..bcdcade51f2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts @@ -117,7 +117,7 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN ); item.tooltip = `Case ID: ${element.caseId} (${element.traceCount} traces)`; - item.iconPath = new vscode.ThemeIcon('beaker'); + item.iconPath = new vscode.ThemeIcon('file-text'); item.contextValue = 'evalsetCase'; item.resourceUri = element.parentUri; diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index c6edc37c3f7..88bbe868dc9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -16,66 +16,15 @@ * under the License. */ -// --- Type Definitions (matching Ballerina records) --- - -type Role = 'system' | 'user' | 'assistant' | 'function'; - -interface ChatUserMessage { - role: 'user'; - content: string | any; - name?: string; -} - -interface ChatSystemMessage { - role: 'system'; - content: string | any; - name?: string; -} - -interface ChatAssistantMessage { - role: 'assistant'; - content?: string | null; - name?: string; - toolCalls?: FunctionCall[]; -} - -interface ChatFunctionMessage { - role: 'function'; - content?: string | null; - name: string; - id?: string; -} - -type ChatMessage = ChatUserMessage | ChatSystemMessage | ChatAssistantMessage | ChatFunctionMessage; - -interface FunctionCall { - name: string; - arguments?: { [key: string]: any }; - id?: string; -} - -interface ToolSchema { - name: string; - description: string; - parametersSchema?: { [key: string]: any }; -} - -interface Iteration { - history: ChatMessage[]; - output: ChatAssistantMessage | ChatFunctionMessage | any; - startTime: string; - endTime: string; -} - -interface EvalsetTrace { - id: string; - userMessage: ChatUserMessage; - iterations: Iteration[]; - output: ChatAssistantMessage | any; - tools: ToolSchema[]; - startTime: string; - endTime: string; -} +import { + EvalChatUserMessage as ChatUserMessage, + EvalChatAssistantMessage as ChatAssistantMessage, + EvalChatMessage as ChatMessage, + EvalToolSchema as ToolSchema, + EvalIteration as Iteration, + EvalsetTrace, + EvalFunctionCall +} from '@wso2/ballerina-core'; // TraceData interface (from trace-details-webview.ts) interface TraceData { @@ -149,7 +98,7 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { // Find the span containing the GenAI interaction attributes const aiSpan = spans.find((s: SpanData) => - s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.messages') + s.name.includes('invoke_agent') && s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.messages') ); if (!rootSpan || !aiSpan) { @@ -218,12 +167,46 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { if (parsedOutput && typeof parsedOutput === 'object' && parsedOutput.role) { outputObj = parsedOutput; - } else { + } else if (outputMessagesStr) { // Construct a generic assistant message if raw string outputObj = { role: 'assistant', content: outputMessagesStr }; + } else { + // No output found - use a placeholder + outputObj = { + role: 'assistant', + content: 'No output available' + }; + } + + // Extract tool calls from execute_tool spans + const toolCallSpans = spans.filter((s: SpanData) => s.name.includes('execute_tool')); + if (toolCallSpans.length > 0) { + const toolCalls: EvalFunctionCall[] = []; + + for (const toolSpan of toolCallSpans) { + const toolName = getAttribute(toolSpan, 'gen_ai.tool.name') || getAttribute(toolSpan, 'tool.name'); + const toolArgs = getAttribute(toolSpan, 'gen_ai.tool.arguments') || getAttribute(toolSpan, 'tool.arguments'); + const toolId = getAttribute(toolSpan, 'gen_ai.tool.id') || getAttribute(toolSpan, 'tool.id') || toolSpan.spanId; + + // parse tool arguments if they are in JSON format + const parsedArgs = safeJsonParse(toolArgs); + const finalArgs = typeof parsedArgs === 'object' ? parsedArgs : toolArgs; + + if (toolName) { + toolCalls.push({ + id: toolId, + name: toolName, + arguments: finalArgs + }); + } + } + + if (toolCalls.length > 0) { + outputObj.toolCalls = toolCalls; + } } // Construct Iteration diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index a2edc2412a4..4d55d8eef3f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -419,7 +419,15 @@ export class TraceDetailsWebview { const jsonContent = JSON.stringify(evalSet, null, 2); await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); - vscode.window.showInformationMessage(`Trace exported as evalset to ${fileUri.fsPath}`); + + const action = await vscode.window.showInformationMessage( + `Trace exported as evalset to ${fileUri.fsPath}`, + 'View' + ); + + if (action === 'View') { + await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalCase.id); + } } } catch (error) { vscode.window.showErrorMessage(`Failed to export trace as evalset: ${error}`); @@ -475,7 +483,15 @@ export class TraceDetailsWebview { const jsonContent = JSON.stringify(evalSet, null, 2); await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); - vscode.window.showInformationMessage(`Session exported as evalset to ${fileUri.fsPath}`); + + const action = await vscode.window.showInformationMessage( + `Session exported as evalset to ${fileUri.fsPath}`, + 'View' + ); + + if (action === 'View') { + await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalCase.id); + } } } catch (error) { vscode.window.showErrorMessage(`Failed to export session as evalset: ${error}`); diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 2acff2a7619..51643e0dbb0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -635,6 +635,7 @@ const MainPanel = () => { case MACHINE_VIEW.EvalsetViewer: setViewComponent( <EvalsetViewer + projectPath={value.projectPath} filePath={value?.evalsetData.filePath} content={value?.evalsetData.content} caseId={value?.evalsetData?.caseId} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index c708326e8e1..a281432b773 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -77,14 +77,14 @@ const WatermarkSubTitle = styled.div` `; // ---------- CHAT AREA ---------- -const ChatWrapper = styled.div` +export const ChatWrapper = styled.div` display: flex; flex-direction: column; height: 100vh; width: 100%; `; -const ChatContainer = styled.div` +export const ChatContainer = styled.div` position: relative; display: flex; flex-direction: column; @@ -93,26 +93,38 @@ const ChatContainer = styled.div` margin: 20px 0 32px 0; `; -const Messages = styled.div` +export const Messages = styled.div` flex: 1; overflow-y: auto; - padding: 8px 0; display: flex; flex-direction: column; gap: 8px; position: relative; z-index: 1; padding: 8px 20px; + height: 100%; + + @media (min-width: 1000px) { + padding: 8px 10%; + } + + @media (min-width: 1600px) { + padding: 8px 15%; + } + + @media (min-width: 2000px) { + padding: 8px 20%; + } `; -const MessageContainer = styled.div<{ isUser: boolean }>` +export const MessageContainer = styled.div<{ isUser: boolean }>` display: flex; align-items: flex-end; justify-content: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; gap: 6px; `; -const ProfilePic = styled.div` +export const ProfilePic = styled.div` padding: 4px; border: 1px solid var(--vscode-panel-border); width: 18px; @@ -121,10 +133,10 @@ const ProfilePic = styled.div` object-fit: cover; `; -const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading?: boolean }>` +export const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading?: boolean }>` position: relative; padding: ${({ isLoading }: { isLoading?: boolean }) => (isLoading ? "10px 14px" : "0 14px")}; - max-width: 55%; + max-width: min(600px, 70%); align-self: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; overflow-wrap: break-word; word-break: break-word; @@ -301,7 +313,7 @@ const ClearChatWarningPopup: React.FC<ClearChatWarningPopupProps> = ({ isOpen, o }; // Preprocess LaTeX delimiters to convert \(...\) and \[...\] to $...$ and $$...$$ -function preprocessLatex(text: string): string { +export function preprocessLatex(text: string): string { if (!text || typeof text !== 'string') return text; // Convert display math \[...\] to $$...$$ diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ToolCallsTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ToolCallsTimeline.tsx new file mode 100644 index 00000000000..ffd34cde9af --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ToolCallsTimeline.tsx @@ -0,0 +1,203 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useState } from "react"; +import styled from "@emotion/styled"; +import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { EvalFunctionCall } from "@wso2/ballerina-core"; + +interface ToolCallsTimelineProps { + toolCalls: EvalFunctionCall[]; +} + +const TimelineContainer = styled.div` + max-width: 600px; + margin: 12px 0 8px; +`; + +const TimelineTitle = styled.div` + font-size: 11px; + color: var(--vscode-descriptionForeground); + letter-spacing: 0.5px; +`; + +const TimelineHeader = styled.button` + display: flex; + align-items: center; + gap: 2px; + background: transparent; + border: none; + padding: 0; + cursor: pointer; +`; + +const ToggleIcon = styled.span<{ isOpen: boolean }>` + color: var(--vscode-descriptionForeground); + display: inline-flex; + align-items: center; + justify-content: center; + transition: transform 0.15s ease; + transform: ${(props: { isOpen: boolean }) => (props.isOpen ? "rotate(90deg)" : "rotate(0deg)")}; +`; + +const TimelineList = styled.div` + margin-top: 8px; + margin-bottom: 4px; + display: flex; + flex-direction: column; + gap: 0; +`; + +const TimelineItem = styled.div` + display: flex; + align-items: flex-start; + position: relative; + margin-bottom: 8px; + + &:last-of-type { + margin-bottom: 0; + } +`; + +const ConnectorColumn = styled.div<{ isLast: boolean }>` + width: 20px; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + flex-shrink: 0; + padding-top: 4px; + + &::after { + content: ''; + position: absolute; + top: 14px; + left: 50%; + transform: translateX(-50%); + width: 1px; + height: calc(100% + 8px); + background-color: var(--vscode-panel-border); + display: ${(props: { isLast: boolean }) => props.isLast ? 'none' : 'block'}; + } +`; + +const Dot = styled.div` + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--vscode-panel-border); + z-index: 1; + flex-shrink: 0; +`; + +const ContentCard = styled.div` + width: 60%; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 8px 12px; + transition: background-color 0.15s ease; +`; + +const CardContent = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const IconBadge = styled.div` + display: flex; + align-items: center; + justify-content: center; + color: var(--vscode-terminal-ansiBrightMagenta); + flex-shrink: 0; +`; + +const OperationLabel = styled.span` + font-size: 10px; + font-weight: 600; + flex-shrink: 0; +`; + +const ToolName = styled.span` + font-size: 12px; + color: var(--vscode-foreground); + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +export function ToolCallsTimeline({ toolCalls }: ToolCallsTimelineProps) { + const [open, setOpen] = useState(false); + + if (!toolCalls || toolCalls.length === 0) { + return null; + } + + return ( + <TimelineContainer> + <TimelineHeader onClick={() => setOpen(!open)} aria-expanded={open}> + <TimelineTitle>Tools Used ({toolCalls.length})</TimelineTitle> + <ToggleIcon isOpen={open}> + <Codicon name="chevron-right" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + </ToggleIcon> + </TimelineHeader> + {open && ( + <TimelineList> + {toolCalls.map((toolCall, index) => ( + <TimelineItem key={toolCall.id || index}> + <ConnectorColumn isLast={index === toolCalls.length - 1}> + <Dot /> + </ConnectorColumn> + <ContentCard title={toolCall.name}> + <CardContent> + <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}> + <IconBadge> + <Icon + name="bi-wrench" + sx={{ + fontSize: '14px', + width: '14px', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "14px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </IconBadge> + <OperationLabel> + Execute Tool + </OperationLabel> + </div> + <ToolName>{toolCall.name}</ToolName> + </CardContent> + </ContentCard> + </TimelineItem> + ))} + </TimelineList> + )} + </TimelineContainer> + ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx new file mode 100644 index 00000000000..5a6fdd42b02 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx @@ -0,0 +1,173 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styled from "@emotion/styled"; +import { EvalCase, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; +import { MessageContainer, MessageBubble, ProfilePic, preprocessLatex } from "./AgentChatPanel/Components/ChatInterface"; +import { ToolCallsTimeline } from "./AgentChatPanel/Components/ToolCallsTimeline"; +import { Icon } from "@wso2/ui-toolkit"; +import ReactMarkdown from "react-markdown"; +import remarkMath from 'remark-math'; +import remarkGfm from 'remark-gfm'; +import rehypeKatex from 'rehype-katex'; +import 'katex/dist/katex.min.css'; +import { TopNavigationBar } from "../components/TopNavigationBar"; + +const Container = styled.div` + height: 100%; + width: 100%; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + + *, *::before, *::after { + box-sizing: content-box; + } +`; + +const Header = styled.div` + top: 0; + padding: 12px 20px; + background-color: var(--vscode-editorWidget-background); + z-index: 2; +`; + +const Title = styled.h2` + font-size: 1.2em; + font-weight: 600; + margin: 0 0 4px 0; + color: var(--vscode-foreground); +`; + +const Subtitle = styled.p` + font-size: 14px; + color: var(--vscode-descriptionForeground); + margin: 0; +`; + +export const Messages = styled.div` + display: flex; + flex-direction: column; + overflow-y: auto; + gap: 8px; + position: relative; + z-index: 1; + padding: 8px 20px; + height: 100%; + + @media (min-width: 1000px) { + padding: 8px 10%; + } + + @media (min-width: 1600px) { + padding: 8px 15%; + } + + @media (min-width: 2000px) { + padding: 8px 20%; + } +`; + +interface EvalCaseViewerProps { + projectPath: string; + evalSet: EvalSet; + evalCase: EvalCase; +} + +export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, evalSet, evalCase }) => { + + const extractToolCalls = (trace: EvalsetTrace): EvalFunctionCall[] => { + const toolCalls: EvalFunctionCall[] = []; + if (trace.output?.toolCalls) { + return trace.output.toolCalls as EvalFunctionCall[]; + } + return toolCalls; + }; + + return ( + <> + <TopNavigationBar projectPath={projectPath} /> + <Container> + <Header> + <Title>{evalSet.name}</Title> + <Subtitle>{evalCase.name} • {evalCase.traces.length} trace(s)</Subtitle> + </Header> + <Messages> + {evalCase.traces.map((trace, traceIdx) => { + const toolCalls = extractToolCalls(trace); + + return ( + <React.Fragment key={traceIdx}> + {/* Render user's initial message */} + <MessageContainer isUser={true}> + <MessageBubble isUser={true}> + <ReactMarkdown + remarkPlugins={[remarkMath, remarkGfm]} + rehypePlugins={[rehypeKatex]} + > + {preprocessLatex(typeof trace.userMessage.content === 'string' + ? trace.userMessage.content + : JSON.stringify(trace.userMessage.content))} + </ReactMarkdown> + </MessageBubble> + <ProfilePic> + <Icon + name="bi-user" + iconSx={{ + fontSize: "18px", + color: "var(--vscode-foreground)", + cursor: "default", + }} + /> + </ProfilePic> + </MessageContainer> + + {/* Render agent response */} + <MessageContainer isUser={false}> + <ProfilePic> + <Icon + name="bi-ai-agent" + iconSx={{ + fontSize: "18px", + color: "var(--vscode-terminal-ansiBrightCyan)", + cursor: "default", + }} + /> + </ProfilePic> + <div style={{ display: 'flex', flexDirection: 'column', gap: '0' }}> + <ToolCallsTimeline toolCalls={toolCalls} /> + <MessageBubble isUser={false}> + <ReactMarkdown + remarkPlugins={[remarkMath, remarkGfm]} + rehypePlugins={[rehypeKatex]} + > + {preprocessLatex(typeof trace.output?.content === 'string' + ? trace.output?.content + : JSON.stringify(trace.output?.content))} + </ReactMarkdown> + </MessageBubble> + </div> + </MessageContainer> + </React.Fragment> + ); + })} + </Messages> + </Container > + </> + ); +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx index 407789258db..e23e11706c1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx @@ -19,6 +19,7 @@ import React from "react"; import styled from "@emotion/styled"; import { EvalSet } from "@wso2/ballerina-core"; +import { EvalCaseViewer } from "./EvalCaseViewer"; const Container = styled.div` padding: 20px; @@ -64,18 +65,46 @@ const Preformatted = styled.pre` color: var(--vscode-editor-foreground); `; +const ErrorMessage = styled.div` + padding: 15px; + background-color: var(--vscode-inputValidation-errorBackground); + border: 1px solid var(--vscode-inputValidation-errorBorder); + border-radius: 4px; + color: var(--vscode-errorForeground); +`; + interface EvalsetViewerProps { + projectPath: string; filePath: string; content: EvalSet; caseId?: string; } -export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ filePath, content, caseId }) => { +export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, filePath, content, caseId }) => { + if (caseId) { + const evalCase = content.cases.find(c => c.id === caseId); + + if (!evalCase) { + return ( + <Container> + <Header> + <Title>{filePath}</Title> + <Subtitle>Case not found</Subtitle> + </Header> + <ErrorMessage> + Case with ID "{caseId}" not found in this evalset. + </ErrorMessage> + </Container> + ); + } + + return <EvalCaseViewer projectPath={projectPath} evalSet={content} evalCase={evalCase} />; + } return ( <Container> <Header> <Title>{filePath}</Title> - <Subtitle>Case: {caseId}</Subtitle> + <Subtitle>{content.cases.length} case(s)</Subtitle> </Header> <ContentSection> <Preformatted>{JSON.stringify(content, null, 2)}</Preformatted> From ebe7fc2e5a28c4b74d90b56b835d6f10b67611af Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 5 Feb 2026 12:07:59 +0530 Subject: [PATCH 179/247] Move EvalsetViewer and EvalCaseViewer components --- workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx | 2 +- .../src/views/{ => EvalsetViewer}/EvalCaseViewer.tsx | 6 +++--- .../src/views/{ => EvalsetViewer}/EvalsetViewer.tsx | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename workspaces/ballerina/ballerina-visualizer/src/views/{ => EvalsetViewer}/EvalCaseViewer.tsx (96%) rename workspaces/ballerina/ballerina-visualizer/src/views/{ => EvalsetViewer}/EvalsetViewer.tsx (100%) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 51643e0dbb0..ccc6d23e01a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -85,7 +85,7 @@ import { SamplesView } from "./views/BI/SamplesView"; import { ReviewMode } from "./views/ReviewMode"; import AddConnectionPopup from "./views/BI/Connection/AddConnectionPopup"; import EditConnectionPopup from "./views/BI/Connection/EditConnectionPopup"; -import { EvalsetViewer } from "./views/EvalsetViewer"; +import { EvalsetViewer } from "./views/EvalsetViewer/EvalsetViewer"; const globalStyles = css` *, diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx similarity index 96% rename from workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx rename to workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx index 5a6fdd42b02..91d5031e69a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalCaseViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx @@ -19,15 +19,15 @@ import React from "react"; import styled from "@emotion/styled"; import { EvalCase, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; -import { MessageContainer, MessageBubble, ProfilePic, preprocessLatex } from "./AgentChatPanel/Components/ChatInterface"; -import { ToolCallsTimeline } from "./AgentChatPanel/Components/ToolCallsTimeline"; +import { MessageContainer, MessageBubble, ProfilePic, preprocessLatex } from "../AgentChatPanel/Components/ChatInterface"; +import { ToolCallsTimeline } from "../AgentChatPanel/Components/ToolCallsTimeline"; import { Icon } from "@wso2/ui-toolkit"; import ReactMarkdown from "react-markdown"; import remarkMath from 'remark-math'; import remarkGfm from 'remark-gfm'; import rehypeKatex from 'rehype-katex'; import 'katex/dist/katex.min.css'; -import { TopNavigationBar } from "../components/TopNavigationBar"; +import { TopNavigationBar } from "../../components/TopNavigationBar"; const Container = styled.div` height: 100%; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx similarity index 100% rename from workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer.tsx rename to workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx From db5446458055d545b48b3655e334ce9a634e4ea8 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 5 Feb 2026 17:30:21 +0530 Subject: [PATCH 180/247] Update EvalCaseViewer with dataset editing capabilities --- common/config/rush/pnpm-lock.yaml | 98 +++++ .../src/rpc-types/visualizer/index.ts | 3 +- .../src/rpc-types/visualizer/interfaces.ts | 12 +- .../src/rpc-types/visualizer/rpc-type.ts | 5 +- .../src/features/test-explorer/activator.ts | 23 +- .../rpc-managers/visualizer/rpc-handler.ts | 3 + .../rpc-managers/visualizer/rpc-manager.ts | 40 ++ .../src/rpc-clients/visualizer/rpc-client.ts | 6 + .../ballerina-visualizer/package.json | 4 + .../Components/ChatInterface.tsx | 4 +- .../views/EvalsetViewer/ConfirmationModal.tsx | 132 ++++++ .../src/views/EvalsetViewer/EditFooter.tsx | 167 +++++++ .../EvalsetViewer/EditableToolCallsList.tsx | 352 +++++++++++++++ .../EvalsetViewer/EditableTraceMessage.tsx | 250 +++++++++++ .../views/EvalsetViewer/EvalCaseViewer.tsx | 409 ++++++++++++++++-- .../src/views/EvalsetViewer/EvalsetViewer.tsx | 2 +- .../ToolCallsTimeline.tsx | 0 .../views/EvalsetViewer/ToolEditorModal.tsx | 361 ++++++++++++++++ .../EvalsetViewer/utils/traceAdapters.ts | 150 +++++++ .../font-wso2-vscode/src/icons/bi-drag.svg | 3 + .../font-wso2-vscode/src/icons/bi-save.svg | 3 + 21 files changed, 1973 insertions(+), 54 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx rename workspaces/ballerina/ballerina-visualizer/src/views/{AgentChatPanel/Components => EvalsetViewer}/ToolCallsTimeline.tsx (100%) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-drag.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-save.svg diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index c063c9a808f..240c0e295da 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1098,6 +1098,15 @@ importers: ../../workspaces/ballerina/ballerina-visualizer: dependencies: + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^8.0.0 + version: 8.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.2.0) '@emotion/css': specifier: 11.13.5 version: 11.13.5 @@ -1179,6 +1188,9 @@ importers: '@wso2/wso2-platform-core': specifier: workspace:* version: link:../../wso2-platform/wso2-platform-core + framer-motion: + specifier: ^11.0.0 + version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -5920,6 +5932,28 @@ packages: resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.3.1': + resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/sortable@8.0.0': + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + '@dual-bundle/import-meta-resolve@4.2.1': resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} @@ -15990,6 +16024,20 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + framer-motion@11.18.2: + resolution: {integrity: sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + framer-motion@6.5.1: resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} peerDependencies: @@ -19378,6 +19426,12 @@ packages: selenium-webdriver: '>=4.6.1' typescript: '>=4.6.2' + motion-dom@11.18.1: + resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} + + motion-utils@11.18.1: + resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + mousetrap@1.6.5: resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} @@ -28114,6 +28168,31 @@ snapshots: '@discoveryjs/json-ext@0.6.3': {} + '@dnd-kit/accessibility@3.1.1(react@18.2.0)': + dependencies: + react: 18.2.0 + tslib: 2.8.1 + + '@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@dnd-kit/accessibility': 3.1.1(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.8.1 + + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@18.2.0)': + dependencies: + react: 18.2.0 + tslib: 2.8.1 + '@dual-bundle/import-meta-resolve@4.2.1': {} '@emnapi/core@1.8.1': @@ -46393,6 +46472,16 @@ snapshots: fraction.js@4.3.7: {} + framer-motion@11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + motion-dom: 11.18.1 + motion-utils: 11.18.1 + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 1.4.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + framer-motion@6.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@motionone/dom': 10.12.0 @@ -48935,7 +49024,10 @@ snapshots: pretty-format: 25.5.0 throat: 5.0.0 transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - utf-8-validate jest-leak-detector@25.5.0: dependencies: @@ -51464,6 +51556,12 @@ snapshots: type-fest: 4.41.0 typescript: 5.8.3 + motion-dom@11.18.1: + dependencies: + motion-utils: 11.18.1 + + motion-utils@11.18.1: {} + mousetrap@1.6.5: {} move-concurrently@1.0.1: diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts index d48d8e7e00f..490c7fffeb1 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts @@ -19,7 +19,7 @@ import { HistoryEntry } from "../../history"; import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind } from "../../state-machine-types"; -import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse } from "./interfaces"; +import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse, SaveEvalCaseRequest, SaveEvalCaseResponse } from "./interfaces"; export interface VisualizerAPI { openView: (params: OpenViewRequest) => void; @@ -39,4 +39,5 @@ export interface VisualizerAPI { reviewAccepted: () => void; handleApprovalPopupClose: (params: HandleApprovalPopupCloseRequest) => void; reopenApprovalView: (params: ReopenApprovalViewRequest) => void; + saveEvalCase: (params: SaveEvalCaseRequest) => Promise<SaveEvalCaseResponse>; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts index 9ec49066897..c919e5529c2 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts @@ -17,7 +17,7 @@ */ import { CodeData } from "../../interfaces/bi"; -import { EVENT_TYPE, PopupVisualizerLocation, VisualizerLocation } from "../../state-machine-types"; +import { EVENT_TYPE, EvalSet, PopupVisualizerLocation, VisualizerLocation } from "../../state-machine-types"; export interface UpdateUndoRedoMangerRequest { filePath: string; @@ -67,3 +67,13 @@ export interface HandleApprovalPopupCloseRequest { export interface ReopenApprovalViewRequest { requestId: string; } + +export interface SaveEvalCaseRequest { + filePath: string; + updatedEvalSet: EvalSet; +} + +export interface SaveEvalCaseResponse { + success: boolean; + error?: string; +} diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts index e0ed47e17c0..f3fe914e17d 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts @@ -19,8 +19,8 @@ */ import { HistoryEntry } from "../../history"; import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ColorThemeKind } from "../../state-machine-types"; -import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse } from "./interfaces"; +import { ColorThemeKind, EvalSet } from "../../state-machine-types"; +import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse, SaveEvalCaseRequest, SaveEvalCaseResponse } from "./interfaces"; import { NotificationType, RequestType } from "vscode-messenger-common"; const _preFix = "visualizer"; @@ -42,3 +42,4 @@ export const reviewAccepted: NotificationType<void> = { method: `${_preFix}/revi export const refreshReviewMode: NotificationType<void> = { method: `${_preFix}/refreshReviewMode` }; export const handleApprovalPopupClose: NotificationType<HandleApprovalPopupCloseRequest> = { method: `${_preFix}/handleApprovalPopupClose` }; export const reopenApprovalView: NotificationType<ReopenApprovalViewRequest> = { method: `${_preFix}/reopenApprovalView` }; +export const saveEvalCase: RequestType<SaveEvalCaseRequest, SaveEvalCaseResponse> = { method: `${_preFix}/saveEvalCase` }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index 7d8b1e4e23a..1d07a37845e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -53,6 +53,27 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { } }); + // Register command to save evalset changes + const saveEvalCaseCommand = commands.registerCommand('ballerina.saveEvalCase', async (data: { filePath: string, updatedEvalSet: EvalSet }) => { + try { + const { filePath, updatedEvalSet } = data; + + // Write the updated evalset back to the file + await fs.promises.writeFile( + filePath, + JSON.stringify(updatedEvalSet, null, 2), + 'utf-8' + ); + + window.showInformationMessage('Evalset saved successfully'); + return { success: true }; + } catch (error) { + console.error('Error saving evalset:', error); + window.showErrorMessage(`Failed to save evalset: ${error}`); + return { success: false, error: String(error) }; + } + }); + testController = tests.createTestController('ballerina-integrator-tests', 'WSO2 Integrator: BI Tests'); const workspaceRoot = getWorkspaceRoot(); @@ -93,7 +114,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { discoverTestFunctionsInProject(ballerinaExtInstance, testController); // Register the test controller and file watcher with the extension context - ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand); + ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand, saveEvalCaseCommand); activateEditBiTest(); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts index b45287c51c0..932c352706e 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts @@ -37,6 +37,8 @@ import { reopenApprovalView, ReopenApprovalViewRequest, resetUndoRedoStack, + saveEvalCase, + SaveEvalCaseRequest, undo, undoRedoState, updateCurrentArtifactLocation, @@ -65,4 +67,5 @@ export function registerVisualizerRpcHandlers(messenger: Messenger) { messenger.onNotification(reviewAccepted, () => rpcManger.reviewAccepted()); messenger.onNotification(handleApprovalPopupClose, (args: HandleApprovalPopupCloseRequest) => rpcManger.handleApprovalPopupClose(args)); messenger.onNotification(reopenApprovalView, (args: ReopenApprovalViewRequest) => rpcManger.reopenApprovalView(args)); + messenger.onRequest(saveEvalCase, (args: SaveEvalCaseRequest) => rpcManger.saveEvalCase(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index 7a74f439649..69217e14511 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -28,6 +28,8 @@ import { PopupVisualizerLocation, ProjectStructureArtifactResponse, ReopenApprovalViewRequest, + SaveEvalCaseRequest, + SaveEvalCaseResponse, SHARED_COMMANDS, undo, UndoRedoStateResponse, @@ -314,4 +316,42 @@ export class VisualizerRpcManager implements VisualizerAPI { reopenApprovalView(params: ReopenApprovalViewRequest): void { approvalViewManager.reopenApprovalViewPopup(params.requestId); } + + async saveEvalCase(params: SaveEvalCaseRequest): Promise<SaveEvalCaseResponse> { + try { + const { filePath, updatedEvalSet } = params; + + // Write the updated evalset back to the file + await fs.promises.writeFile( + filePath, + JSON.stringify(updatedEvalSet, null, 2), + 'utf-8' + ); + + // Read back the file to get fresh data + const savedContent = await fs.promises.readFile(filePath, 'utf-8'); + const savedEvalSet = JSON.parse(savedContent); + + // Get the current caseId from context + const currentContext = StateMachine.context(); + const caseId = currentContext.evalsetData?.caseId; + + // Reload the view with fresh data from disk + openView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.EvalsetViewer, + evalsetData: { + filePath, + content: savedEvalSet, + caseId + } + }); + + window.showInformationMessage('Evalset saved successfully'); + return { success: true }; + } catch (error) { + console.error('Error saving evalset:', error); + window.showErrorMessage(`Failed to save evalset: ${error}`); + return { success: false, error: String(error) }; + } + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts index 8ba1710a9b2..0ae0c6730bb 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts @@ -27,6 +27,8 @@ import { OpenViewRequest, ReopenApprovalViewRequest, ProjectStructureArtifactResponse, + SaveEvalCaseRequest, + SaveEvalCaseResponse, UndoRedoStateResponse, UpdatedArtifactsResponse, VisualizerAPI, @@ -43,6 +45,7 @@ import { redo, reopenApprovalView, resetUndoRedoStack, + saveEvalCase, undo, undoRedoState, updateCurrentArtifactLocation, @@ -125,4 +128,7 @@ export class VisualizerRpcClient implements VisualizerAPI { reopenApprovalView(params: ReopenApprovalViewRequest): void { return this._messenger.sendNotification(reopenApprovalView, HOST_EXTENSION, params); } + saveEvalCase(params: SaveEvalCaseRequest): Promise<SaveEvalCaseResponse> { + return this._messenger.sendRequest(saveEvalCase, HOST_EXTENSION, params); + } } diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index 6fa94601073..d8ec149049e 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -16,6 +16,9 @@ }, "keywords": [], "dependencies": { + "@dnd-kit/core": "6.1.0", + "@dnd-kit/sortable": "8.0.0", + "@dnd-kit/utilities": "3.2.2", "@emotion/css": "11.13.5", "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", @@ -23,6 +26,7 @@ "@tanstack/query-core": "5.77.1", "@tanstack/react-query": "5.77.1", "@vscode/webview-ui-toolkit": "1.4.0", + "framer-motion": "^11.0.0", "@wso2/ballerina-core": "workspace:*", "@wso2/ballerina-graphql-design-diagram": "workspace:*", "@wso2/type-diagram": "workspace:*", diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index a281432b773..7f0d1c6b5d3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -135,8 +135,8 @@ export const ProfilePic = styled.div` export const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading?: boolean }>` position: relative; - padding: ${({ isLoading }: { isLoading?: boolean }) => (isLoading ? "10px 14px" : "0 14px")}; - max-width: min(600px, 70%); + padding: ${({ isLoading }: { isLoading?: boolean }) => (isLoading ? "10px 14px" : "6px 14px")}; + max-width: 100%; align-self: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; overflow-wrap: break-word; word-break: break-word; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx new file mode 100644 index 00000000000..48a9d64cf9c --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styled from "@emotion/styled"; +import { Icon } from "@wso2/ui-toolkit"; + +const Overlay = styled.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 3000; +`; + +const ModalContainer = styled.div` + background-color: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 6px; + width: 90%; + max-width: 500px; + padding: 20px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); +`; + +const ModalHeader = styled.div` + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; +`; + +const ModalTitle = styled.h3` + font-size: 16px; + font-weight: 600; + margin: 0; + color: var(--vscode-foreground); +`; + +const ModalMessage = styled.p` + font-size: 13px; + color: var(--vscode-descriptionForeground); + margin: 0 0 20px 0; + line-height: 1.5; +`; + +const ModalActions = styled.div` + display: flex; + gap: 12px; + justify-content: flex-end; +`; + +const Button = styled.button<{ variant?: 'primary' | 'secondary' }>` + background-color: ${(props: { variant: string; }) => + props.variant === 'primary' + ? 'var(--vscode-button-background)' + : 'var(--vscode-button-secondaryBackground)'}; + color: ${(props: { variant: string; }) => + props.variant === 'primary' + ? 'var(--vscode-button-foreground)' + : 'var(--vscode-button-secondaryForeground)'}; + border: none; + border-radius: 4px; + padding: 8px 16px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + + &:hover { + background-color: ${(props: { variant: string; }) => + props.variant === 'primary' + ? 'var(--vscode-button-hoverBackground)' + : 'var(--vscode-button-secondaryHoverBackground)'}; + } +`; + +interface ConfirmationModalProps { + title: string; + message: string; + confirmLabel?: string; + cancelLabel?: string; + onConfirm: () => void; + onCancel: () => void; +} + +export const ConfirmationModal: React.FC<ConfirmationModalProps> = ({ + title, + message, + confirmLabel = "Confirm", + cancelLabel = "Cancel", + onConfirm, + onCancel, +}) => { + return ( + <Overlay onClick={onCancel}> + <ModalContainer onClick={(e) => e.stopPropagation()}> + <ModalHeader> + <ModalTitle>{title}</ModalTitle> + </ModalHeader> + <ModalMessage>{message}</ModalMessage> + <ModalActions> + <Button variant="secondary" onClick={onCancel}> + {cancelLabel} + </Button> + <Button variant="primary" onClick={onConfirm}> + {confirmLabel} + </Button> + </ModalActions> + </ModalContainer> + </Overlay> + ); +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx new file mode 100644 index 00000000000..6cffd8e127e --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx @@ -0,0 +1,167 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styled from "@emotion/styled"; +import { Icon } from "@wso2/ui-toolkit"; + +const FooterContainer = styled.div` + position: fixed; + bottom: 0; + left: 0; + right: 0; + background-color: var(--vscode-editorWidget-background); + border-top: 1px solid var(--vscode-widget-border); + padding: 12px 20px; + display: flex; + align-items: center; + justify-content: space-between; + z-index: 100; +`; + +const UnsavedIndicator = styled.div` + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: var(--vscode-descriptionForeground); +`; + +const Dot = styled.span` + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--vscode-notificationsWarningIcon-foreground); +`; + +const Actions = styled.div` + display: flex; + gap: 12px; +`; + +const DiscardButton = styled.button` + background-color: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border: none; + border-radius: 4px; + padding: 8px 16px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + + &:hover { + background-color: var(--vscode-button-secondaryHoverBackground); + } +`; + +const SaveButton = styled.button` + background-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 4px; + padding: 8px 16px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + + &:hover { + background-color: var(--vscode-button-hoverBackground); + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +`; + +interface EditFooterProps { + hasUnsavedChanges: boolean; + isSaving?: boolean; + onSave: () => void; + onDiscard: () => void; + onRequestDiscardConfirmation?: () => void; +} + +export const EditFooter: React.FC<EditFooterProps> = ({ + hasUnsavedChanges, + isSaving = false, + onSave, + onDiscard, + onRequestDiscardConfirmation, +}) => { + const handleDiscard = () => { + if (hasUnsavedChanges && onRequestDiscardConfirmation) { + onRequestDiscardConfirmation(); + } else { + onDiscard(); + } + }; + + return ( + <FooterContainer> + <UnsavedIndicator> + {hasUnsavedChanges && ( + <> + <Dot /> + <span>Unsaved changes</span> + </> + )} + </UnsavedIndicator> + <Actions> + <DiscardButton onClick={handleDiscard} disabled={isSaving}> + <Icon + name="bi-close" + iconSx={{ + fontSize: "16px", + }} + /> + Discard + </DiscardButton> + <SaveButton onClick={onSave} disabled={isSaving}> + {isSaving ? ( + <> + <Icon + name="bi-spinner" + iconSx={{ + fontSize: "16px", + }} + /> + Saving... + </> + ) : ( + <> + <Icon + name="bi-save" + iconSx={{ + fontSize: "16px", + }} + /> + Save Case + </> + )} + </SaveButton> + </Actions> + </FooterContainer> + ); +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx new file mode 100644 index 00000000000..cddfc3b9a14 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx @@ -0,0 +1,352 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState } from 'react'; +import styled from '@emotion/styled'; +import { + DndContext, + closestCenter, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors, + DragEndEvent, +} from '@dnd-kit/core'; +import { + arrayMove, + SortableContext, + sortableKeyboardCoordinates, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable'; +import { CSS } from '@dnd-kit/utilities'; +import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; +import { Icon } from '@wso2/ui-toolkit'; +import { ConfirmationModal } from './ConfirmationModal'; + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin: 8px 0; + z-index: 2000; +`; + +const ToolCallItem = styled.div<{ isDragging?: boolean }>` + background-color: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 6px; + padding: 12px; + display: flex; + align-items: center; + gap: 12px; + opacity: ${(props: { isDragging: boolean; }) => props.isDragging ? 0.5 : 1}; + transition: opacity 0.2s; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } +`; + +const IconBadge = styled.div` + display: flex; + align-items: center; + justify-content: center; + color: var(--vscode-terminal-ansiBrightMagenta); + flex-shrink: 0; +`; + +const DragHandle = styled.div` + cursor: grab; + color: var(--vscode-descriptionForeground); + display: flex; + align-items: center; + + &:active { + cursor: grabbing; + } +`; + +const ToolInfo = styled.div` + flex: 1; + min-width: 0; +`; + +const ToolName = styled.div` + font-size: 14px; + font-weight: 600; + color: var(--vscode-foreground); + margin-bottom: 4px; +`; + +const ToolArgs = styled.div` + font-size: 12px; + color: var(--vscode-descriptionForeground); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + +const Actions = styled.div` + display: flex; + gap: 4px; +`; + +const ActionButton = styled.button` + background: none; + border: none; + padding: 4px; + cursor: pointer; + color: var(--vscode-foreground); + border-radius: 4px; + display: flex; + align-items: center; + gap: 4px; + font-size: 12px; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + } +`; + +const AddButton = styled.button` + background-color: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border: none; + border-radius: 4px; + padding: 8px 12px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + align-self: flex-start; + + &:hover { + background-color: var(--vscode-button-secondaryHoverBackground); + } +`; + +interface SortableToolCallItemProps { + toolCall: EvalFunctionCall; + onEdit: () => void; + onDelete: () => void; +} + +const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ + toolCall, + onEdit, + onDelete, +}) => { + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + isDragging, + } = useSortable({ id: toolCall.id || toolCall.name }); + + const style = { + transform: CSS.Transform.toString(transform), + transition, + }; + + const argsPreview = toolCall.arguments + ? Object.entries(toolCall.arguments) + .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) + .join(', ') + : 'No arguments'; + + return ( + <div ref={setNodeRef} style={style}> + <ToolCallItem isDragging={isDragging}> + <DragHandle {...attributes} {...listeners}> + <Icon + name="bi-drag" + iconSx={{ + fontSize: "16px", + }} + /> + </DragHandle> + <IconBadge> + <Icon + name="bi-wrench" + sx={{ + fontSize: '16px', + width: '16px', + height: '16px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + /> + </IconBadge> + <ToolInfo> + <ToolName>{toolCall.name}</ToolName> + <ToolArgs>{argsPreview}</ToolArgs> + </ToolInfo> + <Actions> + <ActionButton onClick={onEdit}> + <Icon + name="bi-edit" + iconSx={{ + fontSize: "16px", + }} + /> + </ActionButton> + <ActionButton onClick={onDelete}> + <Icon + name="bi-delete" + iconSx={{ + fontSize: "16px", + }} + /> + </ActionButton> + </Actions> + </ToolCallItem> + </div> + ); +}; + +interface EditableToolCallsListProps { + traceId: string; + toolCalls: EvalFunctionCall[]; + availableTools: EvalToolSchema[]; + onUpdate: (traceId: string, toolCalls: EvalFunctionCall[]) => void; + onEditToolCall: (traceId: string, toolCallIndex: number) => void; +} + +export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ + traceId, + toolCalls, + availableTools, + onUpdate, + onEditToolCall, +}) => { + const [deleteIndex, setDeleteIndex] = useState<number | null>(null); + + const sensors = useSensors( + useSensor(PointerSensor), + useSensor(KeyboardSensor, { + coordinateGetter: sortableKeyboardCoordinates, + }) + ); + + const handleDragEnd = (event: DragEndEvent) => { + const { active, over } = event; + + if (over && active.id !== over.id) { + const oldIndex = toolCalls.findIndex( + tc => (tc.id || tc.name) === active.id + ); + const newIndex = toolCalls.findIndex( + tc => (tc.id || tc.name) === over.id + ); + + const reorderedToolCalls = arrayMove(toolCalls, oldIndex, newIndex); + onUpdate(traceId, reorderedToolCalls); + } + }; + + const handleDeleteRequest = (index: number) => { + setDeleteIndex(index); + }; + + const handleDeleteConfirm = () => { + if (deleteIndex !== null) { + const updatedToolCalls = toolCalls.filter((_, i) => i !== deleteIndex); + onUpdate(traceId, updatedToolCalls); + setDeleteIndex(null); + } + }; + + const handleDeleteCancel = () => { + setDeleteIndex(null); + }; + + const handleAdd = () => { + onEditToolCall(traceId, -1); // -1 indicates new tool call + }; + + if (toolCalls.length === 0) { + return ( + <Container> + <AddButton onClick={handleAdd}> + <Icon + name="bi-plus" + iconSx={{ + fontSize: "16px", + }} + /> + Add Tool Execution + </AddButton> + </Container> + ); + } + + return ( + <Container> + <DndContext + sensors={sensors} + collisionDetection={closestCenter} + onDragEnd={handleDragEnd} + > + <SortableContext + items={toolCalls.map(tc => tc.id || tc.name)} + strategy={verticalListSortingStrategy} + > + {toolCalls.map((toolCall, index) => ( + <SortableToolCallItem + key={toolCall.id || `${toolCall.name}-${index}`} + toolCall={toolCall} + onEdit={() => onEditToolCall(traceId, index)} + onDelete={() => handleDeleteRequest(index)} + /> + ))} + </SortableContext> + </DndContext> + <AddButton onClick={handleAdd}> + <Icon + name="bi-plus" + iconSx={{ + fontSize: "16px", + }} + /> + Add Tool Execution + </AddButton> + {deleteIndex !== null && ( + <ConfirmationModal + title="Delete Tool Call" + message="Are you sure you want to delete this tool call? This action cannot be undone." + confirmLabel="Delete" + cancelLabel="Cancel" + onConfirm={handleDeleteConfirm} + onCancel={handleDeleteCancel} + /> + )} + </Container> + ); +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx new file mode 100644 index 00000000000..b0e37f82927 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx @@ -0,0 +1,250 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useRef, useEffect } from "react"; +import styled from "@emotion/styled"; +import { MessageBubble, preprocessLatex } from "../AgentChatPanel/Components/ChatInterface"; +import { Icon } from "@wso2/ui-toolkit"; +import ReactMarkdown from "react-markdown"; +import remarkMath from 'remark-math'; +import remarkGfm from 'remark-gfm'; +import rehypeKatex from 'rehype-katex'; + +const EditableContainer = styled.div<{ isUser: boolean }>` + display: flex; + align-items: center; + gap: 4px; + flex-direction: ${(props: { isUser: boolean; }) => props.isUser ? 'row-reverse' : 'row'}; +`; + +const EditIconButton = styled.button` + background: transparent; + color: var(--vscode-foreground); + border: none; + border-radius: 4px; + padding: 6px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + opacity: 0.7; + flex-shrink: 0; + + &:hover { + opacity: 1; + background-color: var(--vscode-toolbar-hoverBackground); + } +`; + +const EditableContent = styled.div` + min-height: 20px; + outline: none; + font-family: var(--vscode-font-family); + font-size: inherit; + line-height: inherit; + white-space: pre-wrap; + word-wrap: break-word; + + &:empty:before { + content: attr(data-placeholder); + color: var(--vscode-input-placeholderForeground); + } +`; + +const EditActions = styled.div<{ isUser: boolean }>` + display: flex; + gap: 8px; + margin-top: 12px; + justify-content: flex-end; +`; + +const EditingMessageBubble = styled(MessageBubble)` + display: flex; + flex-direction: column; + flex-shrink: 1; + min-width: 200px; +`; + +const SaveButton = styled.button` + background-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 4px; + padding: 6px 12px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + white-space: nowrap; + + &:hover { + background-color: var(--vscode-button-hoverBackground); + } +`; + +const CancelButton = styled.button` + background-color: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border: none; + border-radius: 4px; + padding: 6px 12px; + cursor: pointer; + font-size: 13px; + white-space: nowrap; + + &:hover { + background-color: var(--vscode-button-secondaryHoverBackground); + } +`; + +interface EditableTraceMessageProps { + traceId: string; + isUser: boolean; + content: string | any; + isEditMode: boolean; + onSave: (traceId: string, content: string) => void; +} + +export const EditableTraceMessage: React.FC<EditableTraceMessageProps> = ({ + traceId, + isUser, + content, + isEditMode, + onSave, +}) => { + const [isEditing, setIsEditing] = useState(false); + const [editValue, setEditValue] = useState(""); + const editableRef = useRef<HTMLDivElement>(null); + + const contentString = typeof content === 'string' ? content : JSON.stringify(content, null, 2); + + useEffect(() => { + if (isEditing && editableRef.current) { + // Set initial content + editableRef.current.textContent = editValue; + editableRef.current.focus(); + // Move cursor to end + const range = document.createRange(); + const selection = window.getSelection(); + range.selectNodeContents(editableRef.current); + range.collapse(false); + selection?.removeAllRanges(); + selection?.addRange(range); + } + }, [isEditing]); + + // Reset editing state when edit mode is exited + useEffect(() => { + if (!isEditMode && isEditing) { + setIsEditing(false); + setEditValue(""); + } + }, [isEditMode, isEditing]); + + const handleStartEdit = () => { + setEditValue(contentString); + setIsEditing(true); + }; + + const handleSave = () => { + const content = editableRef.current?.textContent || ""; + onSave(traceId, content); + setIsEditing(false); + }; + + const handleCancel = () => { + setIsEditing(false); + setEditValue(""); + }; + + const handleInput = () => { + if (editableRef.current) { + setEditValue(editableRef.current.textContent || ""); + } + }; + + const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => { + if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) { + e.preventDefault(); + handleSave(); + } else if (e.key === 'Escape') { + e.preventDefault(); + handleCancel(); + } + }; + + const handlePaste = (e: React.ClipboardEvent<HTMLDivElement>) => { + e.preventDefault(); + const text = e.clipboardData.getData('text/plain'); + const selection = window.getSelection(); + if (selection && selection.rangeCount > 0) { + const range = selection.getRangeAt(0); + range.deleteContents(); + range.insertNode(document.createTextNode(text)); + range.collapse(false); + selection.removeAllRanges(); + selection.addRange(range); + } + + if (editableRef.current) { + setEditValue(editableRef.current.textContent || ""); + } + }; + + if (isEditing) { + return ( + <EditingMessageBubble isUser={isUser}> + <EditableContent + ref={editableRef} + contentEditable + onInput={handleInput} + onKeyDown={handleKeyDown} + onPaste={handlePaste} + data-placeholder="Enter message..." + suppressContentEditableWarning + /> + <EditActions isUser={isUser}> + <CancelButton onClick={handleCancel}>Cancel</CancelButton> + <SaveButton onClick={handleSave}>Save</SaveButton> + </EditActions> + </EditingMessageBubble> + ); + } + + return ( + <EditableContainer isUser={isUser}> + <MessageBubble isUser={isUser}> + <ReactMarkdown + remarkPlugins={[remarkMath, remarkGfm]} + rehypePlugins={[rehypeKatex]} + > + {preprocessLatex(contentString)} + </ReactMarkdown> + </MessageBubble> + {isEditMode && ( + <EditIconButton onClick={handleStartEdit} title="Edit message"> + <Icon + name="bi-edit" + iconSx={{ + fontSize: "16px", + }} + /> + </EditIconButton> + )} + </EditableContainer> + ); +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx index 91d5031e69a..de9c233a1f4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx @@ -16,24 +16,45 @@ * under the License. */ -import React from "react"; +import React, { useState } from "react"; import styled from "@emotion/styled"; import { EvalCase, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; -import { MessageContainer, MessageBubble, ProfilePic, preprocessLatex } from "../AgentChatPanel/Components/ChatInterface"; -import { ToolCallsTimeline } from "../AgentChatPanel/Components/ToolCallsTimeline"; +import { MessageContainer, ProfilePic } from "../AgentChatPanel/Components/ChatInterface"; +import { ToolCallsTimeline } from "./ToolCallsTimeline"; import { Icon } from "@wso2/ui-toolkit"; -import ReactMarkdown from "react-markdown"; -import remarkMath from 'remark-math'; -import remarkGfm from 'remark-gfm'; -import rehypeKatex from 'rehype-katex'; -import 'katex/dist/katex.min.css'; import { TopNavigationBar } from "../../components/TopNavigationBar"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { EditableTraceMessage } from "./EditableTraceMessage"; +import { EditFooter } from "./EditFooter"; +import { EditableToolCallsList } from "./EditableToolCallsList"; +import { ToolEditorModal } from "./ToolEditorModal"; +import { ConfirmationModal } from "./ConfirmationModal"; +import { + cloneEvalCase, + updateTraceUserMessage, + updateTraceAgentOutput, + updateToolCallsInTrace, + getContentType, + deserializeContent, + generateToolCallId, + createNewTrace +} from "./utils/traceAdapters"; -const Container = styled.div` +const PageWrapper = styled.div` height: 100%; width: 100%; + display: flex; + flex-direction: column; +`; + +const Container = styled.div` + flex: 1; + width: 100%; background-color: var(--vscode-editor-background); color: var(--vscode-editor-foreground); + display: flex; + flex-direction: column; + overflow: hidden; *, *::before, *::after { box-sizing: content-box; @@ -43,8 +64,35 @@ const Container = styled.div` const Header = styled.div` top: 0; padding: 12px 20px; + position: sticky; background-color: var(--vscode-editorWidget-background); z-index: 2; + display: flex; + align-items: flex-start; + justify-content: space-between; +`; + +const HeaderLeft = styled.div` + flex: 1; +`; + +const EditButton = styled.button` + background-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 4px; + padding: 6px 12px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + margin-top: 4px; + + &:hover { + background-color: var(--vscode-button-hoverBackground); + } `; const Title = styled.h2` @@ -60,36 +108,83 @@ const Subtitle = styled.p` margin: 0; `; -export const Messages = styled.div` +export const Messages = styled.div<{ hasEditFooter?: boolean }>` display: flex; flex-direction: column; + flex: 1; overflow-y: auto; gap: 8px; position: relative; z-index: 1; - padding: 8px 20px; - height: 100%; + padding: 16px 20px; + padding-bottom: ${(props: { hasEditFooter: boolean; }) => props.hasEditFooter ? '80px' : '48px'}; @media (min-width: 1000px) { - padding: 8px 10%; + padding-left: 15%; + padding-right: 15%; } @media (min-width: 1600px) { - padding: 8px 15%; + padding-left: 20%; + padding-right: 20%; } @media (min-width: 2000px) { - padding: 8px 20%; + padding-left: 25%; + padding-right: 25%; + } +`; + +const AddTurnButton = styled.button` + background-color: transparent; + color: var(--vscode-textLink-foreground); + border: 1px dashed var(--vscode-textLink-foreground); + border-radius: 4px; + padding: 12px 16px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: 16px 0; + transition: all 0.2s ease; + + &:hover { + background-color: var(--vscode-textLink-foreground); + color: var(--vscode-editor-background); + opacity: 0.9; + } + + &:active { + transform: scale(0.98); } `; +const TraceWrapper = styled.div` + position: relative; +`; + interface EvalCaseViewerProps { projectPath: string; + filePath: string; evalSet: EvalSet; evalCase: EvalCase; } -export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, evalSet, evalCase }) => { +export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, filePath, evalSet, evalCase }) => { + const { rpcClient } = useRpcContext(); + const [isEditMode, setIsEditMode] = useState(false); + const [originalEvalCase, setOriginalEvalCase] = useState<EvalCase>(evalCase); + const [workingEvalCase, setWorkingEvalCase] = useState<EvalCase>(evalCase); + const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); + const [isSaving, setIsSaving] = useState(false); + const [selectedToolCall, setSelectedToolCall] = useState<{ + traceId: string; + toolCallIndex: number; + } | null>(null); + const [showDiscardConfirmation, setShowDiscardConfirmation] = useState(false); const extractToolCalls = (trace: EvalsetTrace): EvalFunctionCall[] => { const toolCalls: EvalFunctionCall[] = []; @@ -99,32 +194,194 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, eva return toolCalls; }; + const handleEnterEditMode = () => { + setOriginalEvalCase(cloneEvalCase(evalCase)); + setWorkingEvalCase(cloneEvalCase(evalCase)); + setHasUnsavedChanges(false); + setIsEditMode(true); + }; + + const handleExitEditMode = () => { + setIsEditMode(false); + setHasUnsavedChanges(false); + }; + + const handleSaveUserMessage = (traceId: string, content: string) => { + setWorkingEvalCase(prev => { + const updatedTraces = prev.traces.map(trace => { + if (trace.id === traceId) { + const originalType = getContentType(trace.userMessage.content); + const deserializedContent = deserializeContent(content, originalType); + return updateTraceUserMessage(trace, deserializedContent); + } + return trace; + }); + return { ...prev, traces: updatedTraces }; + }); + setHasUnsavedChanges(true); + }; + + const handleSaveAgentOutput = (traceId: string, content: string) => { + setWorkingEvalCase(prev => { + const updatedTraces = prev.traces.map(trace => { + if (trace.id === traceId) { + const originalType = getContentType(trace.output?.content); + const deserializedContent = deserializeContent(content, originalType); + return updateTraceAgentOutput(trace, deserializedContent); + } + return trace; + }); + return { ...prev, traces: updatedTraces }; + }); + setHasUnsavedChanges(true); + }; + + const handleSave = async () => { + setIsSaving(true); + try { + // Update the evalSet with the modified case + const updatedEvalSet: EvalSet = { + ...evalSet, + cases: evalSet.cases.map(c => + c.id === workingEvalCase.id ? workingEvalCase : c + ) + }; + + // Call the RPC to save + const response = await rpcClient.getVisualizerRpcClient().saveEvalCase({ + filePath, + updatedEvalSet + }); + + if (response.success) { + setHasUnsavedChanges(false); + handleExitEditMode(); + } else { + console.error('Failed to save:', response.error); + } + } catch (error) { + console.error('Error saving evalCase:', error); + } finally { + setIsSaving(false); + } + }; + + const handleDiscard = () => { + setWorkingEvalCase(cloneEvalCase(originalEvalCase)); + setHasUnsavedChanges(false); + setSelectedToolCall(null); + setIsEditMode(false); + setShowDiscardConfirmation(false); + }; + + const handleRequestDiscardConfirmation = () => { + setShowDiscardConfirmation(true); + }; + + const handleCancelDiscard = () => { + setShowDiscardConfirmation(false); + }; + + const handleUpdateToolCalls = (traceId: string, toolCalls: EvalFunctionCall[]) => { + setWorkingEvalCase(prev => { + const updatedTraces = prev.traces.map(trace => { + if (trace.id === traceId) { + return updateToolCallsInTrace(trace, toolCalls); + } + return trace; + }); + return { ...prev, traces: updatedTraces }; + }); + setHasUnsavedChanges(true); + }; + + const handleEditToolCall = (traceId: string, toolCallIndex: number) => { + setSelectedToolCall({ traceId, toolCallIndex }); + }; + + const handleSaveToolCall = (updates: Partial<EvalFunctionCall>) => { + if (!selectedToolCall) return; + + const { traceId, toolCallIndex } = selectedToolCall; + const trace = workingEvalCase.traces.find(t => t.id === traceId); + if (!trace) return; + + const currentToolCalls = extractToolCalls(trace); + + let updatedToolCalls: EvalFunctionCall[]; + if (toolCallIndex === -1) { + // Adding new tool call + const newToolCall: EvalFunctionCall = { + id: generateToolCallId(), + name: updates.name || trace.tools[0]?.name || '', + arguments: updates.arguments, + }; + updatedToolCalls = [...currentToolCalls, newToolCall]; + } else { + // Editing existing tool call + updatedToolCalls = currentToolCalls.map((tc, idx) => + idx === toolCallIndex ? { ...tc, ...updates } : tc + ); + } + + handleUpdateToolCalls(traceId, updatedToolCalls); + setSelectedToolCall(null); + }; + + const handleAddTurn = () => { + setWorkingEvalCase(prev => ({ + ...prev, + traces: [...prev.traces, createNewTrace()] + })); + setHasUnsavedChanges(true); + }; + + const displayCase = isEditMode ? workingEvalCase : evalCase; + return ( - <> + <PageWrapper> <TopNavigationBar projectPath={projectPath} /> <Container> <Header> - <Title>{evalSet.name}</Title> - <Subtitle>{evalCase.name} • {evalCase.traces.length} trace(s)</Subtitle> + <HeaderLeft> + <Title>{evalSet.name}</Title> + <Subtitle>{displayCase.name}</Subtitle> + </HeaderLeft> + {!isEditMode && ( + <EditButton onClick={handleEnterEditMode}> + <Icon + name="bi-edit" + iconSx={{ + fontSize: "14px", + }} + /> + Edit + </EditButton> + )} </Header> - <Messages> - {evalCase.traces.map((trace, traceIdx) => { + <Messages hasEditFooter={isEditMode}> + {displayCase.traces.map((trace, traceIdx) => { const toolCalls = extractToolCalls(trace); return ( - <React.Fragment key={traceIdx}> + <TraceWrapper key={traceIdx}> + {isEditMode && ( + <Icon + name="bi-x" + iconSx={{ + fontSize: "16px", + }} + /> + )} {/* Render user's initial message */} <MessageContainer isUser={true}> - <MessageBubble isUser={true}> - <ReactMarkdown - remarkPlugins={[remarkMath, remarkGfm]} - rehypePlugins={[rehypeKatex]} - > - {preprocessLatex(typeof trace.userMessage.content === 'string' - ? trace.userMessage.content - : JSON.stringify(trace.userMessage.content))} - </ReactMarkdown> - </MessageBubble> + <EditableTraceMessage + traceId={trace.id} + isUser={true} + content={trace.userMessage.content} + isEditMode={isEditMode} + onSave={handleSaveUserMessage} + /> <ProfilePic> <Icon name="bi-user" @@ -150,24 +407,84 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, eva /> </ProfilePic> <div style={{ display: 'flex', flexDirection: 'column', gap: '0' }}> - <ToolCallsTimeline toolCalls={toolCalls} /> - <MessageBubble isUser={false}> - <ReactMarkdown - remarkPlugins={[remarkMath, remarkGfm]} - rehypePlugins={[rehypeKatex]} - > - {preprocessLatex(typeof trace.output?.content === 'string' - ? trace.output?.content - : JSON.stringify(trace.output?.content))} - </ReactMarkdown> - </MessageBubble> + {isEditMode ? ( + <EditableToolCallsList + traceId={trace.id} + toolCalls={toolCalls} + availableTools={trace.tools} + onUpdate={handleUpdateToolCalls} + onEditToolCall={handleEditToolCall} + /> + ) : ( + <ToolCallsTimeline toolCalls={toolCalls} /> + )} + <EditableTraceMessage + traceId={trace.id} + isUser={false} + content={trace.output?.content || ''} + isEditMode={isEditMode} + onSave={handleSaveAgentOutput} + /> </div> </MessageContainer> - </React.Fragment> + </TraceWrapper> ); })} + {isEditMode && ( + <AddTurnButton onClick={handleAddTurn}> + <Icon + name="bi-plus" + iconSx={{ + fontSize: "16px", + }} + /> + Add Message Turn + </AddTurnButton> + )} </Messages> - </Container > - </> + {isEditMode && ( + <EditFooter + hasUnsavedChanges={hasUnsavedChanges} + isSaving={isSaving} + onSave={handleSave} + onDiscard={handleDiscard} + onRequestDiscardConfirmation={handleRequestDiscardConfirmation} + /> + )} + </Container> + {selectedToolCall && (() => { + const trace = workingEvalCase.traces.find( + t => t.id === selectedToolCall.traceId + ); + if (!trace) return null; + + const toolCalls = extractToolCalls(trace); + const toolCall = + selectedToolCall.toolCallIndex === -1 + ? { name: trace.tools[0]?.name || '', arguments: {} } + : toolCalls[selectedToolCall.toolCallIndex]; + + if (!toolCall) return null; + + return ( + <ToolEditorModal + toolCall={toolCall as EvalFunctionCall} + availableTools={trace.tools} + onClose={() => setSelectedToolCall(null)} + onSave={handleSaveToolCall} + /> + ); + })()} + {showDiscardConfirmation && ( + <ConfirmationModal + title="Discard Changes" + message="Are you sure you want to discard all changes? This action cannot be undone." + confirmLabel="Discard" + cancelLabel="Cancel" + onConfirm={handleDiscard} + onCancel={handleCancelDiscard} + /> + )} + </PageWrapper> ); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx index e23e11706c1..a9397de2f8d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx @@ -98,7 +98,7 @@ export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, fileP ); } - return <EvalCaseViewer projectPath={projectPath} evalSet={content} evalCase={evalCase} />; + return <EvalCaseViewer projectPath={projectPath} filePath={filePath} evalSet={content} evalCase={evalCase} />; } return ( <Container> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ToolCallsTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx similarity index 100% rename from workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ToolCallsTimeline.tsx rename to workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx new file mode 100644 index 00000000000..8e0de5d7cf3 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx @@ -0,0 +1,361 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState } from 'react'; +import styled from '@emotion/styled'; +import { motion } from 'framer-motion'; +import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; +import { Icon } from '@wso2/ui-toolkit'; + +const Overlay = styled.div` + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.4); + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + padding: 16px; +`; + +const ModalContainer = styled(motion.div)` + background-color: var(--vscode-editorWidget-background); + border-radius: 3px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); + width: 100%; + max-width: 600px; + overflow: hidden; + border: 1px solid var(--vscode-widget-border); +`; + +const ModalHeader = styled.div` + padding: 16px 20px; + border-bottom: 1px solid var(--vscode-widget-border); + display: flex; + align-items: center; + justify-content: space-between; + background-color: var(--vscode-editorWidget-background); +`; + +const HeaderTitle = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const Title = styled.h2` + font-size: 14px; + font-weight: 600; + margin: 0; + color: var(--vscode-foreground); +`; + +const CloseButton = styled.button` + background: none; + border: none; + padding: 4px; + cursor: pointer; + color: var(--vscode-foreground); + opacity: 0.7; + border-radius: 3px; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + opacity: 1; + } +`; + +const ModalBody = styled.div` + padding: 20px; + max-height: 60vh; + overflow-y: auto; +`; + +const FormSection = styled.div` + margin-bottom: 20px; + + &:last-child { + margin-bottom: 0; + } +`; + +const Label = styled.label` + display: block; + font-size: 13px; + font-weight: 600; + color: var(--vscode-descriptionForeground); + margin-bottom: 8px; +`; + +const Select = styled.select` + width: 100%; + background-color: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 3px; + padding: 8px 12px; + font-size: 13px; + outline: none; + + &:focus { + border-color: var(--vscode-focusBorder); + } +`; + +const ArgumentsContainer = styled.div` + display: flex; + flex-direction: column; + gap: 12px; +`; + +const ArgumentField = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const FieldLabel = styled.label` + font-size: 13px; + color: var(--vscode-foreground); + min-width: 100px; +`; + +const Input = styled.input` + flex: 1; + background-color: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 3px; + padding: 8px 12px; + font-size: 13px; + outline: none; + + &:focus { + border-color: var(--vscode-focusBorder); + } +`; + +const Textarea = styled.textarea` + flex: 1; + background-color: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 3px; + padding: 8px 12px; + font-size: 13px; + min-height: 80px; + resize: vertical; + outline: none; + + &:focus { + border-color: var(--vscode-focusBorder); + } +`; + +const ModalFooter = styled.div` + padding: 16px 20px; + background-color: var(--vscode-editorWidget-background); + border-top: 1px solid var(--vscode-widget-border); + display: flex; + align-items: center; + justify-content: flex-end; + gap: 12px; +`; + +const CancelButton = styled.button` + background: none; + border: none; + padding: 8px 16px; + font-size: 13px; + color: var(--vscode-foreground); + cursor: pointer; + opacity: 0.8; + + &:hover { + opacity: 1; + } +`; + +const SaveButton = styled.button` + background-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 3px; + padding: 8px 16px; + font-size: 13px; + cursor: pointer; + + &:hover { + background-color: var(--vscode-button-hoverBackground); + } +`; + +interface ToolEditorModalProps { + toolCall: EvalFunctionCall; + availableTools: EvalToolSchema[]; + onClose: () => void; + onSave: (updates: Partial<EvalFunctionCall>) => void; +} + +export const ToolEditorModal: React.FC<ToolEditorModalProps> = ({ + toolCall, + availableTools, + onClose, + onSave, +}) => { + const [name, setName] = useState(toolCall.name); + const [argumentsValue, setArgumentsValue] = useState<Record<string, any>>( + toolCall.arguments || {} + ); + + const selectedTool = availableTools.find(t => t.name === name); + const parametersSchema = selectedTool?.parametersSchema; + + const handleArgumentChange = (fieldName: string, value: any) => { + setArgumentsValue(prev => ({ ...prev, [fieldName]: value })); + }; + + const renderField = ( + fieldName: string, + fieldSchema: any, + value: any, + onChange: (val: any) => void + ) => { + const fieldType = fieldSchema?.type || 'string'; + + // Handle complex objects as JSON textarea + if (fieldType === 'object' || fieldType === 'array') { + return ( + <ArgumentField key={fieldName}> + <FieldLabel>{fieldName}:</FieldLabel> + <Textarea + value={typeof value === 'string' ? value : JSON.stringify(value, null, 2)} + onChange={(e) => { + try { + const parsed = JSON.parse(e.target.value); + onChange(parsed); + } catch { + onChange(e.target.value); + } + }} + placeholder={`Enter ${fieldType} as JSON`} + /> + </ArgumentField> + ); + } + + const inputType = + fieldType === 'integer' || fieldType === 'number' ? 'number' : 'text'; + + return ( + <ArgumentField key={fieldName}> + <FieldLabel>{fieldName}:</FieldLabel> + <Input + type={inputType} + value={value ?? ''} + onChange={(e) => { + const val = + inputType === 'number' + ? e.target.value === '' + ? '' + : Number(e.target.value) + : e.target.value; + onChange(val); + }} + /> + </ArgumentField> + ); + }; + + const handleSave = () => { + onSave({ + name, + arguments: Object.keys(argumentsValue).length > 0 ? argumentsValue : undefined, + }); + }; + + return ( + <Overlay onClick={onClose}> + <ModalContainer + onClick={(e: { stopPropagation: () => any; }) => e.stopPropagation()} + > + <ModalHeader> + <HeaderTitle> + <Icon + name="bi-wrench" + iconSx={{ + fontSize: "16px", + color: "var(--vscode-terminal-ansiBrightMagenta)", + }} + /> + <Title>Edit Tool Call</Title> + </HeaderTitle> + <CloseButton onClick={onClose}> + <Icon + name="bi-close" + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }} + iconSx={{ + fontSize: "16px", + display: 'flex' + }} + /> + </CloseButton> + </ModalHeader> + + <ModalBody> + <FormSection> + <Label>Tool Name</Label> + <Select value={name} onChange={(e) => setName(e.target.value)}> + {availableTools.map((tool) => ( + <option key={tool.name} value={tool.name}> + {tool.name} + </option> + ))} + </Select> + </FormSection> + + {parametersSchema && parametersSchema.properties && ( + <FormSection> + <Label>Input Arguments</Label> + <ArgumentsContainer> + {Object.entries(parametersSchema.properties).map( + ([fieldName, fieldSchema]) => + renderField( + fieldName, + fieldSchema, + argumentsValue[fieldName], + (val) => handleArgumentChange(fieldName, val) + ) + )} + </ArgumentsContainer> + </FormSection> + )} + </ModalBody> + + <ModalFooter> + <CancelButton onClick={onClose}>Cancel</CancelButton> + <SaveButton onClick={handleSave}>Save Changes</SaveButton> + </ModalFooter> + </ModalContainer> + </Overlay> + ); +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts new file mode 100644 index 00000000000..6a257487f0e --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -0,0 +1,150 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { EvalCase, EvalsetTrace, EvalFunctionCall } from "@wso2/ballerina-core"; + +/** + * Deep clone an EvalCase for editing + */ +export const cloneEvalCase = (evalCase: EvalCase): EvalCase => { + return JSON.parse(JSON.stringify(evalCase)); +}; + +/** + * Update the user message content in a trace + */ +export const updateTraceUserMessage = (trace: EvalsetTrace, content: string): EvalsetTrace => { + return { + ...trace, + userMessage: { + ...trace.userMessage, + content, + }, + }; +}; + +/** + * Update the agent output content in a trace + */ +export const updateTraceAgentOutput = (trace: EvalsetTrace, content: string): EvalsetTrace => { + return { + ...trace, + output: { + ...trace.output, + content, + }, + }; +}; + +/** + * Get tool calls from a trace output + */ +export const getToolCallsFromTrace = (trace: EvalsetTrace): EvalFunctionCall[] => { + if (trace.output?.toolCalls) { + return trace.output.toolCalls as EvalFunctionCall[]; + } + return []; +}; + +/** + * Update tool calls in a trace + */ +export const updateToolCallsInTrace = ( + trace: EvalsetTrace, + toolCalls: EvalFunctionCall[] +): EvalsetTrace => { + return { + ...trace, + output: { + ...trace.output, + toolCalls: toolCalls.length > 0 ? toolCalls : undefined, + }, + }; +}; + +/** + * Generate a unique ID for a tool call + */ +export const generateToolCallId = (): string => { + return `tool_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; +}; + +/** + * Serialize content for editing (convert object to string if needed) + */ +export const serializeContent = (content: string | any): string => { + if (typeof content === 'string') { + return content; + } + return JSON.stringify(content, null, 2); +}; + +/** + * Deserialize content after editing (parse JSON if original was object) + */ +export const deserializeContent = ( + content: string, + originalType: 'string' | 'object' +): string | any => { + if (originalType === 'string') { + return content; + } + try { + return JSON.parse(content); + } catch (error) { + // If parsing fails, return as string + console.error('Failed to parse content as JSON:', error); + return content; + } +}; + +/** + * Get the original type of content + */ +export const getContentType = (content: string | any): 'string' | 'object' => { + return typeof content === 'string' ? 'string' : 'object'; +}; + +/** + * Generate a unique ID for a trace + */ +export const generateTraceId = (): string => { + return `trace_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`; +}; + +/** + * Create a new empty trace + */ +export const createNewTrace = (): EvalsetTrace => { + const now = new Date().toISOString(); + return { + id: generateTraceId(), + userMessage: { + role: 'user', + content: 'User Query', + }, + output: { + role: 'assistant', + content: 'Agent Response', + }, + tools: [], + iterations: [], + startTime: now, + endTime: now, + }; +}; diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-drag.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-drag.svg new file mode 100644 index 00000000000..0dc3285e6d5 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-drag.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M9 20q-.825 0-1.412-.587T7 18t.588-1.412T9 16t1.413.588T11 18t-.587 1.413T9 20m6 0q-.825 0-1.412-.587T13 18t.588-1.412T15 16t1.413.588T17 18t-.587 1.413T15 20m-6-6q-.825 0-1.412-.587T7 12t.588-1.412T9 10t1.413.588T11 12t-.587 1.413T9 14m6 0q-.825 0-1.412-.587T13 12t.588-1.412T15 10t1.413.588T17 12t-.587 1.413T15 14M9 8q-.825 0-1.412-.587T7 6t.588-1.412T9 4t1.413.588T11 6t-.587 1.413T9 8m6 0q-.825 0-1.412-.587T13 6t.588-1.412T15 4t1.413.588T17 6t-.587 1.413T15 8" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-save.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-save.svg new file mode 100644 index 00000000000..b84de3737f6 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-save.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> + <path fill="currentColor" d="M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h11.175q.4 0 .763.15t.637.425l2.85 2.85q.275.275.425.638t.15.762V19q0 .825-.587 1.413T19 21zM19 7.85L16.15 5H5v14h14zM12 18q1.25 0 2.125-.875T15 15t-.875-2.125T12 12t-2.125.875T9 15t.875 2.125T12 18m-5-8h7q.425 0 .713-.288T15 9V7q0-.425-.288-.712T14 6H7q-.425 0-.712.288T6 7v2q0 .425.288.713T7 10M5 7.85V19V5z" stroke-width="0.5" stroke="currentColor" /> +</svg> \ No newline at end of file From 926efd7d62cecf31903d4c08665c2dd224c09a9e Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 6 Feb 2026 09:40:32 +0530 Subject: [PATCH 181/247] Refactor EvalsetViewer components: remove EditFooter, update styles, and enhance button interactions --- .../views/EvalsetViewer/ConfirmationModal.tsx | 1 - .../src/views/EvalsetViewer/EditFooter.tsx | 167 ------------- .../EvalsetViewer/EditableToolCallsList.tsx | 21 +- .../EvalsetViewer/EditableTraceMessage.tsx | 8 +- .../views/EvalsetViewer/EvalCaseViewer.tsx | 225 ++++++++++++++---- .../views/EvalsetViewer/ToolEditorModal.tsx | 2 +- 6 files changed, 192 insertions(+), 232 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx index 48a9d64cf9c..ce0c11bfcb0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx @@ -18,7 +18,6 @@ import React from "react"; import styled from "@emotion/styled"; -import { Icon } from "@wso2/ui-toolkit"; const Overlay = styled.div` position: fixed; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx deleted file mode 100644 index 6cffd8e127e..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditFooter.tsx +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from "react"; -import styled from "@emotion/styled"; -import { Icon } from "@wso2/ui-toolkit"; - -const FooterContainer = styled.div` - position: fixed; - bottom: 0; - left: 0; - right: 0; - background-color: var(--vscode-editorWidget-background); - border-top: 1px solid var(--vscode-widget-border); - padding: 12px 20px; - display: flex; - align-items: center; - justify-content: space-between; - z-index: 100; -`; - -const UnsavedIndicator = styled.div` - display: flex; - align-items: center; - gap: 8px; - font-size: 13px; - color: var(--vscode-descriptionForeground); -`; - -const Dot = styled.span` - width: 8px; - height: 8px; - border-radius: 50%; - background-color: var(--vscode-notificationsWarningIcon-foreground); -`; - -const Actions = styled.div` - display: flex; - gap: 12px; -`; - -const DiscardButton = styled.button` - background-color: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; - border-radius: 4px; - padding: 8px 16px; - cursor: pointer; - font-size: 13px; - font-weight: 500; - display: flex; - align-items: center; - gap: 6px; - - &:hover { - background-color: var(--vscode-button-secondaryHoverBackground); - } -`; - -const SaveButton = styled.button` - background-color: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border: none; - border-radius: 4px; - padding: 8px 16px; - cursor: pointer; - font-size: 13px; - font-weight: 500; - display: flex; - align-items: center; - gap: 6px; - - &:hover { - background-color: var(--vscode-button-hoverBackground); - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } -`; - -interface EditFooterProps { - hasUnsavedChanges: boolean; - isSaving?: boolean; - onSave: () => void; - onDiscard: () => void; - onRequestDiscardConfirmation?: () => void; -} - -export const EditFooter: React.FC<EditFooterProps> = ({ - hasUnsavedChanges, - isSaving = false, - onSave, - onDiscard, - onRequestDiscardConfirmation, -}) => { - const handleDiscard = () => { - if (hasUnsavedChanges && onRequestDiscardConfirmation) { - onRequestDiscardConfirmation(); - } else { - onDiscard(); - } - }; - - return ( - <FooterContainer> - <UnsavedIndicator> - {hasUnsavedChanges && ( - <> - <Dot /> - <span>Unsaved changes</span> - </> - )} - </UnsavedIndicator> - <Actions> - <DiscardButton onClick={handleDiscard} disabled={isSaving}> - <Icon - name="bi-close" - iconSx={{ - fontSize: "16px", - }} - /> - Discard - </DiscardButton> - <SaveButton onClick={onSave} disabled={isSaving}> - {isSaving ? ( - <> - <Icon - name="bi-spinner" - iconSx={{ - fontSize: "16px", - }} - /> - Saving... - </> - ) : ( - <> - <Icon - name="bi-save" - iconSx={{ - fontSize: "16px", - }} - /> - Save Case - </> - )} - </SaveButton> - </Actions> - </FooterContainer> - ); -}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx index cddfc3b9a14..fde1bee7a0d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx @@ -48,7 +48,7 @@ const Container = styled.div` `; const ToolCallItem = styled.div<{ isDragging?: boolean }>` - background-color: var(--vscode-editorWidget-background); + background-color: transparent; border: 1px solid var(--vscode-widget-border); border-radius: 6px; padding: 12px; @@ -125,21 +125,28 @@ const ActionButton = styled.button` `; const AddButton = styled.button` - background-color: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; + background-color: var(--vscode-editorWidget-background); + color: var(--vscode-descriptionForeground); + border: 1px solid var(--vscode-panel-border); border-radius: 4px; - padding: 8px 12px; + padding: 4px 12px; cursor: pointer; - font-size: 13px; + font-size: 12px; font-weight: 500; display: flex; align-items: center; gap: 6px; align-self: flex-start; + transition: all 0.15s ease; &:hover { - background-color: var(--vscode-button-secondaryHoverBackground); + background-color: var(--vscode-list-hoverBackground); + border-color: var(--vscode-focusBorder); + color: var(--vscode-foreground); + } + + &:active { + transform: scale(0.98); } `; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx index b0e37f82927..577396ade6c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx @@ -68,8 +68,8 @@ const EditableContent = styled.div` const EditActions = styled.div<{ isUser: boolean }>` display: flex; - gap: 8px; - margin-top: 12px; + gap: 4px; + margin-top: 16px; justify-content: flex-end; `; @@ -85,7 +85,7 @@ const SaveButton = styled.button` color: var(--vscode-button-foreground); border: none; border-radius: 4px; - padding: 6px 12px; + padding: 4px 8px; cursor: pointer; font-size: 13px; font-weight: 500; @@ -101,7 +101,7 @@ const CancelButton = styled.button` color: var(--vscode-button-secondaryForeground); border: none; border-radius: 4px; - padding: 6px 12px; + padding: 4px 8px; cursor: pointer; font-size: 13px; white-space: nowrap; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx index de9c233a1f4..f197ac95717 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx @@ -25,7 +25,6 @@ import { Icon } from "@wso2/ui-toolkit"; import { TopNavigationBar } from "../../components/TopNavigationBar"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { EditableTraceMessage } from "./EditableTraceMessage"; -import { EditFooter } from "./EditFooter"; import { EditableToolCallsList } from "./EditableToolCallsList"; import { ToolEditorModal } from "./ToolEditorModal"; import { ConfirmationModal } from "./ConfirmationModal"; @@ -63,9 +62,11 @@ const Container = styled.div` const Header = styled.div` top: 0; - padding: 12px 20px; + padding: 16px 24px; position: sticky; background-color: var(--vscode-editorWidget-background); + border-top: 1px solid var(--vscode-panel-border); + border-bottom: 1px solid var(--vscode-panel-border); z-index: 2; display: flex; align-items: flex-start; @@ -76,48 +77,125 @@ const HeaderLeft = styled.div` flex: 1; `; +const HeaderRight = styled.div` + display: flex; + align-items: center; + gap: 12px; +`; + +const UnsavedIndicator = styled.div` + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: var(--vscode-descriptionForeground); + margin-right: 8px; +`; + +const Dot = styled.span` + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--vscode-notificationsWarningIcon-foreground); +`; + const EditButton = styled.button` background-color: var(--vscode-button-background); color: var(--vscode-button-foreground); border: none; border-radius: 4px; - padding: 6px 12px; + padding: 8px 12px; cursor: pointer; font-size: 13px; - font-weight: 500; display: flex; align-items: center; gap: 6px; margin-top: 4px; + transition: all 0.2s ease; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); &:hover { background-color: var(--vscode-button-hoverBackground); + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + } + + &:active { + transform: translateY(0); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } +`; + +const DiscardButton = styled.button` + background-color: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border: none; + border-radius: 4px; + padding: 8px 16px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + + &:hover { + background-color: var(--vscode-button-secondaryHoverBackground); + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +`; + +const SaveButton = styled.button` + background-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 4px; + padding: 8px 16px; + cursor: pointer; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + + &:hover { + background-color: var(--vscode-button-hoverBackground); + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; } `; const Title = styled.h2` - font-size: 1.2em; + font-size: 1.3em; font-weight: 600; - margin: 0 0 4px 0; + margin: 0 0 6px 0; color: var(--vscode-foreground); + letter-spacing: -0.01em; `; const Subtitle = styled.p` font-size: 14px; + font-weight: 500; color: var(--vscode-descriptionForeground); margin: 0; `; -export const Messages = styled.div<{ hasEditFooter?: boolean }>` +export const Messages = styled.div` display: flex; flex-direction: column; flex: 1; overflow-y: auto; - gap: 8px; + gap: 16px; position: relative; z-index: 1; - padding: 16px 20px; - padding-bottom: ${(props: { hasEditFooter: boolean; }) => props.hasEditFooter ? '80px' : '48px'}; + padding: 24px 20px 48px; @media (min-width: 1000px) { padding-left: 15%; @@ -137,28 +215,31 @@ export const Messages = styled.div<{ hasEditFooter?: boolean }>` const AddTurnButton = styled.button` background-color: transparent; - color: var(--vscode-textLink-foreground); - border: 1px dashed var(--vscode-textLink-foreground); - border-radius: 4px; - padding: 12px 16px; + color: var(--vscode-button-background); + border: 2px dashed var(--vscode-button-background); + border-radius: 6px; + padding: 14px 20px; cursor: pointer; font-size: 13px; - font-weight: 500; + font-weight: 600; display: flex; align-items: center; justify-content: center; gap: 8px; - margin: 16px 0; + margin: 16px auto; transition: all 0.2s ease; + width: 200px; &:hover { - background-color: var(--vscode-textLink-foreground); - color: var(--vscode-editor-background); + background-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border-style: solid; opacity: 0.9; + transform: translateY(-1px); } &:active { - transform: scale(0.98); + transform: translateY(0) scale(0.98); } `; @@ -166,6 +247,12 @@ const TraceWrapper = styled.div` position: relative; `; +const StyledMessageContainer = styled(MessageContainer)` + &:last-child { + margin-bottom: 0; + } +`; + interface EvalCaseViewerProps { projectPath: string; filePath: string; @@ -347,34 +434,77 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil <Title>{evalSet.name}</Title> <Subtitle>{displayCase.name}</Subtitle> </HeaderLeft> - {!isEditMode && ( - <EditButton onClick={handleEnterEditMode}> - <Icon - name="bi-edit" - iconSx={{ - fontSize: "14px", - }} - /> - Edit - </EditButton> - )} + <HeaderRight> + {isEditMode ? ( + <> + {hasUnsavedChanges && ( + <UnsavedIndicator> + <Dot /> + <span>Unsaved changes</span> + </UnsavedIndicator> + )} + <DiscardButton + onClick={handleRequestDiscardConfirmation} + disabled={isSaving} + > + <Icon + name="bi-close" + iconSx={{ + fontSize: "16px", + }} + /> + Discard + </DiscardButton> + <SaveButton onClick={handleSave} disabled={isSaving}> + {isSaving ? ( + <> + <Icon + name="bi-spinner" + iconSx={{ + fontSize: "16px", + }} + /> + Saving... + </> + ) : ( + <> + <Icon + name="bi-save" + iconSx={{ + fontSize: "16px", + }} + /> + Save Case + </> + )} + </SaveButton> + </> + ) : ( + <EditButton onClick={handleEnterEditMode}> + <Icon + name="bi-edit" + sx={{ + width: "16px", + height: "16px", + fontSize: "16px" + }} + iconSx={{ + fontSize: "16px", + }} + /> + Edit + </EditButton> + )} + </HeaderRight> </Header> - <Messages hasEditFooter={isEditMode}> + <Messages> {displayCase.traces.map((trace, traceIdx) => { const toolCalls = extractToolCalls(trace); return ( <TraceWrapper key={traceIdx}> - {isEditMode && ( - <Icon - name="bi-x" - iconSx={{ - fontSize: "16px", - }} - /> - )} {/* Render user's initial message */} - <MessageContainer isUser={true}> + <StyledMessageContainer isUser={true}> <EditableTraceMessage traceId={trace.id} isUser={true} @@ -392,10 +522,10 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil }} /> </ProfilePic> - </MessageContainer> + </StyledMessageContainer> {/* Render agent response */} - <MessageContainer isUser={false}> + <StyledMessageContainer isUser={false}> <ProfilePic> <Icon name="bi-ai-agent" @@ -426,7 +556,7 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil onSave={handleSaveAgentOutput} /> </div> - </MessageContainer> + </StyledMessageContainer> </TraceWrapper> ); })} @@ -442,15 +572,6 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil </AddTurnButton> )} </Messages> - {isEditMode && ( - <EditFooter - hasUnsavedChanges={hasUnsavedChanges} - isSaving={isSaving} - onSave={handleSave} - onDiscard={handleDiscard} - onRequestDiscardConfirmation={handleRequestDiscardConfirmation} - /> - )} </Container> {selectedToolCall && (() => { const trace = workingEvalCase.traces.find( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx index 8e0de5d7cf3..b28fbf7225b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx @@ -35,7 +35,7 @@ const Overlay = styled.div` const ModalContainer = styled(motion.div)` background-color: var(--vscode-editorWidget-background); - border-radius: 3px; + border-radius: 6px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); width: 100%; max-width: 600px; From ae2494fae00e77d308c873727d7acdf0d32e0854 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 7 Feb 2026 19:56:37 +0530 Subject: [PATCH 182/247] Rename cases to threads in evalsets --- .../src/rpc-types/visualizer/index.ts | 3 +- .../src/rpc-types/visualizer/interfaces.ts | 4 +- .../src/rpc-types/visualizer/rpc-type.ts | 4 +- .../ballerina-core/src/state-machine-types.ts | 6 +- .../src/features/test-explorer/activator.ts | 8 +-- .../test-explorer/evalset-tree-view.ts | 64 +++++++++---------- .../features/tracing/trace-details-webview.ts | 18 +++--- .../rpc-managers/visualizer/rpc-handler.ts | 6 +- .../rpc-managers/visualizer/rpc-manager.ts | 12 ++-- .../src/rpc-clients/visualizer/rpc-client.ts | 10 +-- .../ballerina-visualizer/src/MainPanel.tsx | 2 +- .../Components/ChatInterface.tsx | 3 +- ...valCaseViewer.tsx => EvalThreadViewer.tsx} | 42 ++++++------ .../src/views/EvalsetViewer/EvalsetViewer.tsx | 18 +++--- .../EvalsetViewer/utils/traceAdapters.ts | 8 +-- 15 files changed, 105 insertions(+), 103 deletions(-) rename workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/{EvalCaseViewer.tsx => EvalThreadViewer.tsx} (94%) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts index 490c7fffeb1..e145edb5e4c 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts @@ -19,7 +19,7 @@ import { HistoryEntry } from "../../history"; import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind } from "../../state-machine-types"; -import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse, SaveEvalCaseRequest, SaveEvalCaseResponse } from "./interfaces"; +import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse, SaveEvalThreadRequest, SaveEvalThreadResponse } from "./interfaces"; export interface VisualizerAPI { openView: (params: OpenViewRequest) => void; @@ -40,4 +40,5 @@ export interface VisualizerAPI { handleApprovalPopupClose: (params: HandleApprovalPopupCloseRequest) => void; reopenApprovalView: (params: ReopenApprovalViewRequest) => void; saveEvalCase: (params: SaveEvalCaseRequest) => Promise<SaveEvalCaseResponse>; + saveEvalThread: (params: SaveEvalThreadRequest) => Promise<SaveEvalThreadResponse>; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts index c919e5529c2..8f5a2e52bba 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/interfaces.ts @@ -68,12 +68,12 @@ export interface ReopenApprovalViewRequest { requestId: string; } -export interface SaveEvalCaseRequest { +export interface SaveEvalThreadRequest { filePath: string; updatedEvalSet: EvalSet; } -export interface SaveEvalCaseResponse { +export interface SaveEvalThreadResponse { success: boolean; error?: string; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts index f3fe914e17d..696f97d3f5a 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts @@ -20,7 +20,7 @@ import { HistoryEntry } from "../../history"; import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind, EvalSet } from "../../state-machine-types"; -import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse, SaveEvalCaseRequest, SaveEvalCaseResponse } from "./interfaces"; +import { AddToUndoStackRequest, HandleApprovalPopupCloseRequest, JoinProjectPathRequest, JoinProjectPathResponse, OpenViewRequest, ReopenApprovalViewRequest, UndoRedoStateResponse, SaveEvalThreadRequest, SaveEvalThreadResponse } from "./interfaces"; import { NotificationType, RequestType } from "vscode-messenger-common"; const _preFix = "visualizer"; @@ -42,4 +42,4 @@ export const reviewAccepted: NotificationType<void> = { method: `${_preFix}/revi export const refreshReviewMode: NotificationType<void> = { method: `${_preFix}/refreshReviewMode` }; export const handleApprovalPopupClose: NotificationType<HandleApprovalPopupCloseRequest> = { method: `${_preFix}/handleApprovalPopupClose` }; export const reopenApprovalView: NotificationType<ReopenApprovalViewRequest> = { method: `${_preFix}/reopenApprovalView` }; -export const saveEvalCase: RequestType<SaveEvalCaseRequest, SaveEvalCaseResponse> = { method: `${_preFix}/saveEvalCase` }; +export const saveEvalThread: RequestType<SaveEvalThreadRequest, SaveEvalThreadResponse> = { method: `${_preFix}/saveEvalThread` }; diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 54d5a5909f3..a5ffda550b7 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -263,7 +263,7 @@ export interface EvalsetTrace { endTime: string; } -export interface EvalCase { +export interface EvalThread { id: string; name: string; traces: EvalsetTrace[]; @@ -274,14 +274,14 @@ export interface EvalSet { id: string; name?: string; description?: string; - cases: EvalCase[]; + threads: EvalThread[]; created_on: string; } export interface EvalsetData { filePath: string; content: EvalSet; - caseId?: string; + threadId?: string; } export interface PopupVisualizerLocation extends VisualizerLocation { diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index 1d07a37845e..afa67b858a2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -34,7 +34,7 @@ export let testController: TestController; export async function activate(ballerinaExtInstance: BallerinaExtension) { // Register command to open evalset viewer - const openEvalsetCommand = commands.registerCommand('ballerina.openEvalsetViewer', async (uri: Uri, caseId?: string) => { + const openEvalsetCommand = commands.registerCommand('ballerina.openEvalsetViewer', async (uri: Uri, threadId?: string) => { try { const content = await fs.promises.readFile(uri.fsPath, 'utf-8'); const evalsetData = JSON.parse(content) as EvalSet; @@ -44,7 +44,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { evalsetData: { filePath: uri.fsPath, content: evalsetData, - caseId: caseId + threadId: threadId } }); } catch (error) { @@ -54,7 +54,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { }); // Register command to save evalset changes - const saveEvalCaseCommand = commands.registerCommand('ballerina.saveEvalCase', async (data: { filePath: string, updatedEvalSet: EvalSet }) => { + const saveEvalThreadCommand = commands.registerCommand('ballerina.saveEvalThread', async (data: { filePath: string, updatedEvalSet: EvalSet }) => { try { const { filePath, updatedEvalSet } = data; @@ -114,7 +114,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { discoverTestFunctionsInProject(ballerinaExtInstance, testController); // Register the test controller and file watcher with the extension context - ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand, saveEvalCaseCommand); + ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand, saveEvalThreadCommand); activateEditBiTest(); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts index bcdcade51f2..796cc0c7342 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts @@ -20,8 +20,8 @@ import * as vscode from 'vscode'; import * as fs from 'fs'; import * as path from 'path'; -// Interface matching the EvalCase object structure -interface EvalCaseJson { +// Interface matching the EvalThread object structure +interface EvalThreadJson { id: string; name: string; traces: any[]; @@ -32,7 +32,7 @@ interface EvalSetJson { id: string; name?: string; description?: string; - cases: EvalCaseJson[]; // Array of Case objects + threads: EvalThreadJson[]; // Array of Thread objects created_on?: number; } @@ -43,25 +43,25 @@ class EvalsetFileNode { constructor( public readonly uri: vscode.Uri, public readonly label: string, - public readonly caseCount: number, + public readonly threadCount: number, public readonly description?: string ) { } } /** - * Represents a single case within an evalset + * Represents a single thread within an evalset */ -class EvalsetCaseNode { +class EvalsetThreadNode { constructor( public readonly parentUri: vscode.Uri, - public readonly caseIndex: number, + public readonly threadIndex: number, public readonly label: string, - public readonly caseId: string, + public readonly threadId: string, public readonly traceCount: number ) { } } -type EvalsetNode = EvalsetFileNode | EvalsetCaseNode; +type EvalsetNode = EvalsetFileNode | EvalsetThreadNode; /** * TreeDataProvider for displaying evalsets @@ -104,8 +104,8 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN element.label, vscode.TreeItemCollapsibleState.Collapsed ); - item.tooltip = element.description || `EvalSet with ${element.caseCount} cases`; - item.description = `${element.caseCount} case${element.caseCount !== 1 ? 's' : ''}`; + item.tooltip = element.description || `EvalSet with ${element.threadCount} threads`; + item.description = `${element.threadCount} thread${element.threadCount !== 1 ? 's' : ''}`; item.iconPath = new vscode.ThemeIcon('library'); item.contextValue = 'evalsetFile'; item.resourceUri = element.uri; @@ -115,16 +115,16 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN element.label, vscode.TreeItemCollapsibleState.None ); - item.tooltip = `Case ID: ${element.caseId} (${element.traceCount} traces)`; + item.tooltip = `Thread ID: ${element.threadId} (${element.traceCount} traces)`; item.iconPath = new vscode.ThemeIcon('file-text'); - item.contextValue = 'evalsetCase'; + item.contextValue = 'evalsetThread'; item.resourceUri = element.parentUri; item.command = { command: 'ballerina.openEvalsetViewer', - title: 'Open Evalset Case', - arguments: [element.parentUri, element.caseId] + title: 'Open Evalset Thread', + arguments: [element.parentUri, element.threadId] }; return item; } @@ -135,8 +135,8 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN // Root level - return all evalset files return this.getEvalsetFiles(); } else if (element instanceof EvalsetFileNode) { - // Return cases for this evalset file - return this.getCasesForFile(element.uri); + // Return threads for this evalset file + return this.getThreadsForFile(element.uri); } return []; @@ -160,15 +160,15 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN const evalsetData: EvalSetJson = JSON.parse(content); // Validation for new format - if (!evalsetData.cases || !Array.isArray(evalsetData.cases)) { + if (!evalsetData.threads || !Array.isArray(evalsetData.threads)) { continue; } - const caseCount = evalsetData.cases.length; + const threadCount = evalsetData.threads.length; const label = evalsetData.name || path.basename(uri.fsPath, '.evalset.json'); const description = evalsetData.description || ''; - nodes.push(new EvalsetFileNode(uri, label, caseCount, description)); + nodes.push(new EvalsetFileNode(uri, label, threadCount, description)); } catch (error) { console.error(`Failed to parse evalset file ${uri.fsPath}:`, error); } @@ -178,38 +178,38 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN } /** - * Get cases for a specific evalset file + * Get threads for a specific evalset file */ - private async getCasesForFile(uri: vscode.Uri): Promise<EvalsetCaseNode[]> { + private async getThreadsForFile(uri: vscode.Uri): Promise<EvalsetThreadNode[]> { try { const content = await fs.promises.readFile(uri.fsPath, 'utf-8'); const evalsetData: EvalSetJson = JSON.parse(content); - const nodes: EvalsetCaseNode[] = []; + const nodes: EvalsetThreadNode[] = []; - if (!evalsetData.cases || !Array.isArray(evalsetData.cases)) { + if (!evalsetData.threads || !Array.isArray(evalsetData.threads)) { return []; } - evalsetData.cases.forEach((caseObj: EvalCaseJson, index: number) => { + evalsetData.threads.forEach((threadObj: EvalThreadJson, index: number) => { // Ensure traces is an array - const traceCount = Array.isArray(caseObj.traces) ? caseObj.traces.length : 0; + const traceCount = Array.isArray(threadObj.traces) ? threadObj.traces.length : 0; - // Use the name defined in the case object, fallback to generated name - const label = caseObj.name || `Case ${index + 1}`; - const caseId = caseObj.id || `case-${index + 1}`; + // Use the name defined in the thread object, fallback to generated name + const label = threadObj.name || `Thread ${index + 1}`; + const threadId = threadObj.id || `thread-${index + 1}`; - nodes.push(new EvalsetCaseNode( + nodes.push(new EvalsetThreadNode( uri, index, label, - caseId, + threadId, traceCount )); }); return nodes; } catch (error) { - console.error(`Failed to get cases for ${uri.fsPath}:`, error); + console.error(`Failed to get threads for ${uri.fsPath}:`, error); return []; } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 4d55d8eef3f..ceeebf0f0a1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -25,7 +25,7 @@ import { extension } from '../../BalExtensionContext'; import { Trace, TraceServer } from './trace-server'; import { getLibraryWebViewContent, getComposerWebViewOptions, WebViewOptions } from '../../utils/webview-utils'; import { convertTraceToEvalset, convertTracesToEvalset } from './trace-converter'; -import { EvalCase, EvalSet } from '@wso2/ballerina-core'; +import { EvalThread, EvalSet } from '@wso2/ballerina-core'; // TraceData interface matching the trace-visualizer component interface TraceData { @@ -402,9 +402,9 @@ export class TraceDetailsWebview { if (fileUri) { const evalsetTrace = convertTraceToEvalset(traceData); - const evalCase: EvalCase = { + const evalThread: EvalThread = { id: crypto.randomUUID(), - name: `Case - ${traceData.traceId.substring(0, 8)}`, + name: `Thread - ${traceData.traceId.substring(0, 8)}`, traces: [evalsetTrace], created_on: new Date().toISOString() }; @@ -413,7 +413,7 @@ export class TraceDetailsWebview { id: crypto.randomUUID(), name: `Trace ${traceData.traceId}`, description: "Single trace export", - cases: [evalCase], + threads: [evalThread], created_on: new Date().toISOString() }; @@ -426,7 +426,7 @@ export class TraceDetailsWebview { ); if (action === 'View') { - await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalCase.id); + await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalThread.id); } } } catch (error) { @@ -466,9 +466,9 @@ export class TraceDetailsWebview { if (fileUri) { const evalsetTraces = convertTracesToEvalset(sessionTraces); - const evalCase: EvalCase = { + const evalThread: EvalThread = { id: crypto.randomUUID(), - name: `Case - ${sessionId.substring(0, 8)}`, + name: `Thread - ${sessionId.substring(0, 8)}`, traces: evalsetTraces, created_on: new Date().toISOString() }; @@ -477,7 +477,7 @@ export class TraceDetailsWebview { id: crypto.randomUUID(), name: `Session ${sessionId}`, description: "Session export", - cases: [evalCase], + threads: [evalThread], created_on: new Date().toISOString() }; @@ -490,7 +490,7 @@ export class TraceDetailsWebview { ); if (action === 'View') { - await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalCase.id); + await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalThread.id); } } } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts index 932c352706e..447ddcb2d94 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts @@ -37,8 +37,8 @@ import { reopenApprovalView, ReopenApprovalViewRequest, resetUndoRedoStack, - saveEvalCase, - SaveEvalCaseRequest, + saveEvalThread, + SaveEvalThreadRequest, undo, undoRedoState, updateCurrentArtifactLocation, @@ -67,5 +67,5 @@ export function registerVisualizerRpcHandlers(messenger: Messenger) { messenger.onNotification(reviewAccepted, () => rpcManger.reviewAccepted()); messenger.onNotification(handleApprovalPopupClose, (args: HandleApprovalPopupCloseRequest) => rpcManger.handleApprovalPopupClose(args)); messenger.onNotification(reopenApprovalView, (args: ReopenApprovalViewRequest) => rpcManger.reopenApprovalView(args)); - messenger.onRequest(saveEvalCase, (args: SaveEvalCaseRequest) => rpcManger.saveEvalCase(args)); + messenger.onRequest(saveEvalThread, (args: SaveEvalThreadRequest) => rpcManger.saveEvalThread(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index 69217e14511..49650a6a389 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -28,8 +28,8 @@ import { PopupVisualizerLocation, ProjectStructureArtifactResponse, ReopenApprovalViewRequest, - SaveEvalCaseRequest, - SaveEvalCaseResponse, + SaveEvalThreadRequest, + SaveEvalThreadResponse, SHARED_COMMANDS, undo, UndoRedoStateResponse, @@ -317,7 +317,7 @@ export class VisualizerRpcManager implements VisualizerAPI { approvalViewManager.reopenApprovalViewPopup(params.requestId); } - async saveEvalCase(params: SaveEvalCaseRequest): Promise<SaveEvalCaseResponse> { + async saveEvalThread(params: SaveEvalThreadRequest): Promise<SaveEvalThreadResponse> { try { const { filePath, updatedEvalSet } = params; @@ -332,9 +332,9 @@ export class VisualizerRpcManager implements VisualizerAPI { const savedContent = await fs.promises.readFile(filePath, 'utf-8'); const savedEvalSet = JSON.parse(savedContent); - // Get the current caseId from context + // Get the current threadId from context const currentContext = StateMachine.context(); - const caseId = currentContext.evalsetData?.caseId; + const threadId = currentContext.evalsetData?.threadId; // Reload the view with fresh data from disk openView(EVENT_TYPE.OPEN_VIEW, { @@ -342,7 +342,7 @@ export class VisualizerRpcManager implements VisualizerAPI { evalsetData: { filePath, content: savedEvalSet, - caseId + threadId } }); diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts index 0ae0c6730bb..ae7fb14ca49 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts @@ -27,8 +27,8 @@ import { OpenViewRequest, ReopenApprovalViewRequest, ProjectStructureArtifactResponse, - SaveEvalCaseRequest, - SaveEvalCaseResponse, + SaveEvalThreadRequest, + SaveEvalThreadResponse, UndoRedoStateResponse, UpdatedArtifactsResponse, VisualizerAPI, @@ -45,7 +45,7 @@ import { redo, reopenApprovalView, resetUndoRedoStack, - saveEvalCase, + saveEvalThread, undo, undoRedoState, updateCurrentArtifactLocation, @@ -128,7 +128,7 @@ export class VisualizerRpcClient implements VisualizerAPI { reopenApprovalView(params: ReopenApprovalViewRequest): void { return this._messenger.sendNotification(reopenApprovalView, HOST_EXTENSION, params); } - saveEvalCase(params: SaveEvalCaseRequest): Promise<SaveEvalCaseResponse> { - return this._messenger.sendRequest(saveEvalCase, HOST_EXTENSION, params); + saveEvalThread(params: SaveEvalThreadRequest): Promise<SaveEvalThreadResponse> { + return this._messenger.sendRequest(saveEvalThread, HOST_EXTENSION, params); } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index ccc6d23e01a..2fa5c485658 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -638,7 +638,7 @@ const MainPanel = () => { projectPath={value.projectPath} filePath={value?.evalsetData.filePath} content={value?.evalsetData.content} - caseId={value?.evalsetData?.caseId} + threadId={value?.evalsetData?.threadId} /> ); break; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 7f0d1c6b5d3..954015dcb15 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -122,6 +122,7 @@ export const MessageContainer = styled.div<{ isUser: boolean }>` align-items: flex-end; justify-content: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; gap: 6px; + margin-bottom: 4px; `; export const ProfilePic = styled.div` @@ -135,7 +136,7 @@ export const ProfilePic = styled.div` export const MessageBubble = styled.div<{ isUser: boolean; isError?: boolean; isLoading?: boolean }>` position: relative; - padding: ${({ isLoading }: { isLoading?: boolean }) => (isLoading ? "10px 14px" : "6px 14px")}; + padding: ${({ isLoading }: { isLoading?: boolean }) => (isLoading ? "10px 14px" : "2px 14px")}; max-width: 100%; align-self: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; overflow-wrap: break-word; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx similarity index 94% rename from workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx rename to workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index f197ac95717..24e7c57d183 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalCaseViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -18,7 +18,7 @@ import React, { useState } from "react"; import styled from "@emotion/styled"; -import { EvalCase, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; +import { EvalThread, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; import { MessageContainer, ProfilePic } from "../AgentChatPanel/Components/ChatInterface"; import { ToolCallsTimeline } from "./ToolCallsTimeline"; import { Icon } from "@wso2/ui-toolkit"; @@ -29,7 +29,7 @@ import { EditableToolCallsList } from "./EditableToolCallsList"; import { ToolEditorModal } from "./ToolEditorModal"; import { ConfirmationModal } from "./ConfirmationModal"; import { - cloneEvalCase, + cloneEvalThread, updateTraceUserMessage, updateTraceAgentOutput, updateToolCallsInTrace, @@ -253,18 +253,18 @@ const StyledMessageContainer = styled(MessageContainer)` } `; -interface EvalCaseViewerProps { +interface EvalThreadViewerProps { projectPath: string; filePath: string; evalSet: EvalSet; - evalCase: EvalCase; + evalThread: EvalThread; } -export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, filePath, evalSet, evalCase }) => { +export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, filePath, evalSet, evalThread }) => { const { rpcClient } = useRpcContext(); const [isEditMode, setIsEditMode] = useState(false); - const [originalEvalCase, setOriginalEvalCase] = useState<EvalCase>(evalCase); - const [workingEvalCase, setWorkingEvalCase] = useState<EvalCase>(evalCase); + const [originalEvalThread, setOriginalEvalThread] = useState<EvalThread>(evalThread); + const [workingEvalThread, setWorkingEvalThread] = useState<EvalThread>(evalThread); const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); const [isSaving, setIsSaving] = useState(false); const [selectedToolCall, setSelectedToolCall] = useState<{ @@ -282,8 +282,8 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil }; const handleEnterEditMode = () => { - setOriginalEvalCase(cloneEvalCase(evalCase)); - setWorkingEvalCase(cloneEvalCase(evalCase)); + setOriginalEvalThread(cloneEvalThread(evalThread)); + setWorkingEvalThread(cloneEvalThread(evalThread)); setHasUnsavedChanges(false); setIsEditMode(true); }; @@ -294,7 +294,7 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil }; const handleSaveUserMessage = (traceId: string, content: string) => { - setWorkingEvalCase(prev => { + setWorkingEvalThread(prev => { const updatedTraces = prev.traces.map(trace => { if (trace.id === traceId) { const originalType = getContentType(trace.userMessage.content); @@ -309,7 +309,7 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil }; const handleSaveAgentOutput = (traceId: string, content: string) => { - setWorkingEvalCase(prev => { + setWorkingEvalThread(prev => { const updatedTraces = prev.traces.map(trace => { if (trace.id === traceId) { const originalType = getContentType(trace.output?.content); @@ -329,13 +329,13 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil // Update the evalSet with the modified case const updatedEvalSet: EvalSet = { ...evalSet, - cases: evalSet.cases.map(c => - c.id === workingEvalCase.id ? workingEvalCase : c + threads: evalSet.threads.map(c => + c.id === workingEvalThread.id ? workingEvalThread : c ) }; // Call the RPC to save - const response = await rpcClient.getVisualizerRpcClient().saveEvalCase({ + const response = await rpcClient.getVisualizerRpcClient().saveEvalThread({ filePath, updatedEvalSet }); @@ -347,14 +347,14 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil console.error('Failed to save:', response.error); } } catch (error) { - console.error('Error saving evalCase:', error); + console.error('Error saving evalThread:', error); } finally { setIsSaving(false); } }; const handleDiscard = () => { - setWorkingEvalCase(cloneEvalCase(originalEvalCase)); + setWorkingEvalThread(cloneEvalThread(originalEvalThread)); setHasUnsavedChanges(false); setSelectedToolCall(null); setIsEditMode(false); @@ -370,7 +370,7 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil }; const handleUpdateToolCalls = (traceId: string, toolCalls: EvalFunctionCall[]) => { - setWorkingEvalCase(prev => { + setWorkingEvalThread(prev => { const updatedTraces = prev.traces.map(trace => { if (trace.id === traceId) { return updateToolCallsInTrace(trace, toolCalls); @@ -390,7 +390,7 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil if (!selectedToolCall) return; const { traceId, toolCallIndex } = selectedToolCall; - const trace = workingEvalCase.traces.find(t => t.id === traceId); + const trace = workingEvalThread.traces.find(t => t.id === traceId); if (!trace) return; const currentToolCalls = extractToolCalls(trace); @@ -416,14 +416,14 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil }; const handleAddTurn = () => { - setWorkingEvalCase(prev => ({ + setWorkingEvalThread(prev => ({ ...prev, traces: [...prev.traces, createNewTrace()] })); setHasUnsavedChanges(true); }; - const displayCase = isEditMode ? workingEvalCase : evalCase; + const displayCase = isEditMode ? workingEvalThread : evalThread; return ( <PageWrapper> @@ -574,7 +574,7 @@ export const EvalCaseViewer: React.FC<EvalCaseViewerProps> = ({ projectPath, fil </Messages> </Container> {selectedToolCall && (() => { - const trace = workingEvalCase.traces.find( + const trace = workingEvalThread.traces.find( t => t.id === selectedToolCall.traceId ); if (!trace) return null; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx index a9397de2f8d..cf90e4e3a32 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx @@ -19,7 +19,7 @@ import React from "react"; import styled from "@emotion/styled"; import { EvalSet } from "@wso2/ballerina-core"; -import { EvalCaseViewer } from "./EvalCaseViewer"; +import { EvalThreadViewer } from "./EvalThreadViewer"; const Container = styled.div` padding: 20px; @@ -77,14 +77,14 @@ interface EvalsetViewerProps { projectPath: string; filePath: string; content: EvalSet; - caseId?: string; + threadId?: string; } -export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, filePath, content, caseId }) => { - if (caseId) { - const evalCase = content.cases.find(c => c.id === caseId); +export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, filePath, content, threadId }) => { + if (threadId) { + const evalThread = content.threads.find(c => c.id === threadId); - if (!evalCase) { + if (!evalThread) { return ( <Container> <Header> @@ -92,19 +92,19 @@ export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, fileP <Subtitle>Case not found</Subtitle> </Header> <ErrorMessage> - Case with ID "{caseId}" not found in this evalset. + Case with ID "{threadId}" not found in this evalset. </ErrorMessage> </Container> ); } - return <EvalCaseViewer projectPath={projectPath} filePath={filePath} evalSet={content} evalCase={evalCase} />; + return <EvalThreadViewer projectPath={projectPath} filePath={filePath} evalSet={content} evalThread={evalThread} />; } return ( <Container> <Header> <Title>{filePath}</Title> - <Subtitle>{content.cases.length} case(s)</Subtitle> + <Subtitle>{content.threads.length} case(s)</Subtitle> </Header> <ContentSection> <Preformatted>{JSON.stringify(content, null, 2)}</Preformatted> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index 6a257487f0e..a4cb9da6d81 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -16,13 +16,13 @@ * under the License. */ -import { EvalCase, EvalsetTrace, EvalFunctionCall } from "@wso2/ballerina-core"; +import { EvalThread, EvalsetTrace, EvalFunctionCall } from "@wso2/ballerina-core"; /** - * Deep clone an EvalCase for editing + * Deep clone an EvalThread for editing */ -export const cloneEvalCase = (evalCase: EvalCase): EvalCase => { - return JSON.parse(JSON.stringify(evalCase)); +export const cloneEvalThread = (evalThread: EvalThread): EvalThread => { + return JSON.parse(JSON.stringify(evalThread)); }; /** From 87f5cac37412bc1b95113f1972a77edf10650190 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 7 Feb 2026 23:54:55 +0530 Subject: [PATCH 183/247] Update evalset tree icon --- .../src/features/test-explorer/evalset-tree-view.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts index 796cc0c7342..c29cf8cca82 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts @@ -106,7 +106,7 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN ); item.tooltip = element.description || `EvalSet with ${element.threadCount} threads`; item.description = `${element.threadCount} thread${element.threadCount !== 1 ? 's' : ''}`; - item.iconPath = new vscode.ThemeIcon('library'); + item.iconPath = new vscode.ThemeIcon('collection'); item.contextValue = 'evalsetFile'; item.resourceUri = element.uri; return item; From 1928cfc46b528faf8ef293dd28962e594e580ec7 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 8 Feb 2026 00:15:05 +0530 Subject: [PATCH 184/247] Fix test flow diagram and edit form not opening from test explorer --- .../src/features/test-explorer/commands.ts | 39 ++++++++++++++----- .../ballerina-visualizer/src/MainPanel.tsx | 1 + 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index dd21af2f309..fc97feb883a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -44,15 +44,21 @@ export function activateEditBiTest() { return; } - const fileName = entry.id.split(":")[1]; + const fileName = entry.id.split(":")[2]; const fileUri = path.resolve(projectPath, `tests`, fileName); if (fileUri) { const range = entry.range; - openView(EVENT_TYPE.OPEN_VIEW, { documentUri: fileUri, - position: { startLine: range.start.line, startColumn: range.start.character, - endLine: range.end.line, endColumn: range.end.character } }); + openView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.BIDiagram, + documentUri: fileUri, + identifier: entry.label, + position: { + startLine: range.start.line, startColumn: range.start.character, + endLine: range.end.line, endColumn: range.end.character + } + }); history.clear(); - } + } }); commands.registerCommand(BI_COMMANDS.BI_ADD_TEST_FUNCTION, async (entry?: TestItem) => { @@ -65,8 +71,10 @@ export function activateEditBiTest() { const fileUri = path.resolve(projectPath, `tests`, `tests.bal`); ensureFileExists(fileUri); - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BITestFunctionForm, - documentUri: fileUri, identifier: '', serviceType: 'ADD_NEW_TEST' }); + openView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.BITestFunctionForm, + documentUri: fileUri, identifier: '', serviceType: 'ADD_NEW_TEST' + }); }); commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION_DEF, async (entry: TestItem) => { @@ -81,11 +89,22 @@ export function activateEditBiTest() { return; } - const fileName = entry.id.split(":")[1]; + const fileName = entry.id.split(":")[2]; const fileUri = path.resolve(projectPath, `tests`, fileName); if (fileUri) { - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BITestFunctionForm, - documentUri: fileUri, identifier: entry.label, serviceType: 'UPDATE_TEST' }); + const range = entry.range; + openView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.BITestFunctionForm, + documentUri: fileUri, + identifier: entry.label, + position: { + startLine: range.start.line, + startColumn: range.start.character, + endLine: range.end.line, + endColumn: range.end.character + }, + serviceType: 'UPDATE_TEST' + }); } }); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 2fa5c485658..8bd1eb7b52b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -593,6 +593,7 @@ const MainPanel = () => { case MACHINE_VIEW.BITestFunctionForm: setViewComponent( <TestFunctionForm + key={value?.identifier} // Force remount when switching between different tests projectPath={value.projectPath} functionName={value?.identifier} filePath={value?.documentUri} From fdedc736c696095c7220e3a84f20881822889e31 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 8 Feb 2026 20:30:58 +0530 Subject: [PATCH 185/247] Update test function creation form --- .../ballerina-extension/package.json | 2 +- .../src/components/Form/index.tsx | 209 +++++++++++++++++- .../src/components/Form/types.ts | 20 ++ .../views/BI/Forms/FormGeneratorNew/index.tsx | 8 +- .../src/views/BI/TestFunctionForm/index.tsx | 162 ++++++++++++-- 5 files changed, 372 insertions(+), 29 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 01de2f4ee2a..260e7302d0e 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -589,7 +589,7 @@ { "command": "BI.test.edit.function", "title": "View test flow", - "icon": "$(distro-design-view)", + "icon": "$(type-hierarchy)", "category": "BI" }, { 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 2b35be91b09..c43423d44c5 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -31,21 +31,19 @@ import { } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; -import { ExpressionFormField, FieldDerivation, FormExpressionEditorProps, FormField, FormImports, FormValues } from "./types"; +import { ExpressionFormField, FieldDerivation, FormExpressionEditorProps, FormField, FormImports, FormValues, FormSectionConfig } from "./types"; import { EditorFactory } from "../editors/EditorFactory"; import { getValueForDropdown, isDropdownField } from "../editors/utils"; import { Diagnostic, LineRange, NodeKind, - NodePosition, SubPanel, SubPanelView, FormDiagnostics, FlowNode, ExpressionProperty, RecordTypeField, - Type, VisualizableField, NodeProperties, VisualizerLocation, @@ -105,6 +103,14 @@ namespace S { width: 100%; `; + export const HoverableSection = styled(Row)<{}>` + padding: 12px 16px; + cursor: pointer; + &:hover { + background: var(--vscode-list-hoverBackground); + } + `; + export const CategoryRow = styled.div<{ bottomBorder?: boolean; topBorder?: boolean }>` display: flex; flex-direction: column; @@ -405,6 +411,7 @@ export interface FormProps { changeOptionalFieldTitle?: string; // Option to change the title of optional fields openFormTypeEditor?: (open: boolean, newType?: string, editingField?: FormField) => void; derivedFields?: FieldDerivation[]; // Configuration for auto-deriving field values from other fields + sections?: FormSectionConfig; } export const Form = forwardRef((props: FormProps) => { @@ -446,7 +453,8 @@ export const Form = forwardRef((props: FormProps) => { onValidityChange, changeOptionalFieldTitle = undefined, openFormTypeEditor, - derivedFields = [] + derivedFields = [], + sections } = props; const { @@ -471,6 +479,9 @@ export const Form = forwardRef((props: FormProps) => { const [manuallyEditedFields, setManuallyEditedFields] = useState<Set<string>>(new Set()); const [isSubComponentEnabled, setIsSubComponentEnabled] = useState(false); const [optionalFieldsTitle, setOptionalFieldsTitle] = useState("Advanced Configurations"); + const [sectionCollapseState, setSectionCollapseState] = useState<Map<string, boolean>>( + new Map(sections?.sections.map(s => [s.id, s.defaultCollapsed ?? true]) || []) + ); const markdownRef = useRef<HTMLDivElement>(null); @@ -926,6 +937,80 @@ export const Form = forwardRef((props: FormProps) => { })(); }; + const assignFieldsToSections = useMemo(() => { + if (!sections) return null; + + const sectionGroups = new Map<string, FormField[]>(); + const unmappedFields: FormField[] = []; + + formFields.forEach(field => { + if (field.hidden) return; + + // Find section for this field + let assignedSection: string | null = null; + + // Strategy 1: Check explicit fieldKeys in sections + for (const section of sections.sections) { + if (section.fieldKeys?.includes(field.key)) { + assignedSection = section.id; + break; + } + } + + // Strategy 2: Check field's groupName property + if (!assignedSection && field.groupName) { + const matchingSection = sections.sections.find(s => s.id === field.groupName); + if (matchingSection) assignedSection = field.groupName; + } + + if (assignedSection) { + if (!sectionGroups.has(assignedSection)) { + sectionGroups.set(assignedSection, []); + } + sectionGroups.get(assignedSection)!.push(field); + } else { + unmappedFields.push(field); + } + }); + + return { sectionGroups, unmappedFields }; + }, [formFields, sections]); + + // has advance fields that are not in custom sections + const hasAdvanceFieldsNotInSections = useMemo(() => { + if (!sections || !assignFieldsToSections) { + return hasAdvanceFields; + } + + // Check if there are any advanced fields not in custom sections + const hasAdvancedFormFields = formFields.some((field) => { + if (!field.advanced || !field.enabled || field.hidden) return false; + + // Check if field is in a custom section + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + + return !isInSection; // Return true if NOT in section + }); + + // Check advanced choice fields + const hasAdvancedChoiceFieldsNotInSections = advancedChoiceFields.some((field) => { + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + return !isInSection; + }); + + return hasAdvancedFormFields || hasAdvancedChoiceFieldsNotInSections; + }, [formFields, advancedChoiceFields, sections, assignFieldsToSections, hasAdvanceFields]); + + const handleSectionToggle = (sectionId: string, collapsed: boolean) => { + setSectionCollapseState(prev => { + const newState = new Map(prev); + newState.set(sectionId, collapsed); + return newState; + }); + }; + const handleOnSaveClick = async () => { setSavingButton('save'); @@ -1009,6 +1094,13 @@ export const Form = forwardRef((props: FormProps) => { return; } + // Skip if field is in a section + if (sections && assignFieldsToSections) { + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + if (isInSection) return; + } + const updatedField = updateFormFieldWithImports(field, formImports); renderedComponents.push( <S.Row key={updatedField.key}> @@ -1057,7 +1149,96 @@ export const Form = forwardRef((props: FormProps) => { return renderedComponents; })()} - {hasAdvanceFields && ( + </S.CategoryRow> + + {/* Render configured sections */} + {sections && assignFieldsToSections && ( + <S.CategoryRow bottomBorder={false}> + {sections.sections + .filter(section => { + const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; + const hasFields = fields.length > 0; + const meetsCondition = !section.renderCondition || + section.renderCondition(getValues()); + return hasFields && meetsCondition; + }) + .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) + .map(section => { + const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; + const isCollapsed = sectionCollapseState.get(section.id) ?? section.defaultCollapsed ?? true; + const isCollapsible = section.isCollapsible !== false; + return ( + <React.Fragment key={section.id}> + <div style={{display: "flex", flexDirection: "column", width: "100%", borderRadius: "4px", border: "1px solid var(--vscode-panel-border)"}}> + <S.HoverableSection onClick={() => handleSectionToggle(section.id, !isCollapsed)}> + <div style={{ display: "flex", flexDirection: "column", gap: 2 }}> + <Typography variant="body2" sx={{ fontWeight: 500 }}> + {section.title} + </Typography> + <Typography variant="body2" sx={{ opacity: 0.7, fontSize: 11 }}> + {section.description} + </Typography> + </div> + {isCollapsible && ( + <S.ButtonContainer> + {isCollapsed && ( + <Codicon + name={"chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + )} + {!isCollapsed && ( + <Codicon + name={"chevron-up"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + )} + </S.ButtonContainer> + )} + </S.HoverableSection> + {!isCollapsed && (<S.Row style={{flexDirection: "column", gap: "20px", padding: "8px 16px 28px", borderTop: "1px solid var(--vscode-panel-border)"}}> + {fields.map(field => { + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + selectedNode={selectedNode} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + openSubPanel={handleOpenSubPanel} + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + setSubComponentEnabled={setIsSubComponentEnabled} + handleNewTypeSelected={handleNewTypeSelected} + onBlur={handleOnBlur} + isContextTypeEditorSupported={updatedField?.isContextTypeSupported} + openFormTypeEditor={ + openFormTypeEditor && + ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) + } + /> + {updatedField.key === "scope" && scopeFieldAddon} + </S.Row> + ); + })} + </S.Row>)} + </div> + </React.Fragment> + ); + })} + </S.CategoryRow> + )} + + <S.CategoryRow bottomBorder={false}> + {hasAdvanceFieldsNotInSections && ( <S.Row> {optionalFieldsTitle} <S.ButtonContainer> @@ -1089,10 +1270,17 @@ export const Form = forwardRef((props: FormProps) => { </S.ButtonContainer> </S.Row> )} - {hasAdvanceFields && + {hasAdvanceFieldsNotInSections && showAdvancedOptions && formFields.map((field) => { if (field.advanced && !field.hidden) { + // Skip if field is in a custom section + if (sections && assignFieldsToSections) { + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + if (isInSection) return null; + } + const updatedField = updateFormFieldWithImports(field, formImports); return ( <S.Row key={updatedField.key}> @@ -1114,9 +1302,16 @@ export const Form = forwardRef((props: FormProps) => { } return null; })} - {hasAdvanceFields && + {hasAdvanceFieldsNotInSections && showAdvancedOptions && advancedChoiceFields.map((field) => { + // Skip if field is in a custom section + if (sections && assignFieldsToSections) { + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + if (isInSection) return null; + } + const updatedField = updateFormFieldWithImports(field, formImports); return ( <S.Row key={updatedField.key}> diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts index 593f601a19e..e60779ce873 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts @@ -259,3 +259,23 @@ export type FormExpressionEditorProps = export type FormImports = { [fieldKey: string]: Imports; } + +export interface FormSection { + id: string; + title: string; + isCollapsible?: boolean; + defaultCollapsed?: boolean; + order?: number; + description?: string; + fieldKeys?: string[]; + renderCondition?: (formValues: FormValues) => boolean; +} + +export interface FormSectionConfig { + sections: FormSection[]; + defaultSection?: { + id: string; + title?: string; + order?: number; + }; +} 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 d3a65dd31b0..791bb3a9b1e 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 @@ -49,7 +49,8 @@ import { FormExpressionEditorProps, FormImports, HelperpaneOnChangeOptions, - InputMode + InputMode, + FormSectionConfig } from "@wso2/ballerina-side-panel"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { CompletionItem, FormExpressionEditorRef, HelperPaneHeight, Overlay, ThemeColors } from "@wso2/ui-toolkit"; @@ -119,6 +120,7 @@ interface FormProps { onChange?: (fieldKey: string, value: any, allValues: FormValues) => void; hideSaveButton?: boolean; customDiagnosticFilter?: (diagnostics: Diagnostic[]) => Diagnostic[]; + sections?: FormSectionConfig; } export function FormGeneratorNew(props: FormProps) { @@ -152,7 +154,8 @@ export function FormGeneratorNew(props: FormProps) { changeOptionalFieldTitle, onChange, hideSaveButton, - customDiagnosticFilter + customDiagnosticFilter, + sections } = props; const { rpcClient } = useRpcContext(); @@ -992,6 +995,7 @@ export function FormGeneratorNew(props: FormProps) { changeOptionalFieldTitle={changeOptionalFieldTitle} onChange={onChange} hideSaveButton={hideSaveButton} + sections={sections} /> )} { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index eb57c570502..6f1338c308d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -20,7 +20,7 @@ import { useEffect, useState } from "react"; import { View, ViewContent } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { FormField, FormImports, FormValues, Parameter } from "@wso2/ballerina-side-panel"; +import { FormField, FormImports, FormValues, Parameter, FormSectionConfig } from "@wso2/ballerina-side-panel"; import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType } from "@wso2/ballerina-core"; import { EVENT_TYPE } from "@wso2/ballerina-core"; import { TitleBar } from "../../../components/TitleBar"; @@ -33,17 +33,52 @@ const FormContainer = styled.div` display: flex; flex-direction: column; max-width: 600px; - gap: 20px; - margin-top: 20px; + margin-bottom: 20px; + + .side-panel-body { + overflow: visible; + overflow-y: none; + } `; const Container = styled.div` display: "flex"; flex-direction: "column"; gap: 10; - margin: 20px; `; +const TEST_FORM_SECTIONS: FormSectionConfig = { + sections: [ + { + id: 'data-provider', + title: 'Data Provider', + isCollapsible: true, + defaultCollapsed: true, + order: 1, + description: 'Configure test data sources', + fieldKeys: ['dataProvider'] + }, + { + id: 'repetition', + title: 'Repetition', + isCollapsible: true, + defaultCollapsed: true, + order: 2, + description: 'Configure run frequency and pass criteria', + fieldKeys: ['runs', 'minPassRate'] + }, + { + id: 'execution-organization', + title: 'Execution & Organization', + isCollapsible: true, + defaultCollapsed: true, + order: 3, + description: 'Manage test groups, dependencies, and lifecycle hooks', + fieldKeys: ['groups', 'dependsOn', 'before', 'after'] + } + ] +}; + interface TestFunctionDefProps { projectPath: string; functionName?: string; @@ -116,7 +151,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { endColumn: res.function.codedata.lineRange.endLine.offset }; console.log("Node Position: ", nodePosition); - await rpcClient.getVisualizerRpcClient().openView( + rpcClient.getVisualizerRpcClient().openView( { type: EVENT_TYPE.OPEN_VIEW, location: { position: nodePosition, documentUri: filePath } }) }; @@ -150,6 +185,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { editable: true, enabled: true, advanced: true, + hidden: true, documentation: '', value: '', paramManagerProps: { @@ -160,9 +196,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { types: [{ fieldType: "PARAM_MANAGER", selected: false }] }); } - if (testFunction.returnType) { - fields.push(generateFieldFromProperty('returnType', testFunction.returnType)); - } if (testFunction.annotations) { const configAnnotation = getTestConfigAnnotation(testFunction.annotations); if (configAnnotation && configAnnotation.fields) { @@ -271,6 +304,24 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (field.originalName == 'enabled') { field.value = formValues['enabled']; } + if (field.originalName == 'dependsOn') { + field.value = formValues['dependsOn'] || []; + } + if (field.originalName == 'before') { + field.value = formValues['before'] || ""; + } + if (field.originalName == 'after') { + field.value = formValues['after'] || ""; + } + if (field.originalName == 'runs') { + field.value = formValues['runs'] || "1"; + } + if (field.originalName == 'minPassRate') { + field.value = formValues['minPassRate'] || "100"; + } + if (field.originalName == 'dataProvider') { + field.value = formValues['dataProvider'] || ""; + } } } } @@ -285,21 +336,21 @@ export function TestFunctionForm(props: TestFunctionDefProps) { optional: false, editable: true, advanced: false, - types: [{fieldType: "TYPE", selected: false }] + types: [{ fieldType: "TYPE", selected: false }] }, variable: { value: "b", optional: false, editable: true, advanced: false, - types: [{fieldType: "IDENTIFIER", selected: false }] + types: [{ fieldType: "IDENTIFIER", selected: false }] }, defaultValue: { value: "\"default\"", optional: false, editable: true, advanced: false, - types: [{fieldType: "EXPRESSION", selected: false }] + types: [{ fieldType: "EXPRESSION", selected: false }] }, optional: false, editable: true, @@ -312,8 +363,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { return { functionName: { metadata: { - label: "Test Function", - description: "Test function" + label: "Test Name", + description: "Name of the test function" }, value: "", optional: false, @@ -342,6 +393,18 @@ export function TestFunctionForm(props: TestFunctionDefProps) { module: "test", name: "Config", fields: [ + { + metadata: { + label: "Enabled", + description: "Enable/Disable the test" + }, + originalName: "enabled", + value: true, + optional: true, + editable: true, + advanced: false, + types: [{ fieldType: "FLAG", selected: false }] + }, { metadata: { label: "Groups", @@ -356,15 +419,75 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }, { metadata: { - label: "Enabled", - description: "Enable/Disable the test" + label: "Depends On", + description: "List of test function names that this test depends on" }, - originalName: "enabled", - value: true, + types: [{ fieldType: "EXPRESSION_SET", selected: false }], + originalName: "dependsOn", + value: [], optional: true, editable: true, - advanced: false, - types: [{ fieldType: "FLAG", selected: false }] + advanced: true + }, + { + metadata: { + label: "Before Function", + description: "Function to execute before this test" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "before", + value: "", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "After Function", + description: "Function to execute after this test" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "after", + value: "", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Runs", + description: "Number of times to execute this test" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "runs", + value: "1", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Min Pass Rate (%)", + description: "Minimum percentage of runs that must pass (0-100)" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "minPassRate", + value: "100", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Data Provider", + description: "Function that provides test data" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "dataProvider", + value: "", + optional: true, + editable: true, + advanced: true } ] } @@ -422,6 +545,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { <FormGeneratorNew fileName={filePath} fields={formFields} + sections={TEST_FORM_SECTIONS} targetLineRange={targetLineRange} onSubmit={onFormSubmit} preserveFieldOrder={true} From 339698415eec0bd043337d986f0e6e9503b6be8e Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 00:07:37 +0530 Subject: [PATCH 186/247] Add RadioButtonGroupEditor and update TestFunctionForm for data provider mode selection --- .../src/components/editors/EditorFactory.tsx | 3 + .../editors/RadioButtonGroupEditor.tsx | 65 +++++++++ .../src/components/editors/index.ts | 1 + .../src/views/BI/TestFunctionForm/index.tsx | 135 +++++++++++++++++- .../src/components/Dropdown/Dropdown.tsx | 2 +- 5 files changed, 199 insertions(+), 7 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx 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 3e81173b00f..178bc8e7842 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -41,6 +41,7 @@ import { PathEditor } from "./PathEditor"; import { HeaderSetEditor } from "./HeaderSetEditor"; import { CompletionItem } from "@wso2/ui-toolkit"; import { CustomDropdownEditor } from "./CustomDropdownEditor"; +import { RadioButtonGroupEditor } from "./RadioButtonGroupEditor"; import { ActionExpressionEditor } from "./ActionExpressionEditor"; import { CheckBoxConditionalEditor } from "./CheckBoxConditionalEditor"; import { ActionTypeEditor } from "./ActionTypeEditor"; @@ -105,6 +106,8 @@ export const EditorFactory = (props: FormFieldEditorProps) => { if (!field.enabled || field.hidden) { return <></>; + } else if (field.type === "RADIO_GROUP") { + return <RadioButtonGroupEditor field={field} />; } else if (field.type === "MULTIPLE_SELECT") { return <MultiSelectEditor field={field} label={"Attach Another"} openSubPanel={openSubPanel} />; } else if (field.type === "HEADER_SET") { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx new file mode 100644 index 00000000000..46d544cf25e --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect } from "react"; +import { FormField } from "../Form/types"; +import { RadioButtonGroup } from "@wso2/ui-toolkit"; +import { useFormContext } from "../../context"; + +interface RadioButtonGroupEditorProps { + field: FormField; +} + +export function RadioButtonGroupEditor(props: RadioButtonGroupEditorProps) { + const { field } = props; + const { form } = useFormContext(); + const { register, setValue, watch, getValues } = form; + + const currentValue = watch(field.key); + + // Only set initial value on mount, not when field.value changes + // This prevents the form from resetting when sections collapse/expand + useEffect(() => { + const formValues = getValues(); + const currentFormValue = formValues[field.key]; + if (currentFormValue === undefined || currentFormValue === null || currentFormValue === "") { + setValue(field.key, field.value); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); // Empty dependency array - only run on mount + + const handleChange = (e: any) => { + const value = e.target.value; + setValue(field.key, value); + field.onValueChange?.(value); + }; + + return ( + <RadioButtonGroup + {...register(field.key, { + value: field.value, + onChange: handleChange + })} + label={field.label} + orientation="horizontal" + options={field.itemOptions || []} + value={currentValue} + className="radio-button-group" + /> + ); +} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts b/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts index c378bece5d4..091d282babe 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts @@ -25,6 +25,7 @@ export * from "./ArrayEditor"; export * from "./FileSelect"; export * from "./FormMapEditor"; export * from "./FieldContext"; +export * from "./RadioButtonGroupEditor"; export * from "./MultiModeExpressionEditor/ChipExpressionEditor/components/ChipExpressionEditor"; export * from "./MultiModeExpressionEditor/Configurations"; export { getPropertyFromFormField } from "./utils"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index 6f1338c308d..a39f727d45f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -39,6 +39,15 @@ const FormContainer = styled.div` overflow: visible; overflow-y: none; } + + .radio-button-group { + margin-top: 8px; + margin-bottom: -12px; + } + + .dropdown-container { + margin-top: 12px; + } `; const Container = styled.div` @@ -56,7 +65,7 @@ const TEST_FORM_SECTIONS: FormSectionConfig = { defaultCollapsed: true, order: 1, description: 'Configure test data sources', - fieldKeys: ['dataProvider'] + fieldKeys: ['dataProviderMode', 'dataProvider', 'evalSetFile'] }, { id: 'repetition', @@ -93,6 +102,26 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const [testFunction, setTestFunction] = useState<TestFunction>(); const [formTitle, setFormTitle] = useState<string>('Create New Test Case'); const [targetLineRange, setTargetLineRange] = useState<LineRange>(); + const [dataProviderMode, setDataProviderMode] = useState<string>('function'); + + const handleFieldChange = (fieldKey: string, value: any, allValues: FormValues) => { + if (fieldKey === 'dataProviderMode') { + setDataProviderMode(value); + updateFieldVisibility(value); + } + }; + + const updateFieldVisibility = (mode: string) => { + setFormFields(prevFields => prevFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + })); + }; const updateTargetLineRange = () => { rpcClient @@ -120,9 +149,25 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const loadFunction = async () => { const res = await rpcClient.getTestManagerRpcClient().getTestFunction({ functionName, filePath }); - console.log("Test Function: ", res); setTestFunction(res.function); let formFields = generateFormFields(res.function); + + // Get the dataProviderMode value to initialize field visibility + const modeField = formFields.find(f => f.key === 'dataProviderMode'); + const mode = String(modeField?.value || 'function'); + setDataProviderMode(mode); + + // Set initial field visibility + formFields = formFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + }); + setFormFields(formFields); } @@ -130,13 +175,28 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const emptyTestFunction = getEmptyTestFunctionModel(); setTestFunction(emptyTestFunction); let formFields = generateFormFields(emptyTestFunction); + + // Get the dataProviderMode value to initialize field visibility + const modeField = formFields.find(f => f.key === 'dataProviderMode'); + const mode = String(modeField?.value || 'function'); + setDataProviderMode(mode); + + // Set initial field visibility (default is 'function' mode) + formFields = formFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + }); + setFormFields(formFields); } const onFormSubmit = async (data: FormValues, formImports: FormImports) => { - console.log("Test Function Form Data: ", data); const updatedTestFunction = fillFunctionModel(data, formImports); - console.log("Test Function: ", updatedTestFunction); if (serviceType === 'UPDATE_TEST') { await rpcClient.getTestManagerRpcClient().updateTestFunction({ function: updatedTestFunction, filePath }); } else { @@ -150,7 +210,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { endLine: res.function.codedata.lineRange.endLine.line, endColumn: res.function.codedata.lineRange.endLine.offset }; - console.log("Node Position: ", nodePosition); rpcClient.getVisualizerRpcClient().openView( { type: EVENT_TYPE.OPEN_VIEW, location: { position: nodePosition, documentUri: filePath } }) }; @@ -200,6 +259,31 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const configAnnotation = getTestConfigAnnotation(testFunction.annotations); if (configAnnotation && configAnnotation.fields) { for (const field of configAnnotation.fields) { + if (field.originalName === 'dataProviderMode') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'RADIO_GROUP', + itemOptions: [ + { value: 'function', content: 'Use a custom function' }, + { value: 'evalSet', content: 'Use an Evalset' } + ] + }); + continue; + } + + if (field.originalName === 'evalSetFile') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'SINGLE_SELECT', + itemOptions: [ + { value: 'evalset-1.json', content: 'Evalset 1' }, + { value: 'evalset-2.json', content: 'Evalset 2' }, + { value: 'evalset-3.json', content: 'Evalset 3' } + ] + }); + continue; + } + fields.push(generateFieldFromProperty(field.originalName, field)); } } @@ -319,8 +403,22 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (field.originalName == 'minPassRate') { field.value = formValues['minPassRate'] || "100"; } + if (field.originalName == 'dataProviderMode') { + field.value = formValues['dataProviderMode'] || "function"; + } if (field.originalName == 'dataProvider') { - field.value = formValues['dataProvider'] || ""; + if (formValues['dataProviderMode'] === 'function') { + field.value = formValues['dataProvider'] || ""; + } else { + field.value = ""; + } + } + if (field.originalName == 'evalSetFile') { + if (formValues['dataProviderMode'] === 'evalSet') { + field.value = formValues['evalSetFile'] || ""; + } else { + field.value = ""; + } } } } @@ -477,6 +575,18 @@ export function TestFunctionForm(props: TestFunctionDefProps) { editable: true, advanced: true }, + { + metadata: { + label: "", + description: "Choose how to provide test data" + }, + types: [{ fieldType: "STRING", selected: false }], + originalName: "dataProviderMode", + value: "function", + optional: true, + editable: true, + advanced: false + }, { metadata: { label: "Data Provider", @@ -488,6 +598,18 @@ export function TestFunctionForm(props: TestFunctionDefProps) { optional: true, editable: true, advanced: true + }, + { + metadata: { + label: "Evalset File", + description: "Select an evalset for test data" + }, + types: [{ fieldType: "STRING", selected: false }], + originalName: "evalSetFile", + value: "", + optional: true, + editable: true, + advanced: true } ] } @@ -549,6 +671,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { targetLineRange={targetLineRange} onSubmit={onFormSubmit} preserveFieldOrder={true} + onChange={handleFieldChange} /> )} </FormContainer> diff --git a/workspaces/common-libs/ui-toolkit/src/components/Dropdown/Dropdown.tsx b/workspaces/common-libs/ui-toolkit/src/components/Dropdown/Dropdown.tsx index 9d9d1929008..abd962b43b7 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/Dropdown/Dropdown.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/Dropdown/Dropdown.tsx @@ -106,7 +106,7 @@ export const Dropdown = React.forwardRef<HTMLSelectElement, DropdownProps>((prop {isLoading ? ( <SmallProgressRing /> ) : ( - <DropDownContainer sx={dropdownContainerSx}> + <DropDownContainer sx={dropdownContainerSx} className="dropdown-container"> {label && ( <LabelContainer> <Label> From 74b469de0130f711f0b4a06759e92a6f1f335f2b Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 00:41:44 +0530 Subject: [PATCH 187/247] Add Slider component and integrate into form field editors --- .../ballerina-core/src/interfaces/bi.ts | 1 + .../src/components/Form/types.ts | 8 + .../src/components/editors/EditorFactory.tsx | 3 + .../src/components/editors/SliderEditor.tsx | 75 +++++++ .../src/components/editors/index.ts | 1 + .../src/views/BI/TestFunctionForm/index.tsx | 25 ++- .../src/components/Slider/Slider.tsx | 201 ++++++++++++++++++ .../common-libs/ui-toolkit/src/index.ts | 1 + 8 files changed, 310 insertions(+), 5 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/SliderEditor.tsx create mode 100644 workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 4519a946bfa..4a524e9830b 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 FormFieldInputType = "TEXT" | "RECORD_MAP_EXPRESSION" | "PROMPT" | "CLAUSE_EXPRESSION"; + "SLIDER"; export interface BaseType { fieldType: FormFieldInputType; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts index e60779ce873..97299597a59 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts @@ -70,6 +70,14 @@ export type FormField = { actionCallback?: () => void; onValueChange?: (value: string | boolean) => void; isGraphqlId?: boolean; + sliderProps?: { + min?: number; + max?: number; + step?: number; + showValue?: boolean; + showMarkers?: boolean; + valueFormatter?: (value: number) => string; + }; }; export type ParameterValue = { 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 178bc8e7842..013f7050bce 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -42,6 +42,7 @@ import { HeaderSetEditor } from "./HeaderSetEditor"; import { CompletionItem } from "@wso2/ui-toolkit"; import { CustomDropdownEditor } from "./CustomDropdownEditor"; import { RadioButtonGroupEditor } from "./RadioButtonGroupEditor"; +import { SliderEditor } from "./SliderEditor"; import { ActionExpressionEditor } from "./ActionExpressionEditor"; import { CheckBoxConditionalEditor } from "./CheckBoxConditionalEditor"; import { ActionTypeEditor } from "./ActionTypeEditor"; @@ -108,6 +109,8 @@ export const EditorFactory = (props: FormFieldEditorProps) => { return <></>; } else if (field.type === "RADIO_GROUP") { return <RadioButtonGroupEditor field={field} />; + } else if (field.type === "SLIDER") { + return <SliderEditor field={field} />; } else if (field.type === "MULTIPLE_SELECT") { return <MultiSelectEditor field={field} label={"Attach Another"} openSubPanel={openSubPanel} />; } else if (field.type === "HEADER_SET") { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/SliderEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/SliderEditor.tsx new file mode 100644 index 00000000000..f6d63e48faa --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/SliderEditor.tsx @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect } from "react"; +import { FormField } from "../Form/types"; +import { Slider } from "@wso2/ui-toolkit"; +import { useFormContext } from "../../context"; + +interface SliderEditorProps { + field: FormField; +} + +export function SliderEditor(props: SliderEditorProps) { + const { field } = props; + const { form } = useFormContext(); + const { register, setValue, watch, getValues } = form; + + const currentValue = watch(field.key); + + // Set initial value on mount + useEffect(() => { + const formValues = getValues(); + const currentFormValue = formValues[field.key]; + if (currentFormValue === undefined || currentFormValue === null || currentFormValue === "") { + setValue(field.key, field.value || field.sliderProps?.min || 0); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); // Empty dependency array - only run on mount + + const handleChange = (e: any) => { + const value = e.target.value; + setValue(field.key, value); + field.onValueChange?.(value); + }; + + // Extract slider configuration from field + const min = field.sliderProps?.min ?? 0; + const max = field.sliderProps?.max ?? 100; + const step = field.sliderProps?.step ?? 1; + const showValue = field.sliderProps?.showValue ?? true; + const showMarkers = field.sliderProps?.showMarkers ?? true; + const valueFormatter = field.sliderProps?.valueFormatter; + + return ( + <Slider + {...register(field.key, { + value: field.value, + onChange: handleChange + })} + label={field.label} + value={currentValue} + min={min} + max={max} + step={step} + showValue={showValue} + showMarkers={showMarkers} + valueFormatter={valueFormatter} + /> + ); +} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts b/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts index 091d282babe..f3d302a48ac 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts @@ -26,6 +26,7 @@ export * from "./FileSelect"; export * from "./FormMapEditor"; export * from "./FieldContext"; export * from "./RadioButtonGroupEditor"; +export * from "./SliderEditor"; export * from "./MultiModeExpressionEditor/ChipExpressionEditor/components/ChipExpressionEditor"; export * from "./MultiModeExpressionEditor/Configurations"; export { getPropertyFromFormField } from "./utils"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index a39f727d45f..b8c91f3b334 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -328,18 +328,33 @@ export function TestFunctionForm(props: TestFunctionDefProps) { } const generateFieldFromProperty = (key: string, property: ValueProperty): FormField => { - return { + const fieldType = getPrimaryInputType(property.types)?.fieldType; + const baseField: FormField = { key: key, label: property.metadata.label, - type: getPrimaryInputType(property.types)?.fieldType, + type: fieldType, optional: property.optional, editable: property.editable, advanced: property.advanced, enabled: true, documentation: property.metadata.description, value: property.value, - types: [{ fieldType: getPrimaryInputType(property.types)?.fieldType, selected: false }] + types: [{ fieldType: fieldType, selected: false }] + }; + + // Add slider-specific configuration for minPassRate + if (key === 'minPassRate' && fieldType === 'SLIDER') { + baseField.sliderProps = { + min: 0, + max: 100, + step: 1, + showValue: true, + showMarkers: true, + valueFormatter: (value: number) => `${value}%` + }; } + + return baseField; } const fillFunctionModel = (formValues: FormValues, formImports: FormImports): TestFunction => { @@ -565,10 +580,10 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }, { metadata: { - label: "Min Pass Rate (%)", + label: "Minimum Pass Rate (%)", description: "Minimum percentage of runs that must pass (0-100)" }, - types: [{ fieldType: "EXPRESSION", selected: false }], + types: [{ fieldType: "SLIDER", selected: false }], originalName: "minPassRate", value: "100", optional: true, diff --git a/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx b/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx new file mode 100644 index 00000000000..19b5dd58e46 --- /dev/null +++ b/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx @@ -0,0 +1,201 @@ +/** + * 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, { ComponentProps } from "react"; +import "@wso2/font-wso2-vscode/dist/wso2-vscode.css"; +import styled from "@emotion/styled"; + +interface SliderContainerProps { + sx?: any; +} + +const SliderContainer = styled.div<SliderContainerProps>` + display: flex; + flex-direction: column; + gap: 4px; + width: 100%; + ${(props: SliderContainerProps) => props.sx}; +`; + +const LabelContainer = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + color: var(--vscode-editor-foreground); + margin-bottom: 4px; +`; + +const Label = styled.label` + font-size: 13px; + font-weight: 400; +`; + +const ValueDisplay = styled.span` + font-size: 12px; + color: var(--vscode-descriptionForeground); + font-family: var(--vscode-font-family); +`; + +const SliderTrack = styled.div` + position: relative; + width: 100%; + height: 24px; + display: flex; + align-items: center; +`; + +const StyledSlider = styled.input` + -webkit-appearance: none; + appearance: none; + width: 100%; + height: 4px; + background: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-editorWidget-border); + outline: none; + border-radius: 2px; + cursor: pointer; + + &::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 14px; + height: 14px; + background: var(--vscode-button-background); + border: 1px solid var(--vscode-button-border); + border-radius: 2px; + cursor: pointer; + + &:hover { + background: var(--vscode-button-hoverBackground); + } + + &:active { + background: var(--vscode-button-hoverBackground); + } + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + + &::-webkit-slider-thumb { + cursor: not-allowed; + } + + &::-moz-range-thumb { + cursor: not-allowed; + } + } +`; + +const MarkersContainer = styled.div` + display: flex; + justify-content: space-between; + margin-top: 4px; + padding: 0 2px; +`; + +const Marker = styled.span` + font-size: 11px; + color: var(--vscode-descriptionForeground); +`; + +export interface SliderProps extends Omit<ComponentProps<"input">, "type"> { + id?: string; + className?: string; + label?: string; + sx?: any; + showValue?: boolean; + valueFormatter?: (value: number) => string; + showMarkers?: boolean; + step?: number; +} + +export const Slider = React.forwardRef<HTMLInputElement, SliderProps>((props, ref) => { + const { + id, + className, + label, + sx, + showValue = true, + valueFormatter, + showMarkers = true, + min = 0, + max = 100, + step = 1, + value, + defaultValue, + ...rest + } = props; + + const [currentValue, setCurrentValue] = React.useState<number>( + (value as number) ?? (defaultValue as number) ?? Number(min) + ); + + React.useEffect(() => { + if (value !== undefined) { + setCurrentValue(value as number); + } + }, [value]); + + const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { + const newValue = Number(e.target.value); + setCurrentValue(newValue); + props.onChange?.(e); + }; + + const formatValue = (val: number): string => { + if (valueFormatter) { + return valueFormatter(val); + } + return val.toString(); + }; + + return ( + <SliderContainer id={id} className={className} sx={sx}> + {label && ( + <LabelContainer> + <Label htmlFor={`${id}-slider`}>{label}</Label> + {showValue && ( + <ValueDisplay>{formatValue(currentValue)}</ValueDisplay> + )} + </LabelContainer> + )} + <SliderTrack> + <StyledSlider + ref={ref} + id={`${id}-slider`} + type="range" + min={min} + max={max} + step={step} + value={currentValue} + onChange={handleChange} + {...rest} + /> + </SliderTrack> + {showMarkers && ( + <MarkersContainer> + <Marker>{min}</Marker> + <Marker>{max}</Marker> + </MarkersContainer> + )} + </SliderContainer> + ); +}); + +Slider.displayName = "Slider"; diff --git a/workspaces/common-libs/ui-toolkit/src/index.ts b/workspaces/common-libs/ui-toolkit/src/index.ts index ea71ee68fbd..c0a5355ec99 100644 --- a/workspaces/common-libs/ui-toolkit/src/index.ts +++ b/workspaces/common-libs/ui-toolkit/src/index.ts @@ -55,6 +55,7 @@ export * from './components/CheckBoxGroup/CheckBoxGroup'; export * from './components/ErrorBoundary/ErrorBoundary'; export * from "./components/Card/Card"; export * from './components/RadioButtonGroup/RadioButtonGroup'; +export * from './components/Slider/Slider'; export * from './components/Accordion/Accordion'; export * from './components/SyntaxHighlighter/SyntaxHighlighter'; export * from './components/Drawer/Drawer'; From 4776125e464fa2fe0a7d9501b473ff3ebc09871f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 10:54:06 +0530 Subject: [PATCH 188/247] Update TestFunctionForm to fetch evalset files --- .../src/rpc-types/test-manager/index.ts | 4 +- .../src/rpc-types/test-manager/rpc-type.ts | 25 +- .../ballerina-extension/package.json | 2 +- .../rpc-managers/test-manager/rpc-handler.ts | 5 +- .../rpc-managers/test-manager/rpc-manager.ts | 45 ++ .../rpc-clients/test-manager/rpc-client.ts | 12 +- .../src/components/Form/index.tsx | 679 +++++++++--------- .../src/views/BI/TestFunctionForm/index.tsx | 68 +- 8 files changed, 482 insertions(+), 358 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/index.ts index 041654b7922..3d1363d4d94 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/index.ts @@ -18,9 +18,11 @@ import { GetTestFunctionRequest, GetTestFunctionResponse, AddOrUpdateTestFunctionRequest } from "../../interfaces/extended-lang-client"; import { SourceUpdateResponse } from "../service-designer/interfaces"; +import { GetEvalsetsRequest, GetEvalsetsResponse } from "./rpc-type"; -export interface TestManagerServiceAPI { +export interface TestManagerServiceAPI { updateTestFunction: (params: AddOrUpdateTestFunctionRequest) => Promise<SourceUpdateResponse>; addTestFunction: (params: AddOrUpdateTestFunctionRequest) => Promise<SourceUpdateResponse>; getTestFunction: (params: GetTestFunctionRequest) => Promise<GetTestFunctionResponse>; + getEvalsets: (params: GetEvalsetsRequest) => Promise<GetEvalsetsResponse>; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/rpc-type.ts index 2b2b93031b3..606be83b1c2 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/test-manager/rpc-type.ts @@ -20,9 +20,28 @@ import { RequestType } from "vscode-messenger-common"; import { SourceUpdateResponse } from "../service-designer/interfaces"; const _preFix = "test-manager"; -export const getTestFunction: RequestType<GetTestFunctionRequest, GetTestFunctionResponse> = +export const getTestFunction: RequestType<GetTestFunctionRequest, GetTestFunctionResponse> = { method: `${_preFix}/getTestFunction` }; -export const addTestFunction: RequestType<AddOrUpdateTestFunctionRequest, SourceUpdateResponse> = +export const addTestFunction: RequestType<AddOrUpdateTestFunctionRequest, SourceUpdateResponse> = { method: `${_preFix}/addTestFunction` }; -export const updateTestFunction: RequestType<AddOrUpdateTestFunctionRequest, SourceUpdateResponse> = +export const updateTestFunction: RequestType<AddOrUpdateTestFunctionRequest, SourceUpdateResponse> = { method: `${_preFix}/updateTestFunction` }; + +export interface EvalsetItem { + id: string; + name: string; + filePath: string; + threadCount: number; + description?: string; +} + +export interface GetEvalsetsRequest { + projectPath?: string; +} + +export interface GetEvalsetsResponse { + evalsets: EvalsetItem[]; +} + +export const getEvalsets: RequestType<GetEvalsetsRequest, GetEvalsetsResponse> = +{ method: `${_preFix}/getEvalsets` }; diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 260e7302d0e..b08d6186a55 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -747,7 +747,7 @@ "test": [ { "id": "ballerina-evalsets", - "name": "Eval Sets", + "name": "Evalsets", "when": "isBIProject || isBallerinaProject" } ], diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-handler.ts index 8809c1bdbd9..eb29639dc5c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-handler.ts @@ -15,8 +15,8 @@ * specific language governing permissions and limitations * under the License. */ -import { addTestFunction, getTestFunction, GetTestFunctionRequest, - AddOrUpdateTestFunctionRequest, updateTestFunction } from "@wso2/ballerina-core"; +import { addTestFunction, getTestFunction, GetTestFunctionRequest, + AddOrUpdateTestFunctionRequest, updateTestFunction, getEvalsets, GetEvalsetsRequest } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { TestServiceManagerRpcManager } from "./rpc-manager"; @@ -25,5 +25,6 @@ export function registerTestManagerRpcHandlers(messenger: Messenger) { messenger.onRequest(getTestFunction, (args: GetTestFunctionRequest) => rpcManger.getTestFunction(args)); messenger.onRequest(addTestFunction, (args: AddOrUpdateTestFunctionRequest) => rpcManger.addTestFunction(args)); messenger.onRequest(updateTestFunction, (args: AddOrUpdateTestFunctionRequest) => rpcManger.updateTestFunction(args)); + messenger.onRequest(getEvalsets, (args: GetEvalsetsRequest) => rpcManger.getEvalsets(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts index 40bf18f8eb5..78611e71997 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts @@ -24,12 +24,17 @@ import { SyntaxTree, TestManagerServiceAPI, TestSourceEditResponse, + GetEvalsetsRequest, + GetEvalsetsResponse, + EvalsetItem, } from "@wso2/ballerina-core"; import { ModulePart, NodePosition, STKindChecker } from "@wso2/syntax-tree"; import * as fs from 'fs'; import { existsSync, writeFileSync } from "fs"; import { StateMachine } from "../../stateMachine"; import { updateSourceCode } from "../../utils/source-utils"; +import * as vscode from 'vscode'; +import * as path from 'path'; export class TestServiceManagerRpcManager implements TestManagerServiceAPI { @@ -85,4 +90,44 @@ export class TestServiceManagerRpcManager implements TestManagerServiceAPI { } }); } + + async getEvalsets(params: GetEvalsetsRequest): Promise<GetEvalsetsResponse> { + return new Promise(async (resolve) => { + try { + const evalsetFiles = await vscode.workspace.findFiles('**/evalsets/**/*.evalset.json'); + const evalsets: EvalsetItem[] = []; + + for (const uri of evalsetFiles) { + try { + const content = await fs.promises.readFile(uri.fsPath, 'utf-8'); + const evalsetData = JSON.parse(content); + + // Validate the evalset structure + if (!evalsetData.threads || !Array.isArray(evalsetData.threads)) { + continue; + } + + const threadCount = evalsetData.threads.length; + const name = evalsetData.name || path.basename(uri.fsPath, '.evalset.json'); + const description = evalsetData.description || ''; + + evalsets.push({ + id: evalsetData.id || uri.fsPath, + name: name, + filePath: uri.fsPath, + threadCount: threadCount, + description: description + }); + } catch (error) { + console.error(`Failed to parse evalset file ${uri.fsPath}:`, error); + } + } + + resolve({ evalsets }); + } catch (error) { + console.error('Failed to get evalsets:', error); + resolve({ evalsets: [] }); + } + }); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/test-manager/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/test-manager/rpc-client.ts index 68ef5a6f610..9c8dc050ac2 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/test-manager/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/test-manager/rpc-client.ts @@ -15,10 +15,10 @@ * specific language governing permissions and limitations * under the License. */ -import { TestManagerServiceAPI, GetTestFunctionRequest, AddOrUpdateTestFunctionRequest, - TestSourceEditResponse, GetTestFunctionResponse, - getTestFunction, addTestFunction, updateTestFunction, - SourceUpdateResponse} from "@wso2/ballerina-core"; +import { TestManagerServiceAPI, GetTestFunctionRequest, AddOrUpdateTestFunctionRequest, + TestSourceEditResponse, GetTestFunctionResponse, + getTestFunction, addTestFunction, updateTestFunction, + SourceUpdateResponse, GetEvalsetsRequest, GetEvalsetsResponse, getEvalsets} from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -40,5 +40,9 @@ export class TestManagerServiceRpcClient implements TestManagerServiceAPI { updateTestFunction(params: AddOrUpdateTestFunctionRequest): Promise<SourceUpdateResponse> { return this._messenger.sendRequest(updateTestFunction, HOST_EXTENSION, params); } + + getEvalsets(params: GetEvalsetsRequest): Promise<GetEvalsetsResponse> { + return this._messenger.sendRequest(getEvalsets, 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 c43423d44c5..f8030ba8b86 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -103,9 +103,11 @@ namespace S { width: 100%; `; - export const HoverableSection = styled(Row)<{}>` + export const HoverableSection = styled(Row) <{}>` padding: 12px 16px; cursor: pointer; + background: var(--vscode-sideBar-background); + border-radius: 4px 4px 0; &:hover { background: var(--vscode-list-hoverBackground); } @@ -509,60 +511,61 @@ export const Form = forwardRef((props: FormProps) => { formFields.forEach((field) => { // Only set field defaults if no existing value is present if (defaultValues[field.key] === undefined) { - if (field.hidden) { - defaultValues[field.key] = field.value; - } else if (isDropdownField(field)) { - defaultValues[field.key] = getValueForDropdown(field) ?? ""; - } else if (field.type === "FLAG" && field.types?.length > 1) { - defaultValues[field.key] = String(field.value === "true") || String((typeof field.value === "boolean" && field.value)); - } else if (field.type === "FLAG") { - defaultValues[field.key] = field.value || "true"; - } else if (typeof field.value === "string") { - defaultValues[field.key] = formatJSONLikeString(field.value) ?? ""; - } else { - defaultValues[field.key] = field.value ?? ""; - } - if (field.key === "variable") { - defaultValues[field.key] = formValues[field.key] ?? defaultValues[field.key] ?? ""; - } - if (field.key === "parameters" && field.value.length === 0) { - defaultValues[field.key] = formValues[field.key] ?? []; - } + if (field.hidden) { + defaultValues[field.key] = field.value; + } else if (isDropdownField(field)) { + defaultValues[field.key] = getValueForDropdown(field) ?? ""; + } else if (field.type === "FLAG" && field.types?.length > 1) { + defaultValues[field.key] = String(field.value === "true") || String((typeof field.value === "boolean" && field.value)); + } else if (field.type === "FLAG") { + defaultValues[field.key] = field.value || "true"; + } else if (typeof field.value === "string") { + defaultValues[field.key] = formatJSONLikeString(field.value) ?? ""; + } else { + defaultValues[field.key] = field.value ?? ""; + } + if (field.key === "variable") { + defaultValues[field.key] = formValues[field.key] ?? defaultValues[field.key] ?? ""; + } + 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]; - const newType = field.value; + if (field.key === "type") { + // Handle the case where the type is changed via 'Add Type' + const existingType = formValues[field.key]; + const newType = field.value; - if (existingType !== newType) { - setValue(field.key, newType); - getVisualiableFields(); + if (existingType !== newType) { + setValue(field.key, newType); + getVisualiableFields(); + } } - } - // Handle choice fields and their properties - if (field?.choices && field.choices.length > 0) { - // Get the selected choice index (default to 0 if not set) - const selectedChoiceIndex = formValues[field.key] !== undefined ? Number(formValues[field.key]) : 0; + // Handle choice fields and their properties + if (field?.choices && field.choices.length > 0) { + // Get the selected choice index (default to 0 if not set) + const selectedChoiceIndex = formValues[field.key] !== undefined ? Number(formValues[field.key]) : 0; - const selectedChoice = field.choices[selectedChoiceIndex]; + const selectedChoice = field.choices[selectedChoiceIndex]; - if (selectedChoice && selectedChoice?.properties) { - Object.entries(selectedChoice.properties).forEach(([propKey, propValue]) => { - // Preserve existing form values if they exist, otherwise use propValue.value - if (formValues[propKey] !== undefined && formValues[propKey] !== "") { - defaultValues[propKey] = formValues[propKey]; - } else if (propValue?.value !== undefined && defaultValues[propKey] === undefined) { - defaultValues[propKey] = propValue.value; - } + if (selectedChoice && selectedChoice?.properties) { + Object.entries(selectedChoice.properties).forEach(([propKey, propValue]) => { + // Preserve existing form values if they exist, otherwise use propValue.value + if (formValues[propKey] !== undefined && formValues[propKey] !== "") { + defaultValues[propKey] = formValues[propKey]; + } else if (propValue?.value !== undefined && defaultValues[propKey] === undefined) { + defaultValues[propKey] = propValue.value; + } - diagnosticsMap.push({ key: propKey, diagnostics: [] }); - }); + diagnosticsMap.push({ key: propKey, diagnostics: [] }); + }); + } } - } - diagnosticsMap.push({ key: field.key, diagnostics: [] }); - }}); + diagnosticsMap.push({ key: field.key, diagnostics: [] }); + } + }); setDiagnosticsInfo(diagnosticsMap); reset(defaultValues); @@ -1031,112 +1034,51 @@ export const Form = forwardRef((props: FormProps) => { {actionButton && <S.ActionButtonContainer>{actionButton}</S.ActionButtonContainer>} {infoLabel && !compact && ( <S.MarkdownWrapper> - <S.MarkdownContainer ref={markdownRef} isExpanded={isMarkdownExpanded}> - <ReactMarkdown>{stripHtmlTags(infoLabel)}</ReactMarkdown> - </S.MarkdownContainer> - {markdownRef.current && markdownRef.current.scrollHeight > 200 && ( - <S.ButtonContainer> - <LinkButton - onClick={handleShowMoreClick} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={isMarkdownExpanded ? "chevron-up" : "chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - {isMarkdownExpanded ? "Show Less" : "Show More"} - </LinkButton> - </S.ButtonContainer> - )} - </S.MarkdownWrapper> - )} - {!preserveOrder && !compact && ( - <FormDescription formFields={formFields} selectedNode={selectedNode} /> - )} + <S.MarkdownContainer ref={markdownRef} isExpanded={isMarkdownExpanded}> + <ReactMarkdown>{stripHtmlTags(infoLabel)}</ReactMarkdown> + </S.MarkdownContainer> + {markdownRef.current && markdownRef.current.scrollHeight > 200 && ( + <S.ButtonContainer> + <LinkButton + onClick={handleShowMoreClick} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={isMarkdownExpanded ? "chevron-up" : "chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + {isMarkdownExpanded ? "Show Less" : "Show More"} + </LinkButton> + </S.ButtonContainer> + )} + </S.MarkdownWrapper> + )} + {!preserveOrder && !compact && ( + <FormDescription formFields={formFields} selectedNode={selectedNode} /> + )} - {/* + {/* * Two rendering modes based on preserveOrder prop: * * 1. preserveOrder = true: Render all fields in original order from formFields array * 2. preserveOrder = false: Render name and type fields at the bottom, and rest at top */} - <S.CategoryRow bottomBorder={false}> - {(() => { - const fieldsToRender = formFields - .sort((a, b) => b.groupNo - a.groupNo) - .filter((field) => field.type !== "VIEW"); - - const renderedComponents: React.ReactNode[] = []; - let renderedFieldCount = 0; - const injectedIndices = new Set<number>(); // Track which injections have been added - - fieldsToRender.forEach((field) => { - // Check if we need to inject components before this field - if (injectedComponents) { - injectedComponents.forEach((injected) => { - if (injected.index === renderedFieldCount && !injectedIndices.has(injected.index)) { - renderedComponents.push( - <React.Fragment key={`injected-${injected.index}`}> - {injected.component} - </React.Fragment> - ); - injectedIndices.add(injected.index); - } - }); - } - - if (field.advanced || field.hidden) { - return; - } - // When preserveOrder is false, skip prioritized fields (they'll be rendered at bottom) - if (!preserveOrder && isPrioritizedField(field)) { - return; - } - - // Skip if field is in a section - if (sections && assignFieldsToSections) { - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - if (isInSection) return; - } - - const updatedField = updateFormFieldWithImports(field, formImports); - renderedComponents.push( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - selectedNode={selectedNode} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - openSubPanel={handleOpenSubPanel} - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - autoFocus={firstEditableFieldIndex === formFields.indexOf(updatedField) && !hideSaveButton} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - setSubComponentEnabled={setIsSubComponentEnabled} - handleNewTypeSelected={handleNewTypeSelected} - onBlur={handleOnBlur} - isContextTypeEditorSupported={updatedField?.isContextTypeSupported} - openFormTypeEditor={ - openFormTypeEditor && - ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) - } - /> - {updatedField.key === "scope" && scopeFieldAddon} - </S.Row> - ); - renderedFieldCount++; - }); - - // Check if we need to inject components after all fields + <S.CategoryRow bottomBorder={false}> + {(() => { + const fieldsToRender = formFields + .sort((a, b) => b.groupNo - a.groupNo) + .filter((field) => field.type !== "VIEW"); + + const renderedComponents: React.ReactNode[] = []; + let renderedFieldCount = 0; + const injectedIndices = new Set<number>(); // Track which injections have been added + + fieldsToRender.forEach((field) => { + // Check if we need to inject components before this field if (injectedComponents) { injectedComponents.forEach((injected) => { - if (injected.index >= renderedFieldCount && !injectedIndices.has(injected.index)) { + if (injected.index === renderedFieldCount && !injectedIndices.has(injected.index)) { renderedComponents.push( <React.Fragment key={`injected-${injected.index}`}> {injected.component} @@ -1147,164 +1089,194 @@ export const Form = forwardRef((props: FormProps) => { }); } - return renderedComponents; - })()} - </S.CategoryRow> + if (field.advanced || field.hidden) { + return; + } + // When preserveOrder is false, skip prioritized fields (they'll be rendered at bottom) + if (!preserveOrder && isPrioritizedField(field)) { + return; + } - {/* Render configured sections */} - {sections && assignFieldsToSections && ( - <S.CategoryRow bottomBorder={false}> - {sections.sections - .filter(section => { - const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; - const hasFields = fields.length > 0; - const meetsCondition = !section.renderCondition || - section.renderCondition(getValues()); - return hasFields && meetsCondition; - }) - .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) - .map(section => { - const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; - const isCollapsed = sectionCollapseState.get(section.id) ?? section.defaultCollapsed ?? true; - const isCollapsible = section.isCollapsible !== false; - return ( - <React.Fragment key={section.id}> - <div style={{display: "flex", flexDirection: "column", width: "100%", borderRadius: "4px", border: "1px solid var(--vscode-panel-border)"}}> - <S.HoverableSection onClick={() => handleSectionToggle(section.id, !isCollapsed)}> - <div style={{ display: "flex", flexDirection: "column", gap: 2 }}> - <Typography variant="body2" sx={{ fontWeight: 500 }}> - {section.title} - </Typography> - <Typography variant="body2" sx={{ opacity: 0.7, fontSize: 11 }}> - {section.description} - </Typography> - </div> - {isCollapsible && ( - <S.ButtonContainer> - {isCollapsed && ( - <Codicon - name={"chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - )} - {!isCollapsed && ( - <Codicon - name={"chevron-up"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - )} - </S.ButtonContainer> - )} - </S.HoverableSection> - {!isCollapsed && (<S.Row style={{flexDirection: "column", gap: "20px", padding: "8px 16px 28px", borderTop: "1px solid var(--vscode-panel-border)"}}> - {fields.map(field => { - const updatedField = updateFormFieldWithImports(field, formImports); - return ( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - selectedNode={selectedNode} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - openSubPanel={handleOpenSubPanel} - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - setSubComponentEnabled={setIsSubComponentEnabled} - handleNewTypeSelected={handleNewTypeSelected} - onBlur={handleOnBlur} - isContextTypeEditorSupported={updatedField?.isContextTypeSupported} - openFormTypeEditor={ - openFormTypeEditor && - ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) - } - /> - {updatedField.key === "scope" && scopeFieldAddon} - </S.Row> - ); - })} - </S.Row>)} - </div> + // Skip if field is in a section + if (sections && assignFieldsToSections) { + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + if (isInSection) return; + } + + const updatedField = updateFormFieldWithImports(field, formImports); + renderedComponents.push( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + selectedNode={selectedNode} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + openSubPanel={handleOpenSubPanel} + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + autoFocus={firstEditableFieldIndex === formFields.indexOf(updatedField) && !hideSaveButton} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + setSubComponentEnabled={setIsSubComponentEnabled} + handleNewTypeSelected={handleNewTypeSelected} + onBlur={handleOnBlur} + isContextTypeEditorSupported={updatedField?.isContextTypeSupported} + openFormTypeEditor={ + openFormTypeEditor && + ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) + } + /> + {updatedField.key === "scope" && scopeFieldAddon} + </S.Row> + ); + renderedFieldCount++; + }); + + // Check if we need to inject components after all fields + if (injectedComponents) { + injectedComponents.forEach((injected) => { + if (injected.index >= renderedFieldCount && !injectedIndices.has(injected.index)) { + renderedComponents.push( + <React.Fragment key={`injected-${injected.index}`}> + {injected.component} </React.Fragment> ); - })} - </S.CategoryRow> - )} + injectedIndices.add(injected.index); + } + }); + } - <S.CategoryRow bottomBorder={false}> - {hasAdvanceFieldsNotInSections && ( - <S.Row> - {optionalFieldsTitle} - <S.ButtonContainer> - {!showAdvancedOptions && ( - <LinkButton - onClick={handleOnShowAdvancedOptions} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={"chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - Expand - </LinkButton> - )} - {showAdvancedOptions && ( - <LinkButton - onClick={handleOnHideAdvancedOptions} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={"chevron-up"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - />Collapse - </LinkButton> - )} - </S.ButtonContainer> - </S.Row> - )} - {hasAdvanceFieldsNotInSections && - showAdvancedOptions && - formFields.map((field) => { - if (field.advanced && !field.hidden) { - // Skip if field is in a custom section - if (sections && assignFieldsToSections) { - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - if (isInSection) return null; - } + return renderedComponents; + })()} + </S.CategoryRow> - const updatedField = updateFormFieldWithImports(field, formImports); - return ( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - onBlur={handleOnBlur} - /> - </S.Row> - ); - } - return null; + {/* Render configured sections */} + {sections && assignFieldsToSections && ( + <S.CategoryRow bottomBorder={false}> + {sections.sections + .filter(section => { + const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; + const hasFields = fields.length > 0; + const meetsCondition = !section.renderCondition || + section.renderCondition(getValues()); + return hasFields && meetsCondition; + }) + .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) + .map(section => { + const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; + const isCollapsed = sectionCollapseState.get(section.id) ?? section.defaultCollapsed ?? true; + const isCollapsible = section.isCollapsible !== false; + return ( + <React.Fragment key={section.id}> + <div style={{ display: "flex", flexDirection: "column", width: "100%", borderRadius: "4px", border: "1px solid var(--vscode-panel-border)" }}> + <S.HoverableSection onClick={() => handleSectionToggle(section.id, !isCollapsed)}> + <div style={{ display: "flex", flexDirection: "column", gap: 2 }}> + <Typography variant="body2" sx={{ fontWeight: 500 }}> + {section.title} + </Typography> + <Typography variant="body2" sx={{ opacity: 0.7, fontSize: 11 }}> + {section.description} + </Typography> + </div> + {isCollapsible && ( + <S.ButtonContainer> + {isCollapsed && ( + <Codicon + name={"chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + )} + {!isCollapsed && ( + <Codicon + name={"chevron-up"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + )} + </S.ButtonContainer> + )} + </S.HoverableSection> + {!isCollapsed && (<S.Row style={{ flexDirection: "column", gap: "20px", padding: "8px 16px 28px", borderTop: "1px solid var(--vscode-panel-border)" }}> + {fields.map(field => { + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + selectedNode={selectedNode} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + openSubPanel={handleOpenSubPanel} + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + setSubComponentEnabled={setIsSubComponentEnabled} + handleNewTypeSelected={handleNewTypeSelected} + onBlur={handleOnBlur} + isContextTypeEditorSupported={updatedField?.isContextTypeSupported} + openFormTypeEditor={ + openFormTypeEditor && + ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) + } + /> + {updatedField.key === "scope" && scopeFieldAddon} + </S.Row> + ); + })} + </S.Row>)} + </div> + </React.Fragment> + ); })} - {hasAdvanceFieldsNotInSections && - showAdvancedOptions && - advancedChoiceFields.map((field) => { + </S.CategoryRow> + )} + + <S.CategoryRow bottomBorder={false}> + {hasAdvanceFieldsNotInSections && ( + <S.Row> + {optionalFieldsTitle} + <S.ButtonContainer> + {!showAdvancedOptions && ( + <LinkButton + onClick={handleOnShowAdvancedOptions} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={"chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + Expand + </LinkButton> + )} + {showAdvancedOptions && ( + <LinkButton + onClick={handleOnHideAdvancedOptions} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={"chevron-up"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + />Collapsed + </LinkButton> + )} + </S.ButtonContainer> + </S.Row> + )} + {hasAdvanceFieldsNotInSections && + showAdvancedOptions && + formFields.map((field) => { + if (field.advanced && !field.hidden) { // Skip if field is in a custom section if (sections && assignFieldsToSections) { const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) @@ -1330,57 +1302,88 @@ export const Form = forwardRef((props: FormProps) => { /> </S.Row> ); - })} - </S.CategoryRow> + } + return null; + })} + {hasAdvanceFieldsNotInSections && + showAdvancedOptions && + advancedChoiceFields.map((field) => { + // Skip if field is in a custom section + if (sections && assignFieldsToSections) { + const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) + .some(fields => fields.find(f => f.key === field.key)); + if (isInSection) return null; + } - {!preserveOrder && (variableField || typeField || targetTypeField) && ( - <S.CategoryRow topBorder={!compact && hasParameters}> - {variableField && ( - <EditorFactory - field={variableField} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - onBlur={handleOnBlur} - /> - )} - {typeField && !isInferredReturnType && ( + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + onBlur={handleOnBlur} + /> + </S.Row> + ); + })} + </S.CategoryRow> + + {!preserveOrder && (variableField || typeField || targetTypeField) && ( + <S.CategoryRow topBorder={!compact && hasParameters}> + {variableField && ( + <EditorFactory + field={variableField} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + onBlur={handleOnBlur} + /> + )} + {typeField && !isInferredReturnType && ( + <EditorFactory + field={typeField} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, typeField, newType)) + } + handleOnFieldFocus={handleOnFieldFocus} + handleOnTypeChange={handleOnTypeChange} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleNewTypeSelected={handleNewTypeSelected} + onBlur={handleOnBlur} + + /> + )} + {targetTypeField && !targetTypeField.advanced && ( + <> <EditorFactory - field={typeField} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, typeField, newType)) - } + field={targetTypeField} handleOnFieldFocus={handleOnFieldFocus} - handleOnTypeChange={handleOnTypeChange} recordTypeFields={recordTypeFields} onIdentifierEditingStateChange={handleIdentifierEditingStateChange} handleNewTypeSelected={handleNewTypeSelected} + handleOnTypeChange={handleOnTypeChange} onBlur={handleOnBlur} - /> - )} - {targetTypeField && !targetTypeField.advanced && ( - <> - <EditorFactory - field={targetTypeField} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleNewTypeSelected={handleNewTypeSelected} - handleOnTypeChange={handleOnTypeChange} - onBlur={handleOnBlur} + {typeField && ( + <TypeHelperText + targetTypeField={targetTypeField} + typeField={typeField} /> - {typeField && ( - <TypeHelperText - targetTypeField={targetTypeField} - typeField={typeField} - /> - )} - </> - )} - </S.CategoryRow> - )} + )} + </> + )} + </S.CategoryRow> + )} {concertMessage && ( <S.ConcertContainer> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index b8c91f3b334..b81764e5a92 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -21,7 +21,7 @@ import { View, ViewContent } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { FormField, FormImports, FormValues, Parameter, FormSectionConfig } from "@wso2/ballerina-side-panel"; -import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType } from "@wso2/ballerina-core"; +import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType, EvalsetItem } from "@wso2/ballerina-core"; import { EVENT_TYPE } from "@wso2/ballerina-core"; import { TitleBar } from "../../../components/TitleBar"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; @@ -103,6 +103,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const [formTitle, setFormTitle] = useState<string>('Create New Test Case'); const [targetLineRange, setTargetLineRange] = useState<LineRange>(); const [dataProviderMode, setDataProviderMode] = useState<string>('function'); + const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); const handleFieldChange = (fieldKey: string, value: any, allValues: FormValues) => { if (fieldKey === 'dataProviderMode') { @@ -135,6 +136,10 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }); } + useEffect(() => { + loadEvalsets(); + }, []); + useEffect(() => { if (serviceType === 'UPDATE_TEST') { setFormTitle('Update Test Case'); @@ -147,6 +152,45 @@ export function TestFunctionForm(props: TestFunctionDefProps) { updateTargetLineRange(); }, [functionName]); + // Regenerate form fields when evalsetOptions changes + useEffect(() => { + if (testFunction && evalsetOptions.length > 0) { + let formFields = generateFormFields(testFunction); + + // Get the dataProviderMode value to initialize field visibility + const modeField = formFields.find(f => f.key === 'dataProviderMode'); + const mode = String(modeField?.value || 'function'); + setDataProviderMode(mode); + + // Set field visibility based on mode + formFields = formFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + }); + + setFormFields(formFields); + } + }, [evalsetOptions]); + + const loadEvalsets = async () => { + try { + const res = await rpcClient.getTestManagerRpcClient().getEvalsets({ projectPath }); + const options = res.evalsets.map((evalset: EvalsetItem) => ({ + value: evalset.filePath, + content: `${evalset.name} (${evalset.threadCount} thread${evalset.threadCount !== 1 ? 's' : ''})` + })); + setEvalsetOptions(options); + } catch (error) { + console.error('Failed to load evalsets:', error); + setEvalsetOptions([]); + } + }; + const loadFunction = async () => { const res = await rpcClient.getTestManagerRpcClient().getTestFunction({ functionName, filePath }); setTestFunction(res.function); @@ -275,11 +319,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { fields.push({ ...generateFieldFromProperty(field.originalName, field), type: 'SINGLE_SELECT', - itemOptions: [ - { value: 'evalset-1.json', content: 'Evalset 1' }, - { value: 'evalset-2.json', content: 'Evalset 2' }, - { value: 'evalset-3.json', content: 'Evalset 3' } - ] + itemOptions: evalsetOptions }); continue; } @@ -329,6 +369,14 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const generateFieldFromProperty = (key: string, property: ValueProperty): FormField => { const fieldType = getPrimaryInputType(property.types)?.fieldType; + + // Convert decimal (0-1) to percentage (0-100) for minPassRate display + let displayValue = property.value; + if (key === 'minPassRate' && fieldType === 'SLIDER') { + const decimalValue = parseFloat(property.value) || 1; + displayValue = String(Math.round(decimalValue * 100)); + } + const baseField: FormField = { key: key, label: property.metadata.label, @@ -338,7 +386,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { advanced: property.advanced, enabled: true, documentation: property.metadata.description, - value: property.value, + value: displayValue, types: [{ fieldType: fieldType, selected: false }] }; @@ -416,7 +464,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { field.value = formValues['runs'] || "1"; } if (field.originalName == 'minPassRate') { - field.value = formValues['minPassRate'] || "100"; + // Convert percentage (0-100) to decimal (0-1) + const percentageValue = formValues['minPassRate'] || 100; + field.value = String(Number(percentageValue) / 100); } if (field.originalName == 'dataProviderMode') { field.value = formValues['dataProviderMode'] || "function"; @@ -585,7 +635,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }, types: [{ fieldType: "SLIDER", selected: false }], originalName: "minPassRate", - value: "100", + value: "1.0", optional: true, editable: true, advanced: true From 36deadbdc0753d7c23015ba3a983f3f98ffef586 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 12:40:49 +0530 Subject: [PATCH 189/247] Add seperate view component for AI Evaluations --- .../src/interfaces/constants.ts | 1 + .../ballerina-core/src/state-machine-types.ts | 1 + .../ballerina-extension/package.json | 37 +- .../src/features/test-explorer/commands.ts | 34 +- .../ballerina-visualizer/src/MainPanel.tsx | 13 +- .../src/views/BI/AIEvaluationForm/index.tsx | 748 ++++++++++++++++++ .../src/views/BI/index.tsx | 1 + 7 files changed, 818 insertions(+), 17 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts index 41ed5834e5d..913bc734028 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts @@ -48,6 +48,7 @@ export const BI_COMMANDS = { ADD_DATA_MAPPER: 'BI.project-explorer.add-data-mapper', BI_EDIT_TEST_FUNCTION: 'BI.test.edit.function', BI_ADD_TEST_FUNCTION: 'BI.test.add.function', + BI_ADD_AI_EVALUATION: 'BI.test.add.ai.evaluation', BI_EDIT_TEST_FUNCTION_DEF: 'BI.test.edit.function.def', ADD_NATURAL_FUNCTION: 'BI.project-explorer.add-natural-function', TOGGLE_TRACE_LOGS: 'BI.toggle.trace.logs', diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index a5ffda550b7..945517d7d6e 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -90,6 +90,7 @@ export enum MACHINE_VIEW { BIFunctionForm = "Add Function SKIP", BINPFunctionForm = "Add Natural Function SKIP", BITestFunctionForm = "Add Test Function SKIP", + BIAIEvaluationForm = "AI Evaluation", BIServiceWizard = "Service Wizard SKIP", BIServiceConfigView = "Service Config View", BIListenerConfigView = "Listener Config View", diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index b08d6186a55..029babd46ee 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -600,11 +600,17 @@ }, { "command": "BI.test.add.function", - "title": "Add test case", + "title": "Add New Test", "icon": "$(add)", "category": "BI", "enablement": "isSupportedProject" }, + { + "command": "BI.test.add.ai.evaluation", + "title": "Add AI Evaluation", + "category": "BI", + "enablement": "isSupportedProject" + }, { "command": "BI.view.typeDiagram", "title": "Type Diagram", @@ -784,6 +790,11 @@ "view": "testing", "contents": "[Add Unit Test](command:BI.test.add.function)", "when": "isBIProject || isBallerinaProject" + }, + { + "view": "testing", + "contents": "[Add AI Evaluation](command:BI.test.add.ai.evaluation)", + "when": "isBIProject || isBallerinaProject" } ], "viewsContainers": { @@ -801,6 +812,13 @@ } ] }, + "submenus": [ + { + "id": "BI.test.add.submenu", + "label": "Add Test", + "icon": "$(add)" + } + ], "menus": { "testing/item/context": [ { @@ -812,11 +830,6 @@ "command": "BI.test.edit.function", "group": "inline", "when": "testId not in testGroups" - }, - { - "command": "BI.test.add.function", - "group": "inline", - "when": "testId in testGroups" } ], "view/title": [ @@ -826,7 +839,7 @@ "group": "navigation" }, { - "command": "BI.test.add.function", + "submenu": "BI.test.add.submenu", "when": "(isBIProject || isBallerinaProject) && view == workbench.view.testing", "group": "navigation" }, @@ -843,6 +856,16 @@ "title": "Clear Traces" } ], + "BI.test.add.submenu": [ + { + "command": "BI.test.add.function", + "group": "1@1" + }, + { + "command": "BI.test.add.ai.evaluation", + "group": "1@2" + } + ], "editor/title": [ { "command": "ballerina.project.run", diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index fc97feb883a..93bb2dca0c8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -77,6 +77,22 @@ export function activateEditBiTest() { }); }); + commands.registerCommand(BI_COMMANDS.BI_ADD_AI_EVALUATION, async (entry?: TestItem) => { + const projectPath = await findProjectPath(entry?.uri?.fsPath); + + if (!projectPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + + const fileUri = path.resolve(projectPath, `tests`, `tests.bal`); + ensureFileExists(fileUri); + openView(EVENT_TYPE.OPEN_VIEW, { + view: MACHINE_VIEW.BIAIEvaluationForm, + documentUri: fileUri, identifier: '', serviceType: 'ADD_NEW_TEST' + }); + }); + commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION_DEF, async (entry: TestItem) => { const projectPath = await findProjectPath(entry.uri?.fsPath); @@ -110,15 +126,15 @@ export function activateEditBiTest() { } async function ensureFileExists(filePath: string) { - try { - await fs.access(filePath); - } catch { - // Ensure the directory exists - await fs.mkdir(path.dirname(filePath), { recursive: true }); - - await fs.writeFile(filePath, '', 'utf8'); - console.log('File created:', filePath); - } + try { + await fs.access(filePath); + } catch { + // Ensure the directory exists + await fs.mkdir(path.dirname(filePath), { recursive: true }); + + await fs.writeFile(filePath, '', 'utf8'); + console.log('File created:', filePath); + } } async function findProjectPath(filePath?: string): Promise<string | undefined> { diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 8bd1eb7b52b..344f9e5d22c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -46,7 +46,8 @@ import { PopupMessage, FunctionForm, SetupView, - TestFunctionForm + TestFunctionForm, + AIEvaluationForm } from "./views/BI"; import { handleRedo, handleUndo } from "./utils/utils"; import { STKindChecker } from "@wso2/syntax-tree"; @@ -600,6 +601,16 @@ const MainPanel = () => { serviceType={value?.serviceType} />); break; + case MACHINE_VIEW.BIAIEvaluationForm: + setViewComponent( + <AIEvaluationForm + key={value?.identifier} // Force remount when switching between different tests + projectPath={value.projectPath} + functionName={value?.identifier} + filePath={value?.documentUri} + serviceType={value?.serviceType} + />); + break; case MACHINE_VIEW.ViewConfigVariables: setViewComponent( <ViewConfigurableVariables diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx new file mode 100644 index 00000000000..3e55df294fa --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -0,0 +1,748 @@ +/** + * 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 { useEffect, useState } from "react"; +import { View, ViewContent } from "@wso2/ui-toolkit"; +import styled from "@emotion/styled"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { FormField, FormImports, FormValues, Parameter, FormSectionConfig } from "@wso2/ballerina-side-panel"; +import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType, EvalsetItem } from "@wso2/ballerina-core"; +import { EVENT_TYPE } from "@wso2/ballerina-core"; +import { TitleBar } from "../../../components/TitleBar"; +import { TopNavigationBar } from "../../../components/TopNavigationBar"; +import { FormHeader } from "../../../components/FormHeader"; +import FormGeneratorNew from "../Forms/FormGeneratorNew"; +import { getImportsForProperty } from "../../../utils/bi"; + +const FormContainer = styled.div` + display: flex; + flex-direction: column; + max-width: 600px; + margin-bottom: 20px; + + .side-panel-body { + overflow: visible; + overflow-y: none; + } + + .radio-button-group { + margin-top: 8px; + margin-bottom: -12px; + } + + .dropdown-container { + margin-top: 12px; + } +`; + +const Container = styled.div` + display: "flex"; + flex-direction: "column"; + gap: 10; +`; + +const TEST_FORM_SECTIONS: FormSectionConfig = { + sections: [ + { + id: 'data-provider', + title: 'Data Provider', + isCollapsible: true, + defaultCollapsed: true, + order: 1, + description: 'Configure test data sources', + fieldKeys: ['dataProviderMode', 'dataProvider', 'evalSetFile'] + }, + { + id: 'repetition', + title: 'Repetition', + isCollapsible: true, + defaultCollapsed: true, + order: 2, + description: 'Configure run frequency and pass criteria', + fieldKeys: ['runs', 'minPassRate'] + }, + { + id: 'execution-organization', + title: 'Execution & Organization', + isCollapsible: true, + defaultCollapsed: true, + order: 3, + description: 'Manage test groups, dependencies, and lifecycle hooks', + fieldKeys: ['groups', 'dependsOn', 'before', 'after'] + } + ] +}; + +interface TestFunctionDefProps { + projectPath: string; + functionName?: string; + filePath?: string; + serviceType?: string; +} + +export function TestFunctionForm(props: TestFunctionDefProps) { + const { projectPath, functionName, filePath, serviceType } = props; + const { rpcClient } = useRpcContext(); + const [formFields, setFormFields] = useState<FormField[]>([]); + const [testFunction, setTestFunction] = useState<TestFunction>(); + const [formTitle, setFormTitle] = useState<string>('Create New AI Evaluation'); + const [targetLineRange, setTargetLineRange] = useState<LineRange>(); + const [dataProviderMode, setDataProviderMode] = useState<string>('function'); + const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); + + const handleFieldChange = (fieldKey: string, value: any, allValues: FormValues) => { + if (fieldKey === 'dataProviderMode') { + setDataProviderMode(value); + updateFieldVisibility(value); + } + }; + + const updateFieldVisibility = (mode: string) => { + setFormFields(prevFields => prevFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + })); + }; + + const updateTargetLineRange = () => { + rpcClient + .getBIDiagramRpcClient() + .getEndOfFile({ filePath }) + .then((linePosition) => { + setTargetLineRange({ + startLine: linePosition, + endLine: linePosition + }); + }); + } + + useEffect(() => { + loadEvalsets(); + }, []); + + useEffect(() => { + if (serviceType === 'UPDATE_TEST') { + setFormTitle('Update AI Evaluation'); + loadFunction(); + } else { + setFormTitle('Create New AI Evaluation'); + loadEmptyForm(); + } + + updateTargetLineRange(); + }, [functionName]); + + // Regenerate form fields when evalsetOptions changes + useEffect(() => { + if (testFunction && evalsetOptions.length > 0) { + let formFields = generateFormFields(testFunction); + + // Get the dataProviderMode value to initialize field visibility + const modeField = formFields.find(f => f.key === 'dataProviderMode'); + const mode = String(modeField?.value || 'function'); + setDataProviderMode(mode); + + // Set field visibility based on mode + formFields = formFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + }); + + setFormFields(formFields); + } + }, [evalsetOptions]); + + const loadEvalsets = async () => { + try { + const res = await rpcClient.getTestManagerRpcClient().getEvalsets({ projectPath }); + const options = res.evalsets.map((evalset: EvalsetItem) => ({ + value: evalset.filePath, + content: `${evalset.name} (${evalset.threadCount} thread${evalset.threadCount !== 1 ? 's' : ''})` + })); + setEvalsetOptions(options); + } catch (error) { + console.error('Failed to load evalsets:', error); + setEvalsetOptions([]); + } + }; + + const loadFunction = async () => { + const res = await rpcClient.getTestManagerRpcClient().getTestFunction({ functionName, filePath }); + setTestFunction(res.function); + let formFields = generateFormFields(res.function); + + // Get the dataProviderMode value to initialize field visibility + const modeField = formFields.find(f => f.key === 'dataProviderMode'); + const mode = String(modeField?.value || 'function'); + setDataProviderMode(mode); + + // Set initial field visibility + formFields = formFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + }); + + setFormFields(formFields); + } + + const loadEmptyForm = async () => { + const emptyTestFunction = getEmptyTestFunctionModel(); + setTestFunction(emptyTestFunction); + let formFields = generateFormFields(emptyTestFunction); + + // Get the dataProviderMode value to initialize field visibility + const modeField = formFields.find(f => f.key === 'dataProviderMode'); + const mode = String(modeField?.value || 'function'); + setDataProviderMode(mode); + + // Set initial field visibility (default is 'function' mode) + formFields = formFields.map(field => { + if (field.key === 'dataProvider') { + return { ...field, hidden: mode !== 'function' }; + } + if (field.key === 'evalSetFile') { + return { ...field, hidden: mode !== 'evalSet' }; + } + return field; + }); + + setFormFields(formFields); + } + + const onFormSubmit = async (data: FormValues, formImports: FormImports) => { + const updatedTestFunction = fillFunctionModel(data, formImports); + if (serviceType === 'UPDATE_TEST') { + await rpcClient.getTestManagerRpcClient().updateTestFunction({ function: updatedTestFunction, filePath }); + } else { + await rpcClient.getTestManagerRpcClient().addTestFunction({ function: updatedTestFunction, filePath }); + } + const res = await rpcClient.getTestManagerRpcClient().getTestFunction( + { functionName: updatedTestFunction.functionName.value, filePath }); + const nodePosition = { + startLine: res.function.codedata.lineRange.startLine.line, + startColumn: res.function.codedata.lineRange.startLine.offset, + endLine: res.function.codedata.lineRange.endLine.line, + endColumn: res.function.codedata.lineRange.endLine.offset + }; + rpcClient.getVisualizerRpcClient().openView( + { type: EVENT_TYPE.OPEN_VIEW, location: { position: nodePosition, documentUri: filePath } }) + }; + + // Helper function to modify and set the visual information + const handleParamChange = (param: Parameter) => { + const name = `${param.formValues['variable']}`; + const type = `${param.formValues['type']}`; + const defaultValue = Object.keys(param.formValues).indexOf('defaultable') > -1 && `${param.formValues['defaultable']}`; + let value = `${type} ${name}`; + if (defaultValue) { + value += ` = ${defaultValue}`; + } + return { + ...param, + key: name, + value: value + } + }; + + const generateFormFields = (testFunction: TestFunction): FormField[] => { + const fields: FormField[] = []; + if (testFunction.functionName) { + fields.push(generateFieldFromProperty('functionName', testFunction.functionName)); + } + if (testFunction.parameters) { + fields.push({ + key: `params`, + label: 'Parameters', + type: 'PARAM_MANAGER', + optional: true, + editable: true, + enabled: true, + advanced: true, + hidden: true, + documentation: '', + value: '', + paramManagerProps: { + paramValues: generateParamFields(testFunction.parameters), + formFields: paramFiels, + handleParameter: handleParamChange + }, + types: [{ fieldType: "PARAM_MANAGER", selected: false }] + }); + } + if (testFunction.annotations) { + const configAnnotation = getTestConfigAnnotation(testFunction.annotations); + if (configAnnotation && configAnnotation.fields) { + for (const field of configAnnotation.fields) { + if (field.originalName === 'dataProviderMode') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'RADIO_GROUP', + itemOptions: [ + { value: 'function', content: 'Use a custom function' }, + { value: 'evalSet', content: 'Use an Evalset' } + ] + }); + continue; + } + + if (field.originalName === 'evalSetFile') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'SINGLE_SELECT', + itemOptions: evalsetOptions + }); + continue; + } + + fields.push(generateFieldFromProperty(field.originalName, field)); + } + } + } + return fields; + } + + const getTestConfigAnnotation = (annotations: Annotation[]): Annotation | undefined => { + for (const annotation of annotations) { + if (annotation.name === 'Config') { + return annotation; + } + } + return; + } + + const generateParamFields = (parameters: FunctionParameter[]): Parameter[] => { + const params: Parameter[] = []; + let id = 0; + for (const param of parameters) { + const key = param.variable.value; + const type = param.type.value; + + const value = `${type} ${key}`; + params.push({ + id: id, + formValues: { + variable: key, + type: type, + defaultable: param.defaultValue ? param.defaultValue.value : '' + }, + key: key, + value: value, + icon: '', + identifierEditable: param.variable?.editable, + identifierRange: param.variable?.codedata?.lineRange + }); + + id++; + } + return params + } + + const generateFieldFromProperty = (key: string, property: ValueProperty): FormField => { + const fieldType = getPrimaryInputType(property.types)?.fieldType; + + // Convert decimal (0-1) to percentage (0-100) for minPassRate display + let displayValue = property.value; + if (key === 'minPassRate' && fieldType === 'SLIDER') { + const decimalValue = parseFloat(property.value) || 1; + displayValue = String(Math.round(decimalValue * 100)); + } + + const baseField: FormField = { + key: key, + label: property.metadata.label, + type: fieldType, + optional: property.optional, + editable: property.editable, + advanced: property.advanced, + enabled: true, + documentation: property.metadata.description, + value: displayValue, + types: [{ fieldType: fieldType, selected: false }] + }; + + // Add slider-specific configuration for minPassRate + if (key === 'minPassRate' && fieldType === 'SLIDER') { + baseField.sliderProps = { + min: 0, + max: 100, + step: 1, + showValue: true, + showMarkers: true, + valueFormatter: (value: number) => `${value}%` + }; + } + + return baseField; + } + + const fillFunctionModel = (formValues: FormValues, formImports: FormImports): TestFunction => { + let tmpTestFunction = testFunction; + if (!tmpTestFunction) { + tmpTestFunction = {}; + } + + if (formValues['functionName']) { + tmpTestFunction.functionName.value = formValues['functionName']; + } + + if (formValues['returnType']) { + tmpTestFunction.returnType.value = formValues['returnType']; + tmpTestFunction.returnType.imports = getImportsForProperty('returnType', formImports); + } + + if (formValues['params']) { + const params = formValues['params']; + const paramList: FunctionParameter[] = []; + for (const param of params) { + const paramFormValues = param.formValues; + const variable = paramFormValues['variable']; + const type = paramFormValues['type']; + const typeImports = getImportsForProperty('params', formImports); + const defaultValue = paramFormValues['defaultable']; + let emptyParam = getEmptyParamModel(); + emptyParam.variable.value = variable; + emptyParam.type.value = type; + emptyParam.type.imports = typeImports; + emptyParam.defaultValue.value = defaultValue; + paramList.push(emptyParam); + } + tmpTestFunction.parameters = paramList; + } + + let annots = tmpTestFunction.annotations; + for (const annot of annots) { + if (annot.name == 'Config') { + let configAnnot = annot; + let fields = configAnnot.fields; + for (const field of fields) { + if (field.originalName == 'groups') { + field.value = formValues['groups']; + } + if (field.originalName == 'enabled') { + field.value = formValues['enabled']; + } + if (field.originalName == 'dependsOn') { + field.value = formValues['dependsOn'] || []; + } + if (field.originalName == 'before') { + field.value = formValues['before'] || ""; + } + if (field.originalName == 'after') { + field.value = formValues['after'] || ""; + } + if (field.originalName == 'runs') { + field.value = formValues['runs'] || "1"; + } + if (field.originalName == 'minPassRate') { + // Convert percentage (0-100) to decimal (0-1) + const percentageValue = formValues['minPassRate'] || 100; + field.value = String(Number(percentageValue) / 100); + } + if (field.originalName == 'dataProviderMode') { + field.value = formValues['dataProviderMode'] || "function"; + } + if (field.originalName == 'dataProvider') { + if (formValues['dataProviderMode'] === 'function') { + field.value = formValues['dataProvider'] || ""; + } else { + field.value = ""; + } + } + if (field.originalName == 'evalSetFile') { + if (formValues['dataProviderMode'] === 'evalSet') { + field.value = formValues['evalSetFile'] || ""; + } else { + field.value = ""; + } + } + } + } + } + + return tmpTestFunction; + } + + const getEmptyParamModel = (): FunctionParameter => { + return { + type: { + value: "string", + optional: false, + editable: true, + advanced: false, + types: [{ fieldType: "TYPE", selected: false }] + }, + variable: { + value: "b", + optional: false, + editable: true, + advanced: false, + types: [{ fieldType: "IDENTIFIER", selected: false }] + }, + defaultValue: { + value: "\"default\"", + optional: false, + editable: true, + advanced: false, + types: [{ fieldType: "EXPRESSION", selected: false }] + }, + optional: false, + editable: true, + advanced: false + } + + } + + const getEmptyTestFunctionModel = (): TestFunction => { + return { + functionName: { + metadata: { + label: "AI Evaluation Name", + description: "Name of the AI evaluation" + }, + value: "", + optional: false, + editable: true, + advanced: false, + types: [{ fieldType: "IDENTIFIER", selected: false }] + }, + returnType: { + metadata: { + label: "Return Type", + description: "Return type of the function" + }, + optional: true, + editable: true, + advanced: true, + types: [{ fieldType: "TYPE", selected: false }], + }, + parameters: [], + annotations: [ + { + metadata: { + label: "Config", + description: "AI Evaluation Configurations" + }, + org: "ballerina", + module: "test", + name: "Config", + fields: [ + { + metadata: { + label: "Enabled", + description: "Enable/Disable the test" + }, + originalName: "enabled", + value: true, + optional: true, + editable: true, + advanced: false, + types: [{ fieldType: "FLAG", selected: false }] + }, + { + metadata: { + label: "Groups", + description: "Groups to run" + }, + types: [{ fieldType: "EXPRESSION_SET", selected: false }], + originalName: "groups", + value: [], + optional: true, + editable: true, + advanced: false + }, + { + metadata: { + label: "Depends On", + description: "List of test function names that this test depends on" + }, + types: [{ fieldType: "EXPRESSION_SET", selected: false }], + originalName: "dependsOn", + value: [], + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Before Function", + description: "Function to execute before this test" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "before", + value: "", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "After Function", + description: "Function to execute after this test" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "after", + value: "", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Runs", + description: "Number of times to execute this test" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "runs", + value: "1", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Minimum Pass Rate (%)", + description: "Minimum percentage of runs that must pass (0-100)" + }, + types: [{ fieldType: "SLIDER", selected: false }], + originalName: "minPassRate", + value: "1.0", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "", + description: "Choose how to provide test data" + }, + types: [{ fieldType: "STRING", selected: false }], + originalName: "dataProviderMode", + value: "function", + optional: true, + editable: true, + advanced: false + }, + { + metadata: { + label: "Data Provider", + description: "Function that provides test data" + }, + types: [{ fieldType: "EXPRESSION", selected: false }], + originalName: "dataProvider", + value: "", + optional: true, + editable: true, + advanced: true + }, + { + metadata: { + label: "Evalset File", + description: "Select an evalset for test data" + }, + types: [{ fieldType: "STRING", selected: false }], + originalName: "evalSetFile", + value: "", + optional: true, + editable: true, + advanced: true + } + ] + } + ], + editable: true + } + } + + const paramFiels: FormField[] = [ + { + key: `variable`, + label: 'Name', + type: 'string', + optional: false, + editable: true, + enabled: true, + documentation: '', + value: '', + types: [{ fieldType: "IDENTIFIER", selected: false }] + }, + { + key: `type`, + label: 'Type', + type: 'TYPE', + optional: false, + editable: true, + enabled: true, + documentation: '', + value: '', + types: [{ fieldType: "TYPE", selected: false }] + }, + { + key: `defaultable`, + label: 'Default Value', + type: 'string', + optional: true, + advanced: true, + editable: true, + enabled: true, + documentation: '', + value: '', + types: [{ fieldType: "STRING", selected: false }] + } + ]; + + return ( + <View> + <TopNavigationBar projectPath={projectPath} /> + <TitleBar title="AI Evaluation" subtitle="Create a new AI evaluation for your integration" /> + <ViewContent padding> + <Container> + <FormHeader title={formTitle} /> + <FormContainer> + {targetLineRange && ( + <FormGeneratorNew + fileName={filePath} + fields={formFields} + sections={TEST_FORM_SECTIONS} + targetLineRange={targetLineRange} + onSubmit={onFormSubmit} + preserveFieldOrder={true} + onChange={handleFieldChange} + /> + )} + </FormContainer> + </Container> + </ViewContent> + </View> + ); +} + diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx index c0faa8747fc..b9475a979d4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx @@ -27,3 +27,4 @@ export { PopupMessage } from "./PopupMessage"; export { FunctionForm } from "./FunctionForm"; export { SetupView } from "./SetupView"; export { TestFunctionForm } from "./TestFunctionForm"; +export { TestFunctionForm as AIEvaluationForm } from "./AIEvaluationForm"; From 3f0be003e2c8b033850be649af0197ffd3646a15 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 9 Feb 2026 15:56:22 +0530 Subject: [PATCH 190/247] Update AI Evaluation form --- .../src/components/Form/index.tsx | 2 +- .../BI/AIEvaluationForm/CardSelector.tsx | 158 ++++++++++++++++++ .../src/views/BI/AIEvaluationForm/index.tsx | 95 ++++++++--- .../src/views/BI/TestFunctionForm/index.tsx | 135 +-------------- 4 files changed, 230 insertions(+), 160 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx 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 f8030ba8b86..564b0503dd6 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -1201,7 +1201,7 @@ export const Form = forwardRef((props: FormProps) => { </S.ButtonContainer> )} </S.HoverableSection> - {!isCollapsed && (<S.Row style={{ flexDirection: "column", gap: "20px", padding: "8px 16px 28px", borderTop: "1px solid var(--vscode-panel-border)" }}> + {!isCollapsed && (<S.Row style={{ flexDirection: "column", gap: "20px", padding: "12px 16px 28px", borderTop: "1px solid var(--vscode-panel-border)" }}> {fields.map(field => { const updatedField = updateFormFieldWithImports(field, formImports); return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx new file mode 100644 index 00000000000..7ae3aafa672 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx @@ -0,0 +1,158 @@ +/** + * 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 styled from "@emotion/styled"; +import { ReactNode } from "react"; + +interface CardOption { + value: string; + title: string; + description: string; + icon: ReactNode; +} + +interface CardSelectorProps { + options: CardOption[]; + value: string; + onChange: (value: string) => void; + title?: string; +} + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 4px; +`; + +const Title = styled.label` + font-size: 13px; + color: var(--vscode-foreground); + margin: 0; + margin-bottom: 4px; +`; + +const CardsContainer = styled.div` + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 16px; +`; + +const Card = styled.div<{ selected: boolean }>` + position: relative; + display: flex; + flex-direction: column; + gap: 12px; + padding: 20px; + border: 1px solid ${(props: { selected: boolean; }) => props.selected ? 'var(--vscode-button-background)' : 'var(--vscode-panel-border)'}; + border-radius: 8px; + background-color: ${(props: { selected: boolean; }) => props.selected ? 'color-mix(in srgb, var(--vscode-button-background) 5%, transparent)' : 'transparent'}; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + border-color: var(--vscode-button-background); + background-color: ${(props: { selected: boolean; }) => props.selected ? 'color-mix(in srgb, var(--vscode-button-background) 7%, transparent)' : 'var(--vscode-list-hoverBackground)'}; + } + + &:focus-within { + outline: 1px solid var(--vscode-contrastActiveBorder); + outline-offset: 2px; + } +`; + +const CardHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +`; + +const IconTitleWrapper = styled.div` + display: flex; + align-items: center; + gap: 12px; +`; + +const IconWrapper = styled.div<{ selected: boolean }>` + display: flex; + align-items: center; + justify-content: center; + padding: 8px; + border-radius: 8px; + background-color: ${(props: { selected: boolean; }) => props.selected ? 'var(--vscode-button-background)' : 'var(--vscode-editorWidget-background)'}; + color: ${(props: { selected: boolean; }) => props.selected ? 'var(--vscode-button-foreground)' : 'var(--vscode-description-foreground)'}; + flex-shrink: 0; +`; + +const CardTitle = styled.h4` + font-size: 13px; + font-weight: 600; + color: var(--vscode-foreground); + margin: 0; +`; + +const RadioButton = styled.input` + width: 16px; + height: 16px; + cursor: pointer; + accent-color: var(--vscode-contrastActiveBorder, #1976d2); +`; + +const Description = styled.p` + font-size: 13px; + color: var(--vscode-descriptionForeground); + margin: 0; +`; + +export function CardSelector({ options, value, onChange, title }: CardSelectorProps) { + return ( + <Container> + {title && <Title>{title}</Title>} + <CardsContainer> + {options.map((option) => { + const isSelected = value === option.value; + return ( + <Card + key={option.value} + selected={isSelected} + onClick={() => onChange(option.value)} + > + <CardHeader> + <IconTitleWrapper> + <IconWrapper selected={isSelected}> + {option.icon} + </IconWrapper> + <CardTitle>{option.title}</CardTitle> + </IconTitleWrapper> + <RadioButton + type="radio" + name="card-selector" + value={option.value} + checked={isSelected} + onChange={() => onChange(option.value)} + onClick={(e) => e.stopPropagation()} + /> + </CardHeader> + <Description>{option.description}</Description> + </Card> + ); + })} + </CardsContainer> + </Container> + ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index 3e55df294fa..a4a2dd2f30e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -17,7 +17,7 @@ */ import { useEffect, useState } from "react"; -import { View, ViewContent } from "@wso2/ui-toolkit"; +import { Icon, View, ViewContent } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { FormField, FormImports, FormValues, Parameter, FormSectionConfig } from "@wso2/ballerina-side-panel"; @@ -28,6 +28,7 @@ import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { FormHeader } from "../../../components/FormHeader"; import FormGeneratorNew from "../Forms/FormGeneratorNew"; import { getImportsForProperty } from "../../../utils/bi"; +import { CardSelector } from "./CardSelector"; const FormContainer = styled.div` display: flex; @@ -65,7 +66,7 @@ const TEST_FORM_SECTIONS: FormSectionConfig = { defaultCollapsed: true, order: 1, description: 'Configure test data sources', - fieldKeys: ['dataProviderMode', 'dataProvider', 'evalSetFile'] + fieldKeys: ['dataProviderMode', 'dataProvider'] }, { id: 'repetition', @@ -73,8 +74,8 @@ const TEST_FORM_SECTIONS: FormSectionConfig = { isCollapsible: true, defaultCollapsed: true, order: 2, - description: 'Configure run frequency and pass criteria', - fieldKeys: ['runs', 'minPassRate'] + description: 'Configure run frequency', + fieldKeys: ['runs'] }, { id: 'execution-organization', @@ -83,7 +84,7 @@ const TEST_FORM_SECTIONS: FormSectionConfig = { defaultCollapsed: true, order: 3, description: 'Manage test groups, dependencies, and lifecycle hooks', - fieldKeys: ['groups', 'dependsOn', 'before', 'after'] + fieldKeys: ['groups', 'dependsOn', 'before', 'after', 'enabled'] } ] }; @@ -102,10 +103,10 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const [testFunction, setTestFunction] = useState<TestFunction>(); const [formTitle, setFormTitle] = useState<string>('Create New AI Evaluation'); const [targetLineRange, setTargetLineRange] = useState<LineRange>(); - const [dataProviderMode, setDataProviderMode] = useState<string>('function'); + const [dataProviderMode, setDataProviderMode] = useState<string>('evalSet'); const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); - const handleFieldChange = (fieldKey: string, value: any, allValues: FormValues) => { + const handleFieldChange = (fieldKey: string, value: any) => { if (fieldKey === 'dataProviderMode') { setDataProviderMode(value); updateFieldVisibility(value); @@ -120,6 +121,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (field.key === 'evalSetFile') { return { ...field, hidden: mode !== 'evalSet' }; } + if (field.key === 'runs') { + return { ...field, hidden: mode === 'evalSet' }; + } return field; })); }; @@ -159,7 +163,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { // Get the dataProviderMode value to initialize field visibility const modeField = formFields.find(f => f.key === 'dataProviderMode'); - const mode = String(modeField?.value || 'function'); + const mode = String(modeField?.value || 'evalSet'); setDataProviderMode(mode); // Set field visibility based on mode @@ -170,6 +174,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (field.key === 'evalSetFile') { return { ...field, hidden: mode !== 'evalSet' }; } + if (field.key === 'runs') { + return { ...field, hidden: mode === 'evalSet' }; + } return field; }); @@ -182,7 +189,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const res = await rpcClient.getTestManagerRpcClient().getEvalsets({ projectPath }); const options = res.evalsets.map((evalset: EvalsetItem) => ({ value: evalset.filePath, - content: `${evalset.name} (${evalset.threadCount} thread${evalset.threadCount !== 1 ? 's' : ''})` + content: `${evalset.name}` })); setEvalsetOptions(options); } catch (error) { @@ -198,7 +205,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { // Get the dataProviderMode value to initialize field visibility const modeField = formFields.find(f => f.key === 'dataProviderMode'); - const mode = String(modeField?.value || 'function'); + const mode = String(modeField?.value || 'evalSet'); setDataProviderMode(mode); // Set initial field visibility @@ -209,6 +216,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (field.key === 'evalSetFile') { return { ...field, hidden: mode !== 'evalSet' }; } + if (field.key === 'runs') { + return { ...field, hidden: mode === 'evalSet' }; + } return field; }); @@ -222,10 +232,10 @@ export function TestFunctionForm(props: TestFunctionDefProps) { // Get the dataProviderMode value to initialize field visibility const modeField = formFields.find(f => f.key === 'dataProviderMode'); - const mode = String(modeField?.value || 'function'); + const mode = String(modeField?.value || 'evalSet'); setDataProviderMode(mode); - // Set initial field visibility (default is 'function' mode) + // Set initial field visibility (default is 'evalSet' mode) formFields = formFields.map(field => { if (field.key === 'dataProvider') { return { ...field, hidden: mode !== 'function' }; @@ -233,6 +243,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (field.key === 'evalSetFile') { return { ...field, hidden: mode !== 'evalSet' }; } + if (field.key === 'runs') { + return { ...field, hidden: mode === 'evalSet' }; + } return field; }); @@ -240,7 +253,12 @@ export function TestFunctionForm(props: TestFunctionDefProps) { } const onFormSubmit = async (data: FormValues, formImports: FormImports) => { - const updatedTestFunction = fillFunctionModel(data, formImports); + // Include the dataProviderMode from CardSelector state + const formData = { + ...data, + dataProviderMode: dataProviderMode + }; + const updatedTestFunction = fillFunctionModel(formData, formImports); if (serviceType === 'UPDATE_TEST') { await rpcClient.getTestManagerRpcClient().updateTestFunction({ function: updatedTestFunction, filePath }); } else { @@ -303,15 +321,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const configAnnotation = getTestConfigAnnotation(testFunction.annotations); if (configAnnotation && configAnnotation.fields) { for (const field of configAnnotation.fields) { + // Skip dataProviderMode - it will be rendered as CardSelector if (field.originalName === 'dataProviderMode') { - fields.push({ - ...generateFieldFromProperty(field.originalName, field), - type: 'RADIO_GROUP', - itemOptions: [ - { value: 'function', content: 'Use a custom function' }, - { value: 'evalSet', content: 'Use an Evalset' } - ] - }); continue; } @@ -559,7 +570,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { { metadata: { label: "Enabled", - description: "Enable/Disable the test" + description: "Enable/Disable the evaluation" }, originalName: "enabled", value: true, @@ -636,9 +647,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { types: [{ fieldType: "SLIDER", selected: false }], originalName: "minPassRate", value: "1.0", - optional: true, + optional: false, editable: true, - advanced: true + advanced: false }, { metadata: { @@ -672,9 +683,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { types: [{ fieldType: "STRING", selected: false }], originalName: "evalSetFile", value: "", - optional: true, + optional: false, editable: true, - advanced: true + advanced: false } ] } @@ -720,6 +731,26 @@ export function TestFunctionForm(props: TestFunctionDefProps) { } ]; + const cardOptions = [ + { + value: 'evalSet', + title: 'From Evalset', + description: 'Use conversation traces from an existing dataset to evaluate your agent.', + icon: <Icon name="bi-data-table" sx={{ fontSize: "20px", width: "20px", height: "20px" }} /> + }, + { + value: 'function', + title: 'Standalone/Custom', + description: 'Implement a fully custom logic to evaluate specific behaviors from scratch.', + icon: <Icon name="bi-config" sx={{ fontSize: "20px", width: "20px", height: "20px" }} /> + } + ]; + + const handleCardSelectorChange = (value: string) => { + setDataProviderMode(value); + updateFieldVisibility(value); + }; + return ( <View> <TopNavigationBar projectPath={projectPath} /> @@ -728,6 +759,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { <Container> <FormHeader title={formTitle} /> <FormContainer> + {targetLineRange && ( <FormGeneratorNew fileName={filePath} @@ -737,6 +769,17 @@ export function TestFunctionForm(props: TestFunctionDefProps) { onSubmit={onFormSubmit} preserveFieldOrder={true} onChange={handleFieldChange} + injectedComponents={[ + { + component: <CardSelector + title="How would you like to build this evaluation?" + options={cardOptions} + value={dataProviderMode} + onChange={handleCardSelectorChange} + />, + index: 2 + } + ]} /> )} </FormContainer> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index b81764e5a92..9ddc6ba7558 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -65,7 +65,7 @@ const TEST_FORM_SECTIONS: FormSectionConfig = { defaultCollapsed: true, order: 1, description: 'Configure test data sources', - fieldKeys: ['dataProviderMode', 'dataProvider', 'evalSetFile'] + fieldKeys: ['dataProvider'] }, { id: 'repetition', @@ -102,28 +102,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const [testFunction, setTestFunction] = useState<TestFunction>(); const [formTitle, setFormTitle] = useState<string>('Create New Test Case'); const [targetLineRange, setTargetLineRange] = useState<LineRange>(); - const [dataProviderMode, setDataProviderMode] = useState<string>('function'); const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); - const handleFieldChange = (fieldKey: string, value: any, allValues: FormValues) => { - if (fieldKey === 'dataProviderMode') { - setDataProviderMode(value); - updateFieldVisibility(value); - } - }; - - const updateFieldVisibility = (mode: string) => { - setFormFields(prevFields => prevFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - return field; - })); - }; - const updateTargetLineRange = () => { rpcClient .getBIDiagramRpcClient() @@ -156,23 +136,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { useEffect(() => { if (testFunction && evalsetOptions.length > 0) { let formFields = generateFormFields(testFunction); - - // Get the dataProviderMode value to initialize field visibility - const modeField = formFields.find(f => f.key === 'dataProviderMode'); - const mode = String(modeField?.value || 'function'); - setDataProviderMode(mode); - - // Set field visibility based on mode - formFields = formFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - return field; - }); - setFormFields(formFields); } }, [evalsetOptions]); @@ -195,23 +158,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const res = await rpcClient.getTestManagerRpcClient().getTestFunction({ functionName, filePath }); setTestFunction(res.function); let formFields = generateFormFields(res.function); - - // Get the dataProviderMode value to initialize field visibility - const modeField = formFields.find(f => f.key === 'dataProviderMode'); - const mode = String(modeField?.value || 'function'); - setDataProviderMode(mode); - - // Set initial field visibility - formFields = formFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - return field; - }); - setFormFields(formFields); } @@ -219,23 +165,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const emptyTestFunction = getEmptyTestFunctionModel(); setTestFunction(emptyTestFunction); let formFields = generateFormFields(emptyTestFunction); - - // Get the dataProviderMode value to initialize field visibility - const modeField = formFields.find(f => f.key === 'dataProviderMode'); - const mode = String(modeField?.value || 'function'); - setDataProviderMode(mode); - - // Set initial field visibility (default is 'function' mode) - formFields = formFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - return field; - }); - setFormFields(formFields); } @@ -303,27 +232,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const configAnnotation = getTestConfigAnnotation(testFunction.annotations); if (configAnnotation && configAnnotation.fields) { for (const field of configAnnotation.fields) { - if (field.originalName === 'dataProviderMode') { - fields.push({ - ...generateFieldFromProperty(field.originalName, field), - type: 'RADIO_GROUP', - itemOptions: [ - { value: 'function', content: 'Use a custom function' }, - { value: 'evalSet', content: 'Use an Evalset' } - ] - }); - continue; - } - - if (field.originalName === 'evalSetFile') { - fields.push({ - ...generateFieldFromProperty(field.originalName, field), - type: 'SINGLE_SELECT', - itemOptions: evalsetOptions - }); - continue; - } - fields.push(generateFieldFromProperty(field.originalName, field)); } } @@ -468,22 +376,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const percentageValue = formValues['minPassRate'] || 100; field.value = String(Number(percentageValue) / 100); } - if (field.originalName == 'dataProviderMode') { - field.value = formValues['dataProviderMode'] || "function"; - } if (field.originalName == 'dataProvider') { - if (formValues['dataProviderMode'] === 'function') { - field.value = formValues['dataProvider'] || ""; - } else { - field.value = ""; - } - } - if (field.originalName == 'evalSetFile') { - if (formValues['dataProviderMode'] === 'evalSet') { - field.value = formValues['evalSetFile'] || ""; - } else { - field.value = ""; - } + field.value = formValues['dataProvider'] || ""; } } } @@ -640,18 +534,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { editable: true, advanced: true }, - { - metadata: { - label: "", - description: "Choose how to provide test data" - }, - types: [{ fieldType: "STRING", selected: false }], - originalName: "dataProviderMode", - value: "function", - optional: true, - editable: true, - advanced: false - }, { metadata: { label: "Data Provider", @@ -663,18 +545,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { optional: true, editable: true, advanced: true - }, - { - metadata: { - label: "Evalset File", - description: "Select an evalset for test data" - }, - types: [{ fieldType: "STRING", selected: false }], - originalName: "evalSetFile", - value: "", - optional: true, - editable: true, - advanced: true } ] } @@ -736,7 +606,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { targetLineRange={targetLineRange} onSubmit={onFormSubmit} preserveFieldOrder={true} - onChange={handleFieldChange} /> )} </FormContainer> From 57ec62d733a2fa48659d390a193330435132f3e3 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 10 Feb 2026 14:04:25 +0530 Subject: [PATCH 191/247] Update evalset editor styling --- .../Components/ChatInterface.tsx | 3 +- .../views/EvalsetViewer/ConfirmationModal.tsx | 31 +- .../EvalsetViewer/EditableToolCallsList.tsx | 238 +++--- .../EvalsetViewer/EditableTraceMessage.tsx | 54 +- .../views/EvalsetViewer/EvalThreadViewer.tsx | 710 +++++++++++------- .../src/views/EvalsetViewer/EvalsetViewer.tsx | 6 +- .../views/EvalsetViewer/ToolCallsTimeline.tsx | 80 +- 7 files changed, 646 insertions(+), 476 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 954015dcb15..0c5ba80264f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -122,12 +122,13 @@ export const MessageContainer = styled.div<{ isUser: boolean }>` align-items: flex-end; justify-content: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; gap: 6px; - margin-bottom: 4px; + margin-bottom: 8px; `; export const ProfilePic = styled.div` padding: 4px; border: 1px solid var(--vscode-panel-border); + background-color: var(--vscode-editor-background); width: 18px; height: 18px; border-radius: 50%; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx index ce0c11bfcb0..26a59f42dc8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx @@ -18,6 +18,7 @@ import React from "react"; import styled from "@emotion/styled"; +import { Button } from "@wso2/ui-toolkit"; const Overlay = styled.div` position: fixed; @@ -35,7 +36,7 @@ const Overlay = styled.div` const ModalContainer = styled.div` background-color: var(--vscode-editorWidget-background); border: 1px solid var(--vscode-widget-border); - border-radius: 6px; + border-radius: 4px; width: 90%; max-width: 500px; padding: 20px; @@ -69,30 +70,6 @@ const ModalActions = styled.div` justify-content: flex-end; `; -const Button = styled.button<{ variant?: 'primary' | 'secondary' }>` - background-color: ${(props: { variant: string; }) => - props.variant === 'primary' - ? 'var(--vscode-button-background)' - : 'var(--vscode-button-secondaryBackground)'}; - color: ${(props: { variant: string; }) => - props.variant === 'primary' - ? 'var(--vscode-button-foreground)' - : 'var(--vscode-button-secondaryForeground)'}; - border: none; - border-radius: 4px; - padding: 8px 16px; - cursor: pointer; - font-size: 13px; - font-weight: 500; - - &:hover { - background-color: ${(props: { variant: string; }) => - props.variant === 'primary' - ? 'var(--vscode-button-hoverBackground)' - : 'var(--vscode-button-secondaryHoverBackground)'}; - } -`; - interface ConfirmationModalProps { title: string; message: string; @@ -118,10 +95,10 @@ export const ConfirmationModal: React.FC<ConfirmationModalProps> = ({ </ModalHeader> <ModalMessage>{message}</ModalMessage> <ModalActions> - <Button variant="secondary" onClick={onCancel}> + <Button appearance="secondary" onClick={onCancel}> {cancelLabel} </Button> - <Button variant="primary" onClick={onConfirm}> + <Button appearance="primary" onClick={onConfirm}> {confirmLabel} </Button> </ModalActions> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx index fde1bee7a0d..061ae3d3b5e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx @@ -6,7 +6,7 @@ * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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 @@ -39,36 +39,67 @@ import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; import { Icon } from '@wso2/ui-toolkit'; import { ConfirmationModal } from './ConfirmationModal'; -const Container = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - margin: 8px 0; - z-index: 2000; +// --- STYLES --- + +const TimelineContainer = styled.div` + max-width: 600px; + margin: 4px 0 2px; + position: relative; + padding-left: 0; +`; + +const TimelineTrack = styled.div` + position: absolute; + left: 15px; + top: 24px; + bottom: -2px; + width: 2px; + background-color: var(--vscode-button-background); + opacity: 0.3; + z-index: 0; +`; + +const HeaderTitle = styled.div` + font-size: 11px; + font-weight: 600; + color: var(--vscode-descriptionForeground); + margin-bottom: 8px; + padding-left: 4px; `; -const ToolCallItem = styled.div<{ isDragging?: boolean }>` - background-color: transparent; - border: 1px solid var(--vscode-widget-border); +const ToolCard = styled.div<{ $isDragging?: boolean }>` + background-color: var(--vscode-textBlockQuote-background); + border: 1px solid var(--vscode-panel-border); border-radius: 6px; - padding: 12px; + padding: 8px 6px; display: flex; align-items: center; gap: 12px; - opacity: ${(props: { isDragging: boolean; }) => props.isDragging ? 0.5 : 1}; - transition: opacity 0.2s; + position: relative; + z-index: 1; + margin-bottom: 8px; + + opacity: ${(props: { $isDragging: any; }) => props.$isDragging ? 0.5 : 1}; + transition: border-color 0.2s, background-color 0.2s; &:hover { background-color: var(--vscode-list-hoverBackground); + border-color: var(--vscode-focusBorder); } `; -const IconBadge = styled.div` +const IconBadgeWrapper = styled.div` display: flex; align-items: center; justify-content: center; + width: 28px; + height: 28px; + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 50%; color: var(--vscode-terminal-ansiBrightMagenta); flex-shrink: 0; + z-index: 2; `; const DragHandle = styled.div` @@ -76,6 +107,11 @@ const DragHandle = styled.div` color: var(--vscode-descriptionForeground); display: flex; align-items: center; + opacity: 0.5; + + &:hover { + opacity: 1; + } &:active { cursor: grabbing; @@ -85,70 +121,73 @@ const DragHandle = styled.div` const ToolInfo = styled.div` flex: 1; min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; + padding-top: 2px; `; const ToolName = styled.div` - font-size: 14px; + font-size: 13px; font-weight: 600; color: var(--vscode-foreground); - margin-bottom: 4px; `; -const ToolArgs = styled.div` +const ArgumentsPreview = styled.code` font-size: 12px; color: var(--vscode-descriptionForeground); + font-family: var(--vscode-editor-font-family); + white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - white-space: nowrap; + opacity: 0.8; + display: block; `; const Actions = styled.div` display: flex; - gap: 4px; + align-items: center; + gap: 2px; + opacity: 0; + transition: opacity 0.2s; + + /* Fixed interpolation: Target the parent class name */ + .tool-card-row:hover & { + opacity: 1; + } `; -const ActionButton = styled.button` - background: none; +const ActionButton = styled.button<{ $danger?: boolean }>` + background: transparent; border: none; - padding: 4px; + padding: 6px; cursor: pointer; - color: var(--vscode-foreground); border-radius: 4px; + color: ${(props: { $danger: any; }) => props.$danger ? 'var(--vscode-errorForeground)' : 'var(--vscode-icon-foreground)'}; display: flex; align-items: center; - gap: 4px; - font-size: 12px; + justify-content: center; &:hover { background-color: var(--vscode-toolbar-hoverBackground); + color: ${(props: { $danger: any; }) => props.$danger ? 'var(--vscode-testing-iconFailed)' : 'var(--vscode-foreground)'}; } `; -const AddButton = styled.button` - background-color: var(--vscode-editorWidget-background); - color: var(--vscode-descriptionForeground); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - padding: 4px 12px; - cursor: pointer; - font-size: 12px; - font-weight: 500; - display: flex; - align-items: center; - gap: 6px; - align-self: flex-start; - transition: all 0.15s ease; +// --- HELPER --- - &:hover { - background-color: var(--vscode-list-hoverBackground); - border-color: var(--vscode-focusBorder); - color: var(--vscode-foreground); +const formatArgs = (args: any) => { + if (!args) return "()"; + if (typeof args === 'string') return args; + try { + // Create a compact representation: { a: 1, b: 2 } + return JSON.stringify(args).replace(/"/g, '').replace(/:/g, ': ').replace(/,/g, ', '); + } catch (e) { + return "Invalid arguments"; } +}; - &:active { - transform: scale(0.98); - } -`; +// --- COMPONENTS --- interface SortableToolCallItemProps { toolCall: EvalFunctionCall; @@ -175,65 +214,31 @@ const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ transition, }; - const argsPreview = toolCall.arguments - ? Object.entries(toolCall.arguments) - .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) - .join(', ') - : 'No arguments'; - return ( <div ref={setNodeRef} style={style}> - <ToolCallItem isDragging={isDragging}> + {/* Added className for the CSS selector in Actions */} + <ToolCard $isDragging={isDragging} className="tool-card-row"> <DragHandle {...attributes} {...listeners}> - <Icon - name="bi-drag" - iconSx={{ - fontSize: "16px", - }} - /> + <Icon name="bi-drag" iconSx={{ fontSize: "16px" }} /> </DragHandle> - <IconBadge> - <Icon - name="bi-wrench" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </IconBadge> - <ToolInfo> + + <IconBadgeWrapper> + <Icon name="bi-wrench" sx={{ display: "flex", justifyContent: "center", alignItems: "center" }} iconSx={{ display: "flex", fontSize: "16px" }} /> + </IconBadgeWrapper> + + <ToolInfo onClick={onEdit} style={{ cursor: 'pointer' }}> <ToolName>{toolCall.name}</ToolName> - <ToolArgs>{argsPreview}</ToolArgs> + <ArgumentsPreview> + {formatArgs(toolCall.arguments)} + </ArgumentsPreview> </ToolInfo> + <Actions> - <ActionButton onClick={onEdit}> - <Icon - name="bi-edit" - iconSx={{ - fontSize: "16px", - }} - /> - </ActionButton> - <ActionButton onClick={onDelete}> - <Icon - name="bi-delete" - iconSx={{ - fontSize: "16px", - }} - /> + <ActionButton $danger onClick={(e) => { e.stopPropagation(); onDelete(); }} title="Delete"> + <Icon name="bi-delete" iconSx={{ fontSize: "16px" }} /> </ActionButton> </Actions> - </ToolCallItem> + </ToolCard> </div> ); }; @@ -294,28 +299,17 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ setDeleteIndex(null); }; - const handleAdd = () => { - onEditToolCall(traceId, -1); // -1 indicates new tool call - }; - if (toolCalls.length === 0) { - return ( - <Container> - <AddButton onClick={handleAdd}> - <Icon - name="bi-plus" - iconSx={{ - fontSize: "16px", - }} - /> - Add Tool Execution - </AddButton> - </Container> - ); + return null; } return ( - <Container> + <TimelineContainer> + <HeaderTitle>Tool Execution Chain</HeaderTitle> + + {/* Visual Line connecting the tools */} + <TimelineTrack /> + <DndContext sensors={sensors} collisionDetection={closestCenter} @@ -335,18 +329,10 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ ))} </SortableContext> </DndContext> - <AddButton onClick={handleAdd}> - <Icon - name="bi-plus" - iconSx={{ - fontSize: "16px", - }} - /> - Add Tool Execution - </AddButton> + {deleteIndex !== null && ( <ConfirmationModal - title="Delete Tool Call" + title="Delete Tool Execution" message="Are you sure you want to delete this tool call? This action cannot be undone." confirmLabel="Delete" cancelLabel="Cancel" @@ -354,6 +340,6 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ onCancel={handleDeleteCancel} /> )} - </Container> + </TimelineContainer> ); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx index 577396ade6c..825f81f5a79 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx @@ -26,28 +26,40 @@ import remarkGfm from 'remark-gfm'; import rehypeKatex from 'rehype-katex'; const EditableContainer = styled.div<{ isUser: boolean }>` - display: flex; - align-items: center; - gap: 4px; - flex-direction: ${(props: { isUser: boolean; }) => props.isUser ? 'row-reverse' : 'row'}; + position: relative; `; -const EditIconButton = styled.button` - background: transparent; +const EditIconButton = styled.button<{ isUser: boolean }>` + position: absolute; + top: -10px; + ${(props: { isUser: boolean; }) => props.isUser ? 'left: -10px;' : 'right: -10px;'} + background: var(--vscode-editor-background); color: var(--vscode-foreground); - border: none; - border-radius: 4px; - padding: 6px; + border: 1px solid var(--vscode-panel-border); + border-radius: 8px; + padding: 4px; cursor: pointer; display: flex; align-items: center; justify-content: center; - opacity: 0.7; - flex-shrink: 0; + z-index: 10; + + opacity: 0; + transform: ${(props: { isUser: boolean; }) => props.isUser ? 'translate(-4px, -4px)' : 'translate(4px, -4px)'}; + + transition: + opacity 0.2s ease, + transform 0.2s ease, + background-color 0.15s ease, + border-color 0.15s ease; &:hover { - opacity: 1; - background-color: var(--vscode-toolbar-hoverBackground); + background-color: var(--vscode-list-hoverBackground); + border-color: var(--vscode-focusBorder); + } + + &:active { + transform: translate(0, 0) scale(0.95); } `; @@ -78,6 +90,7 @@ const EditingMessageBubble = styled(MessageBubble)` flex-direction: column; flex-shrink: 1; min-width: 200px; + padding: 12px 14px; `; const SaveButton = styled.button` @@ -227,7 +240,11 @@ export const EditableTraceMessage: React.FC<EditableTraceMessageProps> = ({ return ( <EditableContainer isUser={isUser}> - <MessageBubble isUser={isUser}> + <MessageBubble + isUser={isUser} + onDoubleClick={isEditMode ? handleStartEdit : undefined} + style={isEditMode ? { cursor: 'text' } : undefined} + > <ReactMarkdown remarkPlugins={[remarkMath, remarkGfm]} rehypePlugins={[rehypeKatex]} @@ -236,11 +253,16 @@ export const EditableTraceMessage: React.FC<EditableTraceMessageProps> = ({ </ReactMarkdown> </MessageBubble> {isEditMode && ( - <EditIconButton onClick={handleStartEdit} title="Edit message"> + <EditIconButton + className="edit-button" + isUser={isUser} + onClick={handleStartEdit} + title="Edit message" + > <Icon name="bi-edit" iconSx={{ - fontSize: "16px", + fontSize: "14px", }} /> </EditIconButton> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index 24e7c57d183..dd9d840e6a7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -6,7 +6,7 @@ * in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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 @@ -21,13 +21,30 @@ import styled from "@emotion/styled"; import { EvalThread, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; import { MessageContainer, ProfilePic } from "../AgentChatPanel/Components/ChatInterface"; import { ToolCallsTimeline } from "./ToolCallsTimeline"; -import { Icon } from "@wso2/ui-toolkit"; +import { Button, Icon } from "@wso2/ui-toolkit"; import { TopNavigationBar } from "../../components/TopNavigationBar"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { EditableTraceMessage } from "./EditableTraceMessage"; import { EditableToolCallsList } from "./EditableToolCallsList"; import { ToolEditorModal } from "./ToolEditorModal"; import { ConfirmationModal } from "./ConfirmationModal"; +import { + DndContext, + closestCenter, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors, + DragEndEvent, +} from '@dnd-kit/core'; +import { + arrayMove, + SortableContext, + sortableKeyboardCoordinates, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable'; +import { CSS } from '@dnd-kit/utilities'; import { cloneEvalThread, updateTraceUserMessage, @@ -39,6 +56,8 @@ import { createNewTrace } from "./utils/traceAdapters"; +// --- LAYOUT COMPONENTS --- + const PageWrapper = styled.div` height: 100%; width: 100%; @@ -56,7 +75,7 @@ const Container = styled.div` overflow: hidden; *, *::before, *::after { - box-sizing: content-box; + box-sizing: content-box; /* Fixed: standard box-sizing prevents width math errors */ } `; @@ -67,12 +86,40 @@ const Header = styled.div` background-color: var(--vscode-editorWidget-background); border-top: 1px solid var(--vscode-panel-border); border-bottom: 1px solid var(--vscode-panel-border); - z-index: 2; + z-index: 10; display: flex; align-items: flex-start; justify-content: space-between; `; +const EditModeBanner = styled.div<{ $isVisible: boolean }>` + background-color: var(--vscode-textBlockQuote-background); + border-left: 3px solid var(--vscode-editorInfo-foreground); + display: flex; + align-items: flex-start; + gap: 12px; + + overflow: hidden; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + + max-height: ${(props: { $isVisible: any; }) => (props.$isVisible ? '100px' : '0px')}; + opacity: ${(props: { $isVisible: any; }) => (props.$isVisible ? 1 : 0)}; + padding: ${(props: { $isVisible: any; }) => (props.$isVisible ? '12px 24px' : '0px 24px')}; + border-bottom: 1px solid ${(props: { $isVisible: any; }) => (props.$isVisible ? 'var(--vscode-panel-border)' : 'transparent')}; + margin-bottom: ${(props: { $isVisible: any; }) => (props.$isVisible ? '0px' : '-1px')}; /* Compensate for border */ +`; + +const BannerContent = styled.div` + flex: 1; + display: flex; + align-items: center; +`; + +const BannerDescription = styled.div` + font-size: 13px; + color: var(--vscode-descriptionForeground); +`; + const HeaderLeft = styled.div` flex: 1; `; @@ -99,79 +146,6 @@ const Dot = styled.span` background-color: var(--vscode-notificationsWarningIcon-foreground); `; -const EditButton = styled.button` - background-color: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border: none; - border-radius: 4px; - padding: 8px 12px; - cursor: pointer; - font-size: 13px; - display: flex; - align-items: center; - gap: 6px; - margin-top: 4px; - transition: all 0.2s ease; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - - &:hover { - background-color: var(--vscode-button-hoverBackground); - transform: translateY(-1px); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - } - - &:active { - transform: translateY(0); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - } -`; - -const DiscardButton = styled.button` - background-color: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; - border-radius: 4px; - padding: 8px 16px; - cursor: pointer; - font-size: 13px; - font-weight: 500; - display: flex; - align-items: center; - gap: 6px; - - &:hover { - background-color: var(--vscode-button-secondaryHoverBackground); - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } -`; - -const SaveButton = styled.button` - background-color: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border: none; - border-radius: 4px; - padding: 8px 16px; - cursor: pointer; - font-size: 13px; - font-weight: 500; - display: flex; - align-items: center; - gap: 6px; - - &:hover { - background-color: var(--vscode-button-hoverBackground); - } - - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } -`; - const Title = styled.h2` font-size: 1.3em; font-weight: 600; @@ -192,67 +166,271 @@ export const Messages = styled.div` flex-direction: column; flex: 1; overflow-y: auto; - gap: 16px; + gap: 0; position: relative; z-index: 1; - padding: 24px 20px 48px; + padding: 22px 20px 60px; - @media (min-width: 1000px) { + @media (min-width: 800px) { + padding-left: 10%; + padding-right: 10%; + } + + @media (min-width: 1200px) { padding-left: 15%; padding-right: 15%; } +`; + +const TimelineContainer = styled.div` + position: relative; + display: flex; + flex-direction: column; +`; + +// --- SEAMLESS TRANSITION COMPONENTS --- - @media (min-width: 1600px) { - padding-left: 20%; - padding-right: 20%; +// TraceWrapper: Always has a border width (transparent in view mode) to prevent layout shifting +const TraceWrapper = styled.div<{ $isEditMode: boolean; $isDragging?: boolean }>` + display: flex; + flex-direction: row; + align-items: stretch; + + border: 1px solid ${(props: { $isEditMode: any; }) => props.$isEditMode ? 'var(--vscode-panel-border)' : 'transparent'}; + border-radius: 8px; + + position: relative; + background-color: ${(props: { $isEditMode: any; }) => props.$isEditMode ? 'var(--vscode-editor-background)' : 'transparent'}; + margin: 4px 0; + z-index: 2; + opacity: ${(props: { $isDragging: any; }) => props.$isDragging ? 0.5 : 1}; + + transition: border-color 0.3s ease, background-color 0.3s ease, transform 0.2s ease; + + &:hover { + border-color: ${(props: { $isEditMode: any; }) => props.$isEditMode ? 'var(--vscode-focusBorder)' : 'transparent'}; } +`; + +// TraceHeader: Fixed width container. Icons fade in/out via opacity. +const TraceHeader = styled.div<{ $isEditMode: boolean }>` + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + + width: 32px; + padding: 0 12px; + flex-shrink: 0; + padding-top: 8px; + + border-right: 1px solid ${(props: { $isEditMode: any; }) => props.$isEditMode ? 'var(--vscode-panel-border)' : 'transparent'}; + transition: border-color 0.3s ease; +`; + +// Helper to fade icons +const TraceHeaderIcons = styled.div<{ $visible: boolean }>` + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + opacity: ${(props: { $visible: any; }) => props.$visible ? 1 : 0}; + transition: opacity 0.3s ease; + pointer-events: ${(props: { $visible: any; }) => props.$visible ? 'auto' : 'none'}; +`; - @media (min-width: 2000px) { - padding-left: 25%; - padding-right: 25%; +const TraceContent = styled.div` + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + padding: 12px 16px; +`; + +const TraceDragHandle = styled.div` + cursor: grab; + color: var(--vscode-descriptionForeground); + display: flex; + align-items: center; + justify-content: center; + padding: 6px; + border-radius: 4px; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); } `; -const AddTurnButton = styled.button` - background-color: transparent; - color: var(--vscode-button-background); - border: 2px dashed var(--vscode-button-background); - border-radius: 6px; - padding: 14px 20px; +const TraceDeleteButton = styled.button` + background: none; + border: none; + padding: 6px; cursor: pointer; - font-size: 13px; - font-weight: 600; + color: var(--vscode-foreground); + border-radius: 4px; display: flex; align-items: center; justify-content: center; - gap: 8px; - margin: 16px auto; - transition: all 0.2s ease; - width: 200px; &:hover { - background-color: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border-style: solid; - opacity: 0.9; - transform: translateY(-1px); + background-color: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-errorForeground); } +`; + +// HoverAddTurnContainer: Animates height from 0 to 32px when entering edit mode +const HoverAddTurnContainer = styled.div<{ $visible: boolean }>` + position: relative; + display: flex; + justify-content: center; + align-items: center; + z-index: 5; + + /* Animation Logic */ + height: ${(props: { $visible: any; }) => props.$visible ? '32px' : '0px'}; + margin: ${(props: { $visible: any; }) => props.$visible ? '-16px 0' : '0px'}; /* Overlap traces slightly in edit mode */ + opacity: ${(props: { $visible: any; }) => props.$visible ? 0 : 0}; /* Default hidden, show on hover */ + pointer-events: ${(props: { $visible: any; }) => props.$visible ? 'auto' : 'none'}; + + transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1), margin 0.3s ease, opacity 0.2s ease; + overflow: hidden; - &:active { - transform: translateY(0) scale(0.98); + &:hover { + opacity: ${(props: { $visible: any; }) => props.$visible ? 1 : 0}; } `; -const TraceWrapper = styled.div` - position: relative; +const AddMessageButton = styled.button` + display: flex; + align-items: center; + justify-content: center; + height: 26px; + padding: 0 12px; + border-radius: 8px; + background-color: var(--vscode-editor-background); + color: var(--vscode-foreground); + border: 1px solid var(--vscode-panel-border); + cursor: pointer; + font-size: 12px; + transition: all 0.2s ease; + + &:hover { + border-color: var(--vscode-focusBorder); + } + + .icon-wrapper { + margin-right: 4px; + display: flex; + align-items: center; + } `; const StyledMessageContainer = styled(MessageContainer)` &:last-child { margin-bottom: 0; } + + &:hover .add-tool-button { + opacity: 1; + transform: translateY(0); + max-height: 32px; + padding-top: 4px; + padding-bottom: 4px; + margin-bottom: 8px; + border-width: 1px; + } + + &:hover .edit-button { + opacity: 1; + transform: translate(0, 0); + } +`; + +const AgentContentWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 0; + position: relative; `; +const AddToolButton = styled.button` + background-color: var(--vscode-editorWidget-background); + color: var(--vscode-descriptionForeground); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 0 12px; + padding-top: 0; + padding-bottom: 0; + margin-bottom: 0; + border-width: 0; + cursor: pointer; + font-size: 12px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + align-self: flex-start; + opacity: 0; + transform: translateY(-4px); + max-height: 0; + overflow: hidden; + transition: all 0.2s ease; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + border-color: var(--vscode-focusBorder); + color: var(--vscode-foreground); + } +`; + +interface SortableTraceWrapperProps { + trace: EvalsetTrace; + isEditMode: boolean; + children: React.ReactNode; + onDelete: () => void; +} + +const SortableTraceWrapper: React.FC<SortableTraceWrapperProps> = ({ + trace, + isEditMode, + children, + onDelete, +}) => { + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + isDragging, + } = useSortable({ id: trace.id, disabled: !isEditMode }); + + const style = { + transform: CSS.Transform.toString(transform), + transition, + }; + + return ( + <div ref={setNodeRef} style={style}> + <TraceWrapper $isEditMode={isEditMode} $isDragging={isDragging}> + <TraceHeader $isEditMode={isEditMode}> + <TraceHeaderIcons $visible={isEditMode}> + <TraceDragHandle {...attributes} {...listeners}> + <Icon name="bi-drag" iconSx={{ fontSize: "16px" }} /> + </TraceDragHandle> + <TraceDeleteButton onClick={onDelete}> + <Icon name="bi-delete" iconSx={{ fontSize: "16px" }} /> + </TraceDeleteButton> + </TraceHeaderIcons> + </TraceHeader> + <TraceContent> + {children} + </TraceContent> + </TraceWrapper> + </div> + ); +}; + interface EvalThreadViewerProps { projectPath: string; filePath: string; @@ -272,13 +450,17 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, toolCallIndex: number; } | null>(null); const [showDiscardConfirmation, setShowDiscardConfirmation] = useState(false); + const [deleteTraceIndex, setDeleteTraceIndex] = useState<number | null>(null); + + const sensors = useSensors( + useSensor(PointerSensor), + useSensor(KeyboardSensor, { + coordinateGetter: sortableKeyboardCoordinates, + }) + ); const extractToolCalls = (trace: EvalsetTrace): EvalFunctionCall[] => { - const toolCalls: EvalFunctionCall[] = []; - if (trace.output?.toolCalls) { - return trace.output.toolCalls as EvalFunctionCall[]; - } - return toolCalls; + return (trace.output?.toolCalls as EvalFunctionCall[]) || []; }; const handleEnterEditMode = () => { @@ -326,7 +508,6 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, const handleSave = async () => { setIsSaving(true); try { - // Update the evalSet with the modified case const updatedEvalSet: EvalSet = { ...evalSet, threads: evalSet.threads.map(c => @@ -334,7 +515,6 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, ) }; - // Call the RPC to save const response = await rpcClient.getVisualizerRpcClient().saveEvalThread({ filePath, updatedEvalSet @@ -343,8 +523,6 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, if (response.success) { setHasUnsavedChanges(false); handleExitEditMode(); - } else { - console.error('Failed to save:', response.error); } } catch (error) { console.error('Error saving evalThread:', error); @@ -361,14 +539,6 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, setShowDiscardConfirmation(false); }; - const handleRequestDiscardConfirmation = () => { - setShowDiscardConfirmation(true); - }; - - const handleCancelDiscard = () => { - setShowDiscardConfirmation(false); - }; - const handleUpdateToolCalls = (traceId: string, toolCalls: EvalFunctionCall[]) => { setWorkingEvalThread(prev => { const updatedTraces = prev.traces.map(trace => { @@ -394,10 +564,9 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, if (!trace) return; const currentToolCalls = extractToolCalls(trace); - let updatedToolCalls: EvalFunctionCall[]; + if (toolCallIndex === -1) { - // Adding new tool call const newToolCall: EvalFunctionCall = { id: generateToolCallId(), name: updates.name || trace.tools[0]?.name || '', @@ -405,7 +574,6 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, }; updatedToolCalls = [...currentToolCalls, newToolCall]; } else { - // Editing existing tool call updatedToolCalls = currentToolCalls.map((tc, idx) => idx === toolCallIndex ? { ...tc, ...updates } : tc ); @@ -415,14 +583,38 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, setSelectedToolCall(null); }; - const handleAddTurn = () => { - setWorkingEvalThread(prev => ({ - ...prev, - traces: [...prev.traces, createNewTrace()] - })); + const handleAddTurnAtIndex = (index: number) => { + setWorkingEvalThread(prev => { + const newTraces = [...prev.traces]; + newTraces.splice(index, 0, createNewTrace()); + return { ...prev, traces: newTraces }; + }); setHasUnsavedChanges(true); }; + const handleDragEnd = (event: DragEndEvent) => { + const { active, over } = event; + if (over && active.id !== over.id) { + setWorkingEvalThread(prev => { + const oldIndex = prev.traces.findIndex(trace => trace.id === active.id); + const newIndex = prev.traces.findIndex(trace => trace.id === over.id); + return { ...prev, traces: arrayMove(prev.traces, oldIndex, newIndex) }; + }); + setHasUnsavedChanges(true); + } + }; + + const handleDeleteTraceConfirm = () => { + if (deleteTraceIndex !== null) { + setWorkingEvalThread(prev => ({ + ...prev, + traces: prev.traces.filter((_, i) => i !== deleteTraceIndex) + })); + setHasUnsavedChanges(true); + setDeleteTraceIndex(null); + } + }; + const displayCase = isEditMode ? workingEvalThread : evalThread; return ( @@ -438,154 +630,124 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, {isEditMode ? ( <> {hasUnsavedChanges && ( - <UnsavedIndicator> - <Dot /> - <span>Unsaved changes</span> - </UnsavedIndicator> + <UnsavedIndicator><Dot /><span>Unsaved changes</span></UnsavedIndicator> )} - <DiscardButton - onClick={handleRequestDiscardConfirmation} - disabled={isSaving} - > - <Icon - name="bi-close" - iconSx={{ - fontSize: "16px", - }} - /> + <Button appearance="secondary" onClick={() => setShowDiscardConfirmation(true)} disabled={isSaving}> + <Icon name="bi-close" sx={{ marginRight: "4px" }} iconSx={{ fontSize: "16px" }} /> Discard - </DiscardButton> - <SaveButton onClick={handleSave} disabled={isSaving}> - {isSaving ? ( - <> - <Icon - name="bi-spinner" - iconSx={{ - fontSize: "16px", - }} - /> - Saving... - </> - ) : ( - <> - <Icon - name="bi-save" - iconSx={{ - fontSize: "16px", - }} - /> - Save Case - </> - )} - </SaveButton> + </Button> + <Button appearance="primary" onClick={handleSave} disabled={isSaving}> + <Icon name={isSaving ? "bi-spinner" : "bi-save"} sx={{ marginRight: "4px" }} iconSx={{ fontSize: "16px" }} /> + {isSaving ? "Saving..." : "Save Thread"} + </Button> </> ) : ( - <EditButton onClick={handleEnterEditMode}> - <Icon - name="bi-edit" - sx={{ - width: "16px", - height: "16px", - fontSize: "16px" - }} - iconSx={{ - fontSize: "16px", - }} - /> + <Button appearance="primary" onClick={handleEnterEditMode}> + <Icon name="bi-edit" sx={{ marginRight: "4px" }} iconSx={{ fontSize: "16px" }} /> Edit - </EditButton> + </Button> )} </HeaderRight> </Header> + + {/* Animated Banner - always rendered, visibility controlled by props */} + <EditModeBanner $isVisible={isEditMode}> + <BannerContent> + <BannerDescription> + <span style={{ fontWeight: '600' }}>Edit Mode</span> - Hover over messages to edit, drag traces to reorder, hover between traces to add turns, or hover over agent messages to add tool executions. + </BannerDescription> + </BannerContent> + </EditModeBanner> + <Messages> - {displayCase.traces.map((trace, traceIdx) => { - const toolCalls = extractToolCalls(trace); - - return ( - <TraceWrapper key={traceIdx}> - {/* Render user's initial message */} - <StyledMessageContainer isUser={true}> - <EditableTraceMessage - traceId={trace.id} - isUser={true} - content={trace.userMessage.content} - isEditMode={isEditMode} - onSave={handleSaveUserMessage} - /> - <ProfilePic> - <Icon - name="bi-user" - iconSx={{ - fontSize: "18px", - color: "var(--vscode-foreground)", - cursor: "default", - }} - /> - </ProfilePic> - </StyledMessageContainer> - - {/* Render agent response */} - <StyledMessageContainer isUser={false}> - <ProfilePic> - <Icon - name="bi-ai-agent" - iconSx={{ - fontSize: "18px", - color: "var(--vscode-terminal-ansiBrightCyan)", - cursor: "default", - }} - /> - </ProfilePic> - <div style={{ display: 'flex', flexDirection: 'column', gap: '0' }}> - {isEditMode ? ( - <EditableToolCallsList - traceId={trace.id} - toolCalls={toolCalls} - availableTools={trace.tools} - onUpdate={handleUpdateToolCalls} - onEditToolCall={handleEditToolCall} - /> - ) : ( - <ToolCallsTimeline toolCalls={toolCalls} /> - )} - <EditableTraceMessage - traceId={trace.id} - isUser={false} - content={trace.output?.content || ''} - isEditMode={isEditMode} - onSave={handleSaveAgentOutput} - /> - </div> - </StyledMessageContainer> - </TraceWrapper> - ); - })} - {isEditMode && ( - <AddTurnButton onClick={handleAddTurn}> - <Icon - name="bi-plus" - iconSx={{ - fontSize: "16px", - }} - /> - Add Message Turn - </AddTurnButton> - )} + <TimelineContainer> + {/* Top Add Turn Button */} + <HoverAddTurnContainer $visible={isEditMode}> + <AddMessageButton onClick={() => handleAddTurnAtIndex(0)}> + <div className="icon-wrapper"><Icon name="bi-plus" iconSx={{ fontSize: "16px" }} /></div> + Add Message Turn + </AddMessageButton> + </HoverAddTurnContainer> + + <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}> + <SortableContext items={displayCase.traces.map(t => t.id)} strategy={verticalListSortingStrategy}> + {displayCase.traces.map((trace, traceIdx) => { + const toolCalls = extractToolCalls(trace); + return ( + <React.Fragment key={trace.id}> + <SortableTraceWrapper + trace={trace} + isEditMode={isEditMode} + onDelete={() => setDeleteTraceIndex(traceIdx)} + > + <StyledMessageContainer isUser={true}> + <EditableTraceMessage + traceId={trace.id} + isUser={true} + content={trace.userMessage.content} + isEditMode={isEditMode} + onSave={handleSaveUserMessage} + /> + <ProfilePic> + <Icon name="bi-user" iconSx={{ fontSize: "18px", color: "var(--vscode-foreground)" }} /> + </ProfilePic> + </StyledMessageContainer> + + <StyledMessageContainer isUser={false}> + <ProfilePic> + <Icon name="bi-ai-agent" iconSx={{ fontSize: "18px", color: "var(--vscode-terminal-ansiBrightCyan)" }} /> + </ProfilePic> + <AgentContentWrapper> + {isEditMode ? ( + <EditableToolCallsList + traceId={trace.id} + toolCalls={toolCalls} + availableTools={trace.tools} + onUpdate={handleUpdateToolCalls} + onEditToolCall={handleEditToolCall} + /> + ) : ( + <ToolCallsTimeline toolCalls={toolCalls} /> + )} + {isEditMode && ( + <AddToolButton className="add-tool-button" onClick={() => handleEditToolCall(trace.id, -1)}> + <Icon name="bi-plus" iconSx={{ fontSize: "16px" }} /> + Add Tool Execution + </AddToolButton> + )} + <EditableTraceMessage + traceId={trace.id} + isUser={false} + content={trace.output?.content || ''} + isEditMode={isEditMode} + onSave={handleSaveAgentOutput} + /> + </AgentContentWrapper> + </StyledMessageContainer> + </SortableTraceWrapper> + + {/* Inter-trace Add Turn Button */} + <HoverAddTurnContainer $visible={isEditMode}> + <AddMessageButton onClick={() => handleAddTurnAtIndex(traceIdx + 1)}> + <div className="icon-wrapper"><Icon name="bi-plus" iconSx={{ fontSize: "16px" }} /></div> + Add Message Turn + </AddMessageButton> + </HoverAddTurnContainer> + </React.Fragment> + ); + })} + </SortableContext> + </DndContext> + </TimelineContainer> </Messages> </Container> + {selectedToolCall && (() => { - const trace = workingEvalThread.traces.find( - t => t.id === selectedToolCall.traceId - ); + const trace = workingEvalThread.traces.find(t => t.id === selectedToolCall.traceId); if (!trace) return null; - - const toolCalls = extractToolCalls(trace); - const toolCall = - selectedToolCall.toolCallIndex === -1 - ? { name: trace.tools[0]?.name || '', arguments: {} } - : toolCalls[selectedToolCall.toolCallIndex]; - - if (!toolCall) return null; + const toolCall = selectedToolCall.toolCallIndex === -1 + ? { name: trace.tools[0]?.name || '', arguments: {} } + : extractToolCalls(trace)[selectedToolCall.toolCallIndex]; return ( <ToolEditorModal @@ -596,14 +758,24 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, /> ); })()} + {showDiscardConfirmation && ( <ConfirmationModal title="Discard Changes" message="Are you sure you want to discard all changes? This action cannot be undone." confirmLabel="Discard" - cancelLabel="Cancel" onConfirm={handleDiscard} - onCancel={handleCancelDiscard} + onCancel={() => setShowDiscardConfirmation(false)} + /> + )} + + {deleteTraceIndex !== null && ( + <ConfirmationModal + title="Delete Trace" + message="Are you sure you want to delete this trace? This action cannot be undone." + confirmLabel="Delete" + onConfirm={handleDeleteTraceConfirm} + onCancel={() => setDeleteTraceIndex(null)} /> )} </PageWrapper> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx index cf90e4e3a32..02c7930ee8e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx @@ -89,10 +89,10 @@ export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, fileP <Container> <Header> <Title>{filePath}</Title> - <Subtitle>Case not found</Subtitle> + <Subtitle>Thread not found</Subtitle> </Header> <ErrorMessage> - Case with ID "{threadId}" not found in this evalset. + Thread with ID "{threadId}" not found in this evalset. </ErrorMessage> </Container> ); @@ -104,7 +104,7 @@ export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, fileP <Container> <Header> <Title>{filePath}</Title> - <Subtitle>{content.threads.length} case(s)</Subtitle> + <Subtitle>{content.threads.length} thread(s)</Subtitle> </Header> <ContentSection> <Preformatted>{JSON.stringify(content, null, 2)}</Preformatted> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx index ffd34cde9af..a88f0071750 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx @@ -107,17 +107,21 @@ const Dot = styled.div` const ContentCard = styled.div` width: 60%; - background: var(--vscode-input-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 4px; - padding: 8px 12px; - transition: background-color 0.15s ease; + background-color: transparent; + border: 1px solid var(--vscode-widget-border); + border-radius: 6px; + padding: 12px; + transition: background-color 0.2s; + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } `; const CardContent = styled.div` display: flex; align-items: center; - gap: 8px; + gap: 12px; `; const IconBadge = styled.div` @@ -128,16 +132,21 @@ const IconBadge = styled.div` flex-shrink: 0; `; -const OperationLabel = styled.span` - font-size: 10px; +const ToolInfo = styled.div` + flex: 1; + min-width: 0; +`; + +const ToolName = styled.div` + font-size: 14px; font-weight: 600; - flex-shrink: 0; + color: var(--vscode-foreground); + margin-bottom: 4px; `; -const ToolName = styled.span` +const ToolArgs = styled.div` font-size: 12px; - color: var(--vscode-foreground); - flex: 1; + color: var(--vscode-descriptionForeground); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -153,49 +162,52 @@ export function ToolCallsTimeline({ toolCalls }: ToolCallsTimelineProps) { return ( <TimelineContainer> <TimelineHeader onClick={() => setOpen(!open)} aria-expanded={open}> - <TimelineTitle>Tools Used ({toolCalls.length})</TimelineTitle> + <TimelineTitle>Tool Executions ({toolCalls.length})</TimelineTitle> <ToggleIcon isOpen={open}> <Codicon name="chevron-right" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> </ToggleIcon> </TimelineHeader> {open && ( <TimelineList> - {toolCalls.map((toolCall, index) => ( - <TimelineItem key={toolCall.id || index}> - <ConnectorColumn isLast={index === toolCalls.length - 1}> - <Dot /> - </ConnectorColumn> - <ContentCard title={toolCall.name}> - <CardContent> - <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}> + {toolCalls.map((toolCall, index) => { + const argsPreview = toolCall.arguments + ? Object.entries(toolCall.arguments) + .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) + .join(', ') + : 'No arguments'; + + return ( + <TimelineItem key={toolCall.id || index}> + <ContentCard title={toolCall.name}> + <CardContent> <IconBadge> <Icon name="bi-wrench" sx={{ - fontSize: '14px', - width: '14px', - height: '14px', + fontSize: '16px', + width: '16px', + height: '16px', display: 'flex', alignItems: 'center', justifyContent: 'center' }} iconSx={{ - fontSize: "14px", + fontSize: "16px", display: 'flex', alignItems: 'center', justifyContent: 'center' }} /> </IconBadge> - <OperationLabel> - Execute Tool - </OperationLabel> - </div> - <ToolName>{toolCall.name}</ToolName> - </CardContent> - </ContentCard> - </TimelineItem> - ))} + <ToolInfo> + <ToolName>{toolCall.name}</ToolName> + <ToolArgs>{argsPreview}</ToolArgs> + </ToolInfo> + </CardContent> + </ContentCard> + </TimelineItem> + ); + })} </TimelineList> )} </TimelineContainer> From 23d25fcbf09d444708d6889a32f6c7751eff13dc Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 10 Feb 2026 19:26:31 +0530 Subject: [PATCH 192/247] Refactor timestamp handling in EvalIteration and EvalsetTrace to use [seconds, nanoseconds] format --- .../ballerina-core/src/state-machine-types.ts | 8 +- .../src/features/tracing/trace-converter.ts | 238 +++++++++++------- .../EvalsetViewer/utils/traceAdapters.ts | 10 +- 3 files changed, 163 insertions(+), 93 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 945517d7d6e..0e8f26ce65a 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -250,8 +250,8 @@ export interface EvalToolSchema { export interface EvalIteration { history: EvalChatMessage[]; output: EvalChatAssistantMessage | EvalChatFunctionMessage | any; - startTime: string; - endTime: string; + startTime: [number, number]; // [seconds, nanoseconds] + endTime: [number, number]; // [seconds, nanoseconds] } export interface EvalsetTrace { @@ -260,8 +260,8 @@ export interface EvalsetTrace { iterations: EvalIteration[]; output: EvalChatAssistantMessage | any; tools: EvalToolSchema[]; - startTime: string; - endTime: string; + startTime: [number, number]; // [seconds, nanoseconds] + endTime: [number, number]; // [seconds, nanoseconds] } export interface EvalThread { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 88bbe868dc9..5eb1290294f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -18,12 +18,10 @@ import { EvalChatUserMessage as ChatUserMessage, - EvalChatAssistantMessage as ChatAssistantMessage, EvalChatMessage as ChatMessage, EvalToolSchema as ToolSchema, EvalIteration as Iteration, - EvalsetTrace, - EvalFunctionCall + EvalsetTrace } from '@wso2/ballerina-core'; // TraceData interface (from trace-details-webview.ts) @@ -87,6 +85,23 @@ function safeJsonParse(jsonString: string | null): any { } } +/** + * Converts an ISO timestamp string to [seconds, nanoseconds] array format. + */ +function convertTimestamp(isoString: string | undefined): [number, number] { + if (!isoString) { + const now = Date.now(); + return [Math.floor(now / 1000), (now % 1000) * 1000000]; + } + + const date = new Date(isoString); + const milliseconds = date.getTime(); + const seconds = Math.floor(milliseconds / 1000); + const nanoseconds = (milliseconds % 1000) * 1000000; + + return [seconds, nanoseconds]; +} + // --- Main Conversion Logic --- /** @@ -96,13 +111,20 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { const spans = traceData.spans; const rootSpan = spans.find((s: SpanData) => s.kind === 2 || s.kind === '2'); - // Find the span containing the GenAI interaction attributes - const aiSpan = spans.find((s: SpanData) => - s.name.includes('invoke_agent') && s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.messages') + // Find all chat spans that contain conversation history + const chatSpans = spans.filter((s: SpanData) => + s.name.startsWith('chat') && s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.messages') ); - if (!rootSpan || !aiSpan) { - throw new Error("Could not find required Root or AI spans in trace."); + // Sort chat spans by start time to process in order + chatSpans.sort((a, b) => { + const timeA = a.startTime || ''; + const timeB = b.startTime || ''; + return timeA.localeCompare(timeB); + }); + + if (!rootSpan || chatSpans.length === 0) { + throw new Error("Could not find required Root span or chat spans in trace."); } // Extract Data @@ -110,7 +132,7 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { const startTime = rootSpan.startTime || traceData.firstSeen; const endTime = rootSpan.endTime || traceData.lastSeen; - // Extract Tools + // Extract Tools (look in any span that has gen_ai.input.tools) const toolSpan = spans.find((s: SpanData) => s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.tools') ); @@ -128,104 +150,148 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { }); } - // Extract History & Messages - const inputMessagesStr = getAttribute(aiSpan, 'gen_ai.input.messages'); - const outputMessagesStr = getAttribute(aiSpan, 'gen_ai.output.messages'); + // Helper function to parse messages + const parseMessages = (messagesStr: string | null): ChatMessage[] => { + if (!messagesStr) { + return []; + } - // Parse the input messages (History) - let rawHistory = safeJsonParse(inputMessagesStr); + let rawMessages = safeJsonParse(messagesStr); - // Handle case where history might be a single string - if (typeof rawHistory === 'string') { - rawHistory = [{ role: 'user', content: rawHistory }]; - } + // Handle case where messages might be a single string + if (typeof rawMessages === 'string') { + rawMessages = [{ role: 'user', content: rawMessages }]; + } - // Map raw OpenAI-style messages to our ChatMessage types - const history: ChatMessage[] = (rawHistory || []).map((msg: any) => { - const base: any = { - role: msg.role, - content: msg.content - }; + // Ensure we have an array + if (!Array.isArray(rawMessages)) { + console.warn('Expected array of messages, got:', typeof rawMessages); + return []; + } - if (msg.name) { base.name = msg.name; } - if (msg.toolCalls) { base.toolCalls = msg.toolCalls; } - if (msg.id) { base.id = msg.id; } + // Map raw OpenAI-style messages to our ChatMessage types + return rawMessages.map((msg: any) => { + const base: any = { + role: msg.role, + content: msg.content ?? null + }; + + if (msg.name) { base.name = msg.name; } + if (msg.tool_calls) { + base.toolCalls = msg.tool_calls.map((tc: any) => ({ + id: tc.id, + name: tc.function?.name || tc.name, + arguments: typeof tc.function?.arguments === 'string' + ? safeJsonParse(tc.function.arguments) + : tc.function?.arguments || tc.arguments + })); + } else if (msg.toolCalls) { + base.toolCalls = msg.toolCalls; + } else { + base.toolCalls = null; + } + if (msg.id) { base.id = msg.id; } - return base as ChatMessage; - }); + return base as ChatMessage; + }); + }; - // Determine User Message (Trigger) - // We assume the last user message in the history is the current trigger - const lastUserMsg = [...history].reverse().find(m => m.role === 'user'); - const userMessage: ChatUserMessage = lastUserMsg - ? (lastUserMsg as ChatUserMessage) - : { role: 'user', content: 'Unknown input' }; + // Helper function to parse a single output message + const parseOutputMessage = (messageStr: string | null): ChatMessage => { + if (!messageStr) { + return { + role: 'assistant', + content: 'No output available', + toolCalls: null + }; + } - // Determine Output - let outputObj: ChatAssistantMessage; - const parsedOutput = safeJsonParse(outputMessagesStr); + const rawMessage = safeJsonParse(messageStr); + + // If it's already a properly formatted message object + if (rawMessage && typeof rawMessage === 'object' && rawMessage.role) { + const base: any = { + role: rawMessage.role, + content: rawMessage.content ?? null + }; + + if (rawMessage.name) { base.name = rawMessage.name; } + if (rawMessage.tool_calls) { + base.toolCalls = rawMessage.tool_calls.map((tc: any) => ({ + id: tc.id, + name: tc.function?.name || tc.name, + arguments: typeof tc.function?.arguments === 'string' + ? safeJsonParse(tc.function.arguments) + : tc.function?.arguments || tc.arguments + })); + } else if (rawMessage.toolCalls) { + base.toolCalls = rawMessage.toolCalls; + } else { + base.toolCalls = null; + } + if (rawMessage.id) { base.id = rawMessage.id; } - if (parsedOutput && typeof parsedOutput === 'object' && parsedOutput.role) { - outputObj = parsedOutput; - } else if (outputMessagesStr) { - // Construct a generic assistant message if raw string - outputObj = { - role: 'assistant', - content: outputMessagesStr - }; - } else { - // No output found - use a placeholder - outputObj = { + return base as ChatMessage; + } + + // Fallback: treat as plain content + return { role: 'assistant', - content: 'No output available' + content: typeof rawMessage === 'string' ? rawMessage : JSON.stringify(rawMessage), + toolCalls: null }; - } + }; - // Extract tool calls from execute_tool spans - const toolCallSpans = spans.filter((s: SpanData) => s.name.includes('execute_tool')); - if (toolCallSpans.length > 0) { - const toolCalls: EvalFunctionCall[] = []; - - for (const toolSpan of toolCallSpans) { - const toolName = getAttribute(toolSpan, 'gen_ai.tool.name') || getAttribute(toolSpan, 'tool.name'); - const toolArgs = getAttribute(toolSpan, 'gen_ai.tool.arguments') || getAttribute(toolSpan, 'tool.arguments'); - const toolId = getAttribute(toolSpan, 'gen_ai.tool.id') || getAttribute(toolSpan, 'tool.id') || toolSpan.spanId; - - // parse tool arguments if they are in JSON format - const parsedArgs = safeJsonParse(toolArgs); - const finalArgs = typeof parsedArgs === 'object' ? parsedArgs : toolArgs; - - if (toolName) { - toolCalls.push({ - id: toolId, - name: toolName, - arguments: finalArgs - }); - } - } + // Build iterations from chat spans + const iterations: Iteration[] = []; + + for (let i = 0; i < chatSpans.length; i++) { + const chatSpan = chatSpans[i]; + const isLastSpan = i === chatSpans.length - 1; - if (toolCalls.length > 0) { - outputObj.toolCalls = toolCalls; + const inputMessagesStr = getAttribute(chatSpan, 'gen_ai.input.messages'); + const outputMessageStr = getAttribute(chatSpan, 'gen_ai.output.messages'); + + const inputMessages = parseMessages(inputMessagesStr); + const iterationHistory = [...inputMessages]; + + // Parse output message (single object) + const output = parseOutputMessage(outputMessageStr); + + if (!isLastSpan) { + iterationHistory.push(output); } + + // Create iteration + iterations.push({ + history: iterationHistory, + output: output, + startTime: convertTimestamp(chatSpan.startTime || startTime), + endTime: convertTimestamp(chatSpan.endTime || endTime) + } as any); } - // Construct Iteration - const iteration: Iteration = { - startTime: aiSpan.startTime || startTime, - endTime: aiSpan.endTime || endTime, - history: history, - output: outputObj - }; + // Determine User Message (Trigger) + // Get the first user message from the first chat span + const firstChatInputStr = getAttribute(chatSpans[0], 'gen_ai.input.messages'); + const firstInputMessages = parseMessages(firstChatInputStr); + const lastUserMsg = [...firstInputMessages].reverse().find(m => m.role === 'user'); + const userMessage: ChatUserMessage = lastUserMsg + ? (lastUserMsg as ChatUserMessage) + : { role: 'user', content: 'Unknown input' }; + + // Final output is the last iteration's output + const finalOutput = iterations[iterations.length - 1].output; // Assemble Final Trace Object const evalsetTrace: EvalsetTrace = { id: traceId, userMessage: userMessage, - iterations: [iteration], - output: outputObj, + iterations: iterations, + output: finalOutput, tools: tools, - startTime: startTime, - endTime: endTime + startTime: convertTimestamp(startTime) as any, + endTime: convertTimestamp(endTime) as any }; return evalsetTrace; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index a4cb9da6d81..6e6c7c21d78 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -131,7 +131,11 @@ export const generateTraceId = (): string => { * Create a new empty trace */ export const createNewTrace = (): EvalsetTrace => { - const now = new Date().toISOString(); + const nowMs = Date.now(); + const seconds = Math.floor(nowMs / 1000); + const nanoseconds = (nowMs % 1000) * 1000000; + const timestamp: [number, number] = [seconds, nanoseconds]; + return { id: generateTraceId(), userMessage: { @@ -144,7 +148,7 @@ export const createNewTrace = (): EvalsetTrace => { }, tools: [], iterations: [], - startTime: now, - endTime: now, + startTime: timestamp, + endTime: timestamp, }; }; From 773a5716d8ed03b1ebcb1426360655954d4b47ef Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Tue, 10 Feb 2026 21:31:33 +0530 Subject: [PATCH 193/247] Enhance evalset export functionality with new and append options --- .../src/features/tracing/trace-converter.ts | 34 +- .../features/tracing/trace-details-webview.ts | 486 ++++++++++++++---- .../Components/ChatInterface.tsx | 1 - .../Components/ExecutionTimeline.tsx | 10 +- 4 files changed, 423 insertions(+), 108 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 5eb1290294f..08767b0fd24 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -18,10 +18,12 @@ import { EvalChatUserMessage as ChatUserMessage, + EvalChatAssistantMessage as ChatAssistantMessage, EvalChatMessage as ChatMessage, EvalToolSchema as ToolSchema, EvalIteration as Iteration, - EvalsetTrace + EvalsetTrace, + EvalFunctionCall } from '@wso2/ballerina-core'; // TraceData interface (from trace-details-webview.ts) @@ -116,6 +118,18 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { s.name.startsWith('chat') && s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.messages') ); + // Find all tool spans in the trace + const toolSpans = spans.filter((s: SpanData) => + s.name.startsWith('execute_tool') + ); + + // Sort tool spans by start time to process in order + toolSpans.sort((a, b) => { + const timeA = a.startTime || ''; + const timeB = b.startTime || ''; + return timeA.localeCompare(timeB); + }); + // Sort chat spans by start time to process in order chatSpans.sort((a, b) => { const timeA = a.startTime || ''; @@ -265,7 +279,7 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { // Create iteration iterations.push({ history: iterationHistory, - output: output, + output: output as ChatAssistantMessage, startTime: convertTimestamp(chatSpan.startTime || startTime), endTime: convertTimestamp(chatSpan.endTime || endTime) } as any); @@ -280,8 +294,22 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { ? (lastUserMsg as ChatUserMessage) : { role: 'user', content: 'Unknown input' }; + const lastIteration = iterations[iterations.length - 1]; + const finalOutputToolCalls: EvalFunctionCall[] = []; + + for (let i = 0; i < toolSpans.length; i++) { + const toolSpan = toolSpans[i]; + const toolCallsStr = getAttribute(toolSpan, 'gen_ai.tool.arguments'); + const toolCallsData = safeJsonParse(toolCallsStr); + finalOutputToolCalls.push({ + name: getAttribute(toolSpan, 'gen_ai.tool.name') || 'unknown_tool', + arguments: toolCallsData + }); + } + // Final output is the last iteration's output - const finalOutput = iterations[iterations.length - 1].output; + const finalOutput: ChatAssistantMessage = lastIteration.output; + finalOutput.toolCalls = finalOutputToolCalls.length > 0 ? finalOutputToolCalls : finalOutput.toolCalls; // Assemble Final Trace Object const evalsetTrace: EvalsetTrace = { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index ceeebf0f0a1..6d85f594660 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -19,6 +19,7 @@ import * as vscode from 'vscode'; import * as path from 'path'; import * as os from 'os'; +import * as fs from 'fs'; import * as crypto from 'crypto'; import { Uri, ViewColumn, Webview } from 'vscode'; import { extension } from '../../BalExtensionContext'; @@ -26,6 +27,7 @@ import { Trace, TraceServer } from './trace-server'; import { getLibraryWebViewContent, getComposerWebViewOptions, WebViewOptions } from '../../utils/webview-utils'; import { convertTraceToEvalset, convertTracesToEvalset } from './trace-converter'; import { EvalThread, EvalSet } from '@wso2/ballerina-core'; +import { getCurrentProjectRoot } from '../../utils/project-utils'; // TraceData interface matching the trace-visualizer component interface TraceData { @@ -371,130 +373,416 @@ export class TraceDetailsWebview { } private async exportTraceAsEvalset(traceData: TraceData): Promise<void> { + const mode = await this.promptExportMode(); + if (!mode) { return; } + + if (mode === 'new') { + await this.createNewEvalsetFromTrace(traceData); + } else { + await this.appendTraceToExistingEvalset(traceData); + } + } + + /** + * Ensures evalsets/ directory exists, returns path + */ + private async ensureEvalsetsDirectory(): Promise<string> { + // Check if workspace is open + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { + throw new Error('Please open a workspace first'); + } + + let projectRoot: string; try { - const fileName = `trace-${traceData.traceId}.evalset.json`; - const wf = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; - let defaultUri: vscode.Uri; + projectRoot = await getCurrentProjectRoot(); + } catch (error) { + // Fallback to workspace root if project root cannot be determined + projectRoot = vscode.workspace.workspaceFolders[0].uri.fsPath; + } - if (wf) { - const evaluationsDirPath = path.join(wf.uri.fsPath, 'evalsets'); - const evaluationsDirUri = vscode.Uri.file(evaluationsDirPath); - try { - await vscode.workspace.fs.createDirectory(evaluationsDirUri); - } catch (e) { - // Ignore errors and fall back to workspace root - } + const evalsetsDir = path.join(projectRoot, 'evalsets'); + const evalsetsDirUri = vscode.Uri.file(evalsetsDir); - defaultUri = vscode.Uri.file(path.join(evaluationsDirPath, fileName)); - } else { - defaultUri = vscode.Uri.file(path.join(os.homedir(), fileName)); + try { + await vscode.workspace.fs.createDirectory(evalsetsDirUri); + } catch (e) { + // Directory might exist, ignore + } + + return evalsetsDir; + } + + /** + * Validates evalset name + */ + private validateEvalsetName(name: string, evalsetsDir: string): string | null { + if (!name || name.trim().length === 0) { + return 'Evalset name cannot be empty'; + } + if (!/^[a-zA-Z0-9-_]+$/.test(name)) { + return 'Name can only contain letters, numbers, hyphens, and underscores'; + } + if (name.length > 100) { + return 'Name is too long (max 100 characters)'; + } + const filePath = path.join(evalsetsDir, `${name}.evalset.json`); + if (fs.existsSync(filePath)) { + return 'An evalset with this name already exists'; + } + return null; // Valid + } + + /** + * Finds existing evalsets for QuickPick + */ + private async findExistingEvalsets(evalsetsDir: string): Promise<Array<{ + label: string; + description: string; + filePath: string; + }>> { + const pattern = new vscode.RelativePattern(evalsetsDir, '*.evalset.json'); + const files = await vscode.workspace.findFiles(pattern); + + return files.map(uri => ({ + label: path.basename(uri.fsPath, '.evalset.json'), + description: uri.fsPath, + filePath: uri.fsPath + })); + } + + /** + * Creates thread from traces + */ + private createThreadFromTraces( + sessionTraces: TraceData[], + sessionId: string, + threadName?: string + ): EvalThread { + const evalsetTraces = convertTracesToEvalset(sessionTraces); + + return { + id: crypto.randomUUID(), + name: threadName || `Thread - ${sessionId.substring(0, 8)}`, + traces: evalsetTraces, + created_on: new Date().toISOString() + }; + } + + /** + * Creates thread from a single trace + */ + private createThreadFromTrace( + traceData: TraceData, + threadName?: string + ): EvalThread { + const evalsetTrace = convertTraceToEvalset(traceData); + + return { + id: crypto.randomUUID(), + name: threadName || `Thread - ${traceData.traceId.substring(0, 8)}`, + traces: [evalsetTrace], + created_on: new Date().toISOString() + }; + } + + /** + * Prompt for export mode (new vs append) + */ + private async promptExportMode(): Promise<'new' | 'append' | undefined> { + const mode = await vscode.window.showQuickPick([ + { label: 'Create new evalset', value: 'new' as const }, + { label: 'Append to existing evalset', value: 'append' as const } + ], { + placeHolder: 'How would you like to export this session?' + }); + + return mode?.value; + } + + /** + * Creates a new evalset + */ + private async createNewEvalset( + sessionTraces: TraceData[], + sessionId: string + ): Promise<void> { + try { + // 1. Ensure evalsets directory exists + const evalsetsDir = await this.ensureEvalsetsDirectory(); + + // 2. Prompt for name + const name = await vscode.window.showInputBox({ + prompt: 'Enter evalset name', + placeHolder: `session-${sessionId.substring(0, 8)}`, + value: `session-${sessionId.substring(0, 8)}`, + validateInput: (value) => this.validateEvalsetName(value, evalsetsDir) + }); + + if (!name) { return; } // User cancelled + + // 3. Create EvalSet with single thread + const thread = this.createThreadFromTraces(sessionTraces, sessionId); + const evalset: EvalSet = { + id: crypto.randomUUID(), + name: name, + description: `Session export`, + threads: [thread], + created_on: new Date().toISOString() + }; + + // 4. Write file + const filePath = path.join(evalsetsDir, `${name}.evalset.json`); + const jsonContent = JSON.stringify(evalset, null, 2); + const fileUri = vscode.Uri.file(filePath); + + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + + // 5. Success message with View option + const action = await vscode.window.showInformationMessage( + `Evalset created: ${name}.evalset.json`, + 'View' + ); + + if (action === 'View') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, thread.id); } - const fileUri = await vscode.window.showSaveDialog({ - defaultUri, - filters: { - 'Evalset Files': ['evalset.json'], - 'JSON Files': ['json'], - 'All Files': ['*'] - } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to create evalset: ${errorMessage}`); + } + } + + /** + * Creates a new evalset from a single trace + */ + private async createNewEvalsetFromTrace( + traceData: TraceData + ): Promise<void> { + try { + // 1. Ensure evalsets directory exists + const evalsetsDir = await this.ensureEvalsetsDirectory(); + + // 2. Prompt for name + const name = await vscode.window.showInputBox({ + prompt: 'Enter evalset name', + placeHolder: `trace-${traceData.traceId.substring(0, 8)}`, + value: `trace-${traceData.traceId.substring(0, 8)}`, + validateInput: (value) => this.validateEvalsetName(value, evalsetsDir) }); - if (fileUri) { - const evalsetTrace = convertTraceToEvalset(traceData); - - const evalThread: EvalThread = { - id: crypto.randomUUID(), - name: `Thread - ${traceData.traceId.substring(0, 8)}`, - traces: [evalsetTrace], - created_on: new Date().toISOString() - }; - - const evalSet: EvalSet = { - id: crypto.randomUUID(), - name: `Trace ${traceData.traceId}`, - description: "Single trace export", - threads: [evalThread], - created_on: new Date().toISOString() - }; - - const jsonContent = JSON.stringify(evalSet, null, 2); - await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + if (!name) { return; } // User cancelled + + // 3. Create EvalSet with single thread + const thread = this.createThreadFromTrace(traceData); + const evalset: EvalSet = { + id: crypto.randomUUID(), + name: name, + description: `Single trace export`, + threads: [thread], + created_on: new Date().toISOString() + }; - const action = await vscode.window.showInformationMessage( - `Trace exported as evalset to ${fileUri.fsPath}`, - 'View' - ); + // 4. Write file + const filePath = path.join(evalsetsDir, `${name}.evalset.json`); + const jsonContent = JSON.stringify(evalset, null, 2); + const fileUri = vscode.Uri.file(filePath); - if (action === 'View') { - await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalThread.id); - } + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + + // 5. Success message with View option + const action = await vscode.window.showInformationMessage( + `Evalset created: ${name}.evalset.json`, + 'View' + ); + + if (action === 'View') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, thread.id); } + } catch (error) { - vscode.window.showErrorMessage(`Failed to export trace as evalset: ${error}`); + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to create evalset: ${errorMessage}`); } } - private async exportSessionAsEvalset(sessionTraces: TraceData[], sessionId: string): Promise<void> { + /** + * Appends a single trace to an existing evalset as a new thread + */ + private async appendTraceToExistingEvalset( + traceData: TraceData + ): Promise<void> { try { - const fileName = `session-${sessionId}.evalset.json`; - const wf = vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders[0]; - let defaultUri: vscode.Uri; + // 1. Ensure evalsets directory and find files + const evalsetsDir = await this.ensureEvalsetsDirectory(); + const existingEvalsets = await this.findExistingEvalsets(evalsetsDir); - if (wf) { - const evaluationsDirPath = path.join(wf.uri.fsPath, 'evalsets'); - const evaluationsDirUri = vscode.Uri.file(evaluationsDirPath); - try { - await vscode.workspace.fs.createDirectory(evaluationsDirUri); - } catch (e) { - // Ignore errors - } + if (existingEvalsets.length === 0) { + vscode.window.showErrorMessage('No evalsets found. Create a new one first.'); + return; + } - defaultUri = vscode.Uri.file(path.join(evaluationsDirPath, fileName)); - } else { - defaultUri = vscode.Uri.file(path.join(os.homedir(), fileName)); + // 2. Select evalset + const selected = await vscode.window.showQuickPick(existingEvalsets, { + placeHolder: 'Select an evalset to append to' + }); + + if (!selected) { return; } // User cancelled + + // 3. Prompt for thread name (quick pick: auto vs custom) + const nameChoice = await vscode.window.showQuickPick([ + { label: 'Auto-generate thread name', value: 'auto' as const }, + { label: 'Enter custom thread name', value: 'custom' as const } + ], { + placeHolder: 'How would you like to name the new thread?' + }); + + if (!nameChoice) { return; } // User cancelled + + let threadName: string | undefined; + if (nameChoice.value === 'custom') { + threadName = await vscode.window.showInputBox({ + prompt: 'Enter thread name', + value: `Thread - ${traceData.traceId.substring(0, 8)}`, + placeHolder: `Thread - ${traceData.traceId.substring(0, 8)}` + }); + + if (!threadName) { return; } // User cancelled } - const fileUri = await vscode.window.showSaveDialog({ - defaultUri, - filters: { - 'Evalset Files': ['evalset.json'], - 'JSON Files': ['json'], - 'All Files': ['*'] - } + // 4. Read existing evalset + const fileUri = vscode.Uri.file(selected.filePath); + let evalset: EvalSet; + + try { + const content = await vscode.workspace.fs.readFile(fileUri); + evalset = JSON.parse(Buffer.from(content).toString('utf8')); + } catch (parseError) { + throw new Error('Invalid evalset file: corrupted or invalid JSON'); + } + + // Validate schema + if (!evalset.threads || !Array.isArray(evalset.threads)) { + throw new Error('Invalid evalset format: missing threads array'); + } + + // 5. Add new thread + const newThread = this.createThreadFromTrace(traceData, threadName); + evalset.threads.push(newThread); + + // 6. Write back + const jsonContent = JSON.stringify(evalset, null, 2); + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + + // 7. Success message with View option + const action = await vscode.window.showInformationMessage( + `Thread added to ${selected.label}.evalset.json`, + 'View' + ); + + if (action === 'View') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, newThread.id); + } + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to append to evalset: ${errorMessage}`); + } + } + + /** + * Appends traces to an existing evalset as a new thread + */ + private async appendToExistingEvalset( + sessionTraces: TraceData[], + sessionId: string + ): Promise<void> { + try { + // 1. Ensure evalsets directory and find files + const evalsetsDir = await this.ensureEvalsetsDirectory(); + const existingEvalsets = await this.findExistingEvalsets(evalsetsDir); + + if (existingEvalsets.length === 0) { + vscode.window.showErrorMessage('No evalsets found. Create a new one first.'); + return; + } + + // 2. Select evalset + const selected = await vscode.window.showQuickPick(existingEvalsets, { + placeHolder: 'Select an evalset to append to' }); - if (fileUri) { - const evalsetTraces = convertTracesToEvalset(sessionTraces); - - const evalThread: EvalThread = { - id: crypto.randomUUID(), - name: `Thread - ${sessionId.substring(0, 8)}`, - traces: evalsetTraces, - created_on: new Date().toISOString() - }; - - const evalSet: EvalSet = { - id: crypto.randomUUID(), - name: `Session ${sessionId}`, - description: "Session export", - threads: [evalThread], - created_on: new Date().toISOString() - }; - - const jsonContent = JSON.stringify(evalSet, null, 2); - await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + if (!selected) { return; } // User cancelled - const action = await vscode.window.showInformationMessage( - `Session exported as evalset to ${fileUri.fsPath}`, - 'View' - ); + // 3. Prompt for thread name (quick pick: auto vs custom) + const nameChoice = await vscode.window.showQuickPick([ + { label: 'Auto-generate thread name', value: 'auto' }, + { label: 'Enter custom thread name', value: 'custom' } + ], { + placeHolder: 'How would you like to name the new thread?' + }); - if (action === 'View') { - await vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, evalThread.id); - } + if (!nameChoice) { return; } // User cancelled + + let threadName: string | undefined; + if (nameChoice.value === 'custom') { + threadName = await vscode.window.showInputBox({ + prompt: 'Enter thread name', + value: `Thread - ${sessionId.substring(0, 8)}`, + placeHolder: `Thread - ${sessionId.substring(0, 8)}` + }); + + if (!threadName) { return; } // User cancelled } + + // 4. Read existing evalset + const fileUri = vscode.Uri.file(selected.filePath); + let evalset: EvalSet; + + try { + const content = await vscode.workspace.fs.readFile(fileUri); + evalset = JSON.parse(Buffer.from(content).toString('utf8')); + } catch (parseError) { + throw new Error('Invalid evalset file: corrupted or invalid JSON'); + } + + // Validate schema + if (!evalset.threads || !Array.isArray(evalset.threads)) { + throw new Error('Invalid evalset format: missing threads array'); + } + + // 5. Add new thread + const newThread = this.createThreadFromTraces(sessionTraces, sessionId, threadName); + evalset.threads.push(newThread); + + // 6. Write back + const jsonContent = JSON.stringify(evalset, null, 2); + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + + // 7. Success message with View option + const action = await vscode.window.showInformationMessage( + `Thread added to ${selected.label}.evalset.json`, + 'View' + ); + + if (action === 'View') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, newThread.id); + } + } catch (error) { - vscode.window.showErrorMessage(`Failed to export session as evalset: ${error}`); + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to append to evalset: ${errorMessage}`); + } + } + + private async exportSessionAsEvalset(sessionTraces: TraceData[], sessionId: string): Promise<void> { + const mode = await this.promptExportMode(); + if (!mode) { return; } + + if (mode === 'new') { + await this.createNewEvalset(sessionTraces, sessionId); + } else { + await this.appendToExistingEvalset(sessionTraces, sessionId); } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 0c5ba80264f..0cb92473038 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -122,7 +122,6 @@ export const MessageContainer = styled.div<{ isUser: boolean }>` align-items: flex-end; justify-content: ${({ isUser }: { isUser: boolean }) => (isUser ? "flex-end" : "flex-start")}; gap: 6px; - margin-bottom: 8px; `; export const ProfilePic = styled.div` diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx index 29d4d07cfcb..6897432fa53 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ExecutionTimeline.tsx @@ -167,13 +167,13 @@ const Duration = styled.span` export function ExecutionTimeline({ steps, traceId, onViewInTrace }: ExecutionTimelineProps) { const [open, setOpen] = useState(false); - if (!steps || steps.length === 0) { - return null; - } - // Filter out steps with invoke operation type const filteredSteps = steps.filter(step => step.operationType !== 'invoke'); + if (!filteredSteps || filteredSteps.length === 0) { + return null; + } + const getIconName = (operationType: string) => { switch (operationType) { case 'invoke': return 'bi-ai-agent'; @@ -211,7 +211,7 @@ export function ExecutionTimeline({ steps, traceId, onViewInTrace }: ExecutionTi <TimelineList> {filteredSteps.map((step, index) => ( <TimelineItem key={step.spanId}> - <ConnectorColumn isLast={index === steps.length - 1}> + <ConnectorColumn isLast={index === filteredSteps.length - 1}> <Dot operationType={step.operationType} /> </ConnectorColumn> <ContentCard From 10e951b64188ed10a128f560df237f5f7ce53638 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 11 Feb 2026 05:05:21 +0530 Subject: [PATCH 194/247] Add check for invoke_agent span with conversation ID in TraceDetails to display session traces --- .../ballerina/trace-visualizer/src/TraceDetails.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx index c6a0d2b72f4..b7afd1c629f 100644 --- a/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx +++ b/workspaces/ballerina/trace-visualizer/src/TraceDetails.tsx @@ -644,6 +644,15 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, onViewSessio return null; }, [traceData.spans]); + // Check if there's an invoke_agent span with gen_ai.conversation.id attribute + const hasInvokeAgentWithConversationId = useMemo(() => { + return traceData.spans.some(span => { + const operationName = span.attributes?.find(attr => attr.key === 'gen_ai.operation.name')?.value || ''; + const hasConversationId = span.attributes?.some(attr => attr.key === 'gen_ai.conversation.id'); + return operationName.startsWith('invoke_agent') && hasConversationId; + }); + }, [traceData.spans]); + // Handle resize drag const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => { const target = e.currentTarget; @@ -925,7 +934,7 @@ export function TraceDetails({ traceData, isAgentChat, focusSpanId, onViewSessio {selectedSpan && ( <DetailsPanelContainer> <DetailsPanel> - {onViewSession && ( + {onViewSession && hasInvokeAgentWithConversationId && ( <BreadcrumbContainer> <BreadcrumbItem isClickable onClick={onViewSession}> <Icon name="bi-back" sx={{ fontSize: '12px', width: '12px', height: '12px' }} iconSx={{ fontSize: "12px" }} /> From 812990a6b1a4b84f91fbd7b4e51f783a3a17dc07 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 11 Feb 2026 09:36:07 +0530 Subject: [PATCH 195/247] Auto add evaluations to "Evaluation" group on creation --- .../src/views/BI/AIEvaluationForm/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index a4a2dd2f30e..e32892e18fe 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -586,7 +586,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }, types: [{ fieldType: "EXPRESSION_SET", selected: false }], originalName: "groups", - value: [], + value: ["Evaluation"], optional: true, editable: true, advanced: false From d6fd8b41946acb6763243bb5f17b1c7b45a2ffd8 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 11 Feb 2026 18:41:59 +0530 Subject: [PATCH 196/247] Add support for reusing agents --- .../ballerina-core/src/interfaces/bi.ts | 2 + .../src/rpc-types/bi-diagram/index.ts | 1 + .../src/rpc-types/bi-diagram/rpc-type.ts | 1 + .../src/core/extended-language-client.ts | 5 ++ .../rpc-managers/bi-diagram/rpc-handler.ts | 2 + .../rpc-managers/bi-diagram/rpc-manager.ts | 17 +++++ .../src/rpc-clients/bi-diagram/rpc-client.ts | 5 ++ .../src/components/GroupList/index.tsx | 68 ++++++++++-------- .../src/components/NodeList/categoryConfig.ts | 16 +++-- .../src/components/NodeList/index.tsx | 3 +- .../ballerina-visualizer/src/utils/bi.tsx | 2 +- .../src/views/BI/FlowDiagram/PanelManager.tsx | 17 +++++ .../src/views/BI/FlowDiagram/index.tsx | 70 ++++++++++++++++--- .../views/BI/Forms/FormGenerator/index.tsx | 2 +- .../src/components/ConnectorIcon/index.tsx | 4 ++ .../src/components/NodeIcon/index.tsx | 3 + 16 files changed, 172 insertions(+), 46 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 4a524e9830b..d1bf72545e3 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -467,8 +467,10 @@ export type FieldScope = "Global" | "Local" | "Object"; export type NodeKind = | "ACTION_OR_EXPRESSION" + | "AGENTS" | "AGENT" | "AGENT_CALL" + | "AGENT_RUN" | "ASSIGN" | "AUTOMATION" | "BODY" 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 4e452c463ae..1e5fd2a0fa7 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 @@ -130,6 +130,7 @@ export interface BIDiagramAPI { deleteFlowNode: (params: BISourceCodeRequest) => Promise<UpdatedArtifactsResponse>; deleteByComponentInfo: (params: BIDeleteByComponentInfoRequest) => Promise<BIDeleteByComponentInfoResponse>; getAvailableNodes: (params: BIAvailableNodesRequest) => Promise<BIAvailableNodesResponse>; + getAvailableAgents: (params: BIAvailableNodesRequest) => Promise<BIAvailableNodesResponse>; getAvailableModelProviders: (params: BIAvailableNodesRequest) => Promise<BIAvailableNodesResponse>; getAvailableVectorStores: (params: BIAvailableNodesRequest) => Promise<BIAvailableNodesResponse>; getAvailableEmbeddingProviders: (params: BIAvailableNodesRequest) => Promise<BIAvailableNodesResponse>; 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 1da53727308..4cfa0a38c5d 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 @@ -133,6 +133,7 @@ export const getSourceCode: RequestType<BISourceCodeRequest, UpdatedArtifactsRes export const deleteFlowNode: RequestType<BISourceCodeRequest, UpdatedArtifactsResponse> = { method: `${_preFix}/deleteFlowNode` }; export const deleteByComponentInfo: RequestType<BIDeleteByComponentInfoRequest, BIDeleteByComponentInfoResponse> = { method: `${_preFix}/deleteByComponentInfo` }; export const getAvailableNodes: RequestType<BIAvailableNodesRequest, BIAvailableNodesResponse> = { method: `${_preFix}/getAvailableNodes` }; +export const getAvailableAgents: RequestType<BIAvailableNodesRequest, BIAvailableNodesResponse> = { method: `${_preFix}/getAvailableAgents` }; export const getAvailableModelProviders: RequestType<BIAvailableNodesRequest, BIAvailableNodesResponse> = { method: `${_preFix}/getAvailableModelProviders` }; export const getAvailableVectorStores: RequestType<BIAvailableNodesRequest, BIAvailableNodesResponse> = { method: `${_preFix}/getAvailableVectorStores` }; export const getAvailableEmbeddingProviders: RequestType<BIAvailableNodesRequest, BIAvailableNodesResponse> = { method: `${_preFix}/getAvailableEmbeddingProviders` }; 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 d69484e0cbf..d1f9514532f 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -354,6 +354,7 @@ enum EXTENDED_APIS { BI_VERIFY_TYPE_DELETE = 'typesManager/verifyTypeDelete', BI_DELETE_TYPE = 'typesManager/deleteType', BI_AVAILABLE_NODES = 'flowDesignService/getAvailableNodes', + BI_AVAILABLE_AGENTS = 'flowDesignService/getAvailableAgents', BI_AVAILABLE_MODEL_PROVIDERS = 'flowDesignService/getAvailableModelProviders', BI_AVAILABLE_VECTOR_STORES = 'flowDesignService/getAvailableVectorStores', BI_AVAILABLE_EMBEDDING_PROVIDERS = 'flowDesignService/getAvailableEmbeddingProviders', @@ -1091,6 +1092,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest<BIAvailableNodesResponse>(EXTENDED_APIS.BI_AVAILABLE_NODES, params); } + async getAvailableAgents(params: BIAvailableNodesRequest): Promise<BIAvailableNodesResponse> { + return this.sendRequest<BIAvailableNodesResponse>(EXTENDED_APIS.BI_AVAILABLE_AGENTS, params); + } + async getAvailableModelProviders(params: BIAvailableNodesRequest): Promise<BIAvailableNodesResponse> { return this.sendRequest<BIAvailableNodesResponse>(EXTENDED_APIS.BI_AVAILABLE_MODEL_PROVIDERS, 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 bdd91ec0b50..f09cec269f3 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 @@ -69,6 +69,7 @@ import { FunctionNodeRequest, generateOpenApiClient, getAiSuggestions, + getAvailableAgents, getAvailableChunkers, getAvailableDataLoaders, getAvailableEmbeddingProviders, @@ -163,6 +164,7 @@ 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(getAvailableAgents, (args: BIAvailableNodesRequest) => rpcManger.getAvailableAgents(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)); 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 4169fd1b755..97e7a58f5b8 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 @@ -2106,6 +2106,23 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }); } + async getAvailableAgents(params: BIAvailableNodesRequest): Promise<BIAvailableNodesResponse> { + console.log(">>> requesting bi available agents from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableAgents(params) + .then((model) => { + console.log(">>> bi available agents from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available agents from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } } export function getRepoRoot(projectRoot: string): string | undefined { 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 1e45c2e40b0..d3a41a364b9 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 @@ -143,6 +143,7 @@ import { formDidOpen, generateOpenApiClient, getAiSuggestions, + getAvailableAgents, getAvailableChunkers, getAvailableDataLoaders, getAvailableEmbeddingProviders, @@ -232,6 +233,10 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendRequest(getAvailableNodes, HOST_EXTENSION, params); } + getAvailableAgents(params: BIAvailableNodesRequest): Promise<BIAvailableNodesResponse> { + return this._messenger.sendRequest(getAvailableAgents, HOST_EXTENSION, params); + } + getAvailableModelProviders(params: BIAvailableNodesRequest): Promise<BIAvailableNodesResponse> { return this._messenger.sendRequest(getAvailableModelProviders, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/GroupList/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/GroupList/index.tsx index 555826f913e..2ea46d1967d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/GroupList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/GroupList/index.tsx @@ -153,19 +153,27 @@ interface GroupListProps { category: Category; expand?: boolean; onSelect: (node: Node, category: string) => void; + enableSingleNodeDirectNav?: boolean; } export function GroupList(props: GroupListProps) { - const { category, expand, onSelect } = props; + const { category, expand, onSelect, enableSingleNodeDirectNav } = props; const [showList, setShowList] = useState(expand ?? false); const [expandedTitleIndex, setExpandedTitleIndex] = useState<number | null>(null); const nodes = category.items as Node[]; const openList = expand || showList; + const enabledNodes = nodes.filter((node) => node.enabled); + const isSingleNode = enabledNodes.length === 1 && enableSingleNodeDirectNav; const handleToggleList = () => { - setShowList(!showList); + if (isSingleNode) { + // Navigate directly to the single node + onSelect(enabledNodes[0], category.title); + } else { + setShowList(!showList); + } }; const handleComponentMouseEnter = (index: number) => { @@ -186,37 +194,41 @@ export function GroupList(props: GroupListProps) { <S.CardIcon>{category.icon || <LogIcon />}</S.CardIcon> <S.Title>{category.title}</S.Title> <S.CardAction> - {openList ? <Codicon name={"chevron-up"} /> : <Codicon name={"chevron-down"} />} + {isSingleNode ? ( + <Codicon name={"chevron-right"} /> + ) : openList ? ( + <Codicon name={"chevron-up"} /> + ) : ( + <Codicon name={"chevron-down"} /> + )} </S.CardAction> </S.TitleRow> - {openList && ( + {openList && !isSingleNode && ( <> <S.BodyText>{category.description}</S.BodyText> <S.Grid columns={1}> - {nodes - .filter((node) => node.enabled) - .map((node, index) => ( - <S.Component - key={node.id + index} - enabled={node.enabled} - expanded={expandedTitleIndex === index} - onClick={() => onSelect(node, category.title)} - onMouseEnter={() => handleComponentMouseEnter(index)} - onMouseLeave={handleComponentMouseLeave} - > - <S.ComponentIcon expanded={expandedTitleIndex === index}> - {node.icon || <CallIcon />} - </S.ComponentIcon> - <S.ComponentContent expanded={expandedTitleIndex === index}> - <S.ComponentTitle>{getComponentTitle(node)}</S.ComponentTitle> - {expandedTitleIndex === index && ( - <S.ComponentDescription> - {getComponentDescription(node)} - </S.ComponentDescription> - )} - </S.ComponentContent> - </S.Component> - ))} + {enabledNodes.map((node, index) => ( + <S.Component + key={node.id + index} + enabled={node.enabled} + expanded={expandedTitleIndex === index} + onClick={() => onSelect(node, category.title)} + onMouseEnter={() => handleComponentMouseEnter(index)} + onMouseLeave={handleComponentMouseLeave} + > + <S.ComponentIcon expanded={expandedTitleIndex === index}> + {node.icon || <CallIcon />} + </S.ComponentIcon> + <S.ComponentContent expanded={expandedTitleIndex === index}> + <S.ComponentTitle>{getComponentTitle(node)}</S.ComponentTitle> + {expandedTitleIndex === index && ( + <S.ComponentDescription> + {getComponentDescription(node)} + </S.ComponentDescription> + )} + </S.ComponentContent> + </S.Component> + ))} </S.Grid> </> )} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/categoryConfig.ts b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/categoryConfig.ts index da37cedf5bd..e82e146b2c0 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/categoryConfig.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/categoryConfig.ts @@ -60,7 +60,7 @@ export const CATEGORY_CONFIGS: Record<string, CategoryConfig> = { }, { type: 'function', - tooltip: "Create Natural Function", + tooltip: "Create Natural Function", emptyStateLabel: "Create Natural Function", handlerKey: 'onAddFunction', condition: (title) => title === "Natural Functions" @@ -77,11 +77,17 @@ export const CATEGORY_CONFIGS: Record<string, CategoryConfig> = { useConnectionContainer: false, fixed: true }, - "Agents": { - title: "Agents", - actions: [], + "Agent": { + title: "Agents", + actions: [{ + type: 'add', + tooltip: "Add Agent", // Will use addButtonLabel from props + emptyStateLabel: "", // Will use addButtonLabel from props + handlerKey: 'onAdd' + }], showWhenEmpty: true, - useConnectionContainer: false + useConnectionContainer: true, + fixed: true }, "Model Providers": { title: "Model Providers", 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 895d8b29108..10d88015637 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -524,7 +524,7 @@ export function NodeList(props: NodeListProps) { ); }; - const getConnectionContainer = (categories: Category[]) => ( + const getConnectionContainer = (categories: Category[], enableSingleNodeDirectNav?: boolean) => ( <S.Grid columns={1}> {categories.map((category, index) => category.isLoading ? ( @@ -535,6 +535,7 @@ export function NodeList(props: NodeListProps) { category={category} expand={searchText?.length > 0} onSelect={handleAddNode} + enableSingleNodeDirectNav={enableSingleNodeDirectNav} /> )) } diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 745decac1ff..a4429404559 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -427,7 +427,7 @@ export function getContainerTitle(view: SidePanelView, activeNode: FlowNode, cli if (!activeNode) { return ""; } - if (activeNode.codedata?.node === "AGENT_CALL") { + if (activeNode.codedata?.node === "AGENT_CALL" || activeNode.codedata?.node === "AGENT_RUN") { return `AI Agent`; } if (activeNode.codedata?.node === "KNOWLEDGE_BASE" && activeNode.codedata?.object === "VectorKnowledgeBase") { 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 66f3f63f780..c88f89cd868 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -78,6 +78,7 @@ export enum SidePanelView { CONNECTION_CREATE = "CONNECTION_CREATE", AGENT_MEMORY_MANAGER = "AGENT_MEMORY_MANAGER", AGENT_CONFIG = "AGENT_CONFIG", + AGENT_LIST = "AGENT_LIST" } interface PanelManagerProps { @@ -130,6 +131,7 @@ interface PanelManagerProps { onSearchVectorKnowledgeBase?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchDataLoader?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchChunker?: (searchText: string, functionType: FUNCTION_TYPE) => void; + onAddAgent?: () => void; onEditAgent?: () => void; onNavigateToPanel?: (targetPanel: SidePanelView, connectionKind?: ConnectionKind) => void; setSidePanelView: (view: SidePanelView) => void; @@ -176,6 +178,7 @@ export function PanelManager(props: PanelManagerProps) { onAddFunction, onAddNPFunction, onAddDataMapper, + onAddAgent, onAddModelProvider, onAddVectorStore, onAddEmbeddingProvider, @@ -358,6 +361,20 @@ export function PanelManager(props: PanelManagerProps) { /> ); + case SidePanelView.AGENT_LIST: + return ( + <NodeList + categories={categories} + onSelect={onSelectNode} + onAdd={onAddAgent} + addButtonLabel={"Add Agent"} + onClose={onClose} + title={"Agents"} + searchPlaceholder={"Search agents"} + onBack={canGoBack ? onBack : undefined} + /> + ); + case SidePanelView.MODEL_PROVIDER_LIST: return ( <NodeList 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 70e31aef214..d2c64f5cc0f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -161,6 +161,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const updatedNodeRef = useRef<FlowNode>(undefined); const [targetLineRange, setTargetLineRange] = useState<LineRange>(targetRef?.current); + const isCreatingAgent = useRef<boolean>(false); const isCreatingNewModelProvider = useRef<boolean>(false); const isCreatingNewVectorStore = useRef<boolean>(false); const isCreatingNewEmbeddingProvider = useRef<boolean>(false); @@ -1104,6 +1105,29 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); break; + case "AGENTS": + setShowProgressIndicator(true); + rpcClient + .getBIDiagramRpcClient() + .getAvailableAgents({ + position: targetRef.current.startLine, + filePath: model?.fileName || fileName, + }) + .then((response) => { + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.AGENT_LIST); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + break; + case "MODEL_PROVIDERS": setShowProgressIndicator(true); rpcClient @@ -1471,16 +1495,6 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { console.error(">>> Error updating source code", deleteNodeResponse); } - if (node.codedata.node === "AGENT_CALL") { - const agentNodeDeleteResponse = await removeAgentNode(node, rpcClient); - if (!agentNodeDeleteResponse) { - console.error(">>> Error deleting agent node", node); - setShowProgressIndicator(false); - debouncedGetFlowModel(); - return; - } - } - await updateArtifactLocation(deleteNodeResponse); selectedNodeRef.current = undefined; @@ -1756,6 +1770,41 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { setProgressMessage(LOADING_MESSAGE); }; + const handleOnAddNewAgent = () => { + isCreatingAgent.current = true; + setShowProgressIndicator(true); + setShowProgressSpinner(true); + + // Push current state to navigation stack + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + + rpcClient + .getBIDiagramRpcClient() + .getNodeTemplate({ + position: targetRef.current.startLine, + filePath: model?.fileName, + id: { + node: "AGENT_CALL", + org: "ballerina", + symbol: "run", + module: "ai", + packageName: "ai", + object: "Agent" + }, + }) + .then((response) => { + selectedNodeRef.current = response.flowNode; + nodeTemplateRef.current = response.flowNode; + showEditForm.current = false; + setSidePanelView(SidePanelView.FORM); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + setShowProgressSpinner(false); + }); + }; + const handleOnAddNewModelProvider = () => { isCreatingNewModelProvider.current = true; setShowProgressIndicator(true); @@ -2512,6 +2561,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onSearchChunker={handleSearchChunker} onUpdateNodeWithConnection={updateNodeWithConnection} // AI Agent specific callbacks + onAddAgent={handleOnAddNewAgent} onEditAgent={handleEditAgent} onSelectTool={handleOnSelectTool} onDeleteTool={handleOnDeleteTool} 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 0d1edd1c46e..aa396f8f4f4 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 @@ -260,7 +260,7 @@ export const FormGenerator = forwardRef<FormExpressionEditorRef, FormProps>(func const skipFormValidation = useMemo(() => { const isAgentNode = node && ( - node.codedata.node === "AGENT_CALL" && + (node.codedata.node === "AGENT_CALL" || node.codedata.node === "AGENT_RUN") && node.codedata.org === "ballerina" && node.codedata.module === "ai" && node.codedata.packageName === "ai" && diff --git a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx index b3f3074a7d6..942a1ee1365 100644 --- a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx @@ -59,6 +59,10 @@ export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { return getLlmModelIcons(selectedModule); } + if (codedata && (codedata.node === "AGENT_CALL" || codedata.node === "AGENT_RUN")) { + return <Icon name="bi-ai-agent" className={className} sx={{ width: 24, height: 24, fontSize: 24, ...style }} />; + } + // use custom icon for wso2 module if (codedata && isWso2Module(codedata) || url?.includes("wso2_icon")) { return <Icon name="bi-wso2" className={className} sx={{ width: 24, height: 24, fontSize: 24, ...style }} />; diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx index 600e4394d0d..9ce6dfe1aee 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx @@ -79,6 +79,7 @@ const NODE_COLOR_GROUPS = { // AI/NP function group - cyan variants CYAN_FUNCTION_GROUP: [ "AGENT_CALL", + "AGENTS", "NP_FUNCTION", "NP_FUNCTION_CALL", "MODEL_PROVIDER", @@ -227,6 +228,8 @@ const NODE_ICONS: Record<NodeKind, React.FC<{ size: number; color: string }>> = FAIL: ({ size, color }) => <Icon name="bi-error" sx={{ fontSize: size, width: size, height: size, color }} />, RETRY: ({ size, color }) => <Icon name="bi-retry" sx={{ fontSize: size, width: size, height: size, color }} />, AGENT_CALL: ({ size, color }) => <Icon name="bi-ai-agent" sx={{ fontSize: size, width: size, height: size, color }} />, + AGENTS: ({ size, color }) => <Icon name="bi-ai-agent" sx={{ fontSize: size, width: size, height: size, color }} />, + AGENT_RUN: ({ size, color }) => <Icon name="bi-ai-agent" sx={{ fontSize: size, width: size, height: size, color }} />, MODEL_PROVIDER: ({ size, color }) => <Icon name="bi-ai-model" sx={{ fontSize: size, width: size, height: size, color }} />, MODEL_PROVIDERS: ({ size, color }) => <Icon name="bi-ai-model" sx={{ fontSize: size, width: size, height: size, color }} />, KNOWLEDGE_BASE: ({ size, color }) => <Icon name="bi-db-kb" sx={{ fontSize: size, width: size, height: size, color }} />, From ea46b082027d2d424a6b926e90f1c129a630c686 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 11 Feb 2026 19:38:42 +0530 Subject: [PATCH 197/247] Add toolCalls field to eval trace type --- .../ballerina/ballerina-core/src/state-machine-types.ts | 1 + .../src/features/tracing/trace-converter.ts | 2 +- .../src/views/EvalsetViewer/EvalThreadViewer.tsx | 2 +- .../src/views/EvalsetViewer/utils/traceAdapters.ts | 6 ++---- 4 files changed, 5 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 0e8f26ce65a..53f961f5c0f 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -260,6 +260,7 @@ export interface EvalsetTrace { iterations: EvalIteration[]; output: EvalChatAssistantMessage | any; tools: EvalToolSchema[]; + toolCalls: EvalFunctionCall[]; startTime: [number, number]; // [seconds, nanoseconds] endTime: [number, number]; // [seconds, nanoseconds] } diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 08767b0fd24..464d652737e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -309,7 +309,6 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { // Final output is the last iteration's output const finalOutput: ChatAssistantMessage = lastIteration.output; - finalOutput.toolCalls = finalOutputToolCalls.length > 0 ? finalOutputToolCalls : finalOutput.toolCalls; // Assemble Final Trace Object const evalsetTrace: EvalsetTrace = { @@ -318,6 +317,7 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { iterations: iterations, output: finalOutput, tools: tools, + toolCalls: finalOutputToolCalls, startTime: convertTimestamp(startTime) as any, endTime: convertTimestamp(endTime) as any }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index dd9d840e6a7..64a4a6415a3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -460,7 +460,7 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, ); const extractToolCalls = (trace: EvalsetTrace): EvalFunctionCall[] => { - return (trace.output?.toolCalls as EvalFunctionCall[]) || []; + return (trace.toolCalls as EvalFunctionCall[]) || []; }; const handleEnterEditMode = () => { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index 6e6c7c21d78..e8b1687b013 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -70,10 +70,7 @@ export const updateToolCallsInTrace = ( ): EvalsetTrace => { return { ...trace, - output: { - ...trace.output, - toolCalls: toolCalls.length > 0 ? toolCalls : undefined, - }, + toolCalls: toolCalls.length > 0 ? toolCalls : undefined, }; }; @@ -147,6 +144,7 @@ export const createNewTrace = (): EvalsetTrace => { content: 'Agent Response', }, tools: [], + toolCalls: [], iterations: [], startTime: timestamp, endTime: timestamp, From 86597b8cf921ad4b8b8a31c9d97ae608b68440a7 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Wed, 11 Feb 2026 19:44:18 +0530 Subject: [PATCH 198/247] Rename AIEvaluationForm component --- .../src/views/BI/AIEvaluationForm/index.tsx | 2 +- .../ballerina/ballerina-visualizer/src/views/BI/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index e32892e18fe..f7b856bfcc2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -96,7 +96,7 @@ interface TestFunctionDefProps { serviceType?: string; } -export function TestFunctionForm(props: TestFunctionDefProps) { +export function AIEvaluationForm(props: TestFunctionDefProps) { const { projectPath, functionName, filePath, serviceType } = props; const { rpcClient } = useRpcContext(); const [formFields, setFormFields] = useState<FormField[]>([]); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx index b9475a979d4..d38e47b2f76 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/index.tsx @@ -27,4 +27,4 @@ export { PopupMessage } from "./PopupMessage"; export { FunctionForm } from "./FunctionForm"; export { SetupView } from "./SetupView"; export { TestFunctionForm } from "./TestFunctionForm"; -export { TestFunctionForm as AIEvaluationForm } from "./AIEvaluationForm"; +export { AIEvaluationForm } from "./AIEvaluationForm"; From 1c95896bb28c725a442db2d01c4aee1587ccdb64 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 09:34:37 +0530 Subject: [PATCH 199/247] Update AI evaluation form to support update flow --- .../src/features/test-explorer/activator.ts | 2 +- .../src/features/test-explorer/commands.ts | 104 +++++++++++++++++- .../src/views/BI/AIEvaluationForm/index.tsx | 78 ++++++++++--- 3 files changed, 166 insertions(+), 18 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index afa67b858a2..81b2de7c945 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -116,7 +116,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { // Register the test controller and file watcher with the extension context ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand, saveEvalThreadCommand); - activateEditBiTest(); + activateEditBiTest(ballerinaExtInstance); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index 93bb2dca0c8..a08ed1e21ff 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -19,7 +19,7 @@ import { commands, TestItem, window } from "vscode"; import { openView, StateMachine, history } from "../../stateMachine"; -import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW } from "@wso2/ballerina-core"; +import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW, Annotation, ValueProperty, GetTestFunctionResponse } from "@wso2/ballerina-core"; import { isTestFunctionItem } from "./discover"; import path from "path"; import { promises as fs } from 'fs'; @@ -28,9 +28,9 @@ import { VisualizerWebview } from "../../views/visualizer/webview"; import { getCurrentProjectRoot, tryGetCurrentBallerinaFile } from "../../utils/project-utils"; import { findBallerinaPackageRoot } from "../../utils"; import { MESSAGES } from "../project"; -import { findWorkspaceTypeFromWorkspaceFolders } from "../../rpc-managers/common/utils"; +import { BallerinaExtension } from "../../core"; -export function activateEditBiTest() { +export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { // register run project tests handler commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION, async (entry: TestItem) => { const projectPath = await findProjectPath(entry.uri?.fsPath); @@ -109,8 +109,41 @@ export function activateEditBiTest() { const fileUri = path.resolve(projectPath, `tests`, fileName); if (fileUri) { const range = entry.range; + + // Fetch the test function to check if it belongs to the "Evaluation" group + let viewToOpen = MACHINE_VIEW.BITestFunctionForm; // Default to regular test form + + try { + console.log('[TEST EDIT] Fetching test function:', entry.label, 'from file:', fileUri); + const response = await ballerinaExtInstance.langClient?.getTestFunction({ + functionName: entry.label, + filePath: fileUri + }); + + console.log('[TEST EDIT] Response received:', response); + + if (response && isValidTestFunctionResponse(response) && response.function) { + console.log('[TEST EDIT] Valid response, checking for Evaluation group'); + const isEvaluation = hasEvaluationGroup(response.function); + console.log('[TEST EDIT] Is Evaluation test?', isEvaluation); + if (isEvaluation) { + viewToOpen = MACHINE_VIEW.BIAIEvaluationForm; + console.log('[TEST EDIT] Opening AI Evaluation Form'); + } else { + console.log('[TEST EDIT] Opening regular Test Function Form'); + } + } else { + console.log('[TEST EDIT] Invalid response or no function data, using default form'); + } + } catch (error) { + console.warn('Failed to fetch test function, defaulting to regular test form:', error); + // Continue with default form if fetching fails + } + + console.log('[TEST EDIT] Final view to open:', viewToOpen); + openView(EVENT_TYPE.OPEN_VIEW, { - view: MACHINE_VIEW.BITestFunctionForm, + view: viewToOpen, documentUri: fileUri, identifier: entry.label, position: { @@ -125,6 +158,69 @@ export function activateEditBiTest() { }); } +/** + * Type guard to check if response is a valid GetTestFunctionResponse + * @param response The response to check + * @returns true if response is GetTestFunctionResponse, false if NOT_SUPPORTED_TYPE + */ +function isValidTestFunctionResponse(response: any): response is GetTestFunctionResponse { + return 'function' in response || 'errorMsg' in response || 'stacktrace' in response; +} + +/** + * Check if a test function belongs to the "Evaluation" group + * @param testFunction The test function to check + * @returns true if the function has "Evaluation" in its groups, false otherwise + */ +function hasEvaluationGroup(testFunction: any): boolean { + console.log('[HAS_EVAL_GROUP] Checking test function:', testFunction?.functionName?.value); + + if (!testFunction?.annotations) { + console.log('[HAS_EVAL_GROUP] No annotations found'); + return false; + } + + console.log('[HAS_EVAL_GROUP] Found annotations:', testFunction.annotations.map((a: any) => a.name)); + + // Find the Config annotation + const configAnnotation = testFunction.annotations.find( + (annotation: Annotation) => annotation.name === 'Config' + ); + + if (!configAnnotation?.fields) { + console.log('[HAS_EVAL_GROUP] No Config annotation or fields found'); + return false; + } + + console.log('[HAS_EVAL_GROUP] Config annotation fields:', configAnnotation.fields.map((f: any) => f.originalName)); + + // Find the groups field + const groupsField = configAnnotation.fields.find( + (field: ValueProperty) => field.originalName === 'groups' + ); + + if (!groupsField?.value) { + console.log('[HAS_EVAL_GROUP] No groups field found or empty'); + return false; + } + + console.log('[HAS_EVAL_GROUP] Groups field value:', groupsField.value, 'Type:', typeof groupsField.value, 'IsArray:', Array.isArray(groupsField.value)); + + if (!Array.isArray(groupsField.value)) { + console.log('[HAS_EVAL_GROUP] Groups value is not an array'); + return false; + } + + // Check if "Evaluation" is in the groups array + // Note: The values may include quotes, so we need to strip them + const hasEvaluation = groupsField.value.some((group: string) => { + const cleanedGroup = group.replace(/^["']|["']$/g, ''); // Remove leading/trailing quotes + return cleanedGroup === 'Evaluation'; + }); + console.log('[HAS_EVAL_GROUP] Contains "Evaluation"?', hasEvaluation, 'Groups:', groupsField.value); + return hasEvaluation; +} + async function ensureFileExists(filePath: string) { try { await fs.access(filePath); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index f7b856bfcc2..c9c2f868302 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -102,6 +102,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { const [formFields, setFormFields] = useState<FormField[]>([]); const [testFunction, setTestFunction] = useState<TestFunction>(); const [formTitle, setFormTitle] = useState<string>('Create New AI Evaluation'); + const [formSubtitle, setFormSubtitle] = useState<string>('Create a new AI evaluation for your integration'); const [targetLineRange, setTargetLineRange] = useState<LineRange>(); const [dataProviderMode, setDataProviderMode] = useState<string>('evalSet'); const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); @@ -147,9 +148,11 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { useEffect(() => { if (serviceType === 'UPDATE_TEST') { setFormTitle('Update AI Evaluation'); + setFormSubtitle('Update an existing AI evaluation'); loadFunction(); } else { setFormTitle('Create New AI Evaluation'); + setFormSubtitle('Create a new AI evaluation for your integration'); loadEmptyForm(); } @@ -320,17 +323,67 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { if (testFunction.annotations) { const configAnnotation = getTestConfigAnnotation(testFunction.annotations); if (configAnnotation && configAnnotation.fields) { + const minPassRateField = configAnnotation.fields.find(f => f.originalName === 'minPassRate'); + if (minPassRateField) { + const generatedField = generateFieldFromProperty('minPassRate', minPassRateField); + fields.push({ + ...generatedField, + type: 'SLIDER', + sliderProps: { + min: 0, + max: 100, + step: 1, + showValue: true, + showMarkers: true, + valueFormatter: (value: number) => `${value}%` + } + }); + } + + const evalSetFileField = configAnnotation.fields.find(f => f.originalName === 'evalSetFile'); + if (evalSetFileField) { + fields.push({ + ...generateFieldFromProperty('evalSetFile', evalSetFileField), + type: 'SINGLE_SELECT', + itemOptions: evalsetOptions + }); + } + for (const field of configAnnotation.fields) { - // Skip dataProviderMode - it will be rendered as CardSelector - if (field.originalName === 'dataProviderMode') { + // Skip fields already processed + if (field.originalName === 'dataProviderMode' || + field.originalName === 'minPassRate' || + field.originalName === 'evalSetFile') { + continue; + } + + // Special handling for groups and dependsOn - use EXPRESSION_SET + if (field.originalName === 'groups' || field.originalName === 'dependsOn') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'EXPRESSION_SET', + types: [{ fieldType: 'EXPRESSION_SET', selected: false }] + }); continue; } - if (field.originalName === 'evalSetFile') { + // Special handling for expression fields - ensure they use EXPRESSION type + if (field.originalName === 'before' || field.originalName === 'after' || + field.originalName === 'runs' || field.originalName === 'dataProvider') { fields.push({ ...generateFieldFromProperty(field.originalName, field), - type: 'SINGLE_SELECT', - itemOptions: evalsetOptions + type: 'EXPRESSION', + types: [{ fieldType: 'EXPRESSION', selected: false }] + }); + continue; + } + + // Special handling for enabled - use FLAG + if (field.originalName === 'enabled') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'FLAG', + types: [{ fieldType: 'FLAG', selected: false }] }); continue; } @@ -383,9 +436,9 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { // Convert decimal (0-1) to percentage (0-100) for minPassRate display let displayValue = property.value; - if (key === 'minPassRate' && fieldType === 'SLIDER') { - const decimalValue = parseFloat(property.value) || 1; - displayValue = String(Math.round(decimalValue * 100)); + if (key === 'minPassRate') { + const decimalValue = parseFloat(property.value); + displayValue = String(Math.round((isNaN(decimalValue) ? 1 : decimalValue) * 100)); } const baseField: FormField = { @@ -485,16 +538,15 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { if (field.originalName == 'dataProvider') { if (formValues['dataProviderMode'] === 'function') { field.value = formValues['dataProvider'] || ""; - } else { - field.value = ""; } + // Preserve existing dataProvider value when in evalSet mode + // (backend creates it from evalSetFile) } if (field.originalName == 'evalSetFile') { if (formValues['dataProviderMode'] === 'evalSet') { field.value = formValues['evalSetFile'] || ""; - } else { - field.value = ""; } + // Preserve existing evalSetFile value when in function mode } } } @@ -754,7 +806,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { return ( <View> <TopNavigationBar projectPath={projectPath} /> - <TitleBar title="AI Evaluation" subtitle="Create a new AI evaluation for your integration" /> + <TitleBar title="AI Evaluation" subtitle={formSubtitle} /> <ViewContent padding> <Container> <FormHeader title={formTitle} /> From a7e0e4b258a991c4b825e00a7e1744082603cce9 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 09:50:44 +0530 Subject: [PATCH 200/247] Fix advanced fields in AI evaluation form --- .../src/views/BI/AIEvaluationForm/index.tsx | 48 ++++--------------- 1 file changed, 9 insertions(+), 39 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index c9c2f868302..913d8f6a579 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -20,7 +20,7 @@ import { useEffect, useState } from "react"; import { Icon, View, ViewContent } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { FormField, FormImports, FormValues, Parameter, FormSectionConfig } from "@wso2/ballerina-side-panel"; +import { FormField, FormImports, FormValues, Parameter } from "@wso2/ballerina-side-panel"; import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType, EvalsetItem } from "@wso2/ballerina-core"; import { EVENT_TYPE } from "@wso2/ballerina-core"; import { TitleBar } from "../../../components/TitleBar"; @@ -57,38 +57,6 @@ const Container = styled.div` gap: 10; `; -const TEST_FORM_SECTIONS: FormSectionConfig = { - sections: [ - { - id: 'data-provider', - title: 'Data Provider', - isCollapsible: true, - defaultCollapsed: true, - order: 1, - description: 'Configure test data sources', - fieldKeys: ['dataProviderMode', 'dataProvider'] - }, - { - id: 'repetition', - title: 'Repetition', - isCollapsible: true, - defaultCollapsed: true, - order: 2, - description: 'Configure run frequency', - fieldKeys: ['runs'] - }, - { - id: 'execution-organization', - title: 'Execution & Organization', - isCollapsible: true, - defaultCollapsed: true, - order: 3, - description: 'Manage test groups, dependencies, and lifecycle hooks', - fieldKeys: ['groups', 'dependsOn', 'before', 'after', 'enabled'] - } - ] -}; - interface TestFunctionDefProps { projectPath: string; functionName?: string; @@ -362,6 +330,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { fields.push({ ...generateFieldFromProperty(field.originalName, field), type: 'EXPRESSION_SET', + advanced: true, types: [{ fieldType: 'EXPRESSION_SET', selected: false }] }); continue; @@ -373,6 +342,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { fields.push({ ...generateFieldFromProperty(field.originalName, field), type: 'EXPRESSION', + advanced: true, types: [{ fieldType: 'EXPRESSION', selected: false }] }); continue; @@ -383,6 +353,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { fields.push({ ...generateFieldFromProperty(field.originalName, field), type: 'FLAG', + advanced: true, types: [{ fieldType: 'FLAG', selected: false }] }); continue; @@ -628,7 +599,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { value: true, optional: true, editable: true, - advanced: false, + advanced: true, types: [{ fieldType: "FLAG", selected: false }] }, { @@ -641,7 +612,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { value: ["Evaluation"], optional: true, editable: true, - advanced: false + advanced: true }, { metadata: { @@ -699,7 +670,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { types: [{ fieldType: "SLIDER", selected: false }], originalName: "minPassRate", value: "1.0", - optional: false, + optional: true, editable: true, advanced: false }, @@ -713,7 +684,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { value: "function", optional: true, editable: true, - advanced: false + advanced: true }, { metadata: { @@ -735,7 +706,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { types: [{ fieldType: "STRING", selected: false }], originalName: "evalSetFile", value: "", - optional: false, + optional: true, editable: true, advanced: false } @@ -816,7 +787,6 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { <FormGeneratorNew fileName={filePath} fields={formFields} - sections={TEST_FORM_SECTIONS} targetLineRange={targetLineRange} onSubmit={onFormSubmit} preserveFieldOrder={true} From 98bbe722fc87110e01d9a220a312c14adc896e23 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 11:00:23 +0530 Subject: [PATCH 201/247] Update trace converter to not include toolCalls fields for non assistant messages --- .../src/features/tracing/trace-converter.ts | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 464d652737e..3ca107c5a7f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -191,19 +191,24 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { }; if (msg.name) { base.name = msg.name; } - if (msg.tool_calls) { - base.toolCalls = msg.tool_calls.map((tc: any) => ({ - id: tc.id, - name: tc.function?.name || tc.name, - arguments: typeof tc.function?.arguments === 'string' - ? safeJsonParse(tc.function.arguments) - : tc.function?.arguments || tc.arguments - })); - } else if (msg.toolCalls) { - base.toolCalls = msg.toolCalls; - } else { - base.toolCalls = null; + + // Only include toolCalls for assistant messages + if (msg.role === 'assistant') { + if (msg.tool_calls) { + base.toolCalls = msg.tool_calls.map((tc: any) => ({ + id: tc.id, + name: tc.function?.name || tc.name, + arguments: typeof tc.function?.arguments === 'string' + ? safeJsonParse(tc.function.arguments) + : tc.function?.arguments || tc.arguments + })); + } else if (msg.toolCalls) { + base.toolCalls = msg.toolCalls; + } else { + base.toolCalls = null; + } } + if (msg.id) { base.id = msg.id; } return base as ChatMessage; @@ -230,19 +235,24 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { }; if (rawMessage.name) { base.name = rawMessage.name; } - if (rawMessage.tool_calls) { - base.toolCalls = rawMessage.tool_calls.map((tc: any) => ({ - id: tc.id, - name: tc.function?.name || tc.name, - arguments: typeof tc.function?.arguments === 'string' - ? safeJsonParse(tc.function.arguments) - : tc.function?.arguments || tc.arguments - })); - } else if (rawMessage.toolCalls) { - base.toolCalls = rawMessage.toolCalls; - } else { - base.toolCalls = null; + + // Only include toolCalls for assistant messages + if (rawMessage.role === 'assistant') { + if (rawMessage.tool_calls) { + base.toolCalls = rawMessage.tool_calls.map((tc: any) => ({ + id: tc.id, + name: tc.function?.name || tc.name, + arguments: typeof tc.function?.arguments === 'string' + ? safeJsonParse(tc.function.arguments) + : tc.function?.arguments || tc.arguments + })); + } else if (rawMessage.toolCalls) { + base.toolCalls = rawMessage.toolCalls; + } else { + base.toolCalls = null; + } } + if (rawMessage.id) { base.id = rawMessage.id; } return base as ChatMessage; From d91ba2317f4d78f265ed3480984edfb238fa4121 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 11:19:43 +0530 Subject: [PATCH 202/247] Update time format to ISO string in trace converter --- .../ballerina-core/src/state-machine-types.ts | 8 +++--- .../src/features/tracing/trace-converter.ts | 25 +++---------------- .../EvalsetViewer/utils/traceAdapters.ts | 5 +--- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 53f961f5c0f..8f6303d0283 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -250,8 +250,8 @@ export interface EvalToolSchema { export interface EvalIteration { history: EvalChatMessage[]; output: EvalChatAssistantMessage | EvalChatFunctionMessage | any; - startTime: [number, number]; // [seconds, nanoseconds] - endTime: [number, number]; // [seconds, nanoseconds] + startTime: string; + endTime: string; } export interface EvalsetTrace { @@ -261,8 +261,8 @@ export interface EvalsetTrace { output: EvalChatAssistantMessage | any; tools: EvalToolSchema[]; toolCalls: EvalFunctionCall[]; - startTime: [number, number]; // [seconds, nanoseconds] - endTime: [number, number]; // [seconds, nanoseconds] + startTime: string; + endTime: string; } export interface EvalThread { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 3ca107c5a7f..8adac22e2b3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -87,23 +87,6 @@ function safeJsonParse(jsonString: string | null): any { } } -/** - * Converts an ISO timestamp string to [seconds, nanoseconds] array format. - */ -function convertTimestamp(isoString: string | undefined): [number, number] { - if (!isoString) { - const now = Date.now(); - return [Math.floor(now / 1000), (now % 1000) * 1000000]; - } - - const date = new Date(isoString); - const milliseconds = date.getTime(); - const seconds = Math.floor(milliseconds / 1000); - const nanoseconds = (milliseconds % 1000) * 1000000; - - return [seconds, nanoseconds]; -} - // --- Main Conversion Logic --- /** @@ -290,8 +273,8 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { iterations.push({ history: iterationHistory, output: output as ChatAssistantMessage, - startTime: convertTimestamp(chatSpan.startTime || startTime), - endTime: convertTimestamp(chatSpan.endTime || endTime) + startTime: chatSpan.startTime || startTime, + endTime: chatSpan.endTime || endTime } as any); } @@ -328,8 +311,8 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { output: finalOutput, tools: tools, toolCalls: finalOutputToolCalls, - startTime: convertTimestamp(startTime) as any, - endTime: convertTimestamp(endTime) as any + startTime: startTime, + endTime: endTime }; return evalsetTrace; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index e8b1687b013..c856802811f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -128,10 +128,7 @@ export const generateTraceId = (): string => { * Create a new empty trace */ export const createNewTrace = (): EvalsetTrace => { - const nowMs = Date.now(); - const seconds = Math.floor(nowMs / 1000); - const nanoseconds = (nowMs % 1000) * 1000000; - const timestamp: [number, number] = [seconds, nanoseconds]; + const timestamp = new Date().toISOString(); return { id: generateTraceId(), From ec562e29f4403e05d1e071670c463aa8fc2b9cc0 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 11:31:37 +0530 Subject: [PATCH 203/247] Update Test Function form --- .../src/views/BI/TestFunctionForm/index.tsx | 185 +++++++++--------- 1 file changed, 91 insertions(+), 94 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index 9ddc6ba7558..c72601d982a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -20,8 +20,8 @@ import { useEffect, useState } from "react"; import { View, ViewContent } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { FormField, FormImports, FormValues, Parameter, FormSectionConfig } from "@wso2/ballerina-side-panel"; -import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType, EvalsetItem } from "@wso2/ballerina-core"; +import { FormField, FormImports, FormValues, Parameter } from "@wso2/ballerina-side-panel"; +import { LineRange, FunctionParameter, TestFunction, ValueProperty, Annotation, getPrimaryInputType } from "@wso2/ballerina-core"; import { EVENT_TYPE } from "@wso2/ballerina-core"; import { TitleBar } from "../../../components/TitleBar"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; @@ -39,55 +39,15 @@ const FormContainer = styled.div` overflow: visible; overflow-y: none; } - - .radio-button-group { - margin-top: 8px; - margin-bottom: -12px; - } - - .dropdown-container { - margin-top: 12px; - } `; const Container = styled.div` display: "flex"; flex-direction: "column"; gap: 10; + margin-bottom: 20px; `; -const TEST_FORM_SECTIONS: FormSectionConfig = { - sections: [ - { - id: 'data-provider', - title: 'Data Provider', - isCollapsible: true, - defaultCollapsed: true, - order: 1, - description: 'Configure test data sources', - fieldKeys: ['dataProvider'] - }, - { - id: 'repetition', - title: 'Repetition', - isCollapsible: true, - defaultCollapsed: true, - order: 2, - description: 'Configure run frequency and pass criteria', - fieldKeys: ['runs', 'minPassRate'] - }, - { - id: 'execution-organization', - title: 'Execution & Organization', - isCollapsible: true, - defaultCollapsed: true, - order: 3, - description: 'Manage test groups, dependencies, and lifecycle hooks', - fieldKeys: ['groups', 'dependsOn', 'before', 'after'] - } - ] -}; - interface TestFunctionDefProps { projectPath: string; functionName?: string; @@ -102,7 +62,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { const [testFunction, setTestFunction] = useState<TestFunction>(); const [formTitle, setFormTitle] = useState<string>('Create New Test Case'); const [targetLineRange, setTargetLineRange] = useState<LineRange>(); - const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); const updateTargetLineRange = () => { rpcClient @@ -116,10 +75,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }); } - useEffect(() => { - loadEvalsets(); - }, []); - useEffect(() => { if (serviceType === 'UPDATE_TEST') { setFormTitle('Update Test Case'); @@ -132,30 +87,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { updateTargetLineRange(); }, [functionName]); - // Regenerate form fields when evalsetOptions changes - useEffect(() => { - if (testFunction && evalsetOptions.length > 0) { - let formFields = generateFormFields(testFunction); - setFormFields(formFields); - } - }, [evalsetOptions]); - - const loadEvalsets = async () => { - try { - const res = await rpcClient.getTestManagerRpcClient().getEvalsets({ projectPath }); - const options = res.evalsets.map((evalset: EvalsetItem) => ({ - value: evalset.filePath, - content: `${evalset.name} (${evalset.threadCount} thread${evalset.threadCount !== 1 ? 's' : ''})` - })); - setEvalsetOptions(options); - } catch (error) { - console.error('Failed to load evalsets:', error); - setEvalsetOptions([]); - } - }; - const loadFunction = async () => { const res = await rpcClient.getTestManagerRpcClient().getTestFunction({ functionName, filePath }); + console.log("Test Function: ", res); setTestFunction(res.function); let formFields = generateFormFields(res.function); setFormFields(formFields); @@ -169,7 +103,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { } const onFormSubmit = async (data: FormValues, formImports: FormImports) => { + console.log("Test Function Form Data: ", data); const updatedTestFunction = fillFunctionModel(data, formImports); + console.log("Test Function: ", updatedTestFunction); if (serviceType === 'UPDATE_TEST') { await rpcClient.getTestManagerRpcClient().updateTestFunction({ function: updatedTestFunction, filePath }); } else { @@ -183,7 +119,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { endLine: res.function.codedata.lineRange.endLine.line, endColumn: res.function.codedata.lineRange.endLine.offset }; - rpcClient.getVisualizerRpcClient().openView( + console.log("Node Position: ", nodePosition); + await rpcClient.getVisualizerRpcClient().openView( { type: EVENT_TYPE.OPEN_VIEW, location: { position: nodePosition, documentUri: filePath } }) }; @@ -231,7 +168,65 @@ export function TestFunctionForm(props: TestFunctionDefProps) { if (testFunction.annotations) { const configAnnotation = getTestConfigAnnotation(testFunction.annotations); if (configAnnotation && configAnnotation.fields) { + const minPassRateField = configAnnotation.fields.find(f => f.originalName === 'minPassRate'); + if (minPassRateField) { + const generatedField = generateFieldFromProperty('minPassRate', minPassRateField); + fields.push({ + ...generatedField, + type: 'SLIDER', + advanced: true, + sliderProps: { + min: 0, + max: 100, + step: 1, + showValue: true, + showMarkers: true, + valueFormatter: (value: number) => `${value}%` + } + }); + } + for (const field of configAnnotation.fields) { + // Skip fields already processed + if (field.originalName === 'dataProviderMode' || + field.originalName === 'minPassRate' || + field.originalName === 'evalSetFile') { + continue; + } + + // Special handling for groups and dependsOn - use EXPRESSION_SET + if (field.originalName === 'groups' || field.originalName === 'dependsOn') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'EXPRESSION_SET', + advanced: field.originalName === 'groups' ? false : true, + types: [{ fieldType: 'EXPRESSION_SET', selected: false }] + }); + continue; + } + + // Special handling for expression fields - ensure they use EXPRESSION type + if (field.originalName === 'before' || field.originalName === 'after' || + field.originalName === 'runs' || field.originalName === 'dataProvider') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'EXPRESSION', + advanced: true, + types: [{ fieldType: 'EXPRESSION', selected: false }] + }); + continue; + } + + // Special handling for enabled - use FLAG + if (field.originalName === 'enabled') { + fields.push({ + ...generateFieldFromProperty(field.originalName, field), + type: 'FLAG', + types: [{ fieldType: 'FLAG', selected: false }] + }); + continue; + } + fields.push(generateFieldFromProperty(field.originalName, field)); } } @@ -280,9 +275,9 @@ export function TestFunctionForm(props: TestFunctionDefProps) { // Convert decimal (0-1) to percentage (0-100) for minPassRate display let displayValue = property.value; - if (key === 'minPassRate' && fieldType === 'SLIDER') { - const decimalValue = parseFloat(property.value) || 1; - displayValue = String(Math.round(decimalValue * 100)); + if (key === 'minPassRate') { + const decimalValue = parseFloat(property.value); + displayValue = String(Math.round((isNaN(decimalValue) ? 1 : decimalValue) * 100)); } const baseField: FormField = { @@ -369,7 +364,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { field.value = formValues['after'] || ""; } if (field.originalName == 'runs') { - field.value = formValues['runs'] || "1"; + field.value = formValues['runs'] || ""; } if (field.originalName == 'minPassRate') { // Convert percentage (0-100) to decimal (0-1) @@ -377,7 +372,11 @@ export function TestFunctionForm(props: TestFunctionDefProps) { field.value = String(Number(percentageValue) / 100); } if (field.originalName == 'dataProvider') { - field.value = formValues['dataProvider'] || ""; + if (formValues['dataProviderMode'] === 'function') { + field.value = formValues['dataProvider'] || ""; + } + // Preserve existing dataProvider value when in evalSet mode + // (backend creates it from evalSetFile) } } } @@ -420,8 +419,8 @@ export function TestFunctionForm(props: TestFunctionDefProps) { return { functionName: { metadata: { - label: "Test Name", - description: "Name of the test function" + label: "Test Function", + description: "Test function" }, value: "", optional: false, @@ -450,18 +449,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { module: "test", name: "Config", fields: [ - { - metadata: { - label: "Enabled", - description: "Enable/Disable the test" - }, - originalName: "enabled", - value: true, - optional: true, - editable: true, - advanced: false, - types: [{ fieldType: "FLAG", selected: false }] - }, { metadata: { label: "Groups", @@ -474,6 +461,18 @@ export function TestFunctionForm(props: TestFunctionDefProps) { editable: true, advanced: false }, + { + metadata: { + label: "Enabled", + description: "Enable/Disable the test" + }, + originalName: "enabled", + value: true, + optional: true, + editable: true, + advanced: false, + types: [{ fieldType: "FLAG", selected: false }] + }, { metadata: { label: "Depends On", @@ -517,7 +516,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { }, types: [{ fieldType: "EXPRESSION", selected: false }], originalName: "runs", - value: "1", + value: "", optional: true, editable: true, advanced: true @@ -545,7 +544,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { optional: true, editable: true, advanced: true - } + }, ] } ], @@ -602,7 +601,6 @@ export function TestFunctionForm(props: TestFunctionDefProps) { <FormGeneratorNew fileName={filePath} fields={formFields} - sections={TEST_FORM_SECTIONS} targetLineRange={targetLineRange} onSubmit={onFormSubmit} preserveFieldOrder={true} @@ -614,4 +612,3 @@ export function TestFunctionForm(props: TestFunctionDefProps) { </View> ); } - From d4404f62cd76a4f558956c7c5aa83269146ae89f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 11:57:54 +0530 Subject: [PATCH 204/247] Move chat agent back to module level --- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 71 +++++++------------ 1 file changed, 24 insertions(+), 47 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 7bbe79a53d7..90c317b83c1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -180,58 +180,35 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { console.warn("Unable to resolve Ballerina version; falling back to legacy agent generation.", error); } - // Execute for versions under 2201.13.0, or if version cannot be determined (safety fallback) - const executeForLegacyVersion = !ballerinaVersion || (() => { - const parts = ballerinaVersion.split('.'); - if (parts.length < 2) { - return true; // Can't parse properly, execute for safety - } - const majorVersion = parseInt(parts[0], 10); - const minorVersion = parseInt(parts[1], 10); - if (isNaN(majorVersion) || isNaN(minorVersion)) { - return true; // Can't parse version numbers, execute for safety - } - // Only versions < 2201.13 are legacy - if (majorVersion < 2201) { - return true; - } - if (majorVersion > 2201) { - return false; - } - return minorVersion < 13; - })(); - - if (executeForLegacyVersion) { - // Search for agent node in the current file - const agentSearchResponse = await rpcClient.getBIDiagramRpcClient().search({ - filePath: projectPath.current, - queryMap: { orgName: aiModuleOrg.current }, - searchKind: "AGENT" - }); + // Search for agent node in the current file + const agentSearchResponse = await rpcClient.getBIDiagramRpcClient().search({ + filePath: projectPath.current, + queryMap: { orgName: aiModuleOrg.current }, + searchKind: "AGENT" + }); - // Validate search response structure - if (!agentSearchResponse?.categories?.[0]?.items?.[0]) { - throw new Error('No agent node found in search response'); - } + // Validate search response structure + if (!agentSearchResponse?.categories?.[0]?.items?.[0]) { + throw new Error('No agent node found in search response'); + } - const agentNode = agentSearchResponse.categories[0].items[0] as AvailableNode; - console.log(">>> agentNode", agentNode); + const agentNode = agentSearchResponse.categories[0].items[0] as AvailableNode; + console.log(">>> agentNode", agentNode); - // Generate template from agent node - const agentNodeTemplate = await getNodeTemplate(rpcClient, agentNode.codedata, projectPath.current); + // Generate template from agent node + const agentNodeTemplate = await getNodeTemplate(rpcClient, agentNode.codedata, projectPath.current); - // save the agent node - const systemPromptValue = `{role: string \`\`, instructions: string \`\`}`; - const agentVarName = `${agentName}Agent`; - agentNodeTemplate.properties.systemPrompt.value = systemPromptValue; - agentNodeTemplate.properties.model.value = modelVarName; - agentNodeTemplate.properties.tools.value = []; - agentNodeTemplate.properties.variable.value = agentVarName; + // save the agent node + const systemPromptValue = `{role: string \`\`, instructions: string \`\`}`; + const agentVarName = `${agentName}Agent`; + agentNodeTemplate.properties.systemPrompt.value = systemPromptValue; + agentNodeTemplate.properties.model.value = modelVarName; + agentNodeTemplate.properties.tools.value = []; + agentNodeTemplate.properties.variable.value = agentVarName; - await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: projectPath.current, flowNode: agentNodeTemplate }); - } + await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: projectPath.current, flowNode: agentNodeTemplate }); setCurrentStep(3); From 8c58e7af540f5f815fdd97c8bb4ad3d0294943b8 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 15:16:02 +0530 Subject: [PATCH 205/247] Add delete test option in test explorer --- .../src/interfaces/constants.ts | 1 + .../ballerina-extension/package.json | 15 +++ .../src/features/test-explorer/commands.ts | 117 +++++++++++++++++- 3 files changed, 131 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts index 913bc734028..a0b7cf6ff8c 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts @@ -50,6 +50,7 @@ export const BI_COMMANDS = { BI_ADD_TEST_FUNCTION: 'BI.test.add.function', BI_ADD_AI_EVALUATION: 'BI.test.add.ai.evaluation', BI_EDIT_TEST_FUNCTION_DEF: 'BI.test.edit.function.def', + BI_DELETE_TEST_FUNCTION: 'BI.test.delete.function', ADD_NATURAL_FUNCTION: 'BI.project-explorer.add-natural-function', TOGGLE_TRACE_LOGS: 'BI.toggle.trace.logs', DEVANT_PUSH_TO_CLOUD: 'BI.devant.push.cloud', diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 029babd46ee..dd38b796198 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -611,6 +611,12 @@ "category": "BI", "enablement": "isSupportedProject" }, + { + "command": "BI.test.delete.function", + "title": "Delete test function", + "icon": "$(trash)", + "category": "BI" + }, { "command": "BI.view.typeDiagram", "title": "Type Diagram", @@ -830,6 +836,11 @@ "command": "BI.test.edit.function", "group": "inline", "when": "testId not in testGroups" + }, + { + "command": "BI.test.delete.function", + "group": "inline", + "when": "testId not in testGroups" } ], "view/title": [ @@ -981,6 +992,10 @@ "command": "BI.test.edit.function", "when": "false" }, + { + "command": "BI.test.delete.function", + "when": "false" + }, { "command": "BI.project-explorer.delete", "when": "false" diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index a08ed1e21ff..4a32c1a1544 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -17,9 +17,9 @@ * under the License. */ -import { commands, TestItem, window } from "vscode"; +import { commands, TestItem, window, workspace, WorkspaceEdit, Uri, Range } from "vscode"; import { openView, StateMachine, history } from "../../stateMachine"; -import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW, Annotation, ValueProperty, GetTestFunctionResponse } from "@wso2/ballerina-core"; +import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW, Annotation, ValueProperty, GetTestFunctionResponse, ComponentInfo } from "@wso2/ballerina-core"; import { isTestFunctionItem } from "./discover"; import path from "path"; import { promises as fs } from 'fs'; @@ -156,6 +156,119 @@ export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { }); } }); + + commands.registerCommand(BI_COMMANDS.BI_DELETE_TEST_FUNCTION, async (entry: TestItem) => { + const projectPath = await findProjectPath(entry.uri?.fsPath); + + if (!projectPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + + if (!isTestFunctionItem(entry)) { + window.showErrorMessage('Invalid test item. Please select a test function to delete.'); + return; + } + + // Parse test ID: test:${projectPath}:${fileName}:${functionName} + const idParts = entry.id.split(":"); + if (idParts.length < 4) { + window.showErrorMessage('Unable to parse test item ID.'); + return; + } + + const fileName = idParts[2]; + const functionName = idParts[3]; + const fileUri = path.resolve(projectPath, `tests`, fileName); + + // Determine test type for confirmation message + let testType = "test function"; + try { + const response = await ballerinaExtInstance.langClient?.getTestFunction({ + functionName: entry.label, + filePath: fileUri + }); + + if (response && isValidTestFunctionResponse(response) && response.function) { + const isEvaluation = hasEvaluationGroup(response.function); + if (isEvaluation) { + testType = "AI evaluation test"; + } + } + } catch (error) { + console.warn('Failed to determine test type, proceeding with default:', error); + } + + // Confirmation dialog + const confirmation = await window.showWarningMessage( + `Are you sure you want to delete ${testType} '${functionName}'?`, + { modal: true }, + 'Delete' + ); + + if (confirmation !== 'Delete') { + return; + } + + try { + if (!entry.range) { + window.showErrorMessage('Test function range not available. Cannot delete.'); + return; + } + + // Create ComponentInfo from TestItem range + const component: ComponentInfo = { + name: functionName, + filePath: fileUri, + startLine: entry.range.start.line, + startColumn: entry.range.start.character, + endLine: entry.range.end.line, + endColumn: entry.range.end.character + }; + + // Call language server to delete the component + const response = await ballerinaExtInstance.langClient?.deleteByComponentInfo({ + filePath: fileUri, + component: component + }); + + if (!response || !response.textEdits) { + window.showErrorMessage('Failed to delete test function. No response from language server.'); + return; + } + + // Apply the text edits returned by language server + const edit = new WorkspaceEdit(); + + for (const [filePath, edits] of Object.entries(response.textEdits)) { + const uri = Uri.file(filePath); + for (const textEdit of edits) { + edit.replace( + uri, + new Range( + textEdit.range.start.line, + textEdit.range.start.character, + textEdit.range.end.line, + textEdit.range.end.character + ), + textEdit.newText + ); + } + } + + const success = await workspace.applyEdit(edit); + + if (success) { + window.showInformationMessage(`Test function '${functionName}' deleted successfully.`); + // File watcher automatically triggers test rediscovery + } else { + window.showErrorMessage(`Failed to apply deletion edits for test function '${functionName}'.`); + } + } catch (error) { + window.showErrorMessage(`Error deleting test function: ${error}`); + console.error('Delete test function error:', error); + } + }); } /** From 191f8d1d5c4e56d1fd4697b524fefbb649170c7a Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Thu, 12 Feb 2026 15:44:39 +0530 Subject: [PATCH 206/247] Fix reusable agent sidepanel node --- .../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 10d88015637..172ad06beae 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -693,7 +693,7 @@ export function NodeList(props: NodeListProps) { // 1. If parent group uses connection container and ALL items don't have id, use getConnectionContainer shouldUseConnectionContainer(group.title) && group.items.filter((item) => item != null).every((item) => !("id" in item)) - ? getConnectionContainer(group.items as Category[]) + ? getConnectionContainer(group.items as Category[], group.title === "Agent") : // 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( From 1c950ce41de5be563f9c148168bed5d1c13e1396 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 08:27:18 +0530 Subject: [PATCH 207/247] Update evaluations group name --- .../src/features/test-explorer/commands.ts | 53 ++++--------------- .../src/views/BI/AIEvaluationForm/index.tsx | 2 +- 2 files changed, 10 insertions(+), 45 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index 4a32c1a1544..fcd00bf3ee5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -110,38 +110,25 @@ export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { if (fileUri) { const range = entry.range; - // Fetch the test function to check if it belongs to the "Evaluation" group + // Fetch the test function to check if it belongs to the "evaluations" group let viewToOpen = MACHINE_VIEW.BITestFunctionForm; // Default to regular test form try { - console.log('[TEST EDIT] Fetching test function:', entry.label, 'from file:', fileUri); const response = await ballerinaExtInstance.langClient?.getTestFunction({ functionName: entry.label, filePath: fileUri }); - - console.log('[TEST EDIT] Response received:', response); - if (response && isValidTestFunctionResponse(response) && response.function) { - console.log('[TEST EDIT] Valid response, checking for Evaluation group'); const isEvaluation = hasEvaluationGroup(response.function); - console.log('[TEST EDIT] Is Evaluation test?', isEvaluation); if (isEvaluation) { viewToOpen = MACHINE_VIEW.BIAIEvaluationForm; - console.log('[TEST EDIT] Opening AI Evaluation Form'); - } else { - console.log('[TEST EDIT] Opening regular Test Function Form'); } - } else { - console.log('[TEST EDIT] Invalid response or no function data, using default form'); } } catch (error) { console.warn('Failed to fetch test function, defaulting to regular test form:', error); // Continue with default form if fetching fails } - console.log('[TEST EDIT] Final view to open:', viewToOpen); - openView(EVENT_TYPE.OPEN_VIEW, { view: viewToOpen, documentUri: fileUri, @@ -281,56 +268,34 @@ function isValidTestFunctionResponse(response: any): response is GetTestFunction } /** - * Check if a test function belongs to the "Evaluation" group + * Check if a test function belongs to the "evaluations" group * @param testFunction The test function to check - * @returns true if the function has "Evaluation" in its groups, false otherwise + * @returns true if the function has "evaluations" in its groups, false otherwise */ function hasEvaluationGroup(testFunction: any): boolean { - console.log('[HAS_EVAL_GROUP] Checking test function:', testFunction?.functionName?.value); - - if (!testFunction?.annotations) { - console.log('[HAS_EVAL_GROUP] No annotations found'); - return false; - } - - console.log('[HAS_EVAL_GROUP] Found annotations:', testFunction.annotations.map((a: any) => a.name)); + if (!testFunction?.annotations) return false; // Find the Config annotation const configAnnotation = testFunction.annotations.find( (annotation: Annotation) => annotation.name === 'Config' ); - if (!configAnnotation?.fields) { - console.log('[HAS_EVAL_GROUP] No Config annotation or fields found'); - return false; - } - - console.log('[HAS_EVAL_GROUP] Config annotation fields:', configAnnotation.fields.map((f: any) => f.originalName)); + if (!configAnnotation?.fields) return false; // Find the groups field const groupsField = configAnnotation.fields.find( (field: ValueProperty) => field.originalName === 'groups' ); - if (!groupsField?.value) { - console.log('[HAS_EVAL_GROUP] No groups field found or empty'); - return false; - } - - console.log('[HAS_EVAL_GROUP] Groups field value:', groupsField.value, 'Type:', typeof groupsField.value, 'IsArray:', Array.isArray(groupsField.value)); - - if (!Array.isArray(groupsField.value)) { - console.log('[HAS_EVAL_GROUP] Groups value is not an array'); - return false; - } + if (!groupsField?.value) return false; + if (!Array.isArray(groupsField.value)) return false; - // Check if "Evaluation" is in the groups array + // Check if "evaluations" is in the groups array // Note: The values may include quotes, so we need to strip them const hasEvaluation = groupsField.value.some((group: string) => { const cleanedGroup = group.replace(/^["']|["']$/g, ''); // Remove leading/trailing quotes - return cleanedGroup === 'Evaluation'; + return cleanedGroup === 'evaluations'; }); - console.log('[HAS_EVAL_GROUP] Contains "Evaluation"?', hasEvaluation, 'Groups:', groupsField.value); return hasEvaluation; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index 913d8f6a579..d618c35f1bd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -609,7 +609,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { }, types: [{ fieldType: "EXPRESSION_SET", selected: false }], originalName: "groups", - value: ["Evaluation"], + value: ["evaluations"], optional: true, editable: true, advanced: true From a28aff045a4ae5fd7dc3a870bfae2f09726b0515 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 10:37:58 +0530 Subject: [PATCH 208/247] Add upgrade messaging for AI evaluation feature support --- .../ballerina-core/src/state-machine-types.ts | 3 + .../ballerina-extension/src/RPCLayer.ts | 3 +- .../src/features/test-explorer/commands.ts | 33 ++++++++-- .../ballerina-extension/src/stateMachine.ts | 4 ++ .../ballerina-visualizer/src/MainPanel.tsx | 1 + .../src/views/BI/AIEvaluationForm/index.tsx | 60 ++++++++++++++++++- 6 files changed, 96 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 8f6303d0283..80b9230ea4e 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -182,6 +182,9 @@ export interface VisualizerMetadata { recordFilePath?: string; enableSequenceDiagram?: boolean; // Enable sequence diagram view target?: LinePosition; + featureSupport?: { + aiEvaluation?: boolean; + }; } export interface DataMapperMetadata { diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 09114d0d95b..741c37cdc5d 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -143,7 +143,8 @@ async function getContext(): Promise<VisualizerLocation> { haveLS: StateMachine.langClient() && true, recordFilePath: context.projectPath ? path.join(context.projectPath, "types.bal") : undefined, enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), - target: context.metadata?.target + target: context.metadata?.target, + featureSupport: context.metadata?.featureSupport }, scope: context.scope, org: context.org, diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index fcd00bf3ee5..62149622b94 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -29,8 +29,17 @@ import { getCurrentProjectRoot, tryGetCurrentBallerinaFile } from "../../utils/p import { findBallerinaPackageRoot } from "../../utils"; import { MESSAGES } from "../project"; import { BallerinaExtension } from "../../core"; +import { isSupportedSLVersion, createVersionNumber } from "../../utils/config"; export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { + // Check if AI Evaluation features are supported + const isAIEvaluationSupported = isSupportedSLVersion( + ballerinaExtInstance, + createVersionNumber(2201, 13, 2) + ); + + // Set VS Code context for UI visibility control + commands.executeCommand('setContext', 'ballerina.ai.evaluationSupported', isAIEvaluationSupported); // register run project tests handler commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION, async (entry: TestItem) => { const projectPath = await findProjectPath(entry.uri?.fsPath); @@ -89,7 +98,14 @@ export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { ensureFileExists(fileUri); openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BIAIEvaluationForm, - documentUri: fileUri, identifier: '', serviceType: 'ADD_NEW_TEST' + documentUri: fileUri, + identifier: '', + serviceType: 'ADD_NEW_TEST', + metadata: { + featureSupport: { + aiEvaluation: isAIEvaluationSupported + } + } }); }); @@ -139,7 +155,12 @@ export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { endLine: range.end.line, endColumn: range.end.character }, - serviceType: 'UPDATE_TEST' + serviceType: 'UPDATE_TEST', + metadata: { + featureSupport: { + aiEvaluation: isAIEvaluationSupported + } + } }); } }); @@ -273,22 +294,22 @@ function isValidTestFunctionResponse(response: any): response is GetTestFunction * @returns true if the function has "evaluations" in its groups, false otherwise */ function hasEvaluationGroup(testFunction: any): boolean { - if (!testFunction?.annotations) return false; + if (!testFunction?.annotations) { return false; } // Find the Config annotation const configAnnotation = testFunction.annotations.find( (annotation: Annotation) => annotation.name === 'Config' ); - if (!configAnnotation?.fields) return false; + if (!configAnnotation?.fields) { return false; } // Find the groups field const groupsField = configAnnotation.fields.find( (field: ValueProperty) => field.originalName === 'groups' ); - if (!groupsField?.value) return false; - if (!Array.isArray(groupsField.value)) return false; + if (!groupsField?.value) { return false; } + if (!Array.isArray(groupsField.value)) { return false; } // Check if "evaluations" is in the groups array // Note: The values may include quotes, so we need to strip them diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index 4d7baeb5acf..a64366f3815 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -436,6 +436,10 @@ const stateMachine = createMachine<MachineContext>( dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, reviewData: (context, event) => event.viewLocation?.reviewData, evalsetData: (context, event) => event.viewLocation?.evalsetData, + metadata: (context, event) => event.viewLocation?.metadata ? { + ...context.metadata, + ...event.viewLocation.metadata + } : context.metadata, isViewUpdateTransition: true }), (context, event) => notifyTreeView( diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 344f9e5d22c..c4c466759e1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -609,6 +609,7 @@ const MainPanel = () => { functionName={value?.identifier} filePath={value?.documentUri} serviceType={value?.serviceType} + isVersionSupported={value?.metadata?.featureSupport?.aiEvaluation} />); break; case MACHINE_VIEW.ViewConfigVariables: diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index d618c35f1bd..0a372e62cf5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -57,15 +57,54 @@ const Container = styled.div` gap: 10; `; +const FullHeightView = styled(View)` + display: flex; + flex-direction: column; + height: 100vh; +`; + +const FullHeightViewContent = styled(ViewContent)` + display: flex; + flex: 1; +`; + +const UpgradeMessageContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + flex: 1; + width: 100%; + padding: 40px; + text-align: center; +`; + +const UpgradeTitle = styled.h2` + color: var(--vscode-foreground); + font-size: 18px; + font-weight: 500; + margin: 0 0 12px 0; + line-height: 1.4; +`; + +const UpgradeMessage = styled.p` + color: var(--vscode-descriptionForeground); + font-size: 13px; + margin: 0; + max-width: 500px; + line-height: 1.6; +`; + interface TestFunctionDefProps { projectPath: string; functionName?: string; filePath?: string; serviceType?: string; + isVersionSupported?: boolean; } export function AIEvaluationForm(props: TestFunctionDefProps) { - const { projectPath, functionName, filePath, serviceType } = props; + const { projectPath, functionName, filePath, serviceType, isVersionSupported = true } = props; const { rpcClient } = useRpcContext(); const [formFields, setFormFields] = useState<FormField[]>([]); const [testFunction, setTestFunction] = useState<TestFunction>(); @@ -774,6 +813,25 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { updateFieldVisibility(value); }; + // Show upgrade message if version is not supported + if (isVersionSupported === false) { + return ( + <FullHeightView> + <TopNavigationBar projectPath={projectPath} /> + <TitleBar title="AI Evaluation" subtitle="Version upgrade required" /> + <FullHeightViewContent padding> + <UpgradeMessageContainer> + <UpgradeTitle>Please upgrade your Ballerina version</UpgradeTitle> + <UpgradeMessage> + AI Evaluation features require Ballerina version 2201.13.2 or higher. + Please upgrade your Ballerina installation to use this feature. + </UpgradeMessage> + </UpgradeMessageContainer> + </FullHeightViewContent> + </FullHeightView> + ); + } + return ( <View> <TopNavigationBar projectPath={projectPath} /> From e858deaf449e27d9a2d0570d38e6f2606a41fc31 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 11:20:19 +0530 Subject: [PATCH 209/247] Fix merge conflict --- common/config/rush/pnpm-lock.yaml | 24 +++++++++---------- .../ballerina-core/src/interfaces/bi.ts | 2 +- .../src/rpc-types/visualizer/index.ts | 1 - .../ballerina-extension/src/RPCLayer.ts | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 240c0e295da..2a8398c3b0d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1099,13 +1099,13 @@ importers: ../../workspaces/ballerina/ballerina-visualizer: dependencies: '@dnd-kit/core': - specifier: ^6.1.0 - version: 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: 6.1.0 + version: 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@dnd-kit/sortable': - specifier: ^8.0.0 - version: 8.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + specifier: 8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) '@dnd-kit/utilities': - specifier: ^3.2.2 + specifier: 3.2.2 version: 3.2.2(react@18.2.0) '@emotion/css': specifier: 11.13.5 @@ -5937,8 +5937,8 @@ packages: peerDependencies: react: '>=16.8.0' - '@dnd-kit/core@6.3.1': - resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -28173,7 +28173,7 @@ snapshots: react: 18.2.0 tslib: 2.8.1 - '@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@dnd-kit/accessibility': 3.1.1(react@18.2.0) '@dnd-kit/utilities': 3.2.2(react@18.2.0) @@ -28181,9 +28181,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) tslib: 2.8.1 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/core': 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@dnd-kit/utilities': 3.2.2(react@18.2.0) react: 18.2.0 tslib: 2.8.1 @@ -39811,8 +39811,6 @@ snapshots: '@types/katex@0.16.8': {} - '@types/katex@0.16.8': {} - '@types/linkify-it@5.0.0': {} '@types/lodash.camelcase@4.3.0': @@ -54612,7 +54610,7 @@ snapshots: unist-util-visit-parents: 6.0.2 vfile: 6.0.3 - rehype-raw@6.1.1: + rehype-raw@6.1.0: dependencies: '@types/hast': 2.3.10 hast-util-raw: 7.2.3 diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index d1bf72545e3..4c55b299855 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -154,7 +154,7 @@ export type FormFieldInputType = "TEXT" | "DM_JOIN_CLAUSE_RHS_EXPRESSION" | "RECORD_MAP_EXPRESSION" | "PROMPT" | - "CLAUSE_EXPRESSION"; + "CLAUSE_EXPRESSION" | "SLIDER"; export interface BaseType { diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts index e145edb5e4c..529f9571b1f 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts @@ -39,6 +39,5 @@ export interface VisualizerAPI { reviewAccepted: () => void; handleApprovalPopupClose: (params: HandleApprovalPopupCloseRequest) => void; reopenApprovalView: (params: ReopenApprovalViewRequest) => void; - saveEvalCase: (params: SaveEvalCaseRequest) => Promise<SaveEvalCaseResponse>; saveEvalThread: (params: SaveEvalThreadRequest) => Promise<SaveEvalThreadResponse>; } diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 741c37cdc5d..8528bf94c3f 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -152,7 +152,7 @@ async function getContext(): Promise<VisualizerLocation> { dataMapperMetadata: context.dataMapperMetadata, artifactInfo: context.artifactInfo, reviewData: context.reviewData, - agentMetadata: context.agentMetadata + agentMetadata: context.agentMetadata, evalsetData: context.evalsetData }); }); From ad15db90cde34f7283094b412628d64128aab79a Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 12:12:24 +0530 Subject: [PATCH 210/247] Refactor code --- .../ballerina-core/src/state-machine-types.ts | 4 +- .../src/components/Form/index.tsx | 282 +----------------- .../src/components/Form/types.ts | 20 -- .../src/components/editors/EditorFactory.tsx | 3 - .../editors/RadioButtonGroupEditor.tsx | 65 ---- .../src/components/editors/index.ts | 1 - .../src/components/TopNavigationBar/index.tsx | 4 + .../BI/AIEvaluationForm/CardSelector.tsx | 2 +- .../src/views/BI/AIEvaluationForm/index.tsx | 2 +- .../views/BI/Forms/FormGeneratorNew/index.tsx | 8 +- 10 files changed, 12 insertions(+), 379 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 80b9230ea4e..b56a181e16d 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -90,7 +90,7 @@ export enum MACHINE_VIEW { BIFunctionForm = "Add Function SKIP", BINPFunctionForm = "Add Natural Function SKIP", BITestFunctionForm = "Add Test Function SKIP", - BIAIEvaluationForm = "AI Evaluation", + BIAIEvaluationForm = "AI Evaluation SKIP", BIServiceWizard = "Service Wizard SKIP", BIServiceConfigView = "Service Config View", BIListenerConfigView = "Listener Config View", @@ -103,7 +103,7 @@ export enum MACHINE_VIEW { ServiceFunctionForm = "Service Function Form", BISamplesView = "BI Samples View", ReviewMode = "Review Mode SKIP", - EvalsetViewer = "Evalset Viewer" + EvalsetViewer = "Evalset Viewer SKIP" } export interface MachineEvent { 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 564b0503dd6..0382a1d9a58 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -31,7 +31,7 @@ import { } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; -import { ExpressionFormField, FieldDerivation, FormExpressionEditorProps, FormField, FormImports, FormValues, FormSectionConfig } from "./types"; +import { ExpressionFormField, FieldDerivation, FormExpressionEditorProps, FormField, FormImports, FormValues } from "./types"; import { EditorFactory } from "../editors/EditorFactory"; import { getValueForDropdown, isDropdownField } from "../editors/utils"; import { @@ -103,16 +103,6 @@ namespace S { width: 100%; `; - export const HoverableSection = styled(Row) <{}>` - padding: 12px 16px; - cursor: pointer; - background: var(--vscode-sideBar-background); - border-radius: 4px 4px 0; - &:hover { - background: var(--vscode-list-hoverBackground); - } - `; - export const CategoryRow = styled.div<{ bottomBorder?: boolean; topBorder?: boolean }>` display: flex; flex-direction: column; @@ -413,7 +403,6 @@ export interface FormProps { changeOptionalFieldTitle?: string; // Option to change the title of optional fields openFormTypeEditor?: (open: boolean, newType?: string, editingField?: FormField) => void; derivedFields?: FieldDerivation[]; // Configuration for auto-deriving field values from other fields - sections?: FormSectionConfig; } export const Form = forwardRef((props: FormProps) => { @@ -455,8 +444,7 @@ export const Form = forwardRef((props: FormProps) => { onValidityChange, changeOptionalFieldTitle = undefined, openFormTypeEditor, - derivedFields = [], - sections + derivedFields = [] } = props; const { @@ -481,9 +469,6 @@ export const Form = forwardRef((props: FormProps) => { const [manuallyEditedFields, setManuallyEditedFields] = useState<Set<string>>(new Set()); const [isSubComponentEnabled, setIsSubComponentEnabled] = useState(false); const [optionalFieldsTitle, setOptionalFieldsTitle] = useState("Advanced Configurations"); - const [sectionCollapseState, setSectionCollapseState] = useState<Map<string, boolean>>( - new Map(sections?.sections.map(s => [s.id, s.defaultCollapsed ?? true]) || []) - ); const markdownRef = useRef<HTMLDivElement>(null); @@ -940,80 +925,6 @@ export const Form = forwardRef((props: FormProps) => { })(); }; - const assignFieldsToSections = useMemo(() => { - if (!sections) return null; - - const sectionGroups = new Map<string, FormField[]>(); - const unmappedFields: FormField[] = []; - - formFields.forEach(field => { - if (field.hidden) return; - - // Find section for this field - let assignedSection: string | null = null; - - // Strategy 1: Check explicit fieldKeys in sections - for (const section of sections.sections) { - if (section.fieldKeys?.includes(field.key)) { - assignedSection = section.id; - break; - } - } - - // Strategy 2: Check field's groupName property - if (!assignedSection && field.groupName) { - const matchingSection = sections.sections.find(s => s.id === field.groupName); - if (matchingSection) assignedSection = field.groupName; - } - - if (assignedSection) { - if (!sectionGroups.has(assignedSection)) { - sectionGroups.set(assignedSection, []); - } - sectionGroups.get(assignedSection)!.push(field); - } else { - unmappedFields.push(field); - } - }); - - return { sectionGroups, unmappedFields }; - }, [formFields, sections]); - - // has advance fields that are not in custom sections - const hasAdvanceFieldsNotInSections = useMemo(() => { - if (!sections || !assignFieldsToSections) { - return hasAdvanceFields; - } - - // Check if there are any advanced fields not in custom sections - const hasAdvancedFormFields = formFields.some((field) => { - if (!field.advanced || !field.enabled || field.hidden) return false; - - // Check if field is in a custom section - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - - return !isInSection; // Return true if NOT in section - }); - - // Check advanced choice fields - const hasAdvancedChoiceFieldsNotInSections = advancedChoiceFields.some((field) => { - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - return !isInSection; - }); - - return hasAdvancedFormFields || hasAdvancedChoiceFieldsNotInSections; - }, [formFields, advancedChoiceFields, sections, assignFieldsToSections, hasAdvanceFields]); - - const handleSectionToggle = (sectionId: string, collapsed: boolean) => { - setSectionCollapseState(prev => { - const newState = new Map(prev); - newState.set(sectionId, collapsed); - return newState; - }); - }; - const handleOnSaveClick = async () => { setSavingButton('save'); @@ -1097,13 +1008,6 @@ export const Form = forwardRef((props: FormProps) => { return; } - // Skip if field is in a section - if (sections && assignFieldsToSections) { - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - if (isInSection) return; - } - const updatedField = updateFormFieldWithImports(field, formImports); renderedComponents.push( <S.Row key={updatedField.key}> @@ -1154,188 +1058,6 @@ export const Form = forwardRef((props: FormProps) => { })()} </S.CategoryRow> - {/* Render configured sections */} - {sections && assignFieldsToSections && ( - <S.CategoryRow bottomBorder={false}> - {sections.sections - .filter(section => { - const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; - const hasFields = fields.length > 0; - const meetsCondition = !section.renderCondition || - section.renderCondition(getValues()); - return hasFields && meetsCondition; - }) - .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) - .map(section => { - const fields = assignFieldsToSections.sectionGroups.get(section.id) || []; - const isCollapsed = sectionCollapseState.get(section.id) ?? section.defaultCollapsed ?? true; - const isCollapsible = section.isCollapsible !== false; - return ( - <React.Fragment key={section.id}> - <div style={{ display: "flex", flexDirection: "column", width: "100%", borderRadius: "4px", border: "1px solid var(--vscode-panel-border)" }}> - <S.HoverableSection onClick={() => handleSectionToggle(section.id, !isCollapsed)}> - <div style={{ display: "flex", flexDirection: "column", gap: 2 }}> - <Typography variant="body2" sx={{ fontWeight: 500 }}> - {section.title} - </Typography> - <Typography variant="body2" sx={{ opacity: 0.7, fontSize: 11 }}> - {section.description} - </Typography> - </div> - {isCollapsible && ( - <S.ButtonContainer> - {isCollapsed && ( - <Codicon - name={"chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - )} - {!isCollapsed && ( - <Codicon - name={"chevron-up"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - )} - </S.ButtonContainer> - )} - </S.HoverableSection> - {!isCollapsed && (<S.Row style={{ flexDirection: "column", gap: "20px", padding: "12px 16px 28px", borderTop: "1px solid var(--vscode-panel-border)" }}> - {fields.map(field => { - const updatedField = updateFormFieldWithImports(field, formImports); - return ( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - selectedNode={selectedNode} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - openSubPanel={handleOpenSubPanel} - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - setSubComponentEnabled={setIsSubComponentEnabled} - handleNewTypeSelected={handleNewTypeSelected} - onBlur={handleOnBlur} - isContextTypeEditorSupported={updatedField?.isContextTypeSupported} - openFormTypeEditor={ - openFormTypeEditor && - ((open: boolean, newType?: string) => openFormTypeEditor(open, newType, updatedField)) - } - /> - {updatedField.key === "scope" && scopeFieldAddon} - </S.Row> - ); - })} - </S.Row>)} - </div> - </React.Fragment> - ); - })} - </S.CategoryRow> - )} - - <S.CategoryRow bottomBorder={false}> - {hasAdvanceFieldsNotInSections && ( - <S.Row> - {optionalFieldsTitle} - <S.ButtonContainer> - {!showAdvancedOptions && ( - <LinkButton - onClick={handleOnShowAdvancedOptions} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={"chevron-down"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - /> - Expand - </LinkButton> - )} - {showAdvancedOptions && ( - <LinkButton - onClick={handleOnHideAdvancedOptions} - sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} - > - <Codicon - name={"chevron-up"} - iconSx={{ fontSize: 12 }} - sx={{ height: 12 }} - />Collapsed - </LinkButton> - )} - </S.ButtonContainer> - </S.Row> - )} - {hasAdvanceFieldsNotInSections && - showAdvancedOptions && - formFields.map((field) => { - if (field.advanced && !field.hidden) { - // Skip if field is in a custom section - if (sections && assignFieldsToSections) { - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - if (isInSection) return null; - } - - const updatedField = updateFormFieldWithImports(field, formImports); - return ( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - onBlur={handleOnBlur} - /> - </S.Row> - ); - } - return null; - })} - {hasAdvanceFieldsNotInSections && - showAdvancedOptions && - advancedChoiceFields.map((field) => { - // Skip if field is in a custom section - if (sections && assignFieldsToSections) { - const isInSection = Array.from(assignFieldsToSections.sectionGroups.values()) - .some(fields => fields.find(f => f.key === field.key)); - if (isInSection) return null; - } - - const updatedField = updateFormFieldWithImports(field, formImports); - return ( - <S.Row key={updatedField.key}> - <EditorFactory - field={updatedField} - openRecordEditor={ - openRecordEditor && - ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) - } - subPanelView={subPanelView} - handleOnFieldFocus={handleOnFieldFocus} - recordTypeFields={recordTypeFields} - onIdentifierEditingStateChange={handleIdentifierEditingStateChange} - handleOnTypeChange={handleOnTypeChange} - onBlur={handleOnBlur} - /> - </S.Row> - ); - })} - </S.CategoryRow> - {!preserveOrder && (variableField || typeField || targetTypeField) && ( <S.CategoryRow topBorder={!compact && hasParameters}> {variableField && ( diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts index 97299597a59..cd6f23b36c1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts @@ -267,23 +267,3 @@ export type FormExpressionEditorProps = export type FormImports = { [fieldKey: string]: Imports; } - -export interface FormSection { - id: string; - title: string; - isCollapsible?: boolean; - defaultCollapsed?: boolean; - order?: number; - description?: string; - fieldKeys?: string[]; - renderCondition?: (formValues: FormValues) => boolean; -} - -export interface FormSectionConfig { - sections: FormSection[]; - defaultSection?: { - id: string; - title?: string; - order?: number; - }; -} 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 013f7050bce..a7294bd54e2 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -41,7 +41,6 @@ import { PathEditor } from "./PathEditor"; import { HeaderSetEditor } from "./HeaderSetEditor"; import { CompletionItem } from "@wso2/ui-toolkit"; import { CustomDropdownEditor } from "./CustomDropdownEditor"; -import { RadioButtonGroupEditor } from "./RadioButtonGroupEditor"; import { SliderEditor } from "./SliderEditor"; import { ActionExpressionEditor } from "./ActionExpressionEditor"; import { CheckBoxConditionalEditor } from "./CheckBoxConditionalEditor"; @@ -107,8 +106,6 @@ export const EditorFactory = (props: FormFieldEditorProps) => { if (!field.enabled || field.hidden) { return <></>; - } else if (field.type === "RADIO_GROUP") { - return <RadioButtonGroupEditor field={field} />; } else if (field.type === "SLIDER") { return <SliderEditor field={field} />; } else if (field.type === "MULTIPLE_SELECT") { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx deleted file mode 100644 index 46d544cf25e..00000000000 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/RadioButtonGroupEditor.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React, { useEffect } from "react"; -import { FormField } from "../Form/types"; -import { RadioButtonGroup } from "@wso2/ui-toolkit"; -import { useFormContext } from "../../context"; - -interface RadioButtonGroupEditorProps { - field: FormField; -} - -export function RadioButtonGroupEditor(props: RadioButtonGroupEditorProps) { - const { field } = props; - const { form } = useFormContext(); - const { register, setValue, watch, getValues } = form; - - const currentValue = watch(field.key); - - // Only set initial value on mount, not when field.value changes - // This prevents the form from resetting when sections collapse/expand - useEffect(() => { - const formValues = getValues(); - const currentFormValue = formValues[field.key]; - if (currentFormValue === undefined || currentFormValue === null || currentFormValue === "") { - setValue(field.key, field.value); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); // Empty dependency array - only run on mount - - const handleChange = (e: any) => { - const value = e.target.value; - setValue(field.key, value); - field.onValueChange?.(value); - }; - - return ( - <RadioButtonGroup - {...register(field.key, { - value: field.value, - onChange: handleChange - })} - label={field.label} - orientation="horizontal" - options={field.itemOptions || []} - value={currentValue} - className="radio-button-group" - /> - ); -} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts b/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts index f3d302a48ac..b3c0f739c4a 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/index.ts @@ -25,7 +25,6 @@ export * from "./ArrayEditor"; export * from "./FileSelect"; export * from "./FormMapEditor"; export * from "./FieldContext"; -export * from "./RadioButtonGroupEditor"; export * from "./SliderEditor"; export * from "./MultiModeExpressionEditor/ChipExpressionEditor/components/ChipExpressionEditor"; export * from "./MultiModeExpressionEditor/Configurations"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/TopNavigationBar/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/TopNavigationBar/index.tsx index aa133b51668..94749216eaa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/TopNavigationBar/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/TopNavigationBar/index.tsx @@ -245,6 +245,10 @@ function getShortNames(name: string) { return "Natural Function"; case MACHINE_VIEW.BITestFunctionForm: return "Test Function"; + case MACHINE_VIEW.BIAIEvaluationForm: + return "AI Evaluation"; + case MACHINE_VIEW.EvalsetViewer: + return "Evalset Viewer"; case MACHINE_VIEW.BIServiceWizard: case MACHINE_VIEW.BIServiceConfigView: return "Service"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx index 7ae3aafa672..c2567a12bb1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/CardSelector.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index 0a372e62cf5..5f0fc99a6f0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except 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 791bb3a9b1e..d3a65dd31b0 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 @@ -49,8 +49,7 @@ import { FormExpressionEditorProps, FormImports, HelperpaneOnChangeOptions, - InputMode, - FormSectionConfig + InputMode } from "@wso2/ballerina-side-panel"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { CompletionItem, FormExpressionEditorRef, HelperPaneHeight, Overlay, ThemeColors } from "@wso2/ui-toolkit"; @@ -120,7 +119,6 @@ interface FormProps { onChange?: (fieldKey: string, value: any, allValues: FormValues) => void; hideSaveButton?: boolean; customDiagnosticFilter?: (diagnostics: Diagnostic[]) => Diagnostic[]; - sections?: FormSectionConfig; } export function FormGeneratorNew(props: FormProps) { @@ -154,8 +152,7 @@ export function FormGeneratorNew(props: FormProps) { changeOptionalFieldTitle, onChange, hideSaveButton, - customDiagnosticFilter, - sections + customDiagnosticFilter } = props; const { rpcClient } = useRpcContext(); @@ -995,7 +992,6 @@ export function FormGeneratorNew(props: FormProps) { changeOptionalFieldTitle={changeOptionalFieldTitle} onChange={onChange} hideSaveButton={hideSaveButton} - sections={sections} /> )} { From e1e5a365eca7fa7d6d70c574f41e4b7ed9e5f743 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 13:47:16 +0530 Subject: [PATCH 211/247] Update slider styles --- .../src/components/Slider/Slider.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx b/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx index 19b5dd58e46..8af2a450d88 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx @@ -58,12 +58,22 @@ const SliderTrack = styled.div` align-items: center; `; -const StyledSlider = styled.input` +interface StyledSliderProps { + percentage: number; +} + +const StyledSlider = styled.input<StyledSliderProps>` -webkit-appearance: none; appearance: none; width: 100%; height: 4px; - background: var(--vscode-editorWidget-background); + background: linear-gradient( + to right, + var(--vscode-button-background) 0%, + var(--vscode-button-background) ${(props: { percentage: number; }) => props.percentage}%, + var(--vscode-editorWidget-background) ${(props: { percentage: number; }) => props.percentage}%, + var(--vscode-editorWidget-background) 100% + ); border: 1px solid var(--vscode-editorWidget-border); outline: none; border-radius: 2px; @@ -76,7 +86,7 @@ const StyledSlider = styled.input` height: 14px; background: var(--vscode-button-background); border: 1px solid var(--vscode-button-border); - border-radius: 2px; + border-radius: 4px; cursor: pointer; &:hover { @@ -165,6 +175,8 @@ export const Slider = React.forwardRef<HTMLInputElement, SliderProps>((props, re return val.toString(); }; + const percentage = ((currentValue - Number(min)) / (Number(max) - Number(min))) * 100; + return ( <SliderContainer id={id} className={className} sx={sx}> {label && ( @@ -185,6 +197,7 @@ export const Slider = React.forwardRef<HTMLInputElement, SliderProps>((props, re step={step} value={currentValue} onChange={handleChange} + percentage={percentage} {...rest} /> </SliderTrack> From e9786efb76cfe68d875831ca3bd25446d76b87f6 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 15:07:56 +0530 Subject: [PATCH 212/247] Fix coderabbit suggestions --- .../src/features/tracing/trace-converter.ts | 27 ++++--- .../rpc-managers/bi-diagram/rpc-manager.ts | 4 +- .../rpc-managers/test-manager/rpc-manager.ts | 5 +- .../rpc-managers/visualizer/rpc-manager.ts | 41 ++++++++-- .../src/components/Form/types.ts | 2 +- .../src/views/BI/AIEvaluationForm/index.tsx | 74 ++++++------------- .../src/views/BI/TestFunctionForm/index.tsx | 6 +- .../EvalsetViewer/EditableToolCallsList.tsx | 32 +++++--- .../EvalsetViewer/EditableTraceMessage.tsx | 2 +- .../views/EvalsetViewer/EvalThreadViewer.tsx | 24 +++--- .../views/EvalsetViewer/ToolEditorModal.tsx | 18 ++++- .../EvalsetViewer/utils/traceAdapters.ts | 6 +- .../src/components/Slider/Slider.tsx | 12 ++- 13 files changed, 146 insertions(+), 107 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index 8adac22e2b3..c2e4c3e872b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -133,18 +133,22 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { const toolSpan = spans.find((s: SpanData) => s.attributes?.some((a: AttributeData) => a.key === 'gen_ai.input.tools') ); - const toolsStr = getAttribute(toolSpan, 'gen_ai.input.tools'); - const toolsData = safeJsonParse(toolsStr); const tools: ToolSchema[] = []; - if (Array.isArray(toolsData)) { - toolsData.forEach((t: any) => { - tools.push({ - name: t.name, - description: t.description, - parametersSchema: t.parameters - }); - }); + if (toolSpan) { + const toolsStr = getAttribute(toolSpan, 'gen_ai.input.tools'); + if (toolsStr && toolsStr.trim() !== '') { + const toolsData = safeJsonParse(toolsStr); + if (Array.isArray(toolsData)) { + toolsData.forEach((t: any) => { + tools.push({ + name: t.name, + description: t.description, + parametersSchema: t.parameters + }); + }); + } + } } // Helper function to parse messages @@ -275,11 +279,10 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { output: output as ChatAssistantMessage, startTime: chatSpan.startTime || startTime, endTime: chatSpan.endTime || endTime - } as any); + }); } // Determine User Message (Trigger) - // Get the first user message from the first chat span const firstChatInputStr = getAttribute(chatSpans[0], 'gen_ai.input.messages'); const firstInputMessages = parseMessages(firstChatInputStr); const lastUserMsg = [...firstInputMessages].reverse().find(m => m.role === 'user'); 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 97e7a58f5b8..b659448a3b7 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 @@ -2117,9 +2117,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }) .catch((error) => { console.log(">>> error fetching available agents from ls", error); - return new Promise((resolve) => { - resolve(undefined); - }); + resolve(undefined); }); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts index 78611e71997..8996ff0bc85 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts @@ -94,7 +94,10 @@ export class TestServiceManagerRpcManager implements TestManagerServiceAPI { async getEvalsets(params: GetEvalsetsRequest): Promise<GetEvalsetsResponse> { return new Promise(async (resolve) => { try { - const evalsetFiles = await vscode.workspace.findFiles('**/evalsets/**/*.evalset.json'); + const pattern = params.projectPath + ? new vscode.RelativePattern(vscode.Uri.file(params.projectPath), '**/evalsets/**/*.evalset.json') + : '**/evalsets/**/*.evalset.json'; + const evalsetFiles = await vscode.workspace.findFiles(pattern); const evalsets: EvalsetItem[] = []; for (const uri of evalsetFiles) { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index 49650a6a389..495a374a100 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -38,6 +38,7 @@ import { VisualizerLocation } from "@wso2/ballerina-core"; import fs from "fs"; +import path from "path"; import { commands, Range, Uri, window, workspace, WorkspaceEdit } from "vscode"; import { URI, Utils } from "vscode-uri"; import { notifyCurrentWebview } from "../../RPCLayer"; @@ -316,31 +317,59 @@ export class VisualizerRpcManager implements VisualizerAPI { reopenApprovalView(params: ReopenApprovalViewRequest): void { approvalViewManager.reopenApprovalViewPopup(params.requestId); } - + async saveEvalThread(params: SaveEvalThreadRequest): Promise<SaveEvalThreadResponse> { try { const { filePath, updatedEvalSet } = params; - // Write the updated evalset back to the file + // Validate and canonicalize the file path to prevent path traversal attacks + const normalizedPath = path.normalize(filePath); + const resolvedPath = path.resolve(normalizedPath); + + // Get workspace folders to validate the path is within an allowed workspace + const workspaceFolders = workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + const errorMsg = 'No workspace folder is open'; + console.error('saveEvalThread error:', errorMsg); + window.showErrorMessage(`Failed to save evalset: ${errorMsg}`); + return { success: false, error: errorMsg }; + } + + // Check if the resolved path starts with any of the workspace roots + const isPathInWorkspace = workspaceFolders.some(folder => { + const workspaceRoot = folder.uri.fsPath; + const resolvedWorkspaceRoot = path.resolve(workspaceRoot); + return resolvedPath.startsWith(resolvedWorkspaceRoot + path.sep) || + resolvedPath === resolvedWorkspaceRoot; + }); + + if (!isPathInWorkspace) { + const errorMsg = `Path is outside workspace: ${resolvedPath}`; + console.error('saveEvalThread error:', errorMsg); + window.showErrorMessage(`Failed to save evalset: Path must be within workspace`); + return { success: false, error: errorMsg }; + } + + // Write the updated evalset back to the file using the validated path await fs.promises.writeFile( - filePath, + resolvedPath, JSON.stringify(updatedEvalSet, null, 2), 'utf-8' ); // Read back the file to get fresh data - const savedContent = await fs.promises.readFile(filePath, 'utf-8'); + const savedContent = await fs.promises.readFile(resolvedPath, 'utf-8'); const savedEvalSet = JSON.parse(savedContent); // Get the current threadId from context const currentContext = StateMachine.context(); const threadId = currentContext.evalsetData?.threadId; - // Reload the view with fresh data from disk + // Reload the view with fresh data from disk using the validated path openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.EvalsetViewer, evalsetData: { - filePath, + filePath: resolvedPath, content: savedEvalSet, threadId } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts index cd6f23b36c1..ad22fb73a7c 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts @@ -196,7 +196,7 @@ type FormHelperPaneConditionalProps = { anchorRef: RefObject<HTMLDivElement>, defaultValue: string, value: string, - onChange: (value: string, options?: HelperpaneOnChangeOptions) => void, + onChange: (value: string, options?: HelperpaneOnChangeOptions) => void, changeHelperPaneState: (isOpen: boolean) => void, helperPaneHeight: HelperPaneHeight, recordTypeField?: RecordTypeField, diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx index 5f0fc99a6f0..e63665ba2c3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIEvaluationForm/index.tsx @@ -38,7 +38,7 @@ const FormContainer = styled.div` .side-panel-body { overflow: visible; - overflow-y: none; + overflow-y: hidden; } .radio-button-group { @@ -54,7 +54,7 @@ const FormContainer = styled.div` const Container = styled.div` display: "flex"; flex-direction: "column"; - gap: 10; + gap: 10px; `; const FullHeightView = styled(View)` @@ -114,15 +114,9 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { const [dataProviderMode, setDataProviderMode] = useState<string>('evalSet'); const [evalsetOptions, setEvalsetOptions] = useState<Array<{ value: string; content: string }>>([]); - const handleFieldChange = (fieldKey: string, value: any) => { - if (fieldKey === 'dataProviderMode') { - setDataProviderMode(value); - updateFieldVisibility(value); - } - }; - - const updateFieldVisibility = (mode: string) => { - setFormFields(prevFields => prevFields.map(field => { + // Helper function to apply field visibility rules based on data provider mode + const applyFieldVisibility = (fields: FormField[], mode: string): FormField[] => { + return fields.map(field => { if (field.key === 'dataProvider') { return { ...field, hidden: mode !== 'function' }; } @@ -133,7 +127,18 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { return { ...field, hidden: mode === 'evalSet' }; } return field; - })); + }); + }; + + const handleFieldChange = (fieldKey: string, value: any) => { + if (fieldKey === 'dataProviderMode') { + setDataProviderMode(value); + updateFieldVisibility(value); + } + }; + + const updateFieldVisibility = (mode: string) => { + setFormFields(prevFields => applyFieldVisibility(prevFields, mode)); }; const updateTargetLineRange = () => { @@ -177,18 +182,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { setDataProviderMode(mode); // Set field visibility based on mode - formFields = formFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - if (field.key === 'runs') { - return { ...field, hidden: mode === 'evalSet' }; - } - return field; - }); + formFields = applyFieldVisibility(formFields, mode); setFormFields(formFields); } @@ -219,18 +213,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { setDataProviderMode(mode); // Set initial field visibility - formFields = formFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - if (field.key === 'runs') { - return { ...field, hidden: mode === 'evalSet' }; - } - return field; - }); + formFields = applyFieldVisibility(formFields, mode); setFormFields(formFields); } @@ -246,18 +229,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { setDataProviderMode(mode); // Set initial field visibility (default is 'evalSet' mode) - formFields = formFields.map(field => { - if (field.key === 'dataProvider') { - return { ...field, hidden: mode !== 'function' }; - } - if (field.key === 'evalSetFile') { - return { ...field, hidden: mode !== 'evalSet' }; - } - if (field.key === 'runs') { - return { ...field, hidden: mode === 'evalSet' }; - } - return field; - }); + formFields = applyFieldVisibility(formFields, mode); setFormFields(formFields); } @@ -321,7 +293,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { value: '', paramManagerProps: { paramValues: generateParamFields(testFunction.parameters), - formFields: paramFiels, + formFields: paramFields, handleParameter: handleParamChange }, types: [{ fieldType: "PARAM_MANAGER", selected: false }] @@ -539,7 +511,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { } if (field.originalName == 'minPassRate') { // Convert percentage (0-100) to decimal (0-1) - const percentageValue = formValues['minPassRate'] || 100; + const percentageValue = formValues['minPassRate'] ?? 100; field.value = String(Number(percentageValue) / 100); } if (field.originalName == 'dataProviderMode') { @@ -756,7 +728,7 @@ export function AIEvaluationForm(props: TestFunctionDefProps) { } } - const paramFiels: FormField[] = [ + const paramFields: FormField[] = [ { key: `variable`, label: 'Name', diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx index c72601d982a..9665500f8e1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TestFunctionForm/index.tsx @@ -37,7 +37,7 @@ const FormContainer = styled.div` .side-panel-body { overflow: visible; - overflow-y: none; + overflow-y: hidden; } `; @@ -159,7 +159,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { value: '', paramManagerProps: { paramValues: generateParamFields(testFunction.parameters), - formFields: paramFiels, + formFields: paramFields, handleParameter: handleParamChange }, types: [{ fieldType: "PARAM_MANAGER", selected: false }] @@ -552,7 +552,7 @@ export function TestFunctionForm(props: TestFunctionDefProps) { } } - const paramFiels: FormField[] = [ + const paramFields: FormField[] = [ { key: `variable`, label: 'Name', diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx index 061ae3d3b5e..9a737c35066 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx @@ -191,15 +191,18 @@ const formatArgs = (args: any) => { interface SortableToolCallItemProps { toolCall: EvalFunctionCall; + index: number; onEdit: () => void; onDelete: () => void; } const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ toolCall, + index, onEdit, onDelete, }) => { + const sortableId = `${toolCall.id ?? toolCall.name}-${index}`; const { attributes, listeners, @@ -207,7 +210,7 @@ const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ transform, transition, isDragging, - } = useSortable({ id: toolCall.id || toolCall.name }); + } = useSortable({ id: sortableId }); const style = { transform: CSS.Transform.toString(transform), @@ -271,11 +274,12 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ const { active, over } = event; if (over && active.id !== over.id) { + // Extract index from composite ID: "id-index" or "name-index" const oldIndex = toolCalls.findIndex( - tc => (tc.id || tc.name) === active.id + (tc, idx) => `${tc.id ?? tc.name}-${idx}` === active.id ); const newIndex = toolCalls.findIndex( - tc => (tc.id || tc.name) === over.id + (tc, idx) => `${tc.id ?? tc.name}-${idx}` === over.id ); const reorderedToolCalls = arrayMove(toolCalls, oldIndex, newIndex); @@ -316,17 +320,21 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ onDragEnd={handleDragEnd} > <SortableContext - items={toolCalls.map(tc => tc.id || tc.name)} + items={toolCalls.map((tc, idx) => `${tc.id ?? tc.name}-${idx}`)} strategy={verticalListSortingStrategy} > - {toolCalls.map((toolCall, index) => ( - <SortableToolCallItem - key={toolCall.id || `${toolCall.name}-${index}`} - toolCall={toolCall} - onEdit={() => onEditToolCall(traceId, index)} - onDelete={() => handleDeleteRequest(index)} - /> - ))} + {toolCalls.map((toolCall, index) => { + const sortableId = `${toolCall.id ?? toolCall.name}-${index}`; + return ( + <SortableToolCallItem + key={sortableId} + toolCall={toolCall} + index={index} + onEdit={() => onEditToolCall(traceId, index)} + onDelete={() => handleDeleteRequest(index)} + /> + ); + })} </SortableContext> </DndContext> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx index 825f81f5a79..c74f2fa8240 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableTraceMessage.tsx @@ -127,7 +127,7 @@ const CancelButton = styled.button` interface EditableTraceMessageProps { traceId: string; isUser: boolean; - content: string | any; + content: unknown; isEditMode: boolean; onSave: (traceId: string, content: string) => void; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index 64a4a6415a3..b847165840a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -53,7 +53,8 @@ import { getContentType, deserializeContent, generateToolCallId, - createNewTrace + createNewTrace, + getToolCallsFromTrace } from "./utils/traceAdapters"; // --- LAYOUT COMPONENTS --- @@ -459,10 +460,6 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, }) ); - const extractToolCalls = (trace: EvalsetTrace): EvalFunctionCall[] => { - return (trace.toolCalls as EvalFunctionCall[]) || []; - }; - const handleEnterEditMode = () => { setOriginalEvalThread(cloneEvalThread(evalThread)); setWorkingEvalThread(cloneEvalThread(evalThread)); @@ -523,9 +520,18 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, if (response.success) { setHasUnsavedChanges(false); handleExitEditMode(); + } else { + // Show error when save was unsuccessful + rpcClient.getCommonRpcClient().showErrorMessage({ + message: response.error || 'Failed to save evaluation thread.' + }); } - } catch (error) { + } catch (error: any) { console.error('Error saving evalThread:', error); + // Show error for RPC failures + rpcClient.getCommonRpcClient().showErrorMessage({ + message: error?.message || 'An unexpected error occurred while saving.' + }); } finally { setIsSaving(false); } @@ -563,7 +569,7 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, const trace = workingEvalThread.traces.find(t => t.id === traceId); if (!trace) return; - const currentToolCalls = extractToolCalls(trace); + const currentToolCalls = getToolCallsFromTrace(trace); let updatedToolCalls: EvalFunctionCall[]; if (toolCallIndex === -1) { @@ -672,7 +678,7 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}> <SortableContext items={displayCase.traces.map(t => t.id)} strategy={verticalListSortingStrategy}> {displayCase.traces.map((trace, traceIdx) => { - const toolCalls = extractToolCalls(trace); + const toolCalls = getToolCallsFromTrace(trace); return ( <React.Fragment key={trace.id}> <SortableTraceWrapper @@ -747,7 +753,7 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, if (!trace) return null; const toolCall = selectedToolCall.toolCallIndex === -1 ? { name: trace.tools[0]?.name || '', arguments: {} } - : extractToolCalls(trace)[selectedToolCall.toolCallIndex]; + : getToolCallsFromTrace(trace)[selectedToolCall.toolCallIndex]; return ( <ToolEditorModal diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx index b28fbf7225b..00febf2d429 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import styled from '@emotion/styled'; import { motion } from 'framer-motion'; import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; @@ -226,6 +226,22 @@ export const ToolEditorModal: React.FC<ToolEditorModalProps> = ({ const selectedTool = availableTools.find(t => t.name === name); const parametersSchema = selectedTool?.parametersSchema; + // Reset arguments when the selected tool changes + useEffect(() => { + // Initialize with defaults from schema if available, otherwise empty object + const newArguments: Record<string, any> = {}; + + if (parametersSchema?.properties) { + Object.entries(parametersSchema.properties).forEach(([fieldName, fieldSchema]: [string, any]) => { + if (fieldSchema.default !== undefined) { + newArguments[fieldName] = fieldSchema.default; + } + }); + } + + setArgumentsValue(newArguments); + }, [name, selectedTool, parametersSchema]); + const handleArgumentChange = (fieldName: string, value: any) => { setArgumentsValue(prev => ({ ...prev, [fieldName]: value })); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index c856802811f..9fd2cd48010 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -55,8 +55,8 @@ export const updateTraceAgentOutput = (trace: EvalsetTrace, content: string): Ev * Get tool calls from a trace output */ export const getToolCallsFromTrace = (trace: EvalsetTrace): EvalFunctionCall[] => { - if (trace.output?.toolCalls) { - return trace.output.toolCalls as EvalFunctionCall[]; + if (trace.toolCalls) { + return trace.toolCalls as EvalFunctionCall[]; } return []; }; @@ -70,7 +70,7 @@ export const updateToolCallsInTrace = ( ): EvalsetTrace => { return { ...trace, - toolCalls: toolCalls.length > 0 ? toolCalls : undefined, + toolCalls: toolCalls || [], }; }; diff --git a/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx b/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx index 8af2a450d88..725f6c0feaf 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/Slider/Slider.tsx @@ -152,6 +152,9 @@ export const Slider = React.forwardRef<HTMLInputElement, SliderProps>((props, re ...rest } = props; + const generatedId = React.useId(); + const resolvedId = id ?? generatedId; + const [currentValue, setCurrentValue] = React.useState<number>( (value as number) ?? (defaultValue as number) ?? Number(min) ); @@ -175,13 +178,14 @@ export const Slider = React.forwardRef<HTMLInputElement, SliderProps>((props, re return val.toString(); }; - const percentage = ((currentValue - Number(min)) / (Number(max) - Number(min))) * 100; + const range = Number(max) - Number(min); + const percentage = range === 0 ? 0 : ((currentValue - Number(min)) / range) * 100; return ( - <SliderContainer id={id} className={className} sx={sx}> + <SliderContainer id={resolvedId} className={className} sx={sx}> {label && ( <LabelContainer> - <Label htmlFor={`${id}-slider`}>{label}</Label> + <Label htmlFor={`${resolvedId}-slider`}>{label}</Label> {showValue && ( <ValueDisplay>{formatValue(currentValue)}</ValueDisplay> )} @@ -190,7 +194,7 @@ export const Slider = React.forwardRef<HTMLInputElement, SliderProps>((props, re <SliderTrack> <StyledSlider ref={ref} - id={`${id}-slider`} + id={`${resolvedId}-slider`} type="range" min={min} max={max} From 3fd83ee5c535a21b7905035ab7c78e452f461b53 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Fri, 13 Feb 2026 16:10:16 +0530 Subject: [PATCH 213/247] Add license header to ExportDropdown --- .../src/components/ExportDropdown.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx b/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx index a35787c5ae7..2b7a1748cc6 100644 --- a/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx +++ b/workspaces/ballerina/trace-visualizer/src/components/ExportDropdown.tsx @@ -1,3 +1,21 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + import React, { useState, useRef, useEffect } from 'react'; import styled from '@emotion/styled'; import { Icon } from "@wso2/ui-toolkit"; From c812bd3799ba1ba5300cebf1a8b8cfa9acfc8031 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Fri, 13 Feb 2026 17:53:16 +0000 Subject: [PATCH 214/247] Update CHANGELOG.md for version 1.7.0 release --- 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 200c98e896b..90b9d90c25b 100644 --- a/workspaces/ballerina/ballerina-extension/CHANGELOG.md +++ b/workspaces/ballerina/ballerina-extension/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to the **Ballerina** extension will be documented in this fi The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/). -## [Unreleased] +## [5.8.0](https://github.com/wso2/vscode-extensions/compare/ballerina-5.7.3...ballerina-5.8.0) - 2026-02-14 ### Added diff --git a/workspaces/bi/bi-extension/CHANGELOG.md b/workspaces/bi/bi-extension/CHANGELOG.md index def1415e8aa..47363ecc54e 100644 --- a/workspaces/bi/bi-extension/CHANGELOG.md +++ b/workspaces/bi/bi-extension/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to the **WSO2 Integrator: BI** extension will be documented The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/). -## [Unreleased] +## [1.7.0](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.6.1...ballerina-integrator-1.7.0) - 2026-02-14 ### Added From ad3b0d80313bb4f55d99bddfe5904c2dc3c7fe4b Mon Sep 17 00:00:00 2001 From: gigara <info@gigara.info> Date: Fri, 13 Feb 2026 23:53:22 +0530 Subject: [PATCH 215/247] Fix vulnerability --- common/config/rush/.pnpmfile.cjs | 6 + common/config/rush/pnpm-lock.yaml | 726 +++++++++++++++--------------- 2 files changed, 367 insertions(+), 365 deletions(-) diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 9afac4b374a..e75032e3934 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -46,6 +46,9 @@ module.exports = { if (pkg.dependencies['lodash']) { pkg.dependencies['lodash'] = '4.17.23'; } + if (pkg.dependencies['qs']) { + pkg.dependencies['qs'] = '6.14.2'; + } } if (pkg.devDependencies) { @@ -79,6 +82,9 @@ module.exports = { if (pkg.devDependencies['lodash']) { pkg.devDependencies['lodash'] = '4.17.23'; } + if (pkg.devDependencies['qs']) { + pkg.devDependencies['qs'] = '6.14.2'; + } } return pkg; diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 2a8398c3b0d..d4ee2c33ca0 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1196,7 +1196,7 @@ importers: version: 11.11.1 katex: specifier: ^0.16.27 - version: 0.16.27 + version: 0.16.28 lodash: specifier: 4.17.23 version: 4.17.23 @@ -2338,7 +2338,7 @@ importers: version: link:../../common-libs/ui-toolkit katex: specifier: ^0.16.27 - version: 0.16.27 + version: 0.16.28 react: specifier: 18.2.0 version: 18.2.0 @@ -4858,16 +4858,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.28.1': - resolution: {integrity: sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==} + '@azure/msal-browser@4.28.2': + resolution: {integrity: sha512-6vYUMvs6kJxJgxaCmHn/F8VxjLHNh7i9wzfwPGf8kyBJ8Gg2yvBXx175Uev8LdrD1F5C4o7qHa2CC4IrhGE1XQ==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.14.1': - resolution: {integrity: sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==} + '@azure/msal-common@15.14.2': + resolution: {integrity: sha512-n8RBJEUmd5QotoqbZfd+eGBkzuFI1KX6jw2b3WcpSyGjwmzoeI/Jb99opIBPHpb8y312NB+B6+FGi2ZVSR8yfA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.8.6': - resolution: {integrity: sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==} + '@azure/msal-node@3.8.7': + resolution: {integrity: sha512-a+Xnrae+uwLnlw68bplS1X4kuJ9F/7K6afuMFyRkNIskhjgDezl5Fhrx+1pmAlDmC0VaaAxjRQMp1OmcqVwkIg==} engines: {node: '>=16'} '@babel/code-frame@7.10.4': @@ -5756,8 +5756,8 @@ packages: '@cacheable/memory@2.0.7': resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} - '@cacheable/utils@2.3.3': - resolution: {integrity: sha512-JsXDL70gQ+1Vc2W/KUFfkAJzgb4puKwwKehNLuB+HrNKWf91O736kGfxn4KujXCCSuh6mRRL4XEB0PkAFjWS0A==} + '@cacheable/utils@2.3.4': + resolution: {integrity: sha512-knwKUJEYgIfwShABS1BX6JyJJTglAFcEU7EXqzTdiGCXur4voqkiJkdgZIQtWNFhynzDWERcTYv/sETMu3uJWA==} '@cnakazawa/watch@1.0.4': resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} @@ -6740,14 +6740,6 @@ packages: '@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.1': - resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} - engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -7028,8 +7020,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/base64@17.65.0': - resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} + '@jsonjoy.com/base64@17.67.0': + resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -7040,8 +7032,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/buffers@17.65.0': - resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} + '@jsonjoy.com/buffers@17.67.0': + resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -7052,8 +7044,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/codegen@17.65.0': - resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} + '@jsonjoy.com/codegen@17.67.0': + resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -7112,8 +7104,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@17.65.0': - resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} + '@jsonjoy.com/json-pack@17.67.0': + resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -7124,8 +7116,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pointer@17.65.0': - resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} + '@jsonjoy.com/json-pointer@17.67.0': + resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -7136,8 +7128,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/util@17.65.0': - resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} + '@jsonjoy.com/util@17.67.0': + resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -7585,35 +7577,35 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} - '@peculiar/asn1-cms@2.6.0': - resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==} + '@peculiar/asn1-cms@2.6.1': + resolution: {integrity: sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==} - '@peculiar/asn1-csr@2.6.0': - resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==} + '@peculiar/asn1-csr@2.6.1': + resolution: {integrity: sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==} - '@peculiar/asn1-ecc@2.6.0': - resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==} + '@peculiar/asn1-ecc@2.6.1': + resolution: {integrity: sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==} - '@peculiar/asn1-pfx@2.6.0': - resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==} + '@peculiar/asn1-pfx@2.6.1': + resolution: {integrity: sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==} - '@peculiar/asn1-pkcs8@2.6.0': - resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==} + '@peculiar/asn1-pkcs8@2.6.1': + resolution: {integrity: sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==} - '@peculiar/asn1-pkcs9@2.6.0': - resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==} + '@peculiar/asn1-pkcs9@2.6.1': + resolution: {integrity: sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==} - '@peculiar/asn1-rsa@2.6.0': - resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==} + '@peculiar/asn1-rsa@2.6.1': + resolution: {integrity: sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==} '@peculiar/asn1-schema@2.6.0': resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} - '@peculiar/asn1-x509-attr@2.6.0': - resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==} + '@peculiar/asn1-x509-attr@2.6.1': + resolution: {integrity: sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==} - '@peculiar/asn1-x509@2.6.0': - resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==} + '@peculiar/asn1-x509@2.6.1': + resolution: {integrity: sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==} '@peculiar/x509@1.14.3': resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} @@ -8935,8 +8927,8 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.22.1': - resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} + '@smithy/core@3.23.0': + resolution: {integrity: sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.8': @@ -8999,12 +8991,12 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.13': - resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} + '@smithy/middleware-endpoint@4.4.14': + resolution: {integrity: sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.30': - resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} + '@smithy/middleware-retry@4.4.31': + resolution: {integrity: sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -9019,8 +9011,8 @@ packages: resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.9': - resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==} + '@smithy/node-http-handler@4.4.10': + resolution: {integrity: sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==} engines: {node: '>=18.0.0'} '@smithy/property-provider@4.2.8': @@ -9051,8 +9043,8 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.11.2': - resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} + '@smithy/smithy-client@4.11.3': + resolution: {integrity: sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -9087,12 +9079,12 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.29': - resolution: {integrity: sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==} + '@smithy/util-defaults-mode-browser@4.3.30': + resolution: {integrity: sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.32': - resolution: {integrity: sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==} + '@smithy/util-defaults-mode-node@4.2.33': + resolution: {integrity: sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -9111,8 +9103,8 @@ packages: resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.11': - resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} + '@smithy/util-stream@4.5.12': + resolution: {integrity: sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': @@ -13164,6 +13156,10 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + base16@1.0.0: resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} @@ -13268,8 +13264,8 @@ packages: boundary@2.0.0: resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} - bowser@2.13.1: - resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} boxen@1.3.0: resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} @@ -13296,6 +13292,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -13570,11 +13570,11 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001768: - resolution: {integrity: sha512-hbETk3toYOs+9qGqR0x4Bz4lKFRs6UD9zc4iUtRNwWJ3tRGkFcBxGM/UocIhPFMwA15s1zmtQMgyjo6auN+OTw==} + caniuse-db@1.0.30001769: + resolution: {integrity: sha512-YUJlOqWziYAdXSnL60FU2Won9HqW/IY77M8xgDFMRj5+StEnycCnlKvORrMPAevdyfYd8W6pjQ2XaEiMyDocWA==} - caniuse-lite@1.0.30001768: - resolution: {integrity: sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==} + caniuse-lite@1.0.30001769: + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} canvas@3.2.1: resolution: {integrity: sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==} @@ -13832,8 +13832,8 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - clipboardy@5.2.1: - resolution: {integrity: sha512-RWp4E/ivQAzgF4QSWA9sjeW+Bjo+U2SvebkDhNIfO7y65eGdXPUxMTdIKYsn+bxM3ItPHGm3e68Bv3fgQ3mARw==} + clipboardy@5.3.0: + resolution: {integrity: sha512-EOei1RJTbqXbXhUBMGN8C/Pf+QIPrnDWx9ztlmcW5Hljqj/oVlPrlrDw2O4xh5ViHcvHX3+A0zBrCdcptKTaJA==} engines: {node: '>=20'} cliui@2.1.0: @@ -13918,8 +13918,8 @@ packages: codemirror: ^5.65.3 graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - codemirror@5.65.20: - resolution: {integrity: sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==} + codemirror@5.65.21: + resolution: {integrity: sha512-6teYk0bA0nR3QP0ihGMoxuKzpl5W80FpnHpBJpgy66NK3cZv5b/d/HY8PnRvfSsCG1MTfr92u2WUl+wT0E40mQ==} codemirror@6.0.2: resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} @@ -14341,9 +14341,9 @@ packages: peerDependencies: postcss: ^8.0.9 - css-functions-list@3.2.3: - resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} - engines: {node: '>=12 || >=16'} + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} css-loader@0.28.7: resolution: {integrity: sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==} @@ -15916,8 +15916,8 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flow-parser@0.299.0: - resolution: {integrity: sha512-phGMRoNt6SNglPHGRbCyWm9/pxfe6t/t4++EIYPaBGWT6e0lphLBgUMrvpL62NbRo9R549o3oqrbKHq82kANCw==} + flow-parser@0.301.0: + resolution: {integrity: sha512-yKRjJzN+W9dwk1tU9u6gowANdgFZyYknokcLePyLe30AV6WzAquKJzx+smN9wovWMBE2hvCDUvKbXUpcT1+8OA==} engines: {node: '>=0.4.0'} flush-write-stream@1.1.1: @@ -16686,8 +16686,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hono@4.11.7: - resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} + hono@4.11.9: + resolution: {integrity: sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==} engines: {node: '>=16.9.0'} hookified@1.15.1: @@ -17555,9 +17555,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.2: - resolution: {integrity: sha512-mIcis6w+JiQf3P7t7mg/35GKB4T1FQsBOtMIvuKw4YErj5RjtbhcTd5/I30fmkmGMwvI0WlzSNN+27K0QCMkAw==} - engines: {node: '>=20'} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} @@ -17656,8 +17656,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.2.1: - resolution: {integrity: sha512-GPBXyfcZSGujjddPeA+V34bW70ZJT7jzCEbloVasSH4yjiqWqXHX8iZQtZdVbOhc5esSeAIuiSmMutRZQB/olg==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} jake@10.9.4: @@ -18404,8 +18404,8 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} - katex@0.16.27: - resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==} + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} hasBin: true keytar@7.9.0: @@ -18763,8 +18763,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} lru-cache@4.1.5: @@ -19280,8 +19280,8 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.1.2: - resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + minimatch@10.2.0: + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} engines: {node: 20 || >=22} minimatch@3.0.3: @@ -21140,12 +21140,8 @@ packages: resolution: {integrity: sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==} engines: {node: '>=20'} - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} - - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} query-string@4.3.4: @@ -24052,8 +24048,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.20.0: - resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} + undici@7.21.0: + resolution: {integrity: sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==} engines: {node: '>=20.18.1'} unfetch@4.2.0: @@ -25511,7 +25507,7 @@ snapshots: '@aws-sdk/util-user-agent-node': 3.816.0 '@aws-sdk/xml-builder': 3.804.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/eventstream-serde-browser': 4.2.8 '@smithy/eventstream-serde-config-resolver': 4.3.8 '@smithy/eventstream-serde-node': 4.2.8 @@ -25522,25 +25518,25 @@ snapshots: '@smithy/invalid-dependency': 4.2.8 '@smithy/md5-js': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.13 - '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.29 - '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 '@smithy/util-waiter': 4.2.8 tslib: 2.8.1 @@ -25562,26 +25558,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.816.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.13 - '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.29 - '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -25593,12 +25589,12 @@ snapshots: '@aws-sdk/core@3.816.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 fast-xml-parser: 5.3.4 @@ -25617,12 +25613,12 @@ snapshots: '@aws-sdk/core': 3.816.0 '@aws-sdk/types': 3.804.0 '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 tslib: 2.8.1 '@aws-sdk/credential-provider-ini@3.817.0': @@ -25722,7 +25718,7 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 @@ -25757,15 +25753,15 @@ snapshots: '@aws-sdk/core': 3.816.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 @@ -25780,7 +25776,7 @@ snapshots: '@aws-sdk/core': 3.816.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-endpoints': 3.808.0 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -25800,26 +25796,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.816.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.13 - '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.29 - '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -25887,7 +25883,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.804.0 '@smithy/types': 4.12.0 - bowser: 2.13.1 + bowser: 2.14.1 tslib: 2.8.1 '@aws-sdk/util-user-agent-node@3.816.0': @@ -25966,8 +25962,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.28.1 - '@azure/msal-node': 3.8.6 + '@azure/msal-browser': 4.28.2 + '@azure/msal-node': 3.8.7 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -25980,15 +25976,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.28.1': + '@azure/msal-browser@4.28.2': dependencies: - '@azure/msal-common': 15.14.1 + '@azure/msal-common': 15.14.2 - '@azure/msal-common@15.14.1': {} + '@azure/msal-common@15.14.2': {} - '@azure/msal-node@3.8.6': + '@azure/msal-node@3.8.7': dependencies: - '@azure/msal-common': 15.14.1 + '@azure/msal-common': 15.14.2 jsonwebtoken: 9.0.3 uuid: 8.3.2 @@ -27804,12 +27800,12 @@ snapshots: '@cacheable/memory@2.0.7': dependencies: - '@cacheable/utils': 2.3.3 + '@cacheable/utils': 2.3.4 '@keyv/bigmap': 1.3.1(keyv@5.6.0) hookified: 1.15.1 keyv: 5.6.0 - '@cacheable/utils@2.3.3': + '@cacheable/utils@2.3.4': dependencies: hashery: 1.4.0 keyv: 5.6.0 @@ -28947,8 +28943,8 @@ snapshots: '@radix-ui/react-visually-hidden': 1.2.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) '@types/codemirror': 5.60.17 clsx: 1.2.1 - codemirror: 5.65.20 - codemirror-graphql: 2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.20)(graphql@16.11.0) + codemirror: 5.65.21 + codemirror-graphql: 2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.21)(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 @@ -29012,9 +29008,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.6.0(react@18.2.0) - '@hono/node-server@1.19.9(hono@4.11.7)': + '@hono/node-server@1.19.9(hono@4.11.9)': dependencies: - hono: 4.11.7 + hono: 4.11.9 '@hookform/resolvers@2.8.0(react-hook-form@7.56.4(react@18.2.0))': dependencies: @@ -29047,12 +29043,6 @@ snapshots: '@iarna/toml@2.2.5': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.1': - dependencies: - '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -29085,7 +29075,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -29094,7 +29084,7 @@ snapshots: '@jest/console@30.0.0': dependencies: '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 jest-message-util: 30.0.0 jest-util: 30.0.0 @@ -29221,14 +29211,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-mock: 29.7.0 '@jest/environment@30.0.0': dependencies: '@jest/fake-timers': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-mock: 30.0.0 '@jest/expect-utils@29.7.0': @@ -29269,7 +29259,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -29278,7 +29268,7 @@ snapshots: dependencies: '@jest/types': 30.0.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-message-util: 30.0.0 jest-mock: 30.0.0 jest-util: 30.0.0 @@ -29313,12 +29303,12 @@ snapshots: '@jest/pattern@30.0.0': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-regex-util: 30.0.0 '@jest/pattern@30.0.1': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-regex-util: 30.0.1 '@jest/reporters@25.5.1': @@ -29360,7 +29350,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -29389,7 +29379,7 @@ snapshots: '@jest/transform': 30.0.0 '@jest/types': 30.0.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -29586,7 +29576,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/yargs': 15.0.20 chalk: 4.1.2 @@ -29615,7 +29605,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -29663,7 +29653,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -29671,7 +29661,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -29679,7 +29669,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -29733,10 +29723,10 @@ snapshots: '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': @@ -29751,13 +29741,13 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) hyperdyperid: 1.2.0 thingies: 2.5.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) @@ -29769,9 +29759,9 @@ snapshots: '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': @@ -29780,10 +29770,10 @@ snapshots: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': + '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) tslib: 2.8.1 '@juggle/resize-observer@3.4.0': {} @@ -30340,7 +30330,7 @@ snapshots: '@modelcontextprotocol/sdk@1.26.0': dependencies: - '@hono/node-server': 1.19.9(hono@4.11.7) + '@hono/node-server': 1.19.9(hono@4.11.9) ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -30350,7 +30340,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.11.7 + hono: 4.11.9 jose: 6.1.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -30557,59 +30547,59 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true - '@peculiar/asn1-cms@2.6.0': + '@peculiar/asn1-cms@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 - '@peculiar/asn1-x509-attr': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 + '@peculiar/asn1-x509-attr': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-csr@2.6.0': + '@peculiar/asn1-csr@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.6.0': + '@peculiar/asn1-ecc@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.6.0': + '@peculiar/asn1-pfx@2.6.1': dependencies: - '@peculiar/asn1-cms': 2.6.0 - '@peculiar/asn1-pkcs8': 2.6.0 - '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-cms': 2.6.1 + '@peculiar/asn1-pkcs8': 2.6.1 + '@peculiar/asn1-rsa': 2.6.1 '@peculiar/asn1-schema': 2.6.0 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.6.0': + '@peculiar/asn1-pkcs8@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.6.0': + '@peculiar/asn1-pkcs9@2.6.1': dependencies: - '@peculiar/asn1-cms': 2.6.0 - '@peculiar/asn1-pfx': 2.6.0 - '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-cms': 2.6.1 + '@peculiar/asn1-pfx': 2.6.1 + '@peculiar/asn1-pkcs8': 2.6.1 '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 - '@peculiar/asn1-x509-attr': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 + '@peculiar/asn1-x509-attr': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.6.0': + '@peculiar/asn1-rsa@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 @@ -30619,14 +30609,14 @@ snapshots: pvtsutils: 1.3.6 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.6.0': + '@peculiar/asn1-x509-attr@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-x509@2.6.0': + '@peculiar/asn1-x509@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 asn1js: 3.0.7 @@ -30635,13 +30625,13 @@ snapshots: '@peculiar/x509@1.14.3': dependencies: - '@peculiar/asn1-cms': 2.6.0 - '@peculiar/asn1-csr': 2.6.0 - '@peculiar/asn1-ecc': 2.6.0 - '@peculiar/asn1-pkcs9': 2.6.0 - '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-cms': 2.6.1 + '@peculiar/asn1-csr': 2.6.1 + '@peculiar/asn1-ecc': 2.6.1 + '@peculiar/asn1-pkcs9': 2.6.1 + '@peculiar/asn1-rsa': 2.6.1 '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 @@ -32629,7 +32619,7 @@ snapshots: '@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3)': dependencies: - clipboardy: 5.2.1 + clipboardy: 5.3.0 clone-deep: 4.0.1 compare-versions: 6.1.1 fs-extra: 11.3.3 @@ -32963,7 +32953,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.22.1': + '@smithy/core@3.23.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -32971,7 +32961,7 @@ snapshots: '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 @@ -33067,9 +33057,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.13': + '@smithy/middleware-endpoint@4.4.14': dependencies: - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -33078,12 +33068,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.30': + '@smithy/middleware-retry@4.4.31': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -33108,7 +33098,7 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.9': + '@smithy/node-http-handler@4.4.10': dependencies: '@smithy/abort-controller': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -33157,14 +33147,14 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.11.2': + '@smithy/smithy-client@4.11.3': dependencies: - '@smithy/core': 3.22.1 - '@smithy/middleware-endpoint': 4.4.13 + '@smithy/core': 3.23.0 + '@smithy/middleware-endpoint': 4.4.14 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 tslib: 2.8.1 '@smithy/types@4.12.0': @@ -33205,20 +33195,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.29': + '@smithy/util-defaults-mode-browser@4.3.30': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.32': + '@smithy/util-defaults-mode-node@4.2.33': dependencies: '@smithy/config-resolver': 4.4.6 '@smithy/credential-provider-imds': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -33243,10 +33233,10 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.11': + '@smithy/util-stream@4.5.12': dependencies: '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-buffer-from': 4.2.0 @@ -33900,7 +33890,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 prop-types: 15.8.1 - qs: 6.14.1 + qs: 6.14.2 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: @@ -33918,7 +33908,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 prop-types: 15.8.1 - qs: 6.14.1 + qs: 6.14.2 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: @@ -34306,7 +34296,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35108,7 +35098,7 @@ snapshots: '@storybook/core-events': 6.3.7 core-js: 3.48.0 global: 4.4.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 5.3.3 '@storybook/channel-postmessage@6.5.16': @@ -35118,7 +35108,7 @@ snapshots: '@storybook/core-events': 6.5.16 core-js: 3.48.0 global: 4.4.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 6.0.8 '@storybook/channel-postmessage@6.5.9': @@ -35128,7 +35118,7 @@ snapshots: '@storybook/core-events': 6.5.9 core-js: 3.48.0 global: 4.4.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 6.0.8 '@storybook/channel-websocket@6.5.16': @@ -35170,7 +35160,7 @@ snapshots: '@storybook/client-logger': 7.4.0 '@storybook/core-events': 7.4.0 '@storybook/global': 5.0.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 7.2.0 tiny-invariant: 1.3.3 @@ -35179,7 +35169,7 @@ snapshots: '@storybook/client-logger': 7.6.10 '@storybook/core-events': 7.6.10 '@storybook/global': 5.0.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 7.2.0 tiny-invariant: 1.3.3 @@ -35275,7 +35265,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35302,7 +35292,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35327,7 +35317,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35352,7 +35342,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -35462,7 +35452,7 @@ snapshots: '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35476,7 +35466,7 @@ snapshots: '@types/react-syntax-highlighter': 11.0.5 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-syntax-highlighter: 15.6.1(react@18.2.0) @@ -35491,7 +35481,7 @@ snapshots: '@types/react-syntax-highlighter': 11.0.5 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-syntax-highlighter: 15.6.1(react@19.1.0) @@ -35552,7 +35542,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35583,7 +35573,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35611,7 +35601,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35639,7 +35629,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35667,7 +35657,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35695,7 +35685,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35723,7 +35713,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -35751,7 +35741,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -35779,7 +35769,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -37642,7 +37632,7 @@ snapshots: dequal: 2.0.3 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -37659,7 +37649,7 @@ snapshots: dequal: 2.0.3 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -37680,7 +37670,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -37701,7 +37691,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -37722,7 +37712,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -38468,7 +38458,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 @@ -38478,7 +38468,7 @@ snapshots: '@storybook/client-logger': 6.5.16 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -38488,7 +38478,7 @@ snapshots: '@storybook/client-logger': 6.5.9 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -38498,7 +38488,7 @@ snapshots: '@storybook/client-logger': 6.5.9 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -38507,7 +38497,7 @@ snapshots: dependencies: '@storybook/client-logger': 7.4.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -38515,7 +38505,7 @@ snapshots: dependencies: '@storybook/client-logger': 7.4.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -38850,7 +38840,7 @@ snapshots: markdown-to-jsx: 6.11.4(react@18.2.0) memoizerific: 1.11.3 polished: 4.3.1 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-draggable: 4.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -38876,7 +38866,7 @@ snapshots: '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -38895,7 +38885,7 @@ snapshots: '@storybook/theming': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -38914,7 +38904,7 @@ snapshots: '@storybook/theming': 6.5.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -39540,7 +39530,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.1.2 + minimatch: 10.2.0 path-browserify: 1.0.1 '@tsconfig/node10@1.0.12': {} @@ -39601,11 +39591,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/bonjour@3.5.13': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/braces@3.0.5': {} @@ -39634,15 +39624,15 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.8 - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/connect@3.4.38': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/dagre@0.7.52': {} @@ -39690,7 +39680,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -39728,7 +39718,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/handlebars@4.1.0': dependencies: @@ -39757,7 +39747,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/is-function@1.0.3': {} @@ -39797,7 +39787,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -39931,7 +39921,7 @@ snapshots: '@types/npmlog@4.1.6': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/overlayscrollbars@1.12.5': {} @@ -40020,7 +40010,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/resolve@1.20.2': {} @@ -40036,7 +40026,7 @@ snapshots: '@types/selenium-webdriver@4.35.5': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/ws': 8.2.1 '@types/semver@7.7.1': {} @@ -40044,11 +40034,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/send@1.2.1': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/serve-index@1.9.4': dependencies: @@ -40057,12 +40047,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/source-list-map@0.1.6': {} @@ -40196,7 +40186,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@types/ws@8.2.1': dependencies: @@ -41654,7 +41644,7 @@ snapshots: autoprefixer@10.4.19(postcss@8.5.3): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -41664,7 +41654,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.4): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -41674,7 +41664,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001768 + caniuse-db: 1.0.30001769 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -41683,7 +41673,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -41692,7 +41682,7 @@ snapshots: autoprefixer@9.8.8: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -42604,6 +42594,10 @@ snapshots: balanced-match@2.0.0: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + base16@1.0.0: {} base64-js@1.5.1: {} @@ -42688,7 +42682,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -42701,7 +42695,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -42725,7 +42719,7 @@ snapshots: boundary@2.0.0: {} - bowser@2.13.1: {} + bowser@2.14.1: {} boxen@1.3.0: dependencies: @@ -42777,6 +42771,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -42843,17 +42841,17 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001768 + caniuse-db: 1.0.30001769 electron-to-chromium: 1.5.286 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 electron-to-chromium: 1.5.286 browserslist@4.14.2: dependencies: - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 electron-to-chromium: 1.5.286 escalade: 3.2.0 node-releases: 1.1.77 @@ -42861,7 +42859,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 electron-to-chromium: 1.5.286 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -43075,7 +43073,7 @@ snapshots: cacheable@2.3.2: dependencies: '@cacheable/memory': 2.0.7 - '@cacheable/utils': 2.3.3 + '@cacheable/utils': 2.3.4 hookified: 1.15.1 keyv: 5.6.0 qified: 0.6.0 @@ -43144,20 +43142,20 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001768 + caniuse-db: 1.0.30001769 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001768 + caniuse-lite: 1.0.30001769 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001768: {} + caniuse-db@1.0.30001769: {} - caniuse-lite@1.0.30001768: {} + caniuse-lite@1.0.30001769: {} canvas@3.2.1: dependencies: @@ -43280,7 +43278,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.20.0 + undici: 7.21.0 whatwg-mimetype: 4.0.0 chokidar@1.7.0: @@ -43450,7 +43448,7 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 - clipboardy@5.2.1: + clipboardy@5.3.0: dependencies: clipboard-image: 0.1.0 execa: 9.6.1 @@ -43548,15 +43546,15 @@ snapshots: code-point-at@1.1.0: {} - codemirror-graphql@2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.20)(graphql@16.11.0): + codemirror-graphql@2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.21)(graphql@16.11.0): dependencies: '@codemirror/language': 6.11.3 '@types/codemirror': 0.0.90 - codemirror: 5.65.20 + codemirror: 5.65.21 graphql: 16.11.0 graphql-language-service: 5.5.0(graphql@16.11.0) - codemirror@5.65.20: {} + codemirror@5.65.21: {} codemirror@6.0.2: dependencies: @@ -44028,7 +44026,7 @@ snapshots: dependencies: postcss: 8.5.4 - css-functions-list@3.2.3: {} + css-functions-list@3.3.3: {} css-loader@0.28.7: dependencies: @@ -45801,7 +45799,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2 @@ -45834,7 +45832,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -46214,7 +46212,7 @@ snapshots: flatten@1.0.3: {} - flow-parser@0.299.0: {} + flow-parser@0.301.0: {} flush-write-stream@1.1.1: dependencies: @@ -46812,8 +46810,8 @@ snapshots: glob@11.0.2: dependencies: foreground-child: 3.3.1 - jackspeak: 4.2.1 - minimatch: 10.1.2 + jackspeak: 4.2.3 + minimatch: 10.2.0 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.1 @@ -46821,8 +46819,8 @@ snapshots: glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 4.2.1 - minimatch: 10.1.2 + jackspeak: 4.2.3 + minimatch: 10.2.0 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.1 @@ -47391,7 +47389,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hono@4.11.7: {} + hono@4.11.9: {} hookified@1.15.1: {} @@ -48238,7 +48236,7 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.2: {} + isexe@3.1.5: {} isobject@3.0.1: {} @@ -48409,7 +48407,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.2.1: + jackspeak@4.2.3: dependencies: '@isaacs/cliui': 9.0.0 @@ -48445,7 +48443,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.1(babel-plugin-macros@3.1.0) @@ -48471,7 +48469,7 @@ snapshots: '@jest/expect': 30.0.0 '@jest/test-result': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.1(babel-plugin-macros@3.1.0) @@ -48881,7 +48879,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -48890,7 +48888,7 @@ snapshots: '@jest/environment': 30.0.0 '@jest/fake-timers': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-mock: 30.0.0 jest-util: 30.0.0 jest-validate: 30.0.0 @@ -48931,7 +48929,7 @@ snapshots: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.9 - '@types/node': 16.18.126 + '@types/node': 22.15.24 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -48949,7 +48947,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 16.18.126 + '@types/node': 22.15.24 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -48964,7 +48962,7 @@ snapshots: jest-haste-map@30.0.0: dependencies: '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -49160,19 +49158,19 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-util: 29.7.0 jest-mock@30.0.0: dependencies: '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-util: 30.0.0 jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-util: 30.2.0 jest-pnp-resolver@1.2.3(jest-resolve@25.5.1): @@ -49305,7 +49303,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -49331,7 +49329,7 @@ snapshots: '@jest/test-result': 30.0.0 '@jest/transform': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -49412,7 +49410,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.3 @@ -49439,7 +49437,7 @@ snapshots: '@jest/test-result': 30.0.0 '@jest/transform': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -49463,7 +49461,7 @@ snapshots: jest-serializer@26.6.2: dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 graceful-fs: 4.2.11 jest-snapshot@20.0.3: @@ -49584,7 +49582,7 @@ snapshots: jest-util@26.6.2: dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -49593,7 +49591,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -49602,7 +49600,7 @@ snapshots: jest-util@30.0.0: dependencies: '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -49611,7 +49609,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -49682,7 +49680,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 16.18.126 + '@types/node': 22.15.24 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -49693,7 +49691,7 @@ snapshots: dependencies: '@jest/test-result': 30.0.0 '@jest/types': 30.0.0 - '@types/node': 16.18.126 + '@types/node': 22.15.24 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -49712,7 +49710,7 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -49724,14 +49722,14 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.0.0: dependencies: - '@types/node': 16.18.126 + '@types/node': 22.15.24 '@ungap/structured-clone': 1.3.0 jest-util: 30.0.0 merge-stream: 2.0.0 @@ -49827,7 +49825,7 @@ snapshots: '@babel/register': 7.28.6(@babel/core@7.27.1) babel-core: 7.0.0-bridge.0(@babel/core@7.27.1) chalk: 4.1.2 - flow-parser: 0.299.0 + flow-parser: 0.301.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -49854,7 +49852,7 @@ snapshots: '@babel/register': 7.28.6(@babel/core@7.27.1) babel-core: 7.0.0-bridge.0(@babel/core@7.27.1) chalk: 4.1.2 - flow-parser: 0.299.0 + flow-parser: 0.301.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -50113,7 +50111,7 @@ snapshots: jwt-decode@4.0.0: {} - katex@0.16.27: + katex@0.16.28: dependencies: commander: 8.3.0 @@ -50470,7 +50468,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.5: {} + lru-cache@11.2.6: {} lru-cache@4.1.5: dependencies: @@ -51052,7 +51050,7 @@ snapshots: dependencies: '@types/katex': 0.16.8 devlop: 1.1.0 - katex: 0.16.27 + katex: 0.16.28 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 @@ -51311,9 +51309,9 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} - minimatch@10.1.2: + minimatch@10.2.0: dependencies: - '@isaacs/brace-expansion': 5.0.1 + brace-expansion: 5.0.2 minimatch@3.0.3: dependencies: @@ -52397,7 +52395,7 @@ snapshots: path-scurry@2.0.1: dependencies: - lru-cache: 11.2.5 + lru-cache: 11.2.6 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -53501,12 +53499,10 @@ snapshots: dependencies: hookified: 1.15.1 - qs@6.14.1: + qs@6.14.2: dependencies: side-channel: 1.1.0 - qs@6.5.3: {} - query-string@4.3.4: dependencies: object-assign: 4.1.1 @@ -54606,7 +54602,7 @@ snapshots: '@types/katex': 0.16.8 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 - katex: 0.16.27 + katex: 0.16.28 unist-util-visit-parents: 6.0.2 vfile: 6.0.3 @@ -54791,7 +54787,7 @@ snapshots: mime-types: 2.1.35 oauth-sign: 0.9.0 performance-now: 2.1.0 - qs: 6.5.3 + qs: 6.14.2 safe-buffer: 5.2.1 tough-cookie: 2.5.0 tunnel-agent: 0.6.0 @@ -55006,7 +55002,7 @@ snapshots: rollup@1.32.1: dependencies: '@types/estree': 1.0.8 - '@types/node': 16.18.126 + '@types/node': 22.15.24 acorn: 7.4.1 rollup@4.41.0: @@ -56125,7 +56121,7 @@ snapshots: balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.8.3) - css-functions-list: 3.2.3 + css-functions-list: 3.3.3 css-tree: 3.1.0 debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 @@ -57600,7 +57596,7 @@ snapshots: typed-rest-client@1.8.11: dependencies: - qs: 6.14.1 + qs: 6.14.2 tunnel: 0.0.6 underscore: 1.13.7 @@ -57684,7 +57680,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.20.0: {} + undici@7.21.0: {} unfetch@4.2.0: {} @@ -57743,7 +57739,7 @@ snapshots: union@0.5.0: dependencies: - qs: 6.14.1 + qs: 6.14.2 uniq@1.0.1: {} @@ -58024,7 +58020,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.1 + qs: 6.14.2 use-callback-ref@1.3.3(@types/react@18.2.0)(react@18.2.0): dependencies: @@ -59423,7 +59419,7 @@ snapshots: which@5.0.0: dependencies: - isexe: 3.1.2 + isexe: 3.1.5 wide-align@1.1.5: dependencies: From 9e5c81ba25dbf93ee36adf41acd0390db20465ee Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Fri, 13 Feb 2026 23:55:13 +0530 Subject: [PATCH 216/247] Update package dependencies in package.json and pnpm-lock.yaml --- common/config/rush/pnpm-lock.yaml | 2140 ++++++++++++++--------------- package.json | 2 +- 2 files changed, 1058 insertions(+), 1084 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index c2c624776da..833d0ac6bc5 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -102,7 +102,7 @@ importers: version: 2.6.13(encoding@0.1.13) node-loader: specifier: ~2.0.0 - version: 2.0.0(webpack@5.105.1) + version: 2.0.0(webpack@5.105.2) portfinder: specifier: ^1.0.32 version: 1.0.38 @@ -145,16 +145,16 @@ importers: version: 5.0.10 ts-loader: specifier: ^9.4.4 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@5.1.4) + version: 5.105.2(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.105.1) + version: 5.1.4(webpack@5.105.2) ../../workspaces/api-designer/api-designer-rpc-client: dependencies: @@ -309,31 +309,31 @@ importers: version: 2.4.1 css-loader: specifier: ^5.2.7 - version: 5.2.7(webpack@5.105.1) + version: 5.2.7(webpack@5.105.2) sass-loader: specifier: ^13.2.0 - version: 13.3.3(sass@1.97.3)(webpack@5.105.1) + version: 13.3.3(sass@1.97.3)(webpack@5.105.2) source-map-loader: specifier: ^4.0.1 - version: 4.0.2(webpack@5.105.1) + version: 4.0.2(webpack@5.105.2) style-loader: specifier: ^1.3.0 - version: 1.3.0(webpack@5.105.1) + version: 1.3.0(webpack@5.105.2) ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@5.1.4) + version: 5.105.2(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) ../../workspaces/apk/apk-extension: devDependencies: @@ -454,10 +454,10 @@ importers: dependencies: '@ai-sdk/amazon-bedrock': specifier: ^4.0.4 - version: 4.0.55(zod@4.1.11) + version: 4.0.59(zod@4.1.11) '@ai-sdk/anthropic': specifier: ^3.0.2 - version: 3.0.41(zod@4.1.11) + version: 3.0.43(zod@4.1.11) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -490,7 +490,7 @@ importers: version: link:../../wso2-platform/wso2-platform-core ai: specifier: ^6.0.7 - version: 6.0.78(zod@4.1.11) + version: 6.0.86(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -653,7 +653,7 @@ importers: version: 1.0.2 ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.3) @@ -668,10 +668,10 @@ importers: version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.1) + version: 6.0.1(webpack@5.105.2) yarn: specifier: ^1.22.19 version: 1.22.22 @@ -774,7 +774,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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) @@ -819,25 +819,25 @@ importers: version: 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.2) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.1) + version: 13.0.1(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) express: specifier: ^4.22.1 version: 4.22.1 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.2) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.105.1) + version: 9.1.0(typescript@5.8.3)(webpack@5.105.2) glob: specifier: ^11.1.0 version: 11.1.0 @@ -876,13 +876,13 @@ importers: version: 1.97.3 sass-loader: specifier: ^16.0.5 - version: 16.0.7(sass@1.97.3)(webpack@5.105.1) + version: 16.0.7(sass@1.97.3)(webpack@5.105.2) storybook: specifier: ^8.6.14 version: 8.6.15(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) stylelint: specifier: ^16.19.1 version: 16.26.1(typescript@5.8.3) @@ -891,10 +891,10 @@ importers: version: 38.0.0(stylelint@16.26.1(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.105.1) + version: 8.0.0(webpack@5.105.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -912,13 +912,13 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + version: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -1030,7 +1030,7 @@ importers: version: 4.17.23 markdown-it: specifier: ~14.1.0 - version: 14.1.0 + version: 14.1.1 prosemirror-commands: specifier: ~1.7.1 version: 1.7.1 @@ -1085,7 +1085,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -1266,7 +1266,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -1278,28 +1278,28 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.7(sass@1.97.3)(webpack@5.105.1) + version: 16.0.7(sass@1.97.3)(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@5.1.4) + version: 5.105.2(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -1369,7 +1369,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1487,7 +1487,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1647,7 +1647,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -1659,13 +1659,13 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.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.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1708,7 +1708,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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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) @@ -1729,34 +1729,34 @@ importers: version: 18.2.0 babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.2) css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) graphql: specifier: ^16.11.0 version: 16.12.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.10.0(webpack@5.105.1) + version: 2.10.0(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@4.10.0) + version: 5.105.2(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1935,7 +1935,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.2) html-to-image: specifier: ^1.10.8 version: 1.11.11 @@ -1978,31 +1978,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) ../../workspaces/ballerina/record-creator: dependencies: @@ -2139,7 +2139,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2239,7 +2239,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2342,31 +2342,31 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) sass-loader: specifier: ^16.0.5 - version: 16.0.7(sass@1.97.3)(webpack@5.105.1) + version: 16.0.7(sass@1.97.3)(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@5.1.4) + version: 5.105.2(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) ../../workspaces/ballerina/type-diagram: dependencies: @@ -2411,7 +2411,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.2) html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -2460,31 +2460,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.1) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) ../../workspaces/ballerina/type-editor: dependencies: @@ -2618,7 +2618,7 @@ importers: version: link:../../common-libs/playwright-vscode-tester copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.1) + version: 13.0.1(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2636,16 +2636,16 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.1) + version: 6.0.1(webpack@5.105.2) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2761,7 +2761,7 @@ importers: version: 1.13.5 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.1) + version: 13.0.1(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2773,10 +2773,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2785,10 +2785,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.1) + version: 6.0.1(webpack@5.105.2) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2879,10 +2879,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.2) path: specifier: ^0.12.7 version: 0.12.7 @@ -2891,34 +2891,34 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.1) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.2) sass-loader: specifier: ^16.0.5 - version: 16.0.7(sass@1.97.3)(webpack@5.105.1) + version: 16.0.7(sass@1.97.3)(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) tailwindcss: specifier: ^3.4.3 version: 3.4.19(yaml@2.8.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: @@ -3134,7 +3134,7 @@ importers: version: 4.17.17 '@types/prismjs': specifier: ^1.26.5 - version: 1.26.5 + version: 1.26.6 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -3213,7 +3213,7 @@ importers: version: 3.7.1 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.1) + version: 13.0.1(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3231,16 +3231,16 @@ importers: version: 6.1.6 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + version: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.105.1) + version: 5.1.4(webpack@5.105.2) ../../workspaces/mi/mi-component-diagram: dependencies: @@ -3286,7 +3286,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3447,7 +3447,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) eslint: specifier: ^9.27.0 version: 9.39.2(jiti@2.6.1) @@ -3459,13 +3459,13 @@ importers: version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.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.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) ts-morph: specifier: ^22.0.0 version: 22.0.0 @@ -3711,7 +3711,7 @@ importers: dependencies: '@ai-sdk/anthropic': specifier: ^2.0.35 - version: 2.0.60(zod@3.25.76) + version: 2.0.63(zod@3.25.76) '@apidevtools/json-schema-ref-parser': specifier: 12.0.2 version: 12.0.2 @@ -3771,7 +3771,7 @@ importers: version: 0.5.16 ai: specifier: ^5.0.76 - version: 5.0.129(zod@3.25.76) + version: 5.0.131(zod@3.25.76) axios: specifier: ^1.13.5 version: 1.13.5 @@ -3819,7 +3819,7 @@ importers: version: 3.3.2 node-loader: specifier: ~2.1.0 - version: 2.1.0(webpack@5.105.1) + version: 2.1.0(webpack@5.105.2) portfinder: specifier: ^1.0.37 version: 1.0.38 @@ -3925,7 +3925,7 @@ importers: version: 6.0.1 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -3934,10 +3934,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@4.10.0) + version: 5.105.2(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.105.1) + version: 4.10.0(webpack@5.105.2) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4016,7 +4016,7 @@ importers: version: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 - version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) + version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.2) '@tanstack/query-core': specifier: ^5.76.0 version: 5.90.20 @@ -4176,19 +4176,19 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) sass-loader: specifier: ^16.0.5 - version: 16.0.7(sass@1.97.3)(webpack@5.105.1) + version: 16.0.7(sass@1.97.3)(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4197,13 +4197,13 @@ importers: version: 3.17.5 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@5.1.4) + version: 5.105.2(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4277,7 +4277,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.986.0 + version: 3.989.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -4377,7 +4377,7 @@ importers: version: 1.13.5 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.1) + version: 13.0.1(webpack@5.105.2) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -4389,10 +4389,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -4401,10 +4401,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.1) + version: 6.0.1(webpack@5.105.2) webpack-permissions-plugin: specifier: ^1.0.10 version: 1.0.10 @@ -4516,10 +4516,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.3(webpack@5.105.1) + version: 7.1.3(webpack@5.105.2) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.1) + version: 6.2.0(webpack@5.105.2) path: specifier: ^0.12.7 version: 0.12.7 @@ -4528,78 +4528,78 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.1) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.2) sass-loader: specifier: ^16.0.5 - version: 16.0.7(sass@1.97.3)(webpack@5.105.1) + version: 16.0.7(sass@1.97.3)(webpack@5.105.2) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.1) + version: 5.0.0(webpack@5.105.2) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.105.1) + version: 4.0.0(webpack@5.105.2) tailwindcss: specifier: ^4.1.7 version: 4.1.18 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.105.1) + version: 9.5.4(typescript@5.8.3)(webpack@5.105.2) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.105.1(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/amazon-bedrock@4.0.55': - resolution: {integrity: sha512-fdZZxlFllfpwjweGHg4iUTs1TMIhkqJjdufRydevxMnLQMrFSFUagw7ktuhgF+mzS0ufivY6fe9jqHtrfJjPtg==} + '@ai-sdk/amazon-bedrock@4.0.59': + resolution: {integrity: sha512-reIzGwpstdses389Uh8X+MRI7MjpemJmNGynyrKJF2+ib214fAMdlcNwuwITdzt0t6FhJBeMW7g2WbEjLnL5XA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.60': - resolution: {integrity: sha512-hpabbvnTHIP7y85TeFwkDHPveOxsMaCWTRRd1vb9My2EtJBKXGBG4eZhcR+DU98z1lXOlPRu1oGZhVNPttDW8g==} + '@ai-sdk/anthropic@2.0.63': + resolution: {integrity: sha512-zXlUPCkumnvp8lWS9VFcen/MLF6CL/t1zAKDhpobYj9y/nmylQrKtRvn3RwH871Wd3dF3KYEUXd6M2c6dfCKOA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@3.0.41': - resolution: {integrity: sha512-Wk/YHKyP/MmvQ63MFGRwmm3URM3ey7Tg62y0a7MT+7/8kMVZ40pUYidYO0hB9YB+dHe4z1ks006mNfGYy+wzkA==} + '@ai-sdk/anthropic@3.0.43': + resolution: {integrity: sha512-hfhOa13HqNYIe2GtC7blUMVOKrmt5RzxbE7StFGXKN3hIn4xuppLLQY/gFOr+oEhQw1pO8j6CpffrRrWYz1mVQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.35': - resolution: {integrity: sha512-fMzhC9artgY2s2GgXEWB+cECRJEHHoFJKzDpzsuneguNQ656vydPHhvDdoMjbWW+UtLc4nGf3VwlqG0t4FeQ/w==} + '@ai-sdk/gateway@2.0.37': + resolution: {integrity: sha512-9ZxIFZS6f1zjYO5vMkUKkhgT9c1H6agZnPEePz87KHlFCmdV21F5Vnh5kz6Dq/9A4Z1OFwM1pQf7GdxBrbiZHg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.39': - resolution: {integrity: sha512-SeCZBAdDNbWpVUXiYgOAqis22p5MEYfrjRw0hiBa5hM+7sDGYQpMinUjkM8kbPXMkY+AhKLrHleBl+SuqpzlgA==} + '@ai-sdk/gateway@3.0.46': + resolution: {integrity: sha512-zH1UbNRjG5woOXXFOrVCZraqZuFTtmPvLardMGcgLkzpxKV0U3tAGoyWKSZ862H+eBJfI/Hf2yj/zzGJcCkycg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.20': - resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} + '@ai-sdk/provider-utils@3.0.21': + resolution: {integrity: sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.14': - resolution: {integrity: sha512-7bzKd9lgiDeXM7O4U4nQ8iTxguAOkg8LZGD9AfDVZYjO5cKYRwBPwVjboFcVrxncRHu0tYxZtXZtiLKpG4pEng==} + '@ai-sdk/provider-utils@4.0.15': + resolution: {integrity: sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4655,52 +4655,52 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.986.0': - resolution: {integrity: sha512-IcDJ8shVVvbxgMe8+dLWcv6uhSwmX65PHTVGX81BhWAElPnp3CL8w/5uzOPRo4n4/bqIk9eskGVEIicw2o+SrA==} + '@aws-sdk/client-s3@3.989.0': + resolution: {integrity: sha512-ccz2miIetWAgrJYmKCpSnRjF8jew7DPstl54nufhfPMtM1MLxD2z55eSk1eJj3Umhu4CioNN1aY1ILT7fwlSiw==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.985.0': - resolution: {integrity: sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==} + '@aws-sdk/client-sso@3.989.0': + resolution: {integrity: sha512-3sC+J1ru5VFXLgt9KZmXto0M7mnV5RkS6FNGwRMK3XrojSjHso9DLOWjbnXhbNv4motH8vu53L1HK2VC1+Nj5w==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.7': - resolution: {integrity: sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==} + '@aws-sdk/core@3.973.9': + resolution: {integrity: sha512-cyUOfJSizn8da7XrBEFBf4UMI4A6JQNX6ZFcKtYmh/CrwfzsDcabv3k/z0bNwQ3pX5aeq5sg/8Bs/ASiL0bJaA==} engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.0': resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.5': - resolution: {integrity: sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==} + '@aws-sdk/credential-provider-env@3.972.7': + resolution: {integrity: sha512-r8kBtglvLjGxBT87l6Lqkh9fL8yJJ6O4CYQPjKlj3AkCuL4/4784x3rxxXWw9LTKXOo114VB6mjxAuy5pI7XIg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.7': - resolution: {integrity: sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==} + '@aws-sdk/credential-provider-http@3.972.9': + resolution: {integrity: sha512-40caFblEg/TPrp9EpvyMxp4xlJ5TuTI+A8H6g8FhHn2hfH2PObFAPLF9d5AljK/G69E1YtTklkuQeAwPlV3w8Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.5': - resolution: {integrity: sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==} + '@aws-sdk/credential-provider-ini@3.972.7': + resolution: {integrity: sha512-zeYKrMwM5bCkHFho/x3+1OL0vcZQ0OhTR7k35tLq74+GP5ieV3juHXTZfa2LVE0Bg75cHIIerpX0gomVOhzo/w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.5': - resolution: {integrity: sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==} + '@aws-sdk/credential-provider-login@3.972.7': + resolution: {integrity: sha512-Q103cLU6OjAllYjX7+V+PKQw654jjvZUkD+lbUUiFbqut6gR5zwl1DrelvJPM5hnzIty7BCaxaRB3KMuz3M/ug==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.6': - resolution: {integrity: sha512-DZ3CnAAtSVtVz+G+ogqecaErMLgzph4JH5nYbHoBMgBkwTUV+SUcjsjOJwdBJTHu3Dm6l5LBYekZoU2nDqQk2A==} + '@aws-sdk/credential-provider-node@3.972.8': + resolution: {integrity: sha512-AaDVOT7iNJyLjc3j91VlucPZ4J8Bw+eu9sllRDugJqhHWYyR3Iyp2huBUW8A3+DfHoh70sxGkY92cThAicSzlQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.5': - resolution: {integrity: sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==} + '@aws-sdk/credential-provider-process@3.972.7': + resolution: {integrity: sha512-hxMo1V3ujWWrQSONxQJAElnjredkRpB6p8SDjnvRq70IwYY38R/CZSys0IbhRPxdgWZ5j12yDRk2OXhxw4Gj3g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.5': - resolution: {integrity: sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==} + '@aws-sdk/credential-provider-sso@3.972.7': + resolution: {integrity: sha512-ZGKBOHEj8Ap15jhG2XMncQmKLTqA++2DVU2eZfLu3T/pkwDyhCp5eZv5c/acFxbZcA/6mtxke+vzO/n+aeHs4A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.5': - resolution: {integrity: sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==} + '@aws-sdk/credential-provider-web-identity@3.972.7': + resolution: {integrity: sha512-AbYupBIoSJoVMlbMqBhNvPhqj+CdGtzW7Uk4ZIMBm2br18pc3rkG1VaKVFV85H87QCvLHEnni1idJjaX1wOmIw==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.972.3': @@ -4711,8 +4711,8 @@ packages: resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.5': - resolution: {integrity: sha512-SF/1MYWx67OyCrLA4icIpWUfCkdlOi8Y1KecQ9xYxkL10GMjVdPTGPnYhAg0dw5U43Y9PVUWhAV2ezOaG+0BLg==} + '@aws-sdk/middleware-flexible-checksums@3.972.7': + resolution: {integrity: sha512-YU/5rpz8k2mwFGi2M0px9ChOQZY7Bbow5knB2WLRVPqDM/cG8T5zj55UaWS1qcaFpE7vCX9a9/kvYBlKGcD+KA==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.972.3': @@ -4731,32 +4731,32 @@ packages: resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.7': - resolution: {integrity: sha512-VtZ7tMIw18VzjG+I6D6rh2eLkJfTtByiFoCIauGDtTTPBEUMQUiGaJ/zZrPlCY6BsvLLeFKz3+E5mntgiOWmIg==} + '@aws-sdk/middleware-sdk-s3@3.972.9': + resolution: {integrity: sha512-F4Ak2HM7te/o3izFTqg/jUTBLjavpaJ5iynKM6aLMwNddXbwAZQ1VbIG8RFUHBo7fBHj2eeN2FNLtIFT4ejWYQ==} engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.3': resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.7': - resolution: {integrity: sha512-HUD+geASjXSCyL/DHPQc/Ua7JhldTcIglVAoCV8kiVm99IaFSlAbTvEnyhZwdE6bdFyTL+uIaWLaCFSRsglZBQ==} + '@aws-sdk/middleware-user-agent@3.972.9': + resolution: {integrity: sha512-1g1B7yf7KzessB0mKNiV9gAHEwbM662xgU+VE4LxyGe6kVGZ8LqYsngjhE+Stna09CJ7Pxkjr6Uq1OtbGwJJJg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.985.0': - resolution: {integrity: sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==} + '@aws-sdk/nested-clients@3.989.0': + resolution: {integrity: sha512-Dbk2HMPU3mb6RrSRzgf0WCaWSbgtZG258maCpuN2/ONcAQNpOTw99V5fU5CA1qVK6Vkm4Fwj2cnOnw7wbGVlOw==} engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.972.3': resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.986.0': - resolution: {integrity: sha512-Upw+rw7wCH93E6QWxqpAqJLrUmJYVUAWrk4tCOBnkeuwzGERZvJFL5UQ6TAJFj9T18Ih+vNFaACh8J5aP4oTBw==} + '@aws-sdk/signature-v4-multi-region@3.989.0': + resolution: {integrity: sha512-rVhR/BUZdnru7tLlxWD+uzoKB1LAs2L0pcoh6rYgIYuCtQflnsC6Ud0SpfqIsOapBSBKXdoW73IITFf+XFMdCQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.985.0': - resolution: {integrity: sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==} + '@aws-sdk/token-providers@3.989.0': + resolution: {integrity: sha512-OdBByMv+OjOZoekrk4THPFpLuND5aIQbDHCGh3n2rvifAbm31+6e0OLhxSeCF1UMPm+nKq12bXYYEoCIx5SQBg==} engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.1': @@ -4767,12 +4767,8 @@ packages: resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.985.0': - resolution: {integrity: sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.986.0': - resolution: {integrity: sha512-Mqi79L38qi1gCG3adlVdbNrSxvcm1IPDLiJPA3OBypY5ewxUyWbaA3DD4goG+EwET6LSFgZJcRSIh6KBNpP5pA==} + '@aws-sdk/util-endpoints@3.989.0': + resolution: {integrity: sha512-eKmAOeQM4Qusq0jtcbZPiNWky8XaojByKC/n+THbJ8vJf7t4ys8LlcZ4PrBSHZISe9cC484mQsPVOQh6iySjqw==} engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.4': @@ -4782,8 +4778,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.972.3': resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} - '@aws-sdk/util-user-agent-node@3.972.5': - resolution: {integrity: sha512-GsUDF+rXyxDZkkJxUsDxnA67FG+kc5W1dnloCFLl6fWzceevsCYzJpASBzT+BPjwUgREE6FngfJYYYMQUY5fZQ==} + '@aws-sdk/util-user-agent-node@3.972.7': + resolution: {integrity: sha512-oyhv+FjrgHjP+F16cmsrJzNP4qaRJzkV1n9Lvv4uyh3kLqo3rIe9NSBSBa35f2TedczfG2dD+kaQhHBB47D6Og==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -4837,16 +4833,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.28.1': - resolution: {integrity: sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==} + '@azure/msal-browser@4.28.2': + resolution: {integrity: sha512-6vYUMvs6kJxJgxaCmHn/F8VxjLHNh7i9wzfwPGf8kyBJ8Gg2yvBXx175Uev8LdrD1F5C4o7qHa2CC4IrhGE1XQ==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.14.1': - resolution: {integrity: sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==} + '@azure/msal-common@15.14.2': + resolution: {integrity: sha512-n8RBJEUmd5QotoqbZfd+eGBkzuFI1KX6jw2b3WcpSyGjwmzoeI/Jb99opIBPHpb8y312NB+B6+FGi2ZVSR8yfA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.8.6': - resolution: {integrity: sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==} + '@azure/msal-node@3.8.7': + resolution: {integrity: sha512-a+Xnrae+uwLnlw68bplS1X4kuJ9F/7K6afuMFyRkNIskhjgDezl5Fhrx+1pmAlDmC0VaaAxjRQMp1OmcqVwkIg==} engines: {node: '>=16'} '@babel/code-frame@7.29.0': @@ -6257,14 +6253,6 @@ packages: '@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.1': - resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} - engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -7070,35 +7058,35 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} - '@peculiar/asn1-cms@2.6.0': - resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==} + '@peculiar/asn1-cms@2.6.1': + resolution: {integrity: sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==} - '@peculiar/asn1-csr@2.6.0': - resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==} + '@peculiar/asn1-csr@2.6.1': + resolution: {integrity: sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==} - '@peculiar/asn1-ecc@2.6.0': - resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==} + '@peculiar/asn1-ecc@2.6.1': + resolution: {integrity: sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==} - '@peculiar/asn1-pfx@2.6.0': - resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==} + '@peculiar/asn1-pfx@2.6.1': + resolution: {integrity: sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==} - '@peculiar/asn1-pkcs8@2.6.0': - resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==} + '@peculiar/asn1-pkcs8@2.6.1': + resolution: {integrity: sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==} - '@peculiar/asn1-pkcs9@2.6.0': - resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==} + '@peculiar/asn1-pkcs9@2.6.1': + resolution: {integrity: sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==} - '@peculiar/asn1-rsa@2.6.0': - resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==} + '@peculiar/asn1-rsa@2.6.1': + resolution: {integrity: sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==} '@peculiar/asn1-schema@2.6.0': resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} - '@peculiar/asn1-x509-attr@2.6.0': - resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==} + '@peculiar/asn1-x509-attr@2.6.1': + resolution: {integrity: sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==} - '@peculiar/asn1-x509@2.6.0': - resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==} + '@peculiar/asn1-x509@2.6.1': + resolution: {integrity: sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==} '@peculiar/x509@1.14.3': resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} @@ -8410,8 +8398,8 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.22.1': - resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} + '@smithy/core@3.23.0': + resolution: {integrity: sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.8': @@ -8474,12 +8462,12 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.13': - resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} + '@smithy/middleware-endpoint@4.4.14': + resolution: {integrity: sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.30': - resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} + '@smithy/middleware-retry@4.4.31': + resolution: {integrity: sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -8494,8 +8482,8 @@ packages: resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.9': - resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==} + '@smithy/node-http-handler@4.4.10': + resolution: {integrity: sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==} engines: {node: '>=18.0.0'} '@smithy/property-provider@4.2.8': @@ -8526,8 +8514,8 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.11.2': - resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} + '@smithy/smithy-client@4.11.3': + resolution: {integrity: sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -8562,12 +8550,12 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.29': - resolution: {integrity: sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==} + '@smithy/util-defaults-mode-browser@4.3.30': + resolution: {integrity: sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.32': - resolution: {integrity: sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==} + '@smithy/util-defaults-mode-node@4.2.33': + resolution: {integrity: sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -8586,8 +8574,8 @@ packages: resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.11': - resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} + '@smithy/util-stream@4.5.12': + resolution: {integrity: sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': @@ -10234,8 +10222,8 @@ packages: '@types/pretty-hrtime@1.0.3': resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - '@types/prismjs@1.26.5': - resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + '@types/prismjs@1.26.6': + resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -11017,14 +11005,14 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@5.0.129: - resolution: {integrity: sha512-IARdFetNTedDfqpByNMm9p0oHj7JS+SpOrbgLdQdyCiDe70Xk07wnKP4Lub1ckCrxkhAxY3yxOHllGEjbpXgpQ==} + ai@5.0.131: + resolution: {integrity: sha512-KYuhcpiigvPCpFbNzNKcoZ7AWKnTeE++HRqnWqX0MgSbk1xVi0Q5wvfMmnF71n7l5JjytefLV3NkJwbU+7AR/g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - ai@6.0.78: - resolution: {integrity: sha512-eriIX/NLWfWNDeE/OJy8wmIp9fyaH7gnxTOCPT5bp0MNkvORstp1TwRUql9au8XjXzH7o2WApqbwgxJDDV0Rbw==} + ai@6.0.86: + resolution: {integrity: sha512-U2W2LBCHA/pr0Ui7vmmsjBiLEzBbZF3yVHNy7Rbzn7IX+SvoQPFM5rN74hhfVzZoE8zBuGD4nLLk+j0elGacvQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -11461,8 +11449,8 @@ packages: azure-devops-node-api@12.5.0: resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + b4a@1.7.4: + resolution: {integrity: sha512-u20zJLDaSWpxaZ+zaAkEIB2dZZ1o+DF4T/MRbmsvGp9nletHOyiai19OzX1fF8xUBYsO1bPXxODvcd0978pnug==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: @@ -11897,8 +11885,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.3: - resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==} + bare-fs@4.5.4: + resolution: {integrity: sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -12499,8 +12487,8 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - clipboardy@5.2.1: - resolution: {integrity: sha512-RWp4E/ivQAzgF4QSWA9sjeW+Bjo+U2SvebkDhNIfO7y65eGdXPUxMTdIKYsn+bxM3ItPHGm3e68Bv3fgQ3mARw==} + clipboardy@5.3.0: + resolution: {integrity: sha512-EOei1RJTbqXbXhUBMGN8C/Pf+QIPrnDWx9ztlmcW5Hljqj/oVlPrlrDw2O4xh5ViHcvHX3+A0zBrCdcptKTaJA==} engines: {node: '>=20'} cliui@3.2.0: @@ -14421,8 +14409,8 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flow-parser@0.299.0: - resolution: {integrity: sha512-phGMRoNt6SNglPHGRbCyWm9/pxfe6t/t4++EIYPaBGWT6e0lphLBgUMrvpL62NbRo9R549o3oqrbKHq82kANCw==} + flow-parser@0.301.0: + resolution: {integrity: sha512-yKRjJzN+W9dwk1tU9u6gowANdgFZyYknokcLePyLe30AV6WzAquKJzx+smN9wovWMBE2hvCDUvKbXUpcT1+8OA==} engines: {node: '>=0.4.0'} flush-write-stream@1.1.1: @@ -17178,8 +17166,8 @@ packages: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} hasBin: true - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true markdown-table@3.0.4: @@ -17574,8 +17562,8 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.1.2: - resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + minimatch@10.2.0: + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} engines: {node: 20 || >=22} minimatch@3.0.3: @@ -19328,12 +19316,12 @@ packages: resolution: {integrity: sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==} engines: {node: '>=20'} - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + qs@6.5.5: + resolution: {integrity: sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==} engines: {node: '>=0.6'} query-string@4.3.4: @@ -21380,8 +21368,8 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-decoder@1.2.5: + resolution: {integrity: sha512-ymKEOrjEhNE0+Gehpn2Dw59Vp2fNG0DQvCRAJpCjVqB1Pkj1AMBzDpow4H9kSa6XqO/wZrb5TLxEigx+nEaiBA==} text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -22714,8 +22702,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.105.1: - resolution: {integrity: sha512-Gdj3X74CLJJ8zy4URmK42W7wTZUJrqL+z8nyGEr4dTN0kb3nVs+ZvjbTOqRYPD7qX4tUmwyHL9Q9K6T1seW6Yw==} + webpack@5.105.2: + resolution: {integrity: sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -23133,50 +23121,50 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/amazon-bedrock@4.0.55(zod@4.1.11)': + '@ai-sdk/amazon-bedrock@4.0.59(zod@4.1.11)': dependencies: - '@ai-sdk/anthropic': 3.0.41(zod@4.1.11) + '@ai-sdk/anthropic': 3.0.43(zod@4.1.11) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) + '@ai-sdk/provider-utils': 4.0.15(zod@4.1.11) '@smithy/eventstream-codec': 4.2.8 '@smithy/util-utf8': 4.2.0 aws4fetch: 1.0.20 zod: 4.1.11 - '@ai-sdk/anthropic@2.0.60(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.63(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/anthropic@3.0.41(zod@4.1.11)': + '@ai-sdk/anthropic@3.0.43(zod@4.1.11)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) + '@ai-sdk/provider-utils': 4.0.15(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/gateway@2.0.35(zod@3.25.76)': + '@ai-sdk/gateway@2.0.37(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) '@vercel/oidc': 3.1.0 zod: 3.25.76 - '@ai-sdk/gateway@3.0.39(zod@4.1.11)': + '@ai-sdk/gateway@3.0.46(zod@4.1.11)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) + '@ai-sdk/provider-utils': 4.0.15(zod@4.1.11) '@vercel/oidc': 3.1.0 zod: 4.1.11 - '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.21(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.14(zod@4.1.11)': + '@ai-sdk/provider-utils@4.0.15(zod@4.1.11)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 @@ -23261,31 +23249,31 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.986.0': + '@aws-sdk/client-s3@3.989.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.973.7 - '@aws-sdk/credential-provider-node': 3.972.6 + '@aws-sdk/core': 3.973.9 + '@aws-sdk/credential-provider-node': 3.972.8 '@aws-sdk/middleware-bucket-endpoint': 3.972.3 '@aws-sdk/middleware-expect-continue': 3.972.3 - '@aws-sdk/middleware-flexible-checksums': 3.972.5 + '@aws-sdk/middleware-flexible-checksums': 3.972.7 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-location-constraint': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-sdk-s3': 3.972.7 + '@aws-sdk/middleware-sdk-s3': 3.972.9 '@aws-sdk/middleware-ssec': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/middleware-user-agent': 3.972.9 '@aws-sdk/region-config-resolver': 3.972.3 - '@aws-sdk/signature-v4-multi-region': 3.986.0 + '@aws-sdk/signature-v4-multi-region': 3.989.0 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.986.0 + '@aws-sdk/util-endpoints': 3.989.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.5 + '@aws-sdk/util-user-agent-node': 3.972.7 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/eventstream-serde-browser': 4.2.8 '@smithy/eventstream-serde-config-resolver': 4.3.8 '@smithy/eventstream-serde-node': 4.2.8 @@ -23296,66 +23284,66 @@ snapshots: '@smithy/invalid-dependency': 4.2.8 '@smithy/md5-js': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.13 - '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.29 - '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 '@smithy/util-waiter': 4.2.8 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.985.0': + '@aws-sdk/client-sso@3.989.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/middleware-user-agent': 3.972.9 '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.985.0 + '@aws-sdk/util-endpoints': 3.989.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.5 + '@aws-sdk/util-user-agent-node': 3.972.7 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.13 - '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.29 - '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23364,16 +23352,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.7': + '@aws-sdk/core@3.973.9': dependencies: '@aws-sdk/types': 3.973.1 '@aws-sdk/xml-builder': 3.972.4 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.8 @@ -23385,37 +23373,37 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.5': + '@aws-sdk/credential-provider-env@3.972.7': dependencies: - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.7': + '@aws-sdk/credential-provider-http@3.972.9': dependencies: - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/types': 3.973.1 '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.5': + '@aws-sdk/credential-provider-ini@3.972.7': dependencies: - '@aws-sdk/core': 3.973.7 - '@aws-sdk/credential-provider-env': 3.972.5 - '@aws-sdk/credential-provider-http': 3.972.7 - '@aws-sdk/credential-provider-login': 3.972.5 - '@aws-sdk/credential-provider-process': 3.972.5 - '@aws-sdk/credential-provider-sso': 3.972.5 - '@aws-sdk/credential-provider-web-identity': 3.972.5 - '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/core': 3.973.9 + '@aws-sdk/credential-provider-env': 3.972.7 + '@aws-sdk/credential-provider-http': 3.972.9 + '@aws-sdk/credential-provider-login': 3.972.7 + '@aws-sdk/credential-provider-process': 3.972.7 + '@aws-sdk/credential-provider-sso': 3.972.7 + '@aws-sdk/credential-provider-web-identity': 3.972.7 + '@aws-sdk/nested-clients': 3.989.0 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -23425,10 +23413,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.5': + '@aws-sdk/credential-provider-login@3.972.7': dependencies: - '@aws-sdk/core': 3.973.7 - '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/core': 3.973.9 + '@aws-sdk/nested-clients': 3.989.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -23438,14 +23426,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.6': + '@aws-sdk/credential-provider-node@3.972.8': dependencies: - '@aws-sdk/credential-provider-env': 3.972.5 - '@aws-sdk/credential-provider-http': 3.972.7 - '@aws-sdk/credential-provider-ini': 3.972.5 - '@aws-sdk/credential-provider-process': 3.972.5 - '@aws-sdk/credential-provider-sso': 3.972.5 - '@aws-sdk/credential-provider-web-identity': 3.972.5 + '@aws-sdk/credential-provider-env': 3.972.7 + '@aws-sdk/credential-provider-http': 3.972.9 + '@aws-sdk/credential-provider-ini': 3.972.7 + '@aws-sdk/credential-provider-process': 3.972.7 + '@aws-sdk/credential-provider-sso': 3.972.7 + '@aws-sdk/credential-provider-web-identity': 3.972.7 '@aws-sdk/types': 3.973.1 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 @@ -23455,20 +23443,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.5': + '@aws-sdk/credential-provider-process@3.972.7': dependencies: - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.5': + '@aws-sdk/credential-provider-sso@3.972.7': dependencies: - '@aws-sdk/client-sso': 3.985.0 - '@aws-sdk/core': 3.973.7 - '@aws-sdk/token-providers': 3.985.0 + '@aws-sdk/client-sso': 3.989.0 + '@aws-sdk/core': 3.973.9 + '@aws-sdk/token-providers': 3.989.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23477,10 +23465,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.5': + '@aws-sdk/credential-provider-web-identity@3.972.7': dependencies: - '@aws-sdk/core': 3.973.7 - '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/core': 3.973.9 + '@aws-sdk/nested-clients': 3.989.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23506,12 +23494,12 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.972.5': + '@aws-sdk/middleware-flexible-checksums@3.972.7': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/crc64-nvme': 3.972.0 '@aws-sdk/types': 3.973.1 '@smithy/is-array-buffer': 4.2.0 @@ -23519,7 +23507,7 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 @@ -23550,20 +23538,20 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.7': + '@aws-sdk/middleware-sdk-s3@3.972.9': dependencies: - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/types': 3.973.1 '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 @@ -23573,51 +23561,51 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.7': + '@aws-sdk/middleware-user-agent@3.972.9': dependencies: - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.985.0 - '@smithy/core': 3.22.1 + '@aws-sdk/util-endpoints': 3.989.0 + '@smithy/core': 3.23.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.985.0': + '@aws-sdk/nested-clients@3.989.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.7 + '@aws-sdk/core': 3.973.9 '@aws-sdk/middleware-host-header': 3.972.3 '@aws-sdk/middleware-logger': 3.972.3 '@aws-sdk/middleware-recursion-detection': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/middleware-user-agent': 3.972.9 '@aws-sdk/region-config-resolver': 3.972.3 '@aws-sdk/types': 3.973.1 - '@aws-sdk/util-endpoints': 3.985.0 + '@aws-sdk/util-endpoints': 3.989.0 '@aws-sdk/util-user-agent-browser': 3.972.3 - '@aws-sdk/util-user-agent-node': 3.972.5 + '@aws-sdk/util-user-agent-node': 3.972.7 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.13 - '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.29 - '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -23634,19 +23622,19 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.986.0': + '@aws-sdk/signature-v4-multi-region@3.989.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.7 + '@aws-sdk/middleware-sdk-s3': 3.972.9 '@aws-sdk/types': 3.973.1 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.985.0': + '@aws-sdk/token-providers@3.989.0': dependencies: - '@aws-sdk/core': 3.973.7 - '@aws-sdk/nested-clients': 3.985.0 + '@aws-sdk/core': 3.973.9 + '@aws-sdk/nested-clients': 3.989.0 '@aws-sdk/types': 3.973.1 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -23664,15 +23652,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.985.0': - dependencies: - '@aws-sdk/types': 3.973.1 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.986.0': + '@aws-sdk/util-endpoints@3.989.0': dependencies: '@aws-sdk/types': 3.973.1 '@smithy/types': 4.12.0 @@ -23691,9 +23671,9 @@ snapshots: bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.972.5': + '@aws-sdk/util-user-agent-node@3.972.7': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.7 + '@aws-sdk/middleware-user-agent': 3.972.9 '@aws-sdk/types': 3.973.1 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 @@ -23770,8 +23750,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.28.1 - '@azure/msal-node': 3.8.6 + '@azure/msal-browser': 4.28.2 + '@azure/msal-node': 3.8.7 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23784,15 +23764,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.28.1': + '@azure/msal-browser@4.28.2': dependencies: - '@azure/msal-common': 15.14.1 + '@azure/msal-common': 15.14.2 - '@azure/msal-common@15.14.1': {} + '@azure/msal-common@15.14.2': {} - '@azure/msal-node@3.8.6': + '@azure/msal-node@3.8.7': dependencies: - '@azure/msal-common': 15.14.1 + '@azure/msal-common': 15.14.2 jsonwebtoken: 9.0.3 uuid: 8.3.2 @@ -25630,7 +25610,7 @@ snapshots: get-value: 3.0.1 graphql: 16.12.0 graphql-language-service: 5.5.0(graphql@16.12.0) - markdown-it: 14.1.0 + markdown-it: 14.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) set-value: 4.1.0 @@ -25719,12 +25699,6 @@ snapshots: '@iarna/toml@2.2.5': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.1': - dependencies: - '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -27189,59 +27163,59 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true - '@peculiar/asn1-cms@2.6.0': + '@peculiar/asn1-cms@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 - '@peculiar/asn1-x509-attr': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 + '@peculiar/asn1-x509-attr': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-csr@2.6.0': + '@peculiar/asn1-csr@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.6.0': + '@peculiar/asn1-ecc@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.6.0': + '@peculiar/asn1-pfx@2.6.1': dependencies: - '@peculiar/asn1-cms': 2.6.0 - '@peculiar/asn1-pkcs8': 2.6.0 - '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-cms': 2.6.1 + '@peculiar/asn1-pkcs8': 2.6.1 + '@peculiar/asn1-rsa': 2.6.1 '@peculiar/asn1-schema': 2.6.0 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.6.0': + '@peculiar/asn1-pkcs8@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.6.0': + '@peculiar/asn1-pkcs9@2.6.1': dependencies: - '@peculiar/asn1-cms': 2.6.0 - '@peculiar/asn1-pfx': 2.6.0 - '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-cms': 2.6.1 + '@peculiar/asn1-pfx': 2.6.1 + '@peculiar/asn1-pkcs8': 2.6.1 '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 - '@peculiar/asn1-x509-attr': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 + '@peculiar/asn1-x509-attr': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.6.0': + '@peculiar/asn1-rsa@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 @@ -27251,14 +27225,14 @@ snapshots: pvtsutils: 1.3.6 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.6.0': + '@peculiar/asn1-x509-attr@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 asn1js: 3.0.7 tslib: 2.8.1 - '@peculiar/asn1-x509@2.6.0': + '@peculiar/asn1-x509@2.6.1': dependencies: '@peculiar/asn1-schema': 2.6.0 asn1js: 3.0.7 @@ -27267,13 +27241,13 @@ snapshots: '@peculiar/x509@1.14.3': dependencies: - '@peculiar/asn1-cms': 2.6.0 - '@peculiar/asn1-csr': 2.6.0 - '@peculiar/asn1-ecc': 2.6.0 - '@peculiar/asn1-pkcs9': 2.6.0 - '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-cms': 2.6.1 + '@peculiar/asn1-csr': 2.6.1 + '@peculiar/asn1-ecc': 2.6.1 + '@peculiar/asn1-pkcs9': 2.6.1 + '@peculiar/asn1-rsa': 2.6.1 '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509': 2.6.1 pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 @@ -27288,7 +27262,7 @@ snapshots: dependencies: playwright: 1.55.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.2)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27298,14 +27272,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27315,14 +27289,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)) type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-server: 5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.2)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27332,14 +27306,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.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.3(webpack-cli@4.10.0)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.2) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.2)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27349,14 +27323,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.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.3(webpack-cli@5.1.4)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) 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.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1)(webpack@5.105.2)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -27366,14 +27340,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 - webpack-dev-server: 5.2.3(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack@5.105.2) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.2)': dependencies: anser: 2.3.5 core-js-pure: 3.48.0 @@ -27382,11 +27356,11 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.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.3(webpack-cli@5.1.4)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) webpack-hot-middleware: 2.26.1 '@projectstorm/geometry@6.7.4': {} @@ -29116,7 +29090,7 @@ snapshots: '@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3)': dependencies: - clipboardy: 5.2.1 + clipboardy: 5.3.0 clone-deep: 4.0.1 compare-versions: 6.1.1 fs-extra: 11.3.3 @@ -29465,7 +29439,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.22.1': + '@smithy/core@3.23.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -29473,7 +29447,7 @@ snapshots: '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 @@ -29569,9 +29543,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.13': + '@smithy/middleware-endpoint@4.4.14': dependencies: - '@smithy/core': 3.22.1 + '@smithy/core': 3.23.0 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -29580,12 +29554,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.30': + '@smithy/middleware-retry@4.4.31': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -29610,7 +29584,7 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.9': + '@smithy/node-http-handler@4.4.10': dependencies: '@smithy/abort-controller': 4.2.8 '@smithy/protocol-http': 5.3.8 @@ -29659,14 +29633,14 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.11.2': + '@smithy/smithy-client@4.11.3': dependencies: - '@smithy/core': 3.22.1 - '@smithy/middleware-endpoint': 4.4.13 + '@smithy/core': 3.23.0 + '@smithy/middleware-endpoint': 4.4.14 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.11 + '@smithy/util-stream': 4.5.12 tslib: 2.8.1 '@smithy/types@4.12.0': @@ -29707,20 +29681,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.29': + '@smithy/util-defaults-mode-browser@4.3.30': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.32': + '@smithy/util-defaults-mode-node@4.2.33': dependencies: '@smithy/config-resolver': 4.4.6 '@smithy/credential-provider-imds': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.11.2 + '@smithy/smithy-client': 4.11.3 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -29745,10 +29719,10 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.11': + '@smithy/util-stream@4.5.12': dependencies: '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.9 + '@smithy/node-http-handler': 4.4.10 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-buffer-from': 4.2.0 @@ -30055,7 +30029,7 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.2)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30075,7 +30049,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -30100,7 +30074,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.2)': dependencies: '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -30120,7 +30094,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -30229,13 +30203,13 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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) @@ -30251,7 +30225,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30263,13 +30237,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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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) @@ -30285,7 +30259,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30392,7 +30366,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 prop-types: 15.8.1 - qs: 6.14.1 + qs: 6.14.2 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: @@ -30877,33 +30851,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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - file-loader: 6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 3.6.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - raw-loader: 4.0.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) + raw-loader: 4.0.2(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - terser-webpack-plugin: 4.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30939,33 +30913,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) - file-loader: 6.2.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) + file-loader: 6.2.0(webpack@5.105.2) 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.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.105.1) - raw-loader: 4.0.2(webpack@5.105.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.2) + raw-loader: 4.0.2(webpack@5.105.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.105.1) - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + style-loader: 1.3.0(webpack@5.105.2) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31001,33 +30975,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) - file-loader: 6.2.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) + file-loader: 6.2.0(webpack@5.105.2) 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.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.105.1) - raw-loader: 4.0.2(webpack@5.105.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.2) + raw-loader: 4.0.2(webpack@5.105.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.105.1) - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + style-loader: 1.3.0(webpack@5.105.2) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31063,33 +31037,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) - file-loader: 6.2.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) + file-loader: 6.2.0(webpack@5.105.2) 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.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.105.1) - raw-loader: 4.0.2(webpack@5.105.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.2) + raw-loader: 4.0.2(webpack@5.105.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.105.1) - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + style-loader: 1.3.0(webpack@5.105.2) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31125,33 +31099,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) - file-loader: 6.2.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) + file-loader: 6.2.0(webpack@5.105.2) 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.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.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.105.1) - raw-loader: 4.0.2(webpack@5.105.1) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.105.2) + raw-loader: 4.0.2(webpack@5.105.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.105.1) - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + style-loader: 1.3.0(webpack@5.105.2) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31184,27 +31158,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.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.48.0 - css-loader: 5.2.7(webpack@5.105.1) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) + css-loader: 5.2.7(webpack@5.105.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.6(webpack@5.105.1) + html-webpack-plugin: 5.6.6(webpack@5.105.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.105.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + style-loader: 2.0.0(webpack@5.105.2) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31238,27 +31212,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.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.48.0 - css-loader: 5.2.7(webpack@5.105.1) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) + css-loader: 5.2.7(webpack@5.105.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.6(webpack@5.105.1) + html-webpack-plugin: 5.6.6(webpack@5.105.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.105.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + style-loader: 2.0.0(webpack@5.105.2) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31295,30 +31269,30 @@ snapshots: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.2) 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.105.1) + css-loader: 6.11.0(webpack@5.105.2) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.2) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.6(webpack@5.105.1) + html-webpack-plugin: 5.6.6(webpack@5.105.2) 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.4 - style-loader: 3.3.4(webpack@5.105.1) - swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + style-loader: 3.3.4(webpack@5.105.2) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31356,30 +31330,30 @@ snapshots: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 6.11.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 11.3.3 - html-webpack-plugin: 5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 5.6.6(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) path-browserify: 1.0.1 process: 0.11.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) semver: 7.7.4 - style-loader: 3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 3.3.4(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 6.1.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31403,23 +31377,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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + css-loader: 6.11.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) - html-webpack-plugin: 5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + html-webpack-plugin: 5.6.6(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + style-loader: 3.3.4(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware: 6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack-dev-middleware: 6.1.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31439,23 +31413,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.105.1) + css-loader: 6.11.0(webpack@5.105.2) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.1) - html-webpack-plugin: 5.6.6(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.105.2) + html-webpack-plugin: 5.6.6(webpack@5.105.2) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.105.1) - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + style-loader: 3.3.4(webpack@5.105.2) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.105.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31474,7 +31448,7 @@ snapshots: '@storybook/core-events': 6.5.16 core-js: 3.48.0 global: 4.4.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 6.0.8 '@storybook/channel-websocket@6.5.16': @@ -31496,7 +31470,7 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 7.2.0 tiny-invariant: 1.3.3 @@ -31505,7 +31479,7 @@ snapshots: '@storybook/client-logger': 7.6.21 '@storybook/core-events': 7.6.21 '@storybook/global': 5.0.0 - qs: 6.14.1 + qs: 6.14.2 telejson: 7.2.0 tiny-invariant: 1.3.3 @@ -31606,7 +31580,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -31631,7 +31605,7 @@ snapshots: global: 4.4.0 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -31704,7 +31678,7 @@ snapshots: '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -31717,7 +31691,7 @@ snapshots: '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -31763,7 +31737,7 @@ snapshots: dependencies: storybook: 8.6.15(prettier@3.5.3) - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@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.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31780,18 +31754,18 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.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 @@ -31808,18 +31782,18 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.1)': + '@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.105.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 @@ -31836,14 +31810,14 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 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.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 @@ -31880,7 +31854,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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31888,7 +31862,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31905,7 +31879,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31945,7 +31919,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -31953,7 +31927,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31970,7 +31944,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32010,7 +31984,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32018,7 +31992,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32035,7 +32009,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32075,7 +32049,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32083,7 +32057,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32100,7 +32074,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32140,7 +32114,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.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -32148,7 +32122,7 @@ snapshots: express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32165,7 +32139,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32251,7 +32225,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.2) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32293,7 +32267,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32317,7 +32291,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32359,7 +32333,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32383,7 +32357,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32425,7 +32399,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32447,7 +32421,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32489,7 +32463,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32511,7 +32485,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.1) + '@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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 @@ -32553,7 +32527,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.5.1 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: @@ -32635,13 +32609,13 @@ snapshots: storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.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.105.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.105.2) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -32659,13 +32633,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.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.105.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.105.2) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -32683,13 +32657,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32705,13 +32679,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.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.105.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.105.2) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32727,13 +32701,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.1)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.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.105.1) + '@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.105.2) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32962,23 +32936,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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@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.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + css-loader: 3.6.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + html-webpack-plugin: 4.5.2(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32986,14 +32960,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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + style-loader: 1.3.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware: 3.7.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33013,23 +32987,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.105.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.105.2) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.2) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.2) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33037,14 +33011,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.105.1) + style-loader: 1.3.0(webpack@5.105.2) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33064,23 +33038,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.105.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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.2) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.2) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33088,14 +33062,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.105.1) + style-loader: 1.3.0(webpack@5.105.2) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33115,23 +33089,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.105.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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.2) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.2) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33139,14 +33113,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.105.1) + style-loader: 1.3.0(webpack@5.105.2) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33166,23 +33140,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.105.1) + '@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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 3.6.0(webpack@5.105.1) + css-loader: 3.6.0(webpack@5.105.2) express: 4.22.1 - file-loader: 6.2.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.2) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.105.1) + html-webpack-plugin: 4.5.2(webpack@5.105.2) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) react: 19.1.0 @@ -33190,14 +33164,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.105.1) + style-loader: 1.3.0(webpack@5.105.2) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.105.1) + terser-webpack-plugin: 4.2.3(webpack@5.105.2) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.105.2) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 4.9.5 @@ -33217,21 +33191,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.105.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.105.2) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.105.1) + css-loader: 5.2.7(webpack@5.105.2) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.6(webpack@5.105.1) + html-webpack-plugin: 5.6.6(webpack@5.105.2) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33239,13 +33213,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.105.1) + style-loader: 2.0.0(webpack@5.105.2) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.105.2) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33266,21 +33240,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.105.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.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.1) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.105.2) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.48.0 - css-loader: 5.2.7(webpack@5.105.1) + css-loader: 5.2.7(webpack@5.105.2) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.6(webpack@5.105.1) + html-webpack-plugin: 5.6.6(webpack@5.105.2) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33288,13 +33262,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.105.1) + style-loader: 2.0.0(webpack@5.105.2) telejson: 6.0.8 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.105.2) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33352,12 +33326,12 @@ 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@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.2) '@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.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.2) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 @@ -33367,7 +33341,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-refresh: 0.11.0 semver: 7.7.4 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33389,12 +33363,12 @@ snapshots: dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1)(webpack@5.105.2) '@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.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.2) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 @@ -33404,7 +33378,7 @@ snapshots: react-dom: 19.1.0(react@19.1.0) react-refresh: 0.11.0 semver: 7.7.4 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33426,7 +33400,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33437,7 +33411,7 @@ snapshots: semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33452,7 +33426,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.2) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33463,7 +33437,7 @@ snapshots: semver: 7.7.4 storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33486,7 +33460,7 @@ snapshots: dequal: 2.0.3 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -33503,7 +33477,7 @@ snapshots: dequal: 2.0.3 lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -33524,7 +33498,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -33545,7 +33519,7 @@ snapshots: core-js: 3.48.0 global: 4.4.0 lodash: 4.17.23 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -33556,7 +33530,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.105.1)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.2)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33566,11 +33540,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33580,11 +33554,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.2)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33594,11 +33568,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33608,11 +33582,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.1)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.105.2)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33622,7 +33596,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -33776,15 +33750,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(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.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(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.105.2) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.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 @@ -33811,7 +33785,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -33840,15 +33814,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.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.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 @@ -33875,7 +33849,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -33900,19 +33874,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33939,7 +33913,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33962,19 +33936,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.105.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)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.1) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.105.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 @@ -34001,7 +33975,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -34024,19 +33998,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.105.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)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.105.1))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.3(webpack@5.105.2))(webpack-hot-middleware@2.26.1)(webpack@5.105.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.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.1) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.105.2) '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.1) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.105.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 @@ -34063,7 +34037,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 4.9.5 @@ -34183,7 +34157,7 @@ snapshots: '@storybook/client-logger': 6.5.16 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -34193,7 +34167,7 @@ snapshots: '@storybook/client-logger': 6.5.16 core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -34202,7 +34176,7 @@ snapshots: dependencies: '@storybook/client-logger': 7.4.6 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34210,7 +34184,7 @@ snapshots: dependencies: '@storybook/client-logger': 7.4.6 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -34517,7 +34491,7 @@ snapshots: '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -34536,7 +34510,7 @@ snapshots: '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.1 + qs: 6.14.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -35184,7 +35158,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.1.2 + minimatch: 10.2.0 path-browserify: 1.0.1 '@tsconfig/node10@1.0.12': {} @@ -35464,7 +35438,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.1.2 + minimatch: 10.2.0 '@types/minimist@1.2.5': {} @@ -35519,7 +35493,7 @@ snapshots: '@types/pretty-hrtime@1.0.3': {} - '@types/prismjs@1.26.5': {} + '@types/prismjs@1.26.6': {} '@types/prop-types@15.7.15': {} @@ -35698,7 +35672,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35710,7 +35684,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35722,7 +35696,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35733,7 +35707,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35745,7 +35719,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -36203,7 +36177,7 @@ snapshots: hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 leven: 3.1.0 - markdown-it: 14.1.0 + markdown-it: 14.1.1 mime: 1.6.0 minimatch: 3.1.2 parse-semver: 1.1.1 @@ -36316,69 +36290,69 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.105.1)': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.105.1)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.2) - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.1)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.2) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.21.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.105.1)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.2) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.1)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.2) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: - webpack-cli: 4.10.0(webpack@5.105.1) + webpack-cli: 4.10.0(webpack@5.105.2) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.2) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.1)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.105.1)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.105.2) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.1)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.105.1)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.105.2)': dependencies: - webpack: 5.105.1(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.105.2) '@xmldom/xmldom@0.7.13': {} @@ -36499,19 +36473,19 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.129(zod@3.25.76): + ai@5.0.131(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 2.0.35(zod@3.25.76) + '@ai-sdk/gateway': 2.0.37(zod@3.25.76) '@ai-sdk/provider': 2.0.1 - '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.21(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ai@6.0.78(zod@4.1.11): + ai@6.0.86(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 3.0.39(zod@4.1.11) + '@ai-sdk/gateway': 3.0.46(zod@4.1.11) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@4.1.11) + '@ai-sdk/provider-utils': 4.0.15(zod@4.1.11) '@opentelemetry/api': 1.9.0 zod: 4.1.11 @@ -36966,7 +36940,7 @@ snapshots: tunnel: 0.0.6 typed-rest-client: 1.8.11 - b4a@1.7.3: {} + b4a@1.7.4: {} babel-code-frame@6.26.0: dependencies: @@ -37152,51 +37126,51 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.105.1): + babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.105.2): dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.1): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.2): 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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.1): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.105.2): 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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.1): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.105.2): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) babel-messages@6.23.0: dependencies: @@ -37729,7 +37703,7 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.3: + bare-fs@4.5.4: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 @@ -37837,7 +37811,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -37850,7 +37824,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -38444,7 +38418,7 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 - clipboardy@5.2.1: + clipboardy@5.3.0: dependencies: clipboard-image: 0.1.0 execa: 9.6.1 @@ -38754,14 +38728,14 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.1(webpack@5.105.1): + copy-webpack-plugin@13.0.1(webpack@5.105.2): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -38979,7 +38953,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + css-loader@3.6.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -38994,9 +38968,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@3.6.0(webpack@5.105.1): + css-loader@3.6.0(webpack@5.105.2): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -39011,9 +38985,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - css-loader@5.2.7(webpack@5.105.1): + css-loader@5.2.7(webpack@5.105.2): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -39025,9 +38999,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.4 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + css-loader@6.11.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39038,9 +39012,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - css-loader@6.11.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + css-loader@6.11.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39051,9 +39025,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@6.11.0(webpack@5.105.1): + css-loader@6.11.0(webpack@5.105.2): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39064,9 +39038,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - css-loader@7.1.3(webpack@5.105.1): + css-loader@7.1.3(webpack@5.105.2): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39077,7 +39051,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -40487,7 +40461,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2 @@ -40520,7 +40494,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -40548,12 +40522,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-text-webpack-plugin@3.0.2(webpack@5.105.1): + extract-text-webpack-plugin@3.0.2(webpack@5.105.2): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -40713,23 +40687,23 @@ snapshots: minimatch: 3.1.2 proper-lockfile: 1.2.0 - file-loader@1.1.5(webpack@5.105.1): + file-loader@1.1.5(webpack@5.105.2): dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + file-loader@6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - file-loader@6.2.0(webpack@5.105.1): + file-loader@6.2.0(webpack@5.105.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -40894,7 +40868,7 @@ snapshots: flatten@1.0.3: {} - flow-parser@0.299.0: {} + flow-parser@0.301.0: {} flush-write-stream@1.1.1: dependencies: @@ -40929,7 +40903,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.105.1): + fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.105.2): dependencies: babel-code-frame: 6.26.0 chalk: 1.1.3 @@ -40940,7 +40914,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: @@ -40952,7 +40926,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.105.2): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40968,11 +40942,11 @@ snapshots: semver: 7.7.4 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -40988,11 +40962,11 @@ snapshots: semver: 7.7.4 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.105.2): dependencies: '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 @@ -41008,11 +40982,11 @@ snapshots: semver: 7.7.4 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41027,9 +41001,9 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41044,9 +41018,9 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.1): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.105.2): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41061,9 +41035,9 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.105.1): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.105.2): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -41078,7 +41052,7 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -41420,7 +41394,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.2.3 - minimatch: 10.1.2 + minimatch: 10.2.0 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.1 @@ -41975,7 +41949,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@2.29.0(webpack@5.105.1): + html-webpack-plugin@2.29.0(webpack@5.105.2): dependencies: bluebird: 3.7.2 html-minifier: 3.5.21 @@ -41983,9 +41957,9 @@ snapshots: lodash: 4.17.23 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + html-webpack-plugin@4.5.2(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -41996,9 +41970,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@4.5.2(webpack@5.105.1): + html-webpack-plugin@4.5.2(webpack@5.105.2): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -42009,9 +41983,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + html-webpack-plugin@5.6.6(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42019,9 +41993,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - html-webpack-plugin@5.6.6(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + html-webpack-plugin@5.6.6(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42029,9 +42003,9 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@5.6.6(webpack@5.105.1): + html-webpack-plugin@5.6.6(webpack@5.105.2): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -42039,7 +42013,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) htmlparser2@10.1.0: dependencies: @@ -44210,7 +44184,7 @@ snapshots: '@babel/register': 7.28.6(@babel/core@7.27.7) babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) chalk: 4.1.2 - flow-parser: 0.299.0 + flow-parser: 0.301.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -44905,7 +44879,7 @@ snapshots: mdurl: 1.0.1 uc.micro: 1.0.6 - markdown-it@14.1.0: + markdown-it@14.1.1: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -45590,11 +45564,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.1): + mini-css-extract-plugin@2.10.0(webpack@5.105.2): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) minim@0.23.8: dependencies: @@ -45602,9 +45576,9 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.1.2: + minimatch@10.2.0: dependencies: - '@isaacs/brace-expansion': 5.0.1 + brace-expansion: 2.0.2 minimatch@3.0.3: dependencies: @@ -45942,15 +45916,15 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.105.1): + node-loader@2.0.0(webpack@5.105.2): dependencies: loader-utils: 2.0.4 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - node-loader@2.1.0(webpack@5.105.1): + node-loader@2.1.0(webpack@5.105.2): dependencies: loader-utils: 2.0.4 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) node-notifier@5.4.5: dependencies: @@ -46876,7 +46850,7 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -46884,9 +46858,9 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.4 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.1): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.105.2): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -46894,16 +46868,16 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.4 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.1): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.105.2): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.6.1 postcss: 8.5.6 semver: 7.7.4 optionalDependencies: - webpack: 5.105.1(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -47338,7 +47312,7 @@ snapshots: prism-react-renderer@2.4.1(react@18.2.0): dependencies: - '@types/prismjs': 1.26.5 + '@types/prismjs': 1.26.6 clsx: 2.1.1 react: 18.2.0 @@ -47456,7 +47430,7 @@ snapshots: prosemirror-markdown@1.13.4: dependencies: '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 prosemirror-model: 1.25.4 prosemirror-model@1.25.4: @@ -47576,11 +47550,11 @@ snapshots: dependencies: hookified: 1.15.1 - qs@6.14.1: + qs@6.14.2: dependencies: side-channel: 1.1.0 - qs@6.5.3: {} + qs@6.5.5: {} query-string@4.3.4: dependencies: @@ -47634,17 +47608,17 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + raw-loader@4.0.2(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - raw-loader@4.0.2(webpack@5.105.1): + raw-loader@4.0.2(webpack@5.105.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -48109,18 +48083,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.105.1) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.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.105.1) - file-loader: 1.1.5(webpack@5.105.1) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.1) + extract-text-webpack-plugin: 3.0.2(webpack@5.105.2) + file-loader: 1.1.5(webpack@5.105.2) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.2) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.105.1) + html-webpack-plugin: 2.29.0(webpack@5.105.2) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48131,7 +48105,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.105.1) + sw-precache-webpack-plugin: 0.11.4(webpack@5.105.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 @@ -48139,11 +48113,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.105.1) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.1)) - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) - webpack-manifest-plugin: 1.3.2(webpack@5.105.1) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.105.2) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.2)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) + webpack-manifest-plugin: 1.3.2(webpack@5.105.2) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48163,18 +48137,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.105.1) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.105.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.105.1) - file-loader: 1.1.5(webpack@5.105.1) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.1) + extract-text-webpack-plugin: 3.0.2(webpack@5.105.2) + file-loader: 1.1.5(webpack@5.105.2) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.105.2) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.105.1) + html-webpack-plugin: 2.29.0(webpack@5.105.2) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48185,7 +48159,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.105.1) + sw-precache-webpack-plugin: 0.11.4(webpack@5.105.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 @@ -48193,11 +48167,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.105.1) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.1)) - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-dev-server: 5.2.3(webpack@5.105.1) - webpack-manifest-plugin: 1.3.2(webpack@5.105.1) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.105.2) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.105.2)) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-dev-server: 5.2.3(webpack@5.105.2) + webpack-manifest-plugin: 1.3.2(webpack@5.105.2) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48725,7 +48699,7 @@ snapshots: mime-types: 2.1.35 oauth-sign: 0.9.0 performance-now: 2.1.0 - qs: 6.5.3 + qs: 6.5.5 safe-buffer: 5.2.1 tough-cookie: 2.5.0 tunnel-agent: 0.6.0 @@ -49061,19 +49035,19 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@13.3.3(sass@1.97.3)(webpack@5.105.1): + sass-loader@13.3.3(sass@1.97.3)(webpack@5.105.2): dependencies: neo-async: 2.6.2 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: sass: 1.97.3 - sass-loader@16.0.7(sass@1.97.3)(webpack@5.105.1): + sass-loader@16.0.7(sass@1.97.3)(webpack@5.105.2): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.97.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sass@1.97.3: dependencies: @@ -49474,17 +49448,17 @@ snapshots: async: 2.6.4 loader-utils: 1.4.2 - source-map-loader@4.0.2(webpack@5.105.1): + source-map-loader@4.0.2(webpack@5.105.2): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - source-map-loader@5.0.0(webpack@5.105.1): + source-map-loader@5.0.0(webpack@5.105.2): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -49678,7 +49652,7 @@ snapshots: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.3 + text-decoder: 1.2.5 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -49895,39 +49869,39 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + style-loader@1.3.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@1.3.0(webpack@5.105.1): + style-loader@1.3.0(webpack@5.105.2): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - style-loader@2.0.0(webpack@5.105.1): + style-loader@2.0.0(webpack@5.105.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + style-loader@3.3.4(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - style-loader@3.3.4(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + style-loader@3.3.4(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@3.3.4(webpack@5.105.1): + style-loader@3.3.4(webpack@5.105.2): dependencies: - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - style-loader@4.0.0(webpack@5.105.1): + style-loader@4.0.0(webpack@5.105.2): dependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) style-mod@4.1.3: {} @@ -50071,10 +50045,10 @@ snapshots: svg-tags@1.0.0: {} - svg-url-loader@8.0.0(webpack@5.105.1): + svg-url-loader@8.0.0(webpack@5.105.2): dependencies: - file-loader: 6.2.0(webpack@5.105.1) - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + file-loader: 6.2.0(webpack@5.105.2) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: @@ -50133,12 +50107,12 @@ snapshots: svgpath@2.6.0: {} - sw-precache-webpack-plugin@0.11.4(webpack@5.105.1): + sw-precache-webpack-plugin@0.11.4(webpack@5.105.2): dependencies: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -50263,17 +50237,17 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2): dependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) symbol-tree@3.2.4: {} @@ -50350,7 +50324,7 @@ snapshots: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.5.3 + bare-fs: 4.5.4 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller @@ -50359,7 +50333,7 @@ snapshots: tar-stream@3.1.7: dependencies: - b4a: 1.7.3 + b4a: 1.7.4 fast-fifo: 1.3.2 streamx: 2.23.0 transitivePeerDependencies: @@ -50439,7 +50413,7 @@ snapshots: ansi-escapes: 7.3.0 supports-hyperlinks: 3.2.0 - terser-webpack-plugin@4.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + terser-webpack-plugin@4.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50449,10 +50423,10 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.46.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-sources: 1.4.3 - terser-webpack-plugin@4.2.3(webpack@5.105.1): + terser-webpack-plugin@4.2.3(webpack@5.105.2): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50462,40 +50436,40 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.46.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) esbuild: 0.25.12 - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) - terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.15.11(@swc/helpers@0.5.18) @@ -50532,9 +50506,9 @@ snapshots: glob: 10.5.0 minimatch: 9.0.5 - text-decoder@1.2.3: + text-decoder@1.2.5: dependencies: - b4a: 1.7.3 + b4a: 1.7.4 transitivePeerDependencies: - react-native-b4a @@ -50815,7 +50789,7 @@ snapshots: loader-utils: 1.4.2 semver: 5.7.2 - ts-loader@9.5.4(typescript@5.8.3)(webpack@5.105.1): + ts-loader@9.5.4(typescript@5.8.3)(webpack@5.105.2): dependencies: chalk: 4.1.2 enhanced-resolve: 5.19.0 @@ -50823,7 +50797,7 @@ snapshots: semver: 7.7.4 source-map: 0.7.6 typescript: 5.8.3 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) ts-mixer@6.0.4: {} @@ -51215,7 +51189,7 @@ snapshots: typed-rest-client@1.8.11: dependencies: - qs: 6.14.1 + qs: 6.14.2 tunnel: 0.0.6 underscore: 1.13.7 @@ -51255,7 +51229,7 @@ snapshots: commander: 2.19.0 source-map: 0.6.1 - uglifyjs-webpack-plugin@1.2.5(webpack@5.105.1): + uglifyjs-webpack-plugin@1.2.5(webpack@5.105.2): dependencies: cacache: 10.0.4 find-cache-dir: 1.0.0 @@ -51263,7 +51237,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -51339,7 +51313,7 @@ snapshots: union@0.5.0: dependencies: - qs: 6.14.1 + qs: 6.14.2 uniq@1.0.1: {} @@ -51552,30 +51526,30 @@ snapshots: url-join@4.0.1: {} - url-loader@0.6.2(file-loader@1.1.5(webpack@5.105.1)): + url-loader@0.6.2(file-loader@1.1.5(webpack@5.105.2)): dependencies: - file-loader: 1.1.5(webpack@5.105.1) + file-loader: 1.1.5(webpack@5.105.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.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - file-loader: 6.2.0(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) - url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.1))(webpack@5.105.1): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - file-loader: 6.2.0(webpack@5.105.1) + file-loader: 6.2.0(webpack@5.105.2) url-parse-lax@1.0.0: dependencies: @@ -51589,7 +51563,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.1 + qs: 6.14.2 use-callback-ref@1.3.3(@types/react@18.2.0)(react@18.2.0): dependencies: @@ -52013,10 +51987,10 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1): + webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.1) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.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.3) colorette: 2.0.20 @@ -52026,15 +52000,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.105.2) - webpack-cli@4.10.0(webpack@5.105.1): + webpack-cli@4.10.0(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.1) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.105.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 @@ -52044,15 +52018,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.105.1(webpack-cli@4.10.0) + webpack: 5.105.2(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1): + webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.1) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.105.2) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52061,17 +52035,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.105.2) - webpack-cli@5.1.4(webpack@5.105.1): + webpack-cli@5.1.4(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.105.1) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.105.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.105.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.105.2) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52080,15 +52054,15 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1): + webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.1) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.2) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -52097,17 +52071,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.105.2) - webpack-cli@6.0.1(webpack@5.105.1): + webpack-cli@6.0.1(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.1) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -52116,28 +52090,28 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.1(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@3.7.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-log: 2.0.0 - webpack-dev-middleware@3.7.3(webpack@5.105.1): + webpack-dev-middleware@3.7.3(webpack@5.105.2): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-log: 2.0.0 - webpack-dev-middleware@4.3.0(webpack@5.105.1): + webpack-dev-middleware@4.3.0(webpack@5.105.2): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -52145,9 +52119,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): + webpack-dev-middleware@6.1.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52155,9 +52129,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware@6.1.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@6.1.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52165,9 +52139,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware@6.1.3(webpack@5.105.1): + webpack-dev-middleware@6.1.3(webpack@5.105.2): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -52175,9 +52149,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.5(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-middleware@7.4.5(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 4.56.10 @@ -52186,10 +52160,10 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) optional: true - webpack-dev-middleware@7.4.5(webpack@5.105.1): + webpack-dev-middleware@7.4.5(webpack@5.105.2): dependencies: colorette: 2.0.20 memfs: 4.56.10 @@ -52198,9 +52172,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) - webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.105.1): + webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.105.2): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52228,11 +52202,11 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.2) ws: 8.19.0 optionalDependencies: - webpack: 5.105.1(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - bufferutil - debug @@ -52240,7 +52214,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.105.1): + webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.105.2): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52268,18 +52242,18 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.2) ws: 8.19.0 optionalDependencies: - webpack: 5.105.1(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack: 5.105.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.105.1): + webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.105.2): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52307,18 +52281,18 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.2) ws: 8.19.0 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.3(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-dev-server@5.2.3(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52346,10 +52320,10 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-dev-middleware: 7.4.5(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) ws: 8.19.0 optionalDependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - bufferutil - debug @@ -52357,7 +52331,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.3(webpack@5.105.1): + webpack-dev-server@5.2.3(webpack@5.105.2): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -52385,23 +52359,23 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.1) + webpack-dev-middleware: 7.4.5(webpack@5.105.2) ws: 8.19.0 optionalDependencies: - webpack: 5.105.1(webpack-cli@5.1.4) + webpack: 5.105.2(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): + webpack-filter-warnings-plugin@1.2.1(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-filter-warnings-plugin@1.2.1(webpack@5.105.1): + webpack-filter-warnings-plugin@1.2.1(webpack@5.105.2): dependencies: - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -52414,11 +52388,11 @@ snapshots: ansi-colors: 3.2.4 uuid: 3.4.0 - webpack-manifest-plugin@1.3.2(webpack@5.105.1): + webpack-manifest-plugin@1.3.2(webpack@5.105.2): dependencies: fs-extra: 0.30.0 lodash: 4.17.23 - webpack: 5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack: 5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -52453,7 +52427,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18)): + webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52477,7 +52451,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52485,7 +52459,7 @@ snapshots: - esbuild - uglify-js - webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): + webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52509,7 +52483,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52517,7 +52491,7 @@ snapshots: - esbuild - uglify-js - webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): + webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52541,17 +52515,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.105.1) + webpack-cli: 5.1.4(webpack@5.105.2) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): + webpack@5.105.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52575,17 +52549,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.1(webpack-cli@4.10.0): + webpack@5.105.2(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52609,17 +52583,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.1) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.1(webpack-cli@5.1.4): + webpack@5.105.2(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52643,17 +52617,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.105.1) + webpack-cli: 5.1.4(webpack@5.105.2) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.1(webpack-cli@6.0.1): + webpack@5.105.2(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52677,11 +52651,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.105.2) watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.105.1) + webpack-cli: 6.0.1(webpack@5.105.2) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/package.json b/package.json index 26073084bb5..f24c8e46f80 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "form-data": "^4.0.4", "tmp": "^0.2.4", "express": "^4.22.1", - "qs": "^6.14.1", + "qs": "^6.14.2", "diff": "^8.0.3", "undici": "^7.18.2", "lodash": "4.17.23", From ec2b24f8e0055a1497f5b1f9ed8d33c36dbd09af Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Sat, 14 Feb 2026 00:54:27 +0530 Subject: [PATCH 217/247] Update brace-expansion to version 5.0.2 and clean up pnpmfile.cjs by removing unnecessary dependency checks for brace-expansion. --- common/config/rush/.pnpmfile.cjs | 12 ++--------- common/config/rush/pnpm-lock.yaml | 35 ++++++++++++++++++++++++++++--- package.json | 3 +-- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 88819ceadc2..3780de023f2 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -29,11 +29,7 @@ module.exports = { } if (pkg.dependencies['axios']) { pkg.dependencies['axios'] = '^1.13.5'; - } - if (pkg.dependencies['brace-expansion']) { - pkg.dependencies['brace-expansion'] = '^2.0.2'; - } - if (pkg.dependencies['http-proxy']) { + } if (pkg.dependencies['http-proxy']) { pkg.dependencies['http-proxy'] = '^1.18.1'; } if (pkg.dependencies['prismjs']) { @@ -99,11 +95,7 @@ module.exports = { } if (pkg.devDependencies['axios']) { pkg.devDependencies['axios'] = '^1.13.5'; - } - if (pkg.devDependencies['brace-expansion']) { - pkg.devDependencies['brace-expansion'] = '^2.0.2'; - } - if (pkg.devDependencies['http-proxy']) { + } if (pkg.devDependencies['http-proxy']) { pkg.devDependencies['http-proxy'] = '^1.18.1'; } if (pkg.devDependencies['prismjs']) { diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 833d0ac6bc5..655f8892730 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -11877,6 +11877,10 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -12022,9 +12026,16 @@ packages: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -12723,6 +12734,9 @@ packages: compute-scroll-into-view@2.0.4: resolution: {integrity: sha512-y/ZA3BGnxoM/QHHQ2Uy49CLtnWPbt4tTPpEEZiEmmiWBFKjej7nEyH8Ryz54jH0MLXflUYA3Er2zUxPSJu5R+g==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} @@ -37701,6 +37715,10 @@ snapshots: balanced-match@2.0.0: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + bare-events@2.8.2: {} bare-fs@4.5.4: @@ -37871,10 +37889,19 @@ snapshots: dependencies: big-integer: 1.6.52 + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -38647,6 +38674,8 @@ snapshots: compute-scroll-into-view@2.0.4: {} + concat-map@0.0.1: {} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 @@ -45578,15 +45607,15 @@ snapshots: minimatch@10.2.0: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 5.0.2 minimatch@3.0.3: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 1.1.12 minimatch@3.1.2: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: diff --git a/package.json b/package.json index f24c8e46f80..27a53ed81ae 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,8 @@ "pnpm": { "overrides": { "@modelcontextprotocol/sdk": "^1.26.0", - "@isaacs/brace-expansion": "5.0.1", + "@isaacs/brace-expansion": "5.0.2", "axios": "^1.13.5", - "brace-expansion": "^2.0.2", "http-proxy": "^1.18.1", "prismjs": "^1.30.0", "webpack": "^5.94.0", From 297efcd4fa54d6ccd62469901cbc979e2d5fd185 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan <kanushkanet@gmail.com> Date: Sat, 14 Feb 2026 01:01:16 +0530 Subject: [PATCH 218/247] Refactor pnpmfile.cjs to improve formatting by adding line breaks --- common/config/rush/.pnpmfile.cjs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 3780de023f2..f7fd3947b81 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -29,7 +29,8 @@ module.exports = { } if (pkg.dependencies['axios']) { pkg.dependencies['axios'] = '^1.13.5'; - } if (pkg.dependencies['http-proxy']) { + } + if (pkg.dependencies['http-proxy']) { pkg.dependencies['http-proxy'] = '^1.18.1'; } if (pkg.dependencies['prismjs']) { @@ -95,7 +96,8 @@ module.exports = { } if (pkg.devDependencies['axios']) { pkg.devDependencies['axios'] = '^1.13.5'; - } if (pkg.devDependencies['http-proxy']) { + } + if (pkg.devDependencies['http-proxy']) { pkg.devDependencies['http-proxy'] = '^1.18.1'; } if (pkg.devDependencies['prismjs']) { From 863cad651e8d75dfde5c1fecc5a0309144bcd42f Mon Sep 17 00:00:00 2001 From: choreo-cicd <choreo-cicd@wso2.com> Date: Fri, 13 Feb 2026 19:53:55 +0000 Subject: [PATCH 219/247] Update version to ballerina-integrator-1.7.0 --- 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 ce93849b156..3782d7703a6 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.7.4", + "version": "5.8.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 93c2a3ca81c..cfd08e68290 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.6.1", + "version": "1.7.0", "publisher": "wso2", "icon": "resources/images/wso2-ballerina-integrator-logo.png", "repository": { From ea4f7ece017752e4ec5b7ea65c31d168f6ff1b6b Mon Sep 17 00:00:00 2001 From: Anjana Supun <anjanasupun05@gmail.com> Date: Sat, 14 Feb 2026 13:44:00 +0530 Subject: [PATCH 220/247] Add new/old preview in review mode --- .../src/interfaces/extended-lang-client.ts | 4 ++ .../src/rpc-types/ai-panel/interfaces.ts | 5 +- .../src/features/ai/utils/ai-client.ts | 1 + .../src/rpc-managers/ai-panel/rpc-manager.ts | 5 ++ .../rpc-managers/bi-diagram/rpc-manager.ts | 56 +++++++++++++++++-- .../ReviewMode/ReadonlyComponentDiagram.tsx | 38 +++++++++++-- .../views/ReviewMode/ReadonlyFlowDiagram.tsx | 31 +++++++--- .../views/ReviewMode/ReadonlyTypeDiagram.tsx | 8 ++- .../src/views/ReviewMode/ReviewNavigation.tsx | 55 +++++++++++++++++- .../src/views/ReviewMode/index.tsx | 30 +++++++++- 10 files changed, 210 insertions(+), 23 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 4a977a27928..3a63c9ee122 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 interface BIFlowModelRequest { startLine?: LinePosition; endLine?: LinePosition; forceAssign?: boolean; + useFileSchema?: boolean; } export interface BISuggestedFlowModelRequest extends BIFlowModelRequest { @@ -969,6 +970,7 @@ export type BIGetEnclosedFunctionRequest = { filePath: string; position: LinePosition; findClass?: boolean; + useFileSchema?: boolean; } export type BIGetEnclosedFunctionResponse = { @@ -1059,6 +1061,7 @@ export interface BICopilotContextResponse { export interface BIDesignModelRequest { projectPath?: string; + useFileSchema?: boolean; } export type BIDesignModelResponse = { @@ -1509,6 +1512,7 @@ export interface GetGraphqlTypeResponse { export interface GetTypesRequest { filePath: string; + useFileSchema?: boolean; } export interface GetTypeRequest { 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 2ebaa0aff25..90d3fb7b860 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 @@ -384,8 +384,9 @@ export interface SemanticDiffRequest { // Numeric enum values from the API export enum ChangeTypeEnum { ADDITION = 0, - MODIFICATION = 1, - DELETION = 2 + DELETION = 1, + MODIFICATION = 2, + } export type ChangeType = "ADDITION" | "MODIFICATION" | "DELETION"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts index dd1ecc17da5..3c2ed951b90 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts @@ -161,6 +161,7 @@ export const getAnthropicClient = async (model: AnthropicModel): Promise<any> => // Recreate client if login method has changed or no cached instance if (!cachedAnthropic || cachedAuthMethod !== loginMethod) { let url = BACKEND_URL + "/intelligence-api/v1.0/claude"; + // let url = "http://localhost:9090/intel/claude" if (loginMethod === LoginMethod.BI_INTEL || loginMethod === LoginMethod.DEVANT_ENV) { cachedAnthropic = createAnthropic({ baseURL: 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 9b46f21f63c..441b81088dd 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 @@ -404,6 +404,11 @@ export class AiPanelRpcManager implements AIPanelAPI { try { const res: SemanticDiffResponse = await context.langClient.getSemanticDiff(params); console.log(">>> semantic diff response from ls", JSON.stringify(res)); + if (res?.semanticDiffs) { + for (const diff of res.semanticDiffs) { + console.log(`>>> [SemanticDiff DEBUG] uri=${diff.uri}, changeType=${diff.changeType} (ADDITION=0, MODIFICATION=1, DELETION=2), nodeKind=${diff.nodeKind}, lineRange=${JSON.stringify(diff.lineRange)}`); + } + } return res; } catch (error) { console.log(">>> error in getting semantic diff", error); 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 b659448a3b7..30525a103ce 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 @@ -181,6 +181,31 @@ import { getCurrentBallerinaProject } from "../../utils/project-utils"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise<void>; + private toRawPath(input: string): string { + if (input.includes('://')) { + return Uri.parse(input).fsPath; + } + return input; + } + + private mapTempPathToOriginal(tempFilePath: string): string { + const rawPath = this.toRawPath(tempFilePath); + const context = StateMachine.context(); + const originalRoot = context.workspacePath || context.projectPath; + const workspaceId = context.projectPath; + const threadId = 'default'; + const pendingReview = chatStateStorage.getPendingReviewGeneration(workspaceId, threadId); + if (pendingReview?.reviewState?.tempProjectPath && originalRoot) { + const normalizedTempRoot = pendingReview.reviewState.tempProjectPath.replace(/\\/g, '/'); + const normalizedFilePath = rawPath.replace(/\\/g, '/'); + if (normalizedFilePath.startsWith(normalizedTempRoot)) { + const relativePath = normalizedFilePath.substring(normalizedTempRoot.length); + return originalRoot + relativePath; + } + } + return rawPath; + } + async getFlowModel(params: BIFlowModelRequest): Promise<BIFlowModelResponse> { console.log(">>> requesting bi flow model from ls", params); return new Promise((resolve) => { @@ -189,8 +214,13 @@ export class BiDiagramRpcManager implements BIDiagramAPI { // If params has all required fields, use them directly if (params?.filePath && params?.startLine && params?.endLine) { console.log(">>> using params to create request"); + let filePath = params.filePath; + // When useFileSchema is set, map temp path to original project path + if (params.useFileSchema) { + filePath = this.mapTempPathToOriginal(filePath); + } request = { - filePath: params.filePath, + filePath, startLine: params.startLine, endLine: params.endLine, forceAssign: params.forceAssign ?? true, @@ -199,7 +229,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { // Fall back to context if params are not complete console.log(">>> params incomplete, falling back to context"); const context = StateMachine.context(); - + if (!context.position) { // TODO: check why this hits when we are in review mode console.log(">>> position not found in context, cannot create request"); @@ -1438,9 +1468,15 @@ export class BiDiagramRpcManager implements BIDiagramAPI { async getEnclosedFunction(params: BIGetEnclosedFunctionRequest): Promise<BIGetEnclosedFunctionResponse> { console.log(">>> requesting parent functin definition", params); + // When useFileSchema is set, map temp path to original project path + let filePath = params.filePath; + if (params.useFileSchema) { + filePath = this.mapTempPathToOriginal(filePath); + } + const request = { filePath, position: params.position, findClass: params.findClass }; return new Promise((resolve) => { StateMachine.langClient() - .getEnclosedFunctionDef(params) + .getEnclosedFunctionDef(request) .then((response) => { if (response?.filePath && response?.startLine && response?.endLine) { console.log(">>> parent function position ", response); @@ -1514,8 +1550,13 @@ export class BiDiagramRpcManager implements BIDiagramAPI { return new Promise((resolve) => { let projectPath: string; if (params?.projectPath) { - const uri = Uri.file(params.projectPath); - projectPath = uri.with({ scheme: 'ai' }).toString(); + if (params.useFileSchema) { + // Map temp project path to original project raw path + projectPath = this.mapTempPathToOriginal(params.projectPath); + } else { + const uri = Uri.file(params.projectPath); + projectPath = uri.with({ scheme: 'ai' }).toString(); + } } else { projectPath = StateMachine.context().projectPath; } @@ -1552,6 +1593,11 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }); } + // When useFileSchema is set, map temp path to original project path + if (params.useFileSchema) { + filePath = this.mapTempPathToOriginal(filePath); + } + return new Promise((resolve, reject) => { StateMachine.langClient() .getTypes({ filePath }) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyComponentDiagram.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyComponentDiagram.tsx index f33b21ada46..5cc35dba81a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyComponentDiagram.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyComponentDiagram.tsx @@ -39,28 +39,50 @@ interface ReadonlyComponentDiagramProps { projectPath: string; filePath: string; position: NodePosition; + useFileSchema?: boolean; +} + +const EmptyMessage = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100%; + color: var(--vscode-descriptionForeground); + font-size: 14px; +`; + +function isDesignModelEmpty(model: CDModel): boolean { + return model.connections.length === 0 + && model.listeners.length === 0 + && model.services.length === 0 + && !model.automation; } export function ReadonlyComponentDiagram(props: ReadonlyComponentDiagramProps): JSX.Element { - const { projectPath } = props; + const { projectPath, useFileSchema } = props; const { rpcClient } = useRpcContext(); const [project, setProject] = useState<CDModel | null>(null); + const [isLoaded, setIsLoaded] = useState(false); useEffect(() => { + setProject(null); + setIsLoaded(false); fetchProject(); - }, [projectPath]); + }, [projectPath, useFileSchema]); const fetchProject = () => { rpcClient .getBIDiagramRpcClient() - .getDesignModel({ projectPath }) + .getDesignModel({ projectPath, useFileSchema }) .then((response) => { if (response?.designModel) { setProject(response.designModel); } + setIsLoaded(true); }) .catch((error) => { console.error("Error getting design model", error); + setIsLoaded(true); }); }; @@ -69,7 +91,7 @@ export function ReadonlyComponentDiagram(props: ReadonlyComponentDiagramProps): console.log("Diagram is in readonly mode"); }; - if (!project) { + if (!isLoaded) { return ( <SpinnerContainer> <ProgressRing color={ThemeColors.PRIMARY} /> @@ -77,6 +99,14 @@ export function ReadonlyComponentDiagram(props: ReadonlyComponentDiagramProps): ); } + if (!project || isDesignModelEmpty(project)) { + return ( + <EmptyMessage> + No top-level constructs found in the previous version + </EmptyMessage> + ); + } + return ( <Container> <Diagram diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyFlowDiagram.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyFlowDiagram.tsx index 438390ca99a..07f2f86616b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyFlowDiagram.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyFlowDiagram.tsx @@ -46,35 +46,52 @@ interface ReadonlyFlowDiagramProps { filePath: string; position: NodePosition; onModelLoaded?: (metadata: ItemMetadata) => void; + useFileSchema?: boolean; } export function ReadonlyFlowDiagram(props: ReadonlyFlowDiagramProps): JSX.Element { - const { filePath, position, onModelLoaded } = props; + const { filePath, position, onModelLoaded, useFileSchema } = props; const { rpcClient } = useRpcContext(); const [flowModel, setFlowModel] = useState<Flow | null>(null); useEffect(() => { + setFlowModel(null); fetchFlowModel(); - }, [filePath, position]); + }, [filePath, position, useFileSchema]); const fetchFlowModel = () => { + // First resolve the full function range using getEnclosedFunction, + // since the position from semantic diff may only cover the changed statement rpcClient .getBIDiagramRpcClient() - .getFlowModel({ + .getEnclosedFunction({ filePath: filePath, - startLine: { line: position.startLine, offset: position.startColumn }, - endLine: { line: position.endLine, offset: position.endColumn }, + position: { line: position.startLine, offset: position.startColumn }, + useFileSchema, + }) + .then((enclosedFn) => { + const startLine = enclosedFn?.startLine ?? { line: position.startLine, offset: position.startColumn }; + const endLine = enclosedFn?.endLine ?? { line: position.endLine, offset: position.endColumn }; + + return rpcClient + .getBIDiagramRpcClient() + .getFlowModel({ + filePath: filePath, + startLine, + endLine, + useFileSchema, + }); }) .then((response) => { if (response?.flowModel) { setFlowModel(response.flowModel); - + // Extract metadata from EVENT_START node if (onModelLoaded && response.flowModel.nodes) { const eventStartNode = response.flowModel.nodes.find( (node: any) => node.codedata?.node === 'EVENT_START' ); - + if (eventStartNode?.metadata?.data) { const data = eventStartNode.metadata.data as any; onModelLoaded({ diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyTypeDiagram.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyTypeDiagram.tsx index 0c94a87107a..183c7b6b1b3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyTypeDiagram.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReadonlyTypeDiagram.tsx @@ -45,21 +45,23 @@ interface ReadonlyTypeDiagramProps { projectPath: string; filePath: string; onModelLoaded?: (metadata: ItemMetadata) => void; + useFileSchema?: boolean; } export function ReadonlyTypeDiagram(props: ReadonlyTypeDiagramProps): JSX.Element { - const { filePath, onModelLoaded } = props; + const { filePath, onModelLoaded, useFileSchema } = props; const { rpcClient } = useRpcContext(); const [typesModel, setTypesModel] = useState<Type[] | null>(null); useEffect(() => { + setTypesModel(null); fetchTypesModel(); - }, [filePath]); + }, [filePath, useFileSchema]); const fetchTypesModel = () => { rpcClient .getBIDiagramRpcClient() - .getTypes({ filePath: filePath }) + .getTypes({ filePath: filePath, useFileSchema }) .then((response) => { if (response?.types) { setTypesModel(response.types); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReviewNavigation.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReviewNavigation.tsx index dc2ef72aad6..060e7797eab 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReviewNavigation.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/ReviewNavigation.tsx @@ -80,6 +80,34 @@ const NavigationButtons = styled.div` gap: 8px; `; +const VersionToggle = styled.div` + display: flex; + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + overflow: hidden; +`; + +const ToggleSegment = styled.button<{ active: boolean; disabled?: boolean }>` + background: ${(props: { active: boolean }) => + props.active ? "var(--vscode-button-background)" : "transparent"}; + color: ${(props: { active: boolean }) => + props.active ? "var(--vscode-button-foreground)" : "var(--vscode-foreground)"}; + border: none; + padding: 4px 12px; + font-size: 12px; + font-family: var(--vscode-font-family); + cursor: ${(props: { disabled?: boolean }) => (props.disabled ? "default" : "pointer")}; + opacity: ${(props: { disabled?: boolean }) => (props.disabled ? 0.5 : 1)}; + transition: background 0.15s, color 0.15s; + + &:hover:not(:disabled) { + background: ${(props: { active: boolean }) => + props.active + ? "var(--vscode-button-hoverBackground)" + : "var(--vscode-toolbar-hoverBackground)"}; + } +`; + const ActionButtons = styled.div` display: flex; gap: 8px; @@ -98,6 +126,9 @@ interface ReviewNavigationProps { onReject: () => void; canGoPrevious: boolean; canGoNext: boolean; + showOldVersion: boolean; + onToggleVersion: () => void; + canToggleVersion: boolean; } export function ReviewNavigation(props: ReviewNavigationProps): JSX.Element { @@ -110,7 +141,10 @@ export function ReviewNavigation(props: ReviewNavigationProps): JSX.Element { onAccept, onReject, canGoPrevious, - canGoNext + canGoNext, + showOldVersion, + onToggleVersion, + canToggleVersion } = props; const [isProcessing, setIsProcessing] = useState(false); @@ -177,6 +211,25 @@ export function ReviewNavigation(props: ReviewNavigationProps): JSX.Element { {currentLabel && <ViewLabel title={currentLabel}>{currentLabel}</ViewLabel>} </ViewInfo> + <VersionToggle> + <ToggleSegment + active={!showOldVersion} + disabled={!canToggleVersion} + onClick={() => { if (canToggleVersion && showOldVersion) { onToggleVersion(); } }} + title="Show new version" + > + New + </ToggleSegment> + <ToggleSegment + active={showOldVersion} + disabled={!canToggleVersion} + onClick={() => { if (canToggleVersion && !showOldVersion) { onToggleVersion(); } }} + title="Show old version" + > + Old + </ToggleSegment> + </VersionToggle> + <ActionButtons> <Button appearance="secondary" diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx index b791928f2ca..12358b36010 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx @@ -133,6 +133,7 @@ interface ReviewView { }; projectPath: string; label?: string; + changeType: number; } enum NodeKindEnum { @@ -182,6 +183,8 @@ function convertToReviewView(diff: SemanticDiff, projectPath: string, packageNam const changeTypeStr = getChangeTypeString(diff.changeType); const nodeKindStr = getNodeKindString(diff.nodeKind); + console.log(`[ReviewMode DEBUG] convertToReviewView: uri=${diff.uri}, changeType=${diff.changeType} (${changeTypeStr}), nodeKind=${diff.nodeKind} (${nodeKindStr}), lineRange=${JSON.stringify(diff.lineRange)}`); + // Include package name in label if provided (for multi-package scenarios) const changeLabel = packageName ? `${changeTypeStr}: ${nodeKindStr} in ${packageName}/${fileName}` @@ -198,6 +201,7 @@ function convertToReviewView(diff: SemanticDiff, projectPath: string, packageNam }, projectPath, label: changeLabel, + changeType: diff.changeType, }; } @@ -267,6 +271,7 @@ export function ReviewMode(): JSX.Element { const [isLoading, setIsLoading] = useState(true); const [currentItemMetadata, setCurrentItemMetadata] = useState<ItemMetadata | null>(null); const [isWorkspace, setIsWorkspace] = useState(false); + const [showOldVersion, setShowOldVersion] = useState(false); // Derive current view from views array and currentIndex - no separate state needed const currentView = @@ -320,7 +325,15 @@ export function ReviewMode(): JSX.Element { ? await fetchSemanticDiffForMultiplePackages(rpcClient, packagesToReview) : await fetchSemanticDiff(rpcClient, tempDirPath); - console.log("[ReviewMode] Combined semanticDiff Response:", semanticDiffResponse); + console.log("[ReviewMode] Combined semanticDiff Response:", JSON.stringify(semanticDiffResponse, null, 2)); + console.log("[ReviewMode DEBUG] Raw semanticDiffs from API:", semanticDiffResponse.semanticDiffs.map((d: SemanticDiff) => ({ + uri: d.uri, + changeType: d.changeType, + changeTypeLabel: getChangeTypeString(d.changeType), + nodeKind: d.nodeKind, + nodeKindLabel: getNodeKindString(d.nodeKind), + lineRange: d.lineRange, + }))); setSemanticDiffData(semanticDiffResponse); const allViews: ReviewView[] = []; @@ -344,6 +357,7 @@ export function ReviewMode(): JSX.Element { }, projectPath: packagePath, label: label, + changeType: ChangeTypeEnum.MODIFICATION, }); }); } @@ -426,6 +440,7 @@ export function ReviewMode(): JSX.Element { const newIndex = currentIndex - 1; setCurrentIndex(newIndex); setCurrentItemMetadata(null); // Clear metadata when navigating + setShowOldVersion(false); // Reset toggle when navigating } else { console.log("[Review Mode] Already at first view"); } @@ -436,6 +451,7 @@ export function ReviewMode(): JSX.Element { const newIndex = currentIndex + 1; setCurrentIndex(newIndex); setCurrentItemMetadata(null); // Clear metadata when navigating + setShowOldVersion(false); // Reset toggle when navigating } else { console.log("[Review Mode] Already at last view"); } @@ -485,6 +501,11 @@ export function ReviewMode(): JSX.Element { // Create a unique key for each diagram to force re-mount when switching views const diagramKey = `${currentView.type}-${currentIndex}-${currentView.filePath}`; + // For DELETION views, always show old version + console.log(`[ReviewMode DEBUG] renderDiagram: type=${currentView.type}, changeType=${currentView.changeType} (${getChangeTypeString(currentView.changeType)}), showOldVersion=${showOldVersion}, isDeletion=${currentView.changeType === ChangeTypeEnum.DELETION}, isModification=${currentView.changeType === ChangeTypeEnum.MODIFICATION}`); + const effectiveShowOld = currentView.changeType === ChangeTypeEnum.DELETION ? true : showOldVersion; + console.log(`[ReviewMode DEBUG] effectiveShowOld=${effectiveShowOld}, canToggleVersion=${currentView.changeType === ChangeTypeEnum.MODIFICATION}`); + switch (currentView.type) { case "component": // Metadata is now set by useEffect hook @@ -494,6 +515,7 @@ export function ReviewMode(): JSX.Element { projectPath={currentView.projectPath || projectPath} filePath={currentView.filePath} position={currentView.position} + useFileSchema={effectiveShowOld} /> ); case "flow": @@ -504,6 +526,7 @@ export function ReviewMode(): JSX.Element { filePath={currentView.filePath} position={currentView.position} onModelLoaded={handleModelLoaded} + useFileSchema={effectiveShowOld} /> ); case "type": @@ -513,6 +536,7 @@ export function ReviewMode(): JSX.Element { projectPath={currentView.projectPath || projectPath} filePath={currentView.filePath} onModelLoaded={handleModelLoaded} + useFileSchema={effectiveShowOld} /> ); default: @@ -561,6 +585,7 @@ export function ReviewMode(): JSX.Element { const canGoPrevious = currentIndex > 0; const canGoNext = currentIndex < views.length - 1; + const canToggleVersion = currentView?.changeType === ChangeTypeEnum.MODIFICATION; const isAutomation = currentItemMetadata?.type === "Function" && currentItemMetadata?.name === "main"; const isResource = currentItemMetadata?.type === "Resource"; const isType = currentItemMetadata?.type === "Type"; @@ -637,6 +662,9 @@ export function ReviewMode(): JSX.Element { onReject={handleReject} canGoPrevious={canGoPrevious} canGoNext={canGoNext} + showOldVersion={currentView?.changeType === ChangeTypeEnum.DELETION ? true : showOldVersion} + onToggleVersion={() => setShowOldVersion((prev) => !prev)} + canToggleVersion={canToggleVersion} /> </ReviewContainer> ); From 7fd8a291e91f615be7cf2bb8d114db0cbd32d7a2 Mon Sep 17 00:00:00 2001 From: Anjana Supun <anjanasupun05@gmail.com> Date: Sun, 15 Feb 2026 22:29:36 +0530 Subject: [PATCH 221/247] Remove debug logs --- .../src/features/ai/utils/ai-client.ts | 1 - .../src/rpc-managers/ai-panel/rpc-manager.ts | 5 ----- .../src/views/ReviewMode/index.tsx | 13 ------------- 3 files changed, 19 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts index 3c2ed951b90..dd1ecc17da5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts @@ -161,7 +161,6 @@ export const getAnthropicClient = async (model: AnthropicModel): Promise<any> => // Recreate client if login method has changed or no cached instance if (!cachedAnthropic || cachedAuthMethod !== loginMethod) { let url = BACKEND_URL + "/intelligence-api/v1.0/claude"; - // let url = "http://localhost:9090/intel/claude" if (loginMethod === LoginMethod.BI_INTEL || loginMethod === LoginMethod.DEVANT_ENV) { cachedAnthropic = createAnthropic({ baseURL: 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 441b81088dd..9b46f21f63c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts @@ -404,11 +404,6 @@ export class AiPanelRpcManager implements AIPanelAPI { try { const res: SemanticDiffResponse = await context.langClient.getSemanticDiff(params); console.log(">>> semantic diff response from ls", JSON.stringify(res)); - if (res?.semanticDiffs) { - for (const diff of res.semanticDiffs) { - console.log(`>>> [SemanticDiff DEBUG] uri=${diff.uri}, changeType=${diff.changeType} (ADDITION=0, MODIFICATION=1, DELETION=2), nodeKind=${diff.nodeKind}, lineRange=${JSON.stringify(diff.lineRange)}`); - } - } return res; } catch (error) { console.log(">>> error in getting semantic diff", error); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx index 12358b36010..9d430dd7001 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/ReviewMode/index.tsx @@ -183,8 +183,6 @@ function convertToReviewView(diff: SemanticDiff, projectPath: string, packageNam const changeTypeStr = getChangeTypeString(diff.changeType); const nodeKindStr = getNodeKindString(diff.nodeKind); - console.log(`[ReviewMode DEBUG] convertToReviewView: uri=${diff.uri}, changeType=${diff.changeType} (${changeTypeStr}), nodeKind=${diff.nodeKind} (${nodeKindStr}), lineRange=${JSON.stringify(diff.lineRange)}`); - // Include package name in label if provided (for multi-package scenarios) const changeLabel = packageName ? `${changeTypeStr}: ${nodeKindStr} in ${packageName}/${fileName}` @@ -326,14 +324,6 @@ export function ReviewMode(): JSX.Element { : await fetchSemanticDiff(rpcClient, tempDirPath); console.log("[ReviewMode] Combined semanticDiff Response:", JSON.stringify(semanticDiffResponse, null, 2)); - console.log("[ReviewMode DEBUG] Raw semanticDiffs from API:", semanticDiffResponse.semanticDiffs.map((d: SemanticDiff) => ({ - uri: d.uri, - changeType: d.changeType, - changeTypeLabel: getChangeTypeString(d.changeType), - nodeKind: d.nodeKind, - nodeKindLabel: getNodeKindString(d.nodeKind), - lineRange: d.lineRange, - }))); setSemanticDiffData(semanticDiffResponse); const allViews: ReviewView[] = []; @@ -501,10 +491,7 @@ export function ReviewMode(): JSX.Element { // Create a unique key for each diagram to force re-mount when switching views const diagramKey = `${currentView.type}-${currentIndex}-${currentView.filePath}`; - // For DELETION views, always show old version - console.log(`[ReviewMode DEBUG] renderDiagram: type=${currentView.type}, changeType=${currentView.changeType} (${getChangeTypeString(currentView.changeType)}), showOldVersion=${showOldVersion}, isDeletion=${currentView.changeType === ChangeTypeEnum.DELETION}, isModification=${currentView.changeType === ChangeTypeEnum.MODIFICATION}`); const effectiveShowOld = currentView.changeType === ChangeTypeEnum.DELETION ? true : showOldVersion; - console.log(`[ReviewMode DEBUG] effectiveShowOld=${effectiveShowOld}, canToggleVersion=${currentView.changeType === ChangeTypeEnum.MODIFICATION}`); switch (currentView.type) { case "component": From a6da70acfa004b9300ab5a3d92da2405d16ca84a Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 16 Feb 2026 09:26:55 +0530 Subject: [PATCH 222/247] Bump markdown-it to 14.1.1 --- common/config/rush/pnpm-lock.yaml | 18 +++++++++--------- .../ballerina-side-panel/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d4ee2c33ca0..bd6e1e42c5d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1023,8 +1023,8 @@ importers: specifier: 4.17.23 version: 4.17.23 markdown-it: - specifier: 14.1.0 - version: 14.1.0 + specifier: 14.1.1 + version: 14.1.1 prosemirror-commands: specifier: 1.7.1 version: 1.7.1 @@ -18862,8 +18862,8 @@ packages: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} hasBin: true - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true markdown-table@3.0.4: @@ -28950,7 +28950,7 @@ snapshots: get-value: 3.0.1 graphql: 16.11.0 graphql-language-service: 5.5.0(graphql@16.11.0) - markdown-it: 14.1.0 + markdown-it: 14.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) set-value: 4.1.0 @@ -40767,7 +40767,7 @@ snapshots: hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 leven: 3.1.0 - markdown-it: 14.1.0 + markdown-it: 14.1.1 mime: 1.6.0 minimatch: 3.1.2 parse-semver: 1.1.1 @@ -40803,7 +40803,7 @@ snapshots: hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 leven: 3.1.0 - markdown-it: 14.1.0 + markdown-it: 14.1.1 mime: 1.6.0 minimatch: 3.1.2 parse-semver: 1.1.1 @@ -50577,7 +50577,7 @@ snapshots: mdurl: 1.0.1 uc.micro: 1.0.6 - markdown-it@14.1.0: + markdown-it@14.1.1: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -53365,7 +53365,7 @@ snapshots: prosemirror-markdown@1.13.2: dependencies: '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 + markdown-it: 14.1.1 prosemirror-model: 1.25.4 prosemirror-model@1.25.4: diff --git a/workspaces/ballerina/ballerina-side-panel/package.json b/workspaces/ballerina/ballerina-side-panel/package.json index c6e09e677d2..8c63a27064d 100644 --- a/workspaces/ballerina/ballerina-side-panel/package.json +++ b/workspaces/ballerina/ballerina-side-panel/package.json @@ -30,7 +30,7 @@ "@wso2/ballerina-rpc-client": "workspace:*", "@wso2/ui-toolkit": "workspace:*", "lodash": "4.17.23", - "markdown-it": "14.1.0", + "markdown-it": "14.1.1", "prosemirror-commands": "1.7.1", "prosemirror-gapcursor": "1.4.0", "prosemirror-history": "1.5.0", From f687973da1dee6a826baa1bf11ad4baa8b842c0e Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Thu, 12 Feb 2026 16:52:17 +0530 Subject: [PATCH 223/247] Add Configuration Collector tool for secure Config.toml management Introduces a configuration collection system for managing sensitive values (API keys, tokens, passwords) in BI projects through Config.toml. Features: - 4 operation modes: CREATE, CREATE_AND_COLLECT, COLLECT, CHECK - Support for main and test configurations - Human-in-the-loop approval with value pre-population - Secure handling - never exposes actual values to agent - UI components for user input and chat display - Comprehensive TOML utilities for parsing and validation --- .../src/rpc-types/ai-panel/index.ts | 4 + .../src/rpc-types/ai-panel/interfaces.ts | 10 + .../src/rpc-types/ai-panel/rpc-type.ts | 4 + .../ballerina-core/src/state-machine-types.ts | 35 +- .../src/features/ai/agent/np/prompts.ts | 8 + .../src/features/ai/agent/prompts.ts | 8 +- .../src/features/ai/agent/tool-registry.ts | 9 + .../ai/agent/tools/config-collector.ts | 565 ++++++++++++++++++ .../src/features/ai/state/ApprovalManager.ts | 159 ++++- .../features/ai/state/ApprovalViewManager.ts | 4 +- .../src/features/ai/utils/ai-utils.ts | 4 + .../src/features/ai/utils/events.ts | 4 + .../src/rpc-managers/ai-panel/rpc-handler.ts | 6 + .../src/rpc-managers/ai-panel/rpc-manager.ts | 8 + .../src/utils/toml-utils.ts | 331 ++++++++++ .../src/rpc-clients/ai-panel/rpc-client.ts | 12 + .../ballerina-visualizer/src/MainPanel.tsx | 10 + .../ballerina-visualizer/src/PopupPanel.tsx | 9 + .../views/AIPanel/components/AIChat/index.tsx | 49 ++ .../AIPanel/components/AIChat/segment.ts | 19 +- .../ConfigurationCollectorSegment.tsx | 231 +++++++ .../views/BI/ConfigurationCollector/index.tsx | 284 +++++++++ 22 files changed, 1748 insertions(+), 25 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx 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 3235186fc43..db39742c0b4 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 @@ -39,6 +39,8 @@ import { TaskDeclineRequest, ConnectorSpecRequest, ConnectorSpecCancelRequest, + ConfigurationProvideRequest, + ConfigurationCancelRequest, UIChatMessage, CheckpointInfo, AbortAIGenerationRequest, @@ -93,6 +95,8 @@ export interface AIPanelAPI { declineTask: (params: TaskDeclineRequest) => Promise<void>; provideConnectorSpec: (params: ConnectorSpecRequest) => Promise<void>; cancelConnectorSpec: (params: ConnectorSpecCancelRequest) => Promise<void>; + provideConfiguration: (params: ConfigurationProvideRequest) => Promise<void>; + cancelConfiguration: (params: ConfigurationCancelRequest) => Promise<void>; // ================================== // Chat State Management // ================================== 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 2ebaa0aff25..d53612a16ed 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 @@ -436,6 +436,16 @@ export interface ConnectorSpecCancelRequest { comment?: string; } +export interface ConfigurationProvideRequest { + requestId: string; + configValues: Record<string, string>; +} + +export interface ConfigurationCancelRequest { + requestId: string; + comment?: string; +} + export type ErrorCode = { code: number; message: string; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/rpc-type.ts index 6742364ca36..9cadd3e9462 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 @@ -41,6 +41,8 @@ import { TaskDeclineRequest, ConnectorSpecRequest, ConnectorSpecCancelRequest, + ConfigurationProvideRequest, + ConfigurationCancelRequest, UIChatMessage, CheckpointInfo, AbortAIGenerationRequest, @@ -85,6 +87,8 @@ export const approveTask: RequestType<ApproveTaskRequest, void> = { method: `${_ export const declineTask: RequestType<TaskDeclineRequest, void> = { method: `${_preFix}/declineTask` }; export const provideConnectorSpec: RequestType<ConnectorSpecRequest, void> = { method: `${_preFix}/provideConnectorSpec` }; export const cancelConnectorSpec: RequestType<ConnectorSpecCancelRequest, void> = { method: `${_preFix}/cancelConnectorSpec` }; +export const provideConfiguration: RequestType<ConfigurationProvideRequest, void> = { method: `${_preFix}/provideConfiguration` }; +export const cancelConfiguration: RequestType<ConfigurationCancelRequest, void> = { method: `${_preFix}/cancelConfiguration` }; export const getChatMessages: NotificationType<void> = { method: `${_preFix}/getChatMessages` }; export const getCheckpoints: NotificationType<void> = { method: `${_preFix}/getCheckpoints` }; export const restoreCheckpoint: RequestType<RestoreCheckpointRequest, void> = { method: `${_preFix}/restoreCheckpoint` }; diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index b56a181e16d..4d670a6c440 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -103,7 +103,8 @@ export enum MACHINE_VIEW { ServiceFunctionForm = "Service Function Form", BISamplesView = "BI Samples View", ReviewMode = "Review Mode SKIP", - EvalsetViewer = "Evalset Viewer SKIP" + EvalsetViewer = "Evalset Viewer SKIP", + ConfigurationCollector = "Configuration Collector" } export interface MachineEvent { @@ -168,7 +169,20 @@ export interface ArtifactData { identifier?: string; } +export interface ConfigurationCollectorMetadata { + requestId: string; + variables: Array<{ + name: string; + description: string; + type?: "string" | "int"; + }>; + existingValues?: Record<string, string>; + message: string; + isTestConfig?: boolean; +} + export interface AgentMetadata { + configurationCollector?: ConfigurationCollectorMetadata; } export interface ApprovalOverlayState { @@ -326,6 +340,7 @@ export type ChatNotify = | TaskApprovalRequest | GeneratedSourcesEvent | ConnectorGenerationNotification + | ConfigurationCollectionEvent | CodeReviewActions | PlanUpdated; @@ -446,6 +461,24 @@ export interface ConnectorGenerationNotification { message: string; } +export interface ConfigurationCollectionEvent { + type: "configuration_collection_event"; + requestId: string; + stage: "creating_file" | "collecting" | "done" | "skipped" | "error"; + variables?: Array<{ + name: string; + description: string; + type?: "string" | "int"; + }>; + existingValues?: Record<string, string>; + message: string; + isTestConfig?: boolean; + error?: { + message: string; + code: string; + }; +} + export interface CodeReviewActions { type: "review_actions"; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts index 5a74ec2e419..f241e52f691 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts @@ -14,6 +14,8 @@ // specific language governing permissions and limitations // under the License. +import { CONFIG_COLLECTOR_TOOL } from "../tools/config-collector"; + export const REQUIREMENTS_DOCUMENT_KEY: string = "user_requirements_file"; export function getRequirementAnalysisCodeGenPrefix(requirementAnalysisDocument: string) { @@ -93,6 +95,12 @@ You are an expert test automation engineer specializing in generating test artif 2. Create Ballerina test module with: - Network client configurations (if required, e.g., HTTP, GraphQL, WebSocket, etc.) + - Setup test configuration (if main code uses it): + * If main code uses configuration values (API keys, tokens, passwords), use ${CONFIG_COLLECTOR_TOOL} + * Set mode: "collect", isTestConfig: true + * Tell user: "Setting up test configuration based on main configuration" + * The tool will automatically handle reading from main config and saving to tests/Config.toml + * Example: { mode: "collect", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }], isTestConfig: true } - Test data factories - Reusable validation functions diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts index 2c43f9c9662..45321533fcc 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts @@ -20,6 +20,7 @@ import { LIBRARY_SEARCH_TOOL } from "./tools/library-search"; import { TASK_WRITE_TOOL_NAME } from "./tools/task-writer"; import { FILE_BATCH_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from "./tools/text-editor"; import { CONNECTOR_GENERATOR_TOOL } from "./tools/connector-generator"; +import { CONFIG_COLLECTOR_TOOL } from "./tools/config-collector"; import { getLanglibInstructions } from "../utils/libs/langlibs"; import { formatCodebaseStructure, formatCodeContext } from "./utils"; import { GenerateAgentCodeRequest, OperationType, ProjectSource } from "@wso2/ballerina-core"; @@ -152,6 +153,11 @@ ${getLanglibInstructions()} ## Code Structure - Define required configurables for the query. Use only string, int, decimal, boolean types in configurable variables. +- For sensitive configuration values (API keys, tokens, passwords), use ${CONFIG_COLLECTOR_TOOL} in COLLECT mode. Variable names are converted to lowercase without underscores in Config.toml. You MUST use the exact Config.toml names in your Ballerina configurables to avoid runtime errors. +- When generating tests that need configuration values: + - Use COLLECT mode with isTestConfig: true + - The tool will automatically read existing values from Config.toml (if exists), ask user to reuse or modify for testing, and save to tests/Config.toml + - Example: { mode: "collect", variables: [...], isTestConfig: true } - Initialize any necessary clients with the correct configuration based on the retrieved libraries at the module level (before any function or service declarations). - Implement the main function OR service to address the query requirements. @@ -181,7 +187,7 @@ ${getLanglibInstructions()} )} tools. The complete existing source code will be provided in the <existing_code> section of the user prompt. - When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. - Do NOT create a new markdown file to document each change or summarize your work unless specifically requested by the user. -- Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml) as you don't have access to those files. +- Do not manually add/modify toml files (Ballerina.toml/Dependencies.toml). For Config.toml configuration management, use ${CONFIG_COLLECTOR_TOOL}. - Prefer modifying existing bal files over creating new files unless explicitly asked to create a new file in the query. ${getNPSuffix(projects, op)} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts index abfc0266bb9..003b2a3ce37 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts @@ -40,6 +40,7 @@ import { GenerationType } from '../utils/libs/libraries'; import { getHealthcareLibraryProviderTool, HEALTHCARE_LIBRARY_PROVIDER_TOOL } from './tools/healthcare-library'; import { createConnectorGeneratorTool, CONNECTOR_GENERATOR_TOOL } from './tools/connector-generator'; import { LIBRARY_SEARCH_TOOL, getLibrarySearchTool } from './tools/library-search'; +import { createConfigCollectorTool, CONFIG_COLLECTOR_TOOL } from './tools/config-collector'; export interface ToolRegistryOptions { eventHandler: CopilotEventHandler; @@ -79,6 +80,14 @@ export function createToolRegistry(opts: ToolRegistryOptions) { projects[0].projectName, modifiedFiles ), + [CONFIG_COLLECTOR_TOOL]: createConfigCollectorTool( + eventHandler, + { + tempPath: tempProjectPath, + workspacePath: workspaceId + }, + modifiedFiles + ), [FILE_WRITE_TOOL_NAME]: createWriteTool( createWriteExecute(eventHandler, tempProjectPath, modifiedFiles) ), diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts new file mode 100644 index 00000000000..92b253bc92b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts @@ -0,0 +1,565 @@ +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { tool } from "ai"; +import * as crypto from "crypto"; +import * as fs from "fs"; +import * as path from "path"; +import { z } from "zod"; +import { CopilotEventHandler } from "../../utils/events"; +import { approvalManager } from "../../state/ApprovalManager"; +import { + ConfigVariable, + createConfigWithPlaceholders, + checkConfigurationStatus, + validateVariableName, + writeConfigValuesToConfig, + createStatusMetadata, + readExistingConfigValues, +} from "../../../../utils/toml-utils"; + +export const CONFIG_COLLECTOR_TOOL = "ConfigCollector"; + +// Constants for config file paths +const CONFIG_FILE_PATH = "Config.toml"; +const TEST_CONFIG_FILE_PATH = "tests/Config.toml"; + +const ConfigVariableSchema = z.object({ + name: z.string().describe("Variable name (e.g., API_KEY)"), + description: z.string().describe("Human-readable description"), + type: z.enum(["string", "int"]).optional().describe("Data type: string (default) or int"), +}); + +const ConfigCollectorSchema = z.object({ + mode: z.enum(["create", "create_and_collect", "collect", "check"]).describe("Operation mode"), + filePath: z.string().optional().describe("Path to config file (for check mode)"), + variables: z.array(ConfigVariableSchema).optional().describe("Configuration variables"), + variableNames: z.array(z.string()).optional().describe("Variable names for check mode"), + isTestConfig: z.boolean().optional().describe("Set to true when collecting configuration for tests. Tool will automatically read from Config.toml and write to tests/Config.toml"), +}); + +interface ConfigCollectorInput { + mode: "create" | "create_and_collect" | "collect" | "check"; + filePath?: string; + variables?: ConfigVariable[]; + variableNames?: string[]; + isTestConfig?: boolean; +} + +export interface ConfigCollectorResult { + success: boolean; + message: string; + status?: Record<string, "filled" | "missing">; + error?: string; + errorCode?: string; +} + +export interface ConfigCollectorPaths { + tempPath: string; // Where files are created/modified during execution + workspacePath: string; // Original workspace for reading existing configs +} + +// Helper functions +function getConfigPath(basePath: string, isTestConfig?: boolean): string { + return isTestConfig + ? path.join(basePath, "tests", "Config.toml") + : path.join(basePath, "Config.toml"); +} + +function getConfigFileName(isTestConfig?: boolean): string { + return isTestConfig ? TEST_CONFIG_FILE_PATH : CONFIG_FILE_PATH; +} + +function validateConfigVariables( + variables: ConfigVariable[] +): ConfigCollectorResult | null { + for (const variable of variables) { + if (!validateVariableName(variable.name)) { + return createErrorResult( + "INVALID_VARIABLE_NAME", + `Invalid variable name: ${variable.name}. Use uppercase with underscores (e.g., API_KEY)` + ); + } + } + return null; // Valid +} + +function createErrorResult(errorCode: string, message: string): ConfigCollectorResult { + return { + success: false, + message, + error: message, + errorCode, + }; +} + +export function createConfigCollectorTool( + eventHandler: CopilotEventHandler, + paths: ConfigCollectorPaths, + modifiedFiles?: string[] +) { + return tool({ + description: ` +Manages configuration values in Config.toml for Ballerina integrations securely. Use this tool when user requirements involve API keys, passwords, database credentials, or other sensitive configuration. + +IMPORTANT: Before calling COLLECT or CREATE_AND_COLLECT modes, briefly tell the user what configuration values you need and why. + +Operation Modes: +1. CREATE: Create Config.toml with placeholder variables only + - Use when you need to set up config structure before collecting configuration values + - Example: { mode: "create", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }] } + +2. CREATE_AND_COLLECT: Create config AND immediately request configuration values (most efficient) + - Use for new integrations that need configuration values right away + - Tell user first what you need + - Example: { mode: "create_and_collect", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }] } + +3. COLLECT: Request configuration values from user + - Creates Config.toml if it doesn't exist + - Pre-populates existing values for easy editing + - Use when Config.toml already exists and needs configuration values + - Tell user first what you need + - Example: { mode: "collect", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }] } + +4. CHECK: Check which configuration values are filled/missing + - Returns status metadata only, NEVER actual configuration values + - Example: { mode: "check", variableNames: ["API_KEY", "DB_PASSWORD"], filePath: "Config.toml" } + - Returns: { success: true, status: { API_KEY: "filled", DB_PASSWORD: "missing" } } + +5. COLLECT with isTestConfig: Request configuration values for test Config.toml + - Use when generating tests that need configuration values + - Set isTestConfig: true + - Tool automatically: + * Reads existing configuration from Config.toml (if exists) + * Writes to tests/Config.toml + * Creates tests/ directory if needed + - UI behavior depends on what's in main config: + * If placeholders found: Shows "Configuration values needed" + * If actual values found: Shows "Found existing values. You can reuse or update them for testing." + * If mixed: Shows "Complete the remaining configuration values" + - Works even if main Config.toml doesn't exist (shows empty form) + - Example: { mode: "collect", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }], isTestConfig: true } + +IMPORTANT: When generating tests that use configurables, ALWAYS use isTestConfig: true. +This ensures tests have their own Config.toml in the tests/ directory. + +VARIABLE NAMING (CRITICAL): +Variable names are converted: API_KEY → apikey, DB_HOST → dbhost (lowercase, no underscores). +You MUST use identical names in Config.toml and Ballerina code. + +Correct: + Tool: { name: "DB_HOST" } + Config.toml: dbhost = "localhost" + Code: configurable string dbhost = ?; + +Incorrect (DO NOT DO): + Tool: { name: "DB_HOST" } + Config.toml: dbhost = "localhost" + Code: configurable string dbHost = ?; // WRONG - mismatch causes runtime error + +SECURITY: +- You NEVER see actual configuration values +- Tool returns only status: { API_KEY: "filled" } +- NEVER hardcode configuration values in code`, + inputSchema: ConfigCollectorSchema, + execute: async (input) => { + return await ConfigCollectorTool( + input as ConfigCollectorInput, + eventHandler, + paths, + modifiedFiles + ); + }, + }); +} + +/** + * Analyze existing configuration values to determine their status and appropriate UI message + */ +function analyzeExistingConfig( + existingValues: Record<string, string>, + variableNames: string[] +): { + hasActualValues: boolean; + hasPlaceholders: boolean; + filledCount: number; + message: string; +} { + let filledCount = 0; + let placeholderCount = 0; + + for (const name of variableNames) { + const value = existingValues[name]; + if (value && !value.startsWith('${')) { + filledCount++; + } else { + placeholderCount++; + } + } + + let message = ""; + if (filledCount === 0) { + message = "Configuration values needed"; + } else if (placeholderCount === 0) { + message = "Found existing values. You can reuse or update them."; + } else { + message = "Complete the remaining configuration values"; + } + + return { + hasActualValues: filledCount > 0, + hasPlaceholders: placeholderCount > 0, + filledCount, + message + }; +} + +export async function ConfigCollectorTool( + input: ConfigCollectorInput, + eventHandler: CopilotEventHandler, + paths: ConfigCollectorPaths, + modifiedFiles?: string[] +): Promise<ConfigCollectorResult> { + if (!eventHandler) { + return createErrorResult("INVALID_INPUT", "Event handler is required"); + } + + const requestId = crypto.randomUUID(); + + try { + switch (input.mode) { + case "create": + return await handleCreateMode( + input.variables, + paths, + eventHandler, + requestId, + input.isTestConfig, + modifiedFiles + ); + + case "create_and_collect": + return await handleCreateAndCollectMode( + input.variables, + paths, + eventHandler, + requestId, + input.isTestConfig, + modifiedFiles + ); + + case "collect": + return await handleCollectMode( + input.variables, + paths, + eventHandler, + requestId, + input.isTestConfig, + modifiedFiles + ); + + case "check": + return await handleCheckMode( + input.variableNames, + input.filePath, + paths + ); + + default: + // TypeScript should prevent this with discriminated unions + return createErrorResult("INVALID_MODE", `Unknown mode: ${(input as any).mode}`); + } + } catch (error: any) { + return handleError(error, requestId, eventHandler); + } +} + +async function handleCreateMode( + variables: ConfigVariable[], + paths: ConfigCollectorPaths, + eventHandler: CopilotEventHandler, + requestId: string, + isTestConfig?: boolean, + modifiedFiles?: string[] +): Promise<ConfigCollectorResult> { + // Validate variable names + const validationError = validateConfigVariables(variables); + if (validationError) { return validationError; } + + // Determine output path based on isTestConfig flag + const configPath = getConfigPath(paths.tempPath, isTestConfig); + const configFileName = getConfigFileName(isTestConfig); + + console.log(`[ConfigCollector] CREATE mode - Creating ${configFileName} with placeholders`); + + // Emit creating_file stage + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "creating_file", + message: isTestConfig + ? "Creating configuration file for tests..." + : "Creating configuration file...", + isTestConfig, + }); + + // Create config with placeholder values + createConfigWithPlaceholders(configPath, variables, false); + + // Track modified file + if (modifiedFiles) { + if (!modifiedFiles.includes(configFileName)) { + modifiedFiles.push(configFileName); + } + } + + // Emit done stage + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "done", + message: isTestConfig + ? "Configuration file for tests created" + : "Configuration file created", + isTestConfig, + }); + + return { + success: true, + message: `Created ${configFileName} with ${variables.length} placeholder variable(s). Use collect mode to request configuration values from user.`, + }; +} + +async function handleCreateAndCollectMode( + variables: ConfigVariable[], + paths: ConfigCollectorPaths, + eventHandler: CopilotEventHandler, + requestId: string, + isTestConfig?: boolean, + modifiedFiles?: string[] +): Promise<ConfigCollectorResult> { + // First create the config in temp + const createResult = await handleCreateMode( + variables, + paths, + eventHandler, + requestId, + isTestConfig, + modifiedFiles + ); + + if (!createResult.success) { + return createResult; + } + + // Then immediately collect configuration values and write to temp + // Temp files are automatically synced to workspace by agent system + return await handleCollectMode( + variables, + paths, + eventHandler, + requestId, + isTestConfig, + modifiedFiles + ); +} + +async function handleCollectMode( + variables: ConfigVariable[], + paths: ConfigCollectorPaths, + eventHandler: CopilotEventHandler, + requestId: string, + isTestConfig?: boolean, + modifiedFiles?: string[] +): Promise<ConfigCollectorResult> { + // Validate variable names + const validationError = validateConfigVariables(variables); + if (validationError) { return validationError; } + + // Determine paths based on isTestConfig flag + const configPath = getConfigPath(paths.tempPath, isTestConfig); + const sourceConfigPath = isTestConfig + ? path.join(paths.tempPath, "Config.toml") // Read from main config + : configPath; // Read from same file + + // Create config file if it doesn't exist + if (!fs.existsSync(configPath)) { + console.log(`[ConfigCollector] Creating ${getConfigFileName(isTestConfig)}`); + + // Emit creating_file stage + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "creating_file", + message: isTestConfig + ? "Setting up tests/Config.toml..." + : "Setting up Config.toml...", + isTestConfig, + }); + + createConfigWithPlaceholders(configPath, variables, false); + + // Track modified file + if (modifiedFiles) { + const configFileName = getConfigFileName(isTestConfig); + if (!modifiedFiles.includes(configFileName)) { + modifiedFiles.push(configFileName); + } + } + } + + // Read existing configuration values from source config (if they exist) + const existingValues = readExistingConfigValues( + sourceConfigPath, + variables.map(v => v.name) + ); + + // Analyze existing values to determine appropriate messaging + const analysis = analyzeExistingConfig( + existingValues, + variables.map(v => v.name) + ); + + console.log(`[ConfigCollector] ${isTestConfig ? 'Test' : 'Main'} configuration: ${analysis.filledCount} filled`); + + // Determine the message to show to user + const userMessage = isTestConfig + ? (analysis.hasActualValues + ? "Found existing values. You can reuse or update them for testing." + : "Test configuration values needed") + : (analysis.hasActualValues + ? "Update configuration values" + : "Configuration values needed"); + + // Request configuration values from user via ApprovalManager + // This returns ACTUAL values (not exposed to agent) + const userResponse = await approvalManager.requestConfiguration( + requestId, + variables, + existingValues, + eventHandler, + isTestConfig, + userMessage + ); + + if (!userResponse.provided) { + // User cancelled + const configFileName = getConfigFileName(isTestConfig); + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "skipped", + message: `Configuration collection cancelled${userResponse.comment ? ": " + userResponse.comment : ""}`, + isTestConfig, + }); + + return { + success: false, + message: `User cancelled configuration collection${userResponse.comment ? ": " + userResponse.comment : ""}. ${configFileName} has placeholder values. You can ask user to provide values later using collect mode.`, + error: `User cancelled${userResponse.comment ? ": " + userResponse.comment : ""}`, + errorCode: "USER_CANCELLED", + }; + } + + // Write actual configuration values to determined config path + writeConfigValuesToConfig(configPath, userResponse.configValues!, variables); + + // Track modified file for syncing to workspace + if (modifiedFiles) { + const configFileName = getConfigFileName(isTestConfig); + if (!modifiedFiles.includes(configFileName)) { + modifiedFiles.push(configFileName); + } + } + + // Convert to status metadata (filled/missing) - NEVER return actual values to agent + const statusMetadata = createStatusMetadata(userResponse.configValues!); + + // Clear values from memory + userResponse.configValues = undefined; + + // Success - configuration values were collected and written + const configFileName = getConfigFileName(isTestConfig); + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "done", + message: isTestConfig + ? "Test configuration saved to tests/Config.toml" + : "Configuration saved to Config.toml", + isTestConfig, + }); + + return { + success: true, + message: `Successfully collected ${variables.length} configuration value(s) and saved to ${configFileName}${userResponse.comment ? ". User note: " + userResponse.comment : ""}`, + status: statusMetadata, + }; +} + +async function handleCheckMode( + variableNames: string[], + filePath: string | undefined, + paths: ConfigCollectorPaths +): Promise<ConfigCollectorResult> { + // Determine config path (use provided path or default) + let configPath: string; + if (filePath) { + // Use provided path relative to workspace + configPath = path.join(paths.workspacePath, filePath); + } else { + // Default to workspace Config.toml + configPath = path.join(paths.workspacePath, "Config.toml"); + } + + // Check configuration value status + const status = checkConfigurationStatus(configPath, variableNames); + + const filledCount = Object.values(status).filter((s) => s === "filled").length; + const missingCount = Object.values(status).filter((s) => s === "missing").length; + + return { + success: true, + message: `Checked ${variableNames.length} configuration value(s): ${filledCount} filled, ${missingCount} missing`, + status, + }; +} + +function handleError( + error: any, + requestId: string, + eventHandler: CopilotEventHandler +): ConfigCollectorResult { + console.error("[ConfigCollector] Error:", error); + + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "error", + message: `Error: ${error.message}`, + error: { + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }, + }); + + return { + success: false, + message: `Failed to manage configuration: ${error.message}`, + error: error.message, + errorCode: error.code || "UNKNOWN_ERROR", + }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts index c61dcf4d2f5..a6a51c317b4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts @@ -16,8 +16,11 @@ * under the License. */ -import { Task } from '@wso2/ballerina-core/lib/state-machine-types'; -import { CopilotEventHandler } from '../utils/events'; +import { Task, MACHINE_VIEW } from "@wso2/ballerina-core/lib/state-machine-types"; +import { CopilotEventHandler } from "../utils/events"; +import { ConfigVariable } from "src/utils/toml-utils"; +import { StateMachine } from "../../../stateMachine"; +import { approvalViewManager } from './ApprovalViewManager'; /** * Plan approval response @@ -45,6 +48,15 @@ export interface ConnectorSpecResponse { comment?: string; } +/** + * Configuration response containing actual values (converted to metadata before exposing to agent) + */ +export interface ConfigurationResponse { + provided: boolean; + configValues?: Record<string, string>; + comment?: string; +} + /** * Generic promise resolver for approval requests */ @@ -67,6 +79,7 @@ export class ApprovalManager { private planApprovals = new Map<string, PromiseResolver<PlanApprovalResponse>>(); private taskApprovals = new Map<string, PromiseResolver<TaskApprovalResponse>>(); private connectorSpecs = new Map<string, PromiseResolver<ConnectorSpecResponse>>(); + private configurationRequests = new Map<string, PromiseResolver<ConfigurationResponse>>(); // Default timeout for abandoned approvals (30 minutes) private readonly DEFAULT_TIMEOUT_MS = 30 * 60 * 1000; @@ -98,7 +111,7 @@ export class ApprovalManager { requestPlanApproval( requestId: string, tasks: Task[], - eventHandler: CopilotEventHandler + eventHandler: CopilotEventHandler, ): Promise<PlanApprovalResponse> { console.log(`[ApprovalManager] Requesting plan approval: ${requestId}`); @@ -108,7 +121,7 @@ export class ApprovalManager { requestId: requestId, approvalType: "plan", tasks: tasks, - message: "Please review the implementation plan" + message: "Please review the implementation plan", }); // Create promise that will be resolved by resolvePlanApproval() @@ -168,7 +181,7 @@ export class ApprovalManager { requestId: string, taskDescription: string, tasks: Task[], - eventHandler: CopilotEventHandler + eventHandler: CopilotEventHandler, ): Promise<TaskApprovalResponse> { console.log(`[ApprovalManager] Requesting task approval: ${requestId}`); @@ -179,7 +192,7 @@ export class ApprovalManager { approvalType: "completion", tasks: tasks, taskDescription: taskDescription, - message: `Please verify the completed work for: ${taskDescription}` + message: `Please verify the completed work for: ${taskDescription}`, }); // Create promise that will be resolved by resolveTaskApproval() @@ -205,7 +218,7 @@ export class ApprovalManager { requestId: string, approved: boolean, comment?: string, - approvedTaskDescription?: string + approvedTaskDescription?: string, ): void { const resolver = this.taskApprovals.get(requestId); if (!resolver) { @@ -239,10 +252,7 @@ export class ApprovalManager { * @param eventHandler - Event handler to emit spec request * @returns Promise that resolves when user provides/cancels spec */ - requestConnectorSpec( - requestId: string, - eventHandler: CopilotEventHandler - ): Promise<ConnectorSpecResponse> { + requestConnectorSpec(requestId: string, eventHandler: CopilotEventHandler): Promise<ConnectorSpecResponse> { console.log(`[ApprovalManager] Requesting connector spec: ${requestId}`); // Emit event to frontend @@ -250,7 +260,7 @@ export class ApprovalManager { type: "connector_generation_notification", requestId: requestId, stage: "requesting_input", - message: "Please provide the OpenAPI specification" + message: "Please provide the OpenAPI specification", }); // Create promise that will be resolved by resolveConnectorSpec() @@ -272,12 +282,7 @@ export class ApprovalManager { * @param spec - The OpenAPI spec (if provided) * @param comment - Optional comment from user */ - resolveConnectorSpec( - requestId: string, - provided: boolean, - spec?: any, - comment?: string - ): void { + resolveConnectorSpec(requestId: string, provided: boolean, spec?: any, comment?: string): void { const resolver = this.connectorSpecs.get(requestId); if (!resolver) { console.warn(`[ApprovalManager] No pending connector spec request for: ${requestId}`); @@ -298,6 +303,107 @@ export class ApprovalManager { this.connectorSpecs.delete(requestId); } + // ============================================ + // Configuration Collection + // ============================================ + + /** + * Request configuration values from user + * Returns actual configuration values to tool (tool converts to metadata for agent) + * Opens a popup in the BI Visualizer for user input + * + * @param isTestConfig - Flag to indicate this is for test configuration (affects UI messaging) + * @param message - Custom message from configuration collector (includes smart analysis for test mode) + */ + requestConfiguration( + requestId: string, + variables: ConfigVariable[], + existingValues: Record<string, string>, + eventHandler: CopilotEventHandler, + isTestConfig?: boolean, + message?: string + ): Promise<ConfigurationResponse> { + console.log(`[ApprovalManager] Requesting ${isTestConfig ? 'test ' : ''}configuration: ${requestId}`); + + // Use provided message or generate default + const displayMessage = message || `Please provide ${variables.length} configuration value(s)`; + + // Emit collecting stage to AI Panel + eventHandler({ + type: "configuration_collection_event", + requestId, + stage: "collecting", + variables, + existingValues, + message: displayMessage, + isTestConfig, + }); + + const { projectPath } = StateMachine.context(); + + // Open configuration collector view + approvalViewManager.openApprovalViewPopup( + requestId, + 'configuration', + { + view: MACHINE_VIEW.ConfigurationCollector, + projectPath, + agentMetadata: { + configurationCollector: { + requestId, + variables, + existingValues, + message: displayMessage, + isTestConfig, + }, + }, + } + ); + + // Create promise that will be resolved by resolveConfiguration() + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + this.configurationRequests.delete(requestId); + reject(new Error(`Configuration request timeout for request ${requestId}`)); + }, this.DEFAULT_TIMEOUT_MS); + + this.configurationRequests.set(requestId, { resolve, reject, timeoutId }); + }); + } + + /** + * Resolve configuration request (called by RPC method when user responds) + * Contains actual configuration values - tool will convert to metadata for agent + */ + resolveConfiguration( + requestId: string, + provided: boolean, + configValues?: Record<string, string>, + comment?: string, + ): void { + const resolver = this.configurationRequests.get(requestId); + if (!resolver) { + console.warn(`[ApprovalManager] No pending configuration request for: ${requestId}`); + return; + } + + console.log(`[ApprovalManager] Resolving configuration request: ${requestId}, provided: ${provided}`); + + // Clear timeout + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + + // Resolve promise with actual configuration values (tool will sanitize before returning to agent) + resolver.resolve({ provided, configValues, comment }); + + // Cleanup + this.configurationRequests.delete(requestId); + + // Cleanup view and clear state machine metadata + approvalViewManager.cleanupView(requestId, true); + } + // ============================================ // Cleanup // ============================================ @@ -310,6 +416,9 @@ export class ApprovalManager { cancelAllPending(reason: string): void { console.log(`[ApprovalManager] Cancelling all pending approvals: ${reason}`); + // Cleanup all approval views + approvalViewManager.cleanupAllViews(); + const error = new Error(reason); // Cancel plan approvals @@ -338,16 +447,26 @@ export class ApprovalManager { resolver.reject(error); } this.connectorSpecs.clear(); + + // Cancel configuration requests + for (const [requestId, resolver] of this.configurationRequests.entries()) { + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + resolver.reject(error); + } + this.configurationRequests.clear(); } /** * Get count of pending approvals (useful for debugging) */ - getPendingCount(): { plans: number; tasks: number; connectorSpecs: number } { + getPendingCount(): { plans: number; tasks: number; connectorSpecs: number; configurations: number } { return { plans: this.planApprovals.size, tasks: this.taskApprovals.size, - connectorSpecs: this.connectorSpecs.size + connectorSpecs: this.connectorSpecs.size, + configurations: this.configurationRequests.size, }; } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts index a5f7f35055e..f88f14010f5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalViewManager.ts @@ -23,7 +23,7 @@ import { openView as openMainView, StateMachine } from '../../../stateMachine'; import { openPopupView, StateMachinePopup } from '../../../stateMachinePopup'; import { notifyApprovalOverlayState } from '../../../RPCLayer'; -export type ApprovalType = 'credential' | 'task' | 'plan' | 'connector_spec'; +export type ApprovalType = 'configuration' | 'task' | 'plan' | 'connector_spec'; interface OpenedApprovalView { requestId: string; @@ -129,7 +129,7 @@ export class ApprovalViewManager { private getOverlayMessage(approvalType: ApprovalType): string { const messages: Record<ApprovalType, string> = { - 'credential': 'Waiting for credentials...', + 'configuration': 'Waiting for configuration...', 'task': 'Waiting for task approval...', 'plan': 'Waiting for plan approval...', 'connector_spec': 'Waiting for connector spec approval...' diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts index ea3166cc05f..83f59b21e9f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts @@ -294,6 +294,10 @@ export function sendConnectorGenerationNotification(event: ChatNotify & { type: sendAIPanelNotification(event); } +export function sendConfigurationCollectionNotification(event: ChatNotify & { type: "configuration_collection_event" }): void { + sendAIPanelNotification(event); +} + function sendAIPanelNotification(msg: ChatNotify): void { RPCLayer._messenger.sendNotification(onChatNotify, { type: "webview", webviewType: AiPanelWebview.viewType }, msg); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts index 7da57209cb7..e2d68b3c377 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts @@ -30,6 +30,7 @@ import { sendAbortNotification, sendSaveChatNotification, sendConnectorGenerationNotification, + sendConfigurationCollectionNotification, sendReviewActionsNotification, } from "./ai-utils"; @@ -103,6 +104,9 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler case "connector_generation_notification": sendConnectorGenerationNotification(event); break; + case "configuration_collection_event": + sendConfigurationCollectionNotification(event); + break; default: console.warn(`Unhandled event type: ${event}`); break; 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 06868551057..8ea82657ac1 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 @@ -28,10 +28,13 @@ import { approveTask, ApproveTaskRequest, cancelConnectorSpec, + cancelConfiguration, clearChat, clearInitialPrompt, ConnectorSpecCancelRequest, ConnectorSpecRequest, + ConfigurationCancelRequest, + ConfigurationProvideRequest, createTestDirecoryIfNotExists, declineChanges, declinePlan, @@ -69,6 +72,7 @@ import { ProcessMappingParametersRequest, promptGithubAuthorize, provideConnectorSpec, + provideConfiguration, RequirementSpecification, restoreCheckpoint, RestoreCheckpointRequest, @@ -123,6 +127,8 @@ export function registerAiPanelRpcHandlers(messenger: Messenger) { messenger.onRequest(declineTask, (args: TaskDeclineRequest) => rpcManger.declineTask(args)); messenger.onRequest(provideConnectorSpec, (args: ConnectorSpecRequest) => rpcManger.provideConnectorSpec(args)); messenger.onRequest(cancelConnectorSpec, (args: ConnectorSpecCancelRequest) => rpcManger.cancelConnectorSpec(args)); + messenger.onRequest(provideConfiguration, (args: ConfigurationProvideRequest) => rpcManger.provideConfiguration(args)); + messenger.onRequest(cancelConfiguration, (args: ConfigurationCancelRequest) => rpcManger.cancelConfiguration(args)); messenger.onRequest(getChatMessages, () => rpcManger.getChatMessages()); messenger.onRequest(getCheckpoints, () => rpcManger.getCheckpoints()); messenger.onRequest(restoreCheckpoint, (args: RestoreCheckpointRequest) => rpcManger.restoreCheckpoint(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 9b46f21f63c..9804fb50513 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 @@ -583,6 +583,14 @@ export class AiPanelRpcManager implements AIPanelAPI { approvalManager.resolveConnectorSpec(params.requestId, false, undefined, params.comment); } + async provideConfiguration(params: { requestId: string; configValues: Record<string, string> }): Promise<void> { + approvalManager.resolveConfiguration(params.requestId, true, params.configValues); + } + + async cancelConfiguration(params: { requestId: string; comment?: string }): Promise<void> { + approvalManager.resolveConfiguration(params.requestId, false, undefined, params.comment); + } + async restoreCheckpoint(params: RestoreCheckpointRequest): Promise<void> { // Get workspace and thread identifiers const workspaceId = StateMachine.context().projectPath; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts new file mode 100644 index 00000000000..347c10155b2 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts @@ -0,0 +1,331 @@ +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as fs from "fs"; +import * as path from "path"; +import { parse, stringify } from "@iarna/toml"; + +export interface PlaceholderInfo { + key: string; + placeholder: string; + variableName: string; +} + +export interface ConfigVariable { + name: string; + description: string; + type?: "string" | "int"; +} + +// Cache regex for performance +const PLACEHOLDER_REGEX = /^\$\{([A-Z_0-9]+)\}$/; + +/** + * Parse Config.toml and identify placeholder variables with pattern ${VARIABLE_NAME} + */ +export function parseConfigPlaceholders(configPath: string): Map<string, PlaceholderInfo> { + const placeholders = new Map<string, PlaceholderInfo>(); + + if (!fs.existsSync(configPath)) { + return placeholders; + } + + try { + const content = fs.readFileSync(configPath, "utf-8"); + const config = parse(content) as Record<string, any>; + + function findPlaceholders(obj: any, prefix: string = "") { + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}.${key}` : key; + + if (typeof value === "string") { + const match = value.match(PLACEHOLDER_REGEX); + if (match) { + const variableName = match[1]; + placeholders.set(variableName, { + key: fullKey, + placeholder: value, + variableName, + }); + } + } else if (typeof value === "object" && value !== null) { + findPlaceholders(value, fullKey); + } + } + } + + findPlaceholders(config); + } catch (error) { + console.error(`[TOML Utils] Error parsing config at ${configPath}:`, error); + throw error; + } + + return placeholders; +} + +/** + * Create or update Config.toml with placeholder variables + */ +export function createConfigWithPlaceholders( + configPath: string, + variables: ConfigVariable[], + overwrite: boolean = false +): void { + let config: Record<string, any> = {}; + + // Read existing config if exists + if (fs.existsSync(configPath)) { + try { + const content = fs.readFileSync(configPath, "utf-8"); + config = parse(content) as Record<string, any>; + } catch (error) { + console.error(`[TOML Utils] Error reading existing config:`, error); + throw error; + } + } + + // Add placeholder variables (convert API_KEY to apikey) + for (const variable of variables) { + const tomlKey = toTomlKey(variable.name); + + if (!config[tomlKey] || overwrite) { + config[tomlKey] = `\${${variable.name}}`; + } + } + + // Write back to file + try { + const dirPath = path.dirname(configPath); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } + + const tomlContent = stringify(config); + fs.writeFileSync(configPath, tomlContent, "utf-8"); + + console.log(`[TOML Utils] Created/updated Config.toml with ${variables.length} placeholder(s)`); + } catch (error) { + console.error(`[TOML Utils] Error writing config:`, error); + throw error; + } +} + +/** + * Check configuration value status - returns metadata only, never actual values + */ +export function checkConfigurationStatus( + configPath: string, + variableNames: string[] +): Record<string, "filled" | "missing"> { + const status: Record<string, "filled" | "missing"> = {}; + + if (!fs.existsSync(configPath)) { + for (const name of variableNames) { + status[name] = "missing"; + } + return status; + } + + try { + const content = fs.readFileSync(configPath, "utf-8"); + const config = parse(content) as Record<string, any>; + + for (const name of variableNames) { + const tomlKey = toTomlKey(name); + const value = getNestedValue(config, tomlKey); + + if (value === undefined || value === null) { + status[name] = "missing"; + } else if (typeof value === "string" && value.startsWith("${")) { + status[name] = "missing"; + } else { + status[name] = "filled"; + } + } + } catch (error) { + console.error(`[TOML Utils] Error checking configuration status:`, error); + for (const name of variableNames) { + status[name] = "missing"; + } + } + + return status; +} + +/** + * Write configuration values to Config.toml - SECURITY: never logs values + */ +export function writeConfigValuesToConfig( + configPath: string, + configValues: Record<string, string>, + variables?: ConfigVariable[] +): void { + let config: Record<string, any> = {}; + + if (fs.existsSync(configPath)) { + try { + const content = fs.readFileSync(configPath, "utf-8"); + config = parse(content) as Record<string, any>; + } catch (error) { + console.error(`[TOML Utils] Error reading config for value write:`, error); + throw error; + } + } + + // Create a map of variable types for quick lookup + const typeMap = new Map<string, string>(); + if (variables) { + for (const variable of variables) { + typeMap.set(variable.name, variable.type || "string"); + } + } + + // Replace placeholders with actual values (convert API_KEY to apikey) + const intKeys = new Set<string>(); + for (const [variableName, value] of Object.entries(configValues)) { + const tomlKey = toTomlKey(variableName); + const varType = typeMap.get(variableName) || "string"; + + // Convert value based on type + if (varType === "int") { + const intValue = parseInt(value, 10); + if (isNaN(intValue)) { + throw new Error(`Invalid integer value for ${variableName}: ${value}`); + } + config[tomlKey] = intValue; + intKeys.add(tomlKey); + } else { + config[tomlKey] = value; + } + } + + try { + const dirPath = path.dirname(configPath); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } + + let tomlContent = stringify(config); + + // Fix TOML integer formatting - remove underscores from integer values + // The @iarna/toml library adds underscores to large numbers for readability (e.g., 8_080) + // We need to remove them for Ballerina compatibility + for (const intKey of intKeys) { + const intValue = config[intKey]; + if (typeof intValue === 'number') { + // Replace formatted number (with underscores) with plain number + const formattedPattern = new RegExp(`${intKey}\\s*=\\s*[0-9_]+`, 'g'); + tomlContent = tomlContent.replace(formattedPattern, `${intKey} = ${intValue}`); + } + } + + fs.writeFileSync(configPath, tomlContent, "utf-8"); + + console.log(`[TOML Utils] Updated ${Object.keys(configValues).length} configuration value(s) in Config.toml`); + } catch (error) { + console.error(`[TOML Utils] Error writing configuration values:`, error); + throw error; + } +} + +function getNestedValue(obj: any, key: string): any { + if (key.includes(".")) { + const parts = key.split("."); + let current = obj; + for (const part of parts) { + if (current && typeof current === "object") { + current = current[part]; + } else { + return undefined; + } + } + return current; + } + return obj[key]; +} + +export function validateVariableName(name: string): boolean { + return /^[A-Z_0-9]+$/.test(name); +} + +/** + * Converts configuration variable name to TOML key format + * Example: API_KEY -> apikey, DB_HOST -> dbhost + */ +export function toTomlKey(variableName: string): string { + return variableName.toLowerCase().replace(/_/g, ""); +} + +/** + * Read existing configuration values from Config.toml + * Returns actual values (to be shown in UI for editing) + */ +export function readExistingConfigValues( + configPath: string, + variableNames: string[] +): Record<string, string> { + const existingValues: Record<string, string> = {}; + + if (!fs.existsSync(configPath)) { + return existingValues; + } + + try { + const content = fs.readFileSync(configPath, "utf-8"); + const config = parse(content) as Record<string, any>; + + for (const name of variableNames) { + const tomlKey = toTomlKey(name); + const value = getNestedValue(config, tomlKey); + + // Include the value if it exists and is not a placeholder + if (value !== undefined && value !== null) { + if (typeof value === "string") { + // Don't include placeholder values like ${VARIABLE_NAME} + if (!value.startsWith("${")) { + existingValues[name] = value; + } + } else if (typeof value === "number") { + // Convert number to string for UI display + existingValues[name] = value.toString(); + } + } + } + } catch (error) { + console.error(`[TOML Utils] Error reading existing configuration values:`, error); + } + + return existingValues; +} + +/** + * Create status metadata from configuration values - returns only fill status, never values + */ +export function createStatusMetadata( + configValues: Record<string, string> +): Record<string, "filled" | "missing"> { + const status: Record<string, "filled" | "missing"> = {}; + + for (const [key, value] of Object.entries(configValues)) { + if (!value || value.trim() === "" || value.startsWith("${")) { + status[key] = "missing"; + } else { + status[key] = "filled"; + } + } + + return status; +} 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 e61df942a79..8819bea3351 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 @@ -27,6 +27,8 @@ import { CheckpointInfo, ConnectorSpecCancelRequest, ConnectorSpecRequest, + ConfigurationCancelRequest, + ConfigurationProvideRequest, DocGenerationRequest, GenerateAgentCodeRequest, GenerateOpenAPIRequest, @@ -51,6 +53,7 @@ import { approvePlan, approveTask, cancelConnectorSpec, + cancelConfiguration, clearChat, clearInitialPrompt, createTestDirecoryIfNotExists, @@ -83,6 +86,7 @@ import { openChatWindowWithCommand, promptGithubAuthorize, provideConnectorSpec, + provideConfiguration, restoreCheckpoint, showSignInAlert, submitFeedback, @@ -247,6 +251,14 @@ export class AiPanelRpcClient implements AIPanelAPI { return this._messenger.sendRequest(cancelConnectorSpec, HOST_EXTENSION, params); } + provideConfiguration(params: ConfigurationProvideRequest): Promise<void> { + return this._messenger.sendRequest(provideConfiguration, HOST_EXTENSION, params); + } + + cancelConfiguration(params: ConfigurationCancelRequest): Promise<void> { + return this._messenger.sendRequest(cancelConfiguration, HOST_EXTENSION, params); + } + getChatMessages(): Promise<UIChatMessage[]> { return this._messenger.sendRequest(getChatMessages, HOST_EXTENSION); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index c4c466759e1..dbbd0540502 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -87,6 +87,7 @@ import { ReviewMode } from "./views/ReviewMode"; import AddConnectionPopup from "./views/BI/Connection/AddConnectionPopup"; import EditConnectionPopup from "./views/BI/Connection/EditConnectionPopup"; import { EvalsetViewer } from "./views/EvalsetViewer/EvalsetViewer"; +import { ConfigurationCollector } from "./views/BI/ConfigurationCollector"; const globalStyles = css` *, @@ -655,6 +656,15 @@ const MainPanel = () => { /> ); break; + case MACHINE_VIEW.ConfigurationCollector: + setViewComponent( + <ConfigurationCollector + data={value.agentMetadata?.configurationCollector} + onClose={() => handleApprovalClose(value.agentMetadata?.configurationCollector)} + /> + ); + break; + default: setNavActive(false); setViewComponent(<LoadingRing />); diff --git a/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx index b8627d6e102..3100a9b2d60 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/PopupPanel.tsx @@ -27,6 +27,7 @@ import { FunctionForm } from "./views/BI"; import { DataMapper } from "./views/DataMapper"; import AddConnectionPopup from "./views/BI/Connection/AddConnectionPopup"; import EditConnectionPopup from "./views/BI/Connection/EditConnectionPopup"; +import { ConfigurationCollector } from "./views/BI/ConfigurationCollector"; const ViewContainer = styled.div<{ isFullScreen?: boolean }>` position: fixed; @@ -161,6 +162,14 @@ const PopupPanel = (props: PopupPanelProps) => { /> ); break; + case MACHINE_VIEW.ConfigurationCollector: + setViewComponent( + <ConfigurationCollector + data={machineState.agentMetadata?.configurationCollector} + onClose={() => handleApprovalClose(machineState.agentMetadata?.configurationCollector)} + /> + ); + break; default: setViewComponent(null); } 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 dd3a0c046f7..5bf0dfafc95 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 @@ -45,6 +45,7 @@ import ProgressTextSegment from "../ProgressTextSegment"; import ToolCallSegment from "../ToolCallSegment"; import TodoSection from "../TodoSection"; import { ConnectorGeneratorSegment } from "../ConnectorGeneratorSegment"; +import { ConfigurationCollectorSegment, ConfigurationCollectionData } from "../ConfigurationCollectorSegment"; import RoleContainer from "../RoleContainter"; import CheckpointSeparator from "../CheckpointSeparator"; import { Attachment, AttachmentStatus, TaskApprovalRequest } from "@wso2/ballerina-core"; @@ -675,6 +676,46 @@ const AIChat: React.FC = () => { } return newMessages; }); + } else if (type === "configuration_collection_event") { + const configurationNotification = response as any; + const configurationData: ConfigurationCollectionData = { + requestId: configurationNotification.requestId, + stage: configurationNotification.stage, + variables: configurationNotification.variables, + existingValues: configurationNotification.existingValues, + message: configurationNotification.message, + isTestConfig: configurationNotification.isTestConfig, + error: configurationNotification.error + }; + + const configurationJson = JSON.stringify(configurationData); + + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + const lastMessageContent = newMessages[newMessages.length - 1].content; + + const escapeRegex = (str: string): string => { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }; + + const searchPattern = `<configurationcollector>{"requestId":"${configurationNotification.requestId}"`; + + if (lastMessageContent.includes(searchPattern)) { + const replacePattern = new RegExp( + `<configurationcollector>[^<]*${escapeRegex(configurationNotification.requestId)}[^<]*</configurationcollector>`, + 's' + ); + newMessages[newMessages.length - 1].content = lastMessageContent.replace( + replacePattern, + `<configurationcollector>${configurationJson}</configurationcollector>` + ); + } else { + newMessages[newMessages.length - 1].content += `\n\n<configurationcollector>${configurationJson}</configurationcollector>`; + } + } + return newMessages; + }); } else if (type === "diagnostics") { //TODO: Handle this in review mode const content = response.diagnostics; @@ -1563,6 +1604,14 @@ const AIChat: React.FC = () => { rpcClient={rpcClient} /> ); + } else if (segment.type === SegmentType.ConfigurationCollector) { + return ( + <ConfigurationCollectorSegment + key={`configuration-collector-${i}`} + data={segment.configurationData} + rpcClient={rpcClient} + /> + ); } else if (segment.type === SegmentType.ReviewActions) { return ( <ReviewActions diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts index f7d5ad6bd7e..64bc7bdc74d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/segment.ts @@ -11,6 +11,7 @@ export enum SegmentType { TestScenario = "TestScenario", Button = "Button", SpecFetcher = "SpecFetcher", + ConfigurationCollector = "ConfigurationCollector", ReviewActions = "ReviewActions", } @@ -86,7 +87,7 @@ export function splitContent(content: string): Segment[] { // Combined regex to capture either <code ...>```<language> code ```</code> or <progress>Text</progress> // Using matchAll for stateless iteration to avoid regex lastIndex corruption during streaming const regexPattern = - /<code\s+filename="([^"]+)"(?:\s+type=("test"|"ai_map"|"type_creator"))?>\s*```(\w+)\s*([\s\S]*?)```\s*<\/code>|<progress>([\s\S]*?)<\/progress>|<toolcall(?:\s+[^>]*)?>([\s\S]*?)<\/toolcall>|<toolresult(?:\s+[^>]*)?>([\s\S]*?)<\/toolresult>|<todo>([\s\S]*?)<\/todo>|<attachment>([\s\S]*?)<\/attachment>|<scenario>([\s\S]*?)<\/scenario>|<button\s+type="([^"]+)">([\s\S]*?)<\/button>|<inlineCode>([\s\S]*?)<inlineCode>|<references>([\s\S]*?)<references>|<connectorgenerator>([\s\S]*?)<\/connectorgenerator>|<reviewactions>([\s\S]*?)<\/reviewactions>/g; + /<code\s+filename="([^"]+)"(?:\s+type=("test"|"ai_map"|"type_creator"))?>\s*```(\w+)\s*([\s\S]*?)```\s*<\/code>|<progress>([\s\S]*?)<\/progress>|<toolcall(?:\s+[^>]*)?>([\s\S]*?)<\/toolcall>|<toolresult(?:\s+[^>]*)?>([\s\S]*?)<\/toolresult>|<todo>([\s\S]*?)<\/todo>|<attachment>([\s\S]*?)<\/attachment>|<scenario>([\s\S]*?)<\/scenario>|<button\s+type="([^"]+)">([\s\S]*?)<\/button>|<inlineCode>([\s\S]*?)<inlineCode>|<references>([\s\S]*?)<references>|<connectorgenerator>([\s\S]*?)<\/connectorgenerator>|<reviewactions>([\s\S]*?)<\/reviewactions>|<configurationcollector>([\s\S]*?)<\/configurationcollector>/g; // Convert to array to avoid stateful regex iteration issues const matches = Array.from(content.matchAll(regexPattern)); @@ -248,6 +249,22 @@ export function splitContent(content: string): Segment[] { loading: false, text: "", }); + } else if (match[17]) { + // <configurationcollector> block matched + const configurationData = match[17]; + + updateLastProgressSegmentLoading(); + try { + const parsedData = JSON.parse(configurationData); + segments.push({ + type: SegmentType.ConfigurationCollector, + loading: false, + text: "", + configurationData: parsedData + }); + } catch (error) { + console.error("Failed to parse configuration collector data:", error); + } } // Update lastIndex to the end of the current match diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx new file mode 100644 index 00000000000..e828fe3b31d --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx @@ -0,0 +1,231 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useCallback } from "react"; +import styled from "@emotion/styled"; +import { Button, Codicon } from "@wso2/ui-toolkit"; +import type { BallerinaRpcClient } from "@wso2/ballerina-rpc-client"; + +const Container = styled.div<{ variant: string }>` + padding: 12px; + border-radius: 4px; + margin: 8px 0; + font-family: var(--vscode-font-family); + font-size: var(--vscode-font-size); + + ${(props: { variant: string }) => + props.variant === "error" && + ` + background-color: var(--vscode-inputValidation-errorBackground); + border: 1px solid var(--vscode-inputValidation-errorBorder); + `} + + ${(props: { variant: string }) => + props.variant === "done" && + ` + background-color: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-testing-iconPassed); + `} + + ${(props: { variant: string }) => + props.variant === "skipped" && + ` + background-color: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-testing-iconFailed); + `} + + ${(props: { variant: string }) => + props.variant === "creating_file" && + ` + background-color: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-focusBorder); + `} + + ${(props: { variant: string }) => + props.variant === "collecting" && + ` + background-color: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + `} +`; + +const Header = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const Title = styled.span` + font-weight: 500; + font-size: 13px; + color: var(--vscode-foreground); +`; + +const TestBadge = styled.span` + display: inline-block; + padding: 2px 8px; + margin-left: 8px; + border-radius: 3px; + font-size: 11px; + font-weight: 600; + background-color: var(--vscode-badge-background); + color: var(--vscode-badge-foreground); +`; + +const ErrorContainer = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 8px; +`; + +const ErrorMessage = styled.div` + color: var(--vscode-inputValidation-errorForeground); + font-weight: 500; +`; + +const ErrorCode = styled.div` + font-size: 12px; + color: var(--vscode-descriptionForeground); +`; + +const ButtonGroup = styled.div` + display: flex; + gap: 8px; + flex-wrap: wrap; + margin-top: 8px; +`; + +interface ConfigurationVariable { + name: string; + description: string; + type?: "string" | "int"; +} + +export interface ConfigurationCollectionData { + requestId: string; + stage: "creating_file" | "collecting" | "done" | "skipped" | "error"; + variables?: ConfigurationVariable[]; + existingValues?: Record<string, string>; + message: string; + isTestConfig?: boolean; + error?: { + message: string; + code: string; + }; +} + +interface ConfigurationCollectorSegmentProps { + data: ConfigurationCollectionData; + rpcClient: BallerinaRpcClient; +} + +export const ConfigurationCollectorSegment: React.FC<ConfigurationCollectorSegmentProps> = ({ data, rpcClient }) => { + const currentStage = data.stage; + + const handleConfigure = useCallback(() => { + console.log('[ConfigurationCollectorSegment] Reopening configuration collector via backend:', data.requestId); + rpcClient.getVisualizerRpcClient().reopenApprovalView({ + requestId: data.requestId + }); + }, [rpcClient, data.requestId]); + + const handleSkip = useCallback(async () => { + try { + console.log('[ConfigurationCollectorSegment] Skipping configuration collection:', data.requestId); + await rpcClient.getAiPanelRpcClient().cancelConfiguration({ + requestId: data.requestId, + }); + } catch (error) { + console.error('[ConfigurationCollectorSegment] Error canceling configuration:', error); + } + }, [rpcClient, data.requestId]); + + if (currentStage === "creating_file") { + return ( + <Container variant="creating_file"> + <Header> + <Codicon name="file" /> + <Title>{data.message}</Title> + {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} + </Header> + </Container> + ); + } + + if (currentStage === "collecting") { + return ( + <Container variant="collecting"> + <Header> + <Codicon name="key" /> + <Title>{data.message}</Title> + {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} + </Header> + <ButtonGroup> + <Button appearance="secondary" onClick={handleSkip}> + Skip + </Button> + <Button appearance="primary" onClick={handleConfigure}> + Configure + </Button> + </ButtonGroup> + </Container> + ); + } + + if (currentStage === "error" && data.error) { + return ( + <Container variant="error"> + <Header> + <Codicon name="warning" /> + <Title>Configuration Collection Failed</Title> + </Header> + <ErrorContainer> + <ErrorMessage>{data.error.message}</ErrorMessage> + <ErrorCode>Error Code: {data.error.code}</ErrorCode> + </ErrorContainer> + </Container> + ); + } + + if (currentStage === "done") { + return ( + <Container variant="done"> + <Header> + <Codicon name="pass" /> + <Title>{data.message}</Title> + {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} + </Header> + </Container> + ); + } + + if (currentStage === "skipped") { + return ( + <Container variant="skipped"> + <Header> + <Codicon name="error" /> + <Title>{data.message}</Title> + {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} + </Header> + </Container> + ); + } + + return null; +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx new file mode 100644 index 00000000000..0142f0601f2 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx @@ -0,0 +1,284 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useEffect } from "react"; +import styled from "@emotion/styled"; +import { Button, Codicon, ThemeColors } from "@wso2/ui-toolkit"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { ConfigurationCollectorMetadata, ParentPopupData } from "@wso2/ballerina-core"; +import { + PopupOverlay, + PopupContainer, + PopupHeader, + HeaderTitleContainer, + PopupTitle, + PopupSubtitle, + CloseButton, + PopupContent, + PopupFooter, +} from "../Connection/styles"; + +// Form styled components +const FormSection = styled.div` + display: flex; + flex-direction: column; + gap: 16px; +`; + +const ConfigurationField = styled.div` + display: flex; + flex-direction: column; + gap: 6px; +`; + +const FieldLabel = styled.label` + font-size: 13px; + font-weight: 500; + color: ${ThemeColors.ON_SURFACE}; + display: flex; + align-items: center; + gap: 4px; +`; + +const FieldDescription = styled.span` + font-size: 12px; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + font-style: italic; + font-weight: normal; +`; + +const FieldInput = styled.input<{ hasError: boolean }>` + padding: 10px 12px; + background-color: ${ThemeColors.SURFACE_DIM}; + color: ${ThemeColors.ON_SURFACE}; + border: 1px solid ${(props: { hasError: boolean }) => + props.hasError ? ThemeColors.ERROR : ThemeColors.OUTLINE_VARIANT}; + border-radius: 6px; + font-size: 13px; + + &:focus { + outline: none; + border-color: ${ThemeColors.PRIMARY}; + } + + &::placeholder { + color: ${ThemeColors.ON_SURFACE_VARIANT}; + } +`; + +const FieldError = styled.div` + font-size: 12px; + color: ${ThemeColors.ERROR}; +`; + +const ActionButton = styled(Button)` + min-width: 100px; +`; + +const LoadingContainer = styled.div` + display: flex; + align-items: center; + justify-content: center; + padding: 40px; + color: ${ThemeColors.ON_SURFACE_VARIANT}; +`; + +interface ConfigurationCollectorProps { + data?: ConfigurationCollectorMetadata; + onClose: (parent?: ParentPopupData) => void; +} + +export const ConfigurationCollector: React.FC<ConfigurationCollectorProps> = ({ data, onClose }) => { + const { rpcClient } = useRpcContext(); + const [configValues, setConfigValues] = useState<Record<string, string>>(data?.existingValues || {}); + const [errors, setErrors] = useState<Record<string, string>>({}); + const [isProcessing, setIsProcessing] = useState(false); + + // Initialize configuration values when data prop changes + useEffect(() => { + if (data?.existingValues) { + setConfigValues(data.existingValues); + } + }, [data]); + + const handleInputChange = (variableName: string, value: string) => { + setConfigValues((prev) => ({ ...prev, [variableName]: value })); + setErrors((prev) => { + const newErrors = { ...prev }; + delete newErrors[variableName]; + return newErrors; + }); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && !isProcessing) { + handleSubmit(); + } + }; + + const validateConfiguration = (): boolean => { + const newErrors: Record<string, string> = {}; + + data?.variables?.forEach((variable) => { + const value = configValues[variable.name]; + if (!value || !value.trim()) { + newErrors[variable.name] = "This field is required"; + } else if (variable.type === "int") { + const intValue = parseInt(value, 10); + if (isNaN(intValue)) { + newErrors[variable.name] = "Please enter a valid number"; + } + } + }); + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = async () => { + if (!data) return; + + console.log("[ConfigurationCollector] handleSubmit called", { + requestId: data.requestId, + configurationCount: Object.keys(configValues).length, + }); + + if (!validateConfiguration()) { + console.log("[ConfigurationCollector] Validation failed"); + return; + } + + setIsProcessing(true); + + try { + console.log("[ConfigurationCollector] Calling provideConfiguration RPC"); + await rpcClient.getAiPanelRpcClient().provideConfiguration({ + requestId: data.requestId, + configValues: configValues, + }); + console.log("[ConfigurationCollector] RPC call successful"); + onClose(); + } catch (error: any) { + console.error("[ConfigurationCollector] Error in handleSubmit:", error); + } finally { + setIsProcessing(false); + } + }; + + const handleCancel = async () => { + if (!data) { + onClose(); + return; + } + + try { + await rpcClient.getAiPanelRpcClient().cancelConfiguration({ + requestId: data.requestId, + }); + } catch (error: any) { + console.error("[ConfigurationCollector] Error in handleCancel:", error); + } + onClose(); + }; + + // Close button (X) just closes the popup without canceling configuration collection + // User can reopen via the Configure button in the chat segment + const handleClose = () => { + onClose(); + }; + + // Prevent overlay clicks from closing the popup + const handleOverlayClick = (e: React.MouseEvent) => { + e.stopPropagation(); + }; + + if (!data) { + return ( + <> + <PopupOverlay + sx={{ background: `${ThemeColors.SURFACE_CONTAINER}`, opacity: `0.5` }} + onClose={handleOverlayClick} + /> + <PopupContainer> + <LoadingContainer>Loading...</LoadingContainer> + </PopupContainer> + </> + ); + } + + return ( + <> + <PopupOverlay + sx={{ background: `${ThemeColors.SURFACE_CONTAINER}`, opacity: `0.5` }} + onClose={handleOverlayClick} + /> + <PopupContainer> + <PopupHeader> + <HeaderTitleContainer> + <PopupTitle variant="h2"> + {data.isTestConfig ? "Configure Test Environment" : "Configure Application"} + </PopupTitle> + {data.message && <PopupSubtitle variant="body2">{data.message}</PopupSubtitle>} + </HeaderTitleContainer> + <CloseButton appearance="icon" onClick={handleClose}> + <Codicon name="close" /> + </CloseButton> + </PopupHeader> + <PopupContent> + <FormSection> + {data.variables?.map((variable) => ( + <ConfigurationField key={variable.name}> + <FieldLabel> + {variable.name} + {variable.description && ( + <FieldDescription>- {variable.description}</FieldDescription> + )} + </FieldLabel> + <FieldInput + type={variable.type === "int" ? "number" : "text"} + placeholder={ + variable.type === "int" ? "Enter number" : "Enter value" + } + value={configValues[variable.name] || ""} + onChange={(e) => handleInputChange(variable.name, e.target.value)} + onKeyDown={handleKeyDown} + hasError={!!errors[variable.name]} + /> + {errors[variable.name] && <FieldError>{errors[variable.name]}</FieldError>} + </ConfigurationField> + ))} + </FormSection> + </PopupContent> + <PopupFooter> + <ActionButton appearance="secondary" onClick={handleCancel} disabled={isProcessing}> + Cancel + </ActionButton> + <ActionButton + appearance="primary" + onClick={handleSubmit} + disabled={isProcessing || !data.variables || data.variables.length === 0} + > + {isProcessing ? "Saving..." : "Save Configuration"} + </ActionButton> + </PopupFooter> + </PopupContainer> + </> + ); +}; + +export default ConfigurationCollector; From b149a0967fd5bc2406d5a94d7dfdb2a268f22f9e Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Fri, 13 Feb 2026 10:51:09 +0530 Subject: [PATCH 224/247] Fix ConfigCollector tool based on PR review and improve check mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - handleCheckMode reads entire Config.toml and returns all variable statuses - Replace parseConfigPlaceholders with getAllConfigStatus in toml-utils - handleCreateMode delegates to checkMode when file already exists - handleCreateAndCollectMode skips create step if file already exists - handleCheckMode returns FILE_NOT_FOUND when config does not exist - isTestConfig support added to handleCheckMode for tests/Config.toml - Fix test collect mode source priority: tests/Config.toml → Config.toml → empty - Fix handleError to safely handle non-Error throws - Fix falsy check in createConfigWithPlaceholders to not overwrite 0 or false values - Fix integer error message to not leak user value - Fix checkMode to use tempPath instead of workspacePath --- .../ai/agent/tools/config-collector.ts | 122 +++++++++++------- .../src/utils/toml-utils.ts | 49 +++---- 2 files changed, 97 insertions(+), 74 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts index 92b253bc92b..d6e480d42be 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts @@ -24,7 +24,7 @@ import { approvalManager } from "../../state/ApprovalManager"; import { ConfigVariable, createConfigWithPlaceholders, - checkConfigurationStatus, + getAllConfigStatus, validateVariableName, writeConfigValuesToConfig, createStatusMetadata, @@ -68,8 +68,8 @@ export interface ConfigCollectorResult { } export interface ConfigCollectorPaths { - tempPath: string; // Where files are created/modified during execution - workspacePath: string; // Original workspace for reading existing configs + tempPath: string; + workspacePath: string; } // Helper functions @@ -119,10 +119,12 @@ IMPORTANT: Before calling COLLECT or CREATE_AND_COLLECT modes, briefly tell the Operation Modes: 1. CREATE: Create Config.toml with placeholder variables only + - If file already exists, returns current variable status (same as check mode) instead of overwriting - Use when you need to set up config structure before collecting configuration values - Example: { mode: "create", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }] } 2. CREATE_AND_COLLECT: Create config AND immediately request configuration values (most efficient) + - If file already exists, skips create and goes straight to collect - Use for new integrations that need configuration values right away - Tell user first what you need - Example: { mode: "create_and_collect", variables: [{ name: "API_KEY", description: "Stripe API key", type: "string" }] } @@ -275,7 +277,8 @@ export async function ConfigCollectorTool( return await handleCheckMode( input.variableNames, input.filePath, - paths + paths, + input.isTestConfig ); default: @@ -299,13 +302,22 @@ async function handleCreateMode( const validationError = validateConfigVariables(variables); if (validationError) { return validationError; } - // Determine output path based on isTestConfig flag const configPath = getConfigPath(paths.tempPath, isTestConfig); const configFileName = getConfigFileName(isTestConfig); + // If file already exists, delegate to check mode to inform the agent of current status + if (fs.existsSync(configPath)) { + console.log(`[ConfigCollector] CREATE mode - ${configFileName} already exists, delegating to check mode`); + const variableNames = variables.map((v) => v.name); + const checkResult = await handleCheckMode(variableNames, undefined, paths, isTestConfig); + return { + ...checkResult, + message: `${configFileName} already exists. ${checkResult.message}. Use collect mode to update values.`, + }; + } + console.log(`[ConfigCollector] CREATE mode - Creating ${configFileName} with placeholders`); - // Emit creating_file stage eventHandler({ type: "configuration_collection_event", requestId, @@ -316,17 +328,12 @@ async function handleCreateMode( isTestConfig, }); - // Create config with placeholder values createConfigWithPlaceholders(configPath, variables, false); - // Track modified file - if (modifiedFiles) { - if (!modifiedFiles.includes(configFileName)) { - modifiedFiles.push(configFileName); - } + if (modifiedFiles && !modifiedFiles.includes(configFileName)) { + modifiedFiles.push(configFileName); } - // Emit done stage eventHandler({ type: "configuration_collection_event", requestId, @@ -351,22 +358,23 @@ async function handleCreateAndCollectMode( isTestConfig?: boolean, modifiedFiles?: string[] ): Promise<ConfigCollectorResult> { - // First create the config in temp - const createResult = await handleCreateMode( - variables, - paths, - eventHandler, - requestId, - isTestConfig, - modifiedFiles - ); + const configPath = getConfigPath(paths.tempPath, isTestConfig); - if (!createResult.success) { - return createResult; + // If file already exists, skip create and go straight to collect + if (!fs.existsSync(configPath)) { + const createResult = await handleCreateMode( + variables, + paths, + eventHandler, + requestId, + isTestConfig, + modifiedFiles + ); + if (!createResult.success) { + return createResult; + } } - // Then immediately collect configuration values and write to temp - // Temp files are automatically synced to workspace by agent system return await handleCollectMode( variables, paths, @@ -391,9 +399,12 @@ async function handleCollectMode( // Determine paths based on isTestConfig flag const configPath = getConfigPath(paths.tempPath, isTestConfig); + + // Priority: tests/Config.toml → Config.toml → empty + const mainConfigPath = path.join(paths.tempPath, "Config.toml"); const sourceConfigPath = isTestConfig - ? path.join(paths.tempPath, "Config.toml") // Read from main config - : configPath; // Read from same file + ? (fs.existsSync(configPath) ? configPath : mainConfigPath) + : configPath; // Create config file if it doesn't exist if (!fs.existsSync(configPath)) { @@ -436,9 +447,12 @@ async function handleCollectMode( console.log(`[ConfigCollector] ${isTestConfig ? 'Test' : 'Main'} configuration: ${analysis.filledCount} filled`); // Determine the message to show to user + const testConfigExists = isTestConfig && fs.existsSync(configPath); const userMessage = isTestConfig ? (analysis.hasActualValues - ? "Found existing values. You can reuse or update them for testing." + ? (testConfigExists + ? "Found existing test values. You can update them." + : "Found values from main config. You can reuse or update them for testing.") : "Test configuration values needed") : (analysis.hasActualValues ? "Update configuration values" @@ -513,27 +527,44 @@ async function handleCollectMode( async function handleCheckMode( variableNames: string[], filePath: string | undefined, - paths: ConfigCollectorPaths + paths: ConfigCollectorPaths, + isTestConfig?: boolean ): Promise<ConfigCollectorResult> { - // Determine config path (use provided path or default) let configPath: string; if (filePath) { - // Use provided path relative to workspace - configPath = path.join(paths.workspacePath, filePath); + configPath = path.join(paths.tempPath, filePath); } else { - // Default to workspace Config.toml - configPath = path.join(paths.workspacePath, "Config.toml"); + configPath = getConfigPath(paths.tempPath, isTestConfig); + } + + const configFileName = getConfigFileName(isTestConfig); + + if (!fs.existsSync(configPath)) { + return { + success: false, + message: `${configFileName} not found. Use create or collect mode to create it.`, + error: "FILE_NOT_FOUND", + errorCode: "FILE_NOT_FOUND", + }; } - // Check configuration value status - const status = checkConfigurationStatus(configPath, variableNames); + // Read all variables from the file + const status = getAllConfigStatus(configPath); + + // Any requested variable names not found in file → mark as missing + for (const name of variableNames) { + if (!(name in status)) { + status[name] = "missing"; + } + } const filledCount = Object.values(status).filter((s) => s === "filled").length; const missingCount = Object.values(status).filter((s) => s === "missing").length; + const totalCount = filledCount + missingCount; return { success: true, - message: `Checked ${variableNames.length} configuration value(s): ${filledCount} filled, ${missingCount} missing`, + message: `${configFileName} has ${totalCount} variable(s): ${filledCount} filled, ${missingCount} with placeholder`, status, }; } @@ -543,23 +574,26 @@ function handleError( requestId: string, eventHandler: CopilotEventHandler ): ConfigCollectorResult { + const message = (error && typeof error.message === "string" && error.message) || String(error) || "Unknown error"; + const code = (error && error.code) || "UNKNOWN_ERROR"; + console.error("[ConfigCollector] Error:", error); eventHandler({ type: "configuration_collection_event", requestId, stage: "error", - message: `Error: ${error.message}`, + message: `Error: ${message}`, error: { - message: error.message, - code: error.code || "UNKNOWN_ERROR", + message, + code, }, }); return { success: false, - message: `Failed to manage configuration: ${error.message}`, - error: error.message, - errorCode: error.code || "UNKNOWN_ERROR", + message: `Failed to manage configuration: ${message}`, + error: message, + errorCode: code, }; } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts index 347c10155b2..70f60c95726 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts @@ -18,12 +18,6 @@ import * as fs from "fs"; import * as path from "path"; import { parse, stringify } from "@iarna/toml"; -export interface PlaceholderInfo { - key: string; - placeholder: string; - variableName: string; -} - export interface ConfigVariable { name: string; description: string; @@ -34,46 +28,41 @@ export interface ConfigVariable { const PLACEHOLDER_REGEX = /^\$\{([A-Z_0-9]+)\}$/; /** - * Parse Config.toml and identify placeholder variables with pattern ${VARIABLE_NAME} + * Read all keys from Config.toml and return their status — filled or placeholder. + * Returns empty object if file doesn't exist. */ -export function parseConfigPlaceholders(configPath: string): Map<string, PlaceholderInfo> { - const placeholders = new Map<string, PlaceholderInfo>(); +export function getAllConfigStatus( + configPath: string +): Record<string, "filled" | "missing"> { + const status: Record<string, "filled" | "missing"> = {}; if (!fs.existsSync(configPath)) { - return placeholders; + return status; } try { const content = fs.readFileSync(configPath, "utf-8"); const config = parse(content) as Record<string, any>; - function findPlaceholders(obj: any, prefix: string = "") { + function collectStatus(obj: any, prefix: string = "") { for (const [key, value] of Object.entries(obj)) { const fullKey = prefix ? `${prefix}.${key}` : key; - - if (typeof value === "string") { - const match = value.match(PLACEHOLDER_REGEX); - if (match) { - const variableName = match[1]; - placeholders.set(variableName, { - key: fullKey, - placeholder: value, - variableName, - }); - } - } else if (typeof value === "object" && value !== null) { - findPlaceholders(value, fullKey); + if (value !== null && typeof value === "object" && !Array.isArray(value)) { + collectStatus(value, fullKey); + } else if (typeof value === "string" && PLACEHOLDER_REGEX.test(value)) { + status[fullKey] = "missing"; + } else { + status[fullKey] = "filled"; } } } - findPlaceholders(config); + collectStatus(config); } catch (error) { - console.error(`[TOML Utils] Error parsing config at ${configPath}:`, error); - throw error; + console.error(`[TOML Utils] Error reading config status:`, error); } - return placeholders; + return status; } /** @@ -101,7 +90,7 @@ export function createConfigWithPlaceholders( for (const variable of variables) { const tomlKey = toTomlKey(variable.name); - if (!config[tomlKey] || overwrite) { + if (!Object.prototype.hasOwnProperty.call(config, tomlKey) || overwrite) { config[tomlKey] = `\${${variable.name}}`; } } @@ -203,7 +192,7 @@ export function writeConfigValuesToConfig( if (varType === "int") { const intValue = parseInt(value, 10); if (isNaN(intValue)) { - throw new Error(`Invalid integer value for ${variableName}: ${value}`); + throw new Error(`Invalid integer value for ${variableName}`); } config[tomlKey] = intValue; intKeys.add(tomlKey); From 6fc2ffd57f1160692487433cdef1af361afbc5d1 Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Fri, 13 Feb 2026 11:12:47 +0530 Subject: [PATCH 225/247] Handle all TOML types in getAllConfigStatus Extend collectStatus to recurse into arrays of tables ([[...]]) and primitive arrays, producing indexed keys like fruit[0].color[1].name. Empty arrays are marked as filled. This ensures the agent gets accurate status for all TOML structures Ballerina supports. --- .../features/ai/agent/tools/config-collector.ts | 5 +++-- .../ballerina-extension/src/utils/toml-utils.ts | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts index d6e480d42be..bd53fc45649 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts @@ -531,14 +531,15 @@ async function handleCheckMode( isTestConfig?: boolean ): Promise<ConfigCollectorResult> { let configPath: string; + let configFileName: string; if (filePath) { configPath = path.join(paths.tempPath, filePath); + configFileName = path.basename(filePath); } else { configPath = getConfigPath(paths.tempPath, isTestConfig); + configFileName = getConfigFileName(isTestConfig); } - const configFileName = getConfigFileName(isTestConfig); - if (!fs.existsSync(configPath)) { return { success: false, diff --git a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts index 70f60c95726..ec43e34a508 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts @@ -47,7 +47,22 @@ export function getAllConfigStatus( function collectStatus(obj: any, prefix: string = "") { for (const [key, value] of Object.entries(obj)) { const fullKey = prefix ? `${prefix}.${key}` : key; - if (value !== null && typeof value === "object" && !Array.isArray(value)) { + if (Array.isArray(value)) { + // Arrays of tables [[...]] or primitive arrays + value.forEach((item, index) => { + if (item !== null && typeof item === "object") { + collectStatus(item, `${fullKey}[${index}]`); + } else if (typeof item === "string" && PLACEHOLDER_REGEX.test(item)) { + status[`${fullKey}[${index}]`] = "missing"; + } else { + status[`${fullKey}[${index}]`] = "filled"; + } + }); + // Also mark the array key itself if empty + if (value.length === 0) { + status[fullKey] = "filled"; + } + } else if (value !== null && typeof value === "object") { collectStatus(value, fullKey); } else if (typeof value === "string" && PLACEHOLDER_REGEX.test(value)) { status[fullKey] = "missing"; From 4142e752afedeeff70566696767909c734511373 Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Fri, 13 Feb 2026 14:21:56 +0530 Subject: [PATCH 226/247] Minor fixes across config collector and toml utils --- .../src/features/ai/agent/tools/config-collector.ts | 6 ++++-- .../src/features/ai/state/ApprovalManager.ts | 2 +- .../ballerina/ballerina-extension/src/utils/toml-utils.ts | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts index bd53fc45649..a0af9a75077 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts @@ -406,6 +406,9 @@ async function handleCollectMode( ? (fs.existsSync(configPath) ? configPath : mainConfigPath) : configPath; + // Capture whether the test config already existed + const testConfigPreExisted = isTestConfig && fs.existsSync(configPath); + // Create config file if it doesn't exist if (!fs.existsSync(configPath)) { console.log(`[ConfigCollector] Creating ${getConfigFileName(isTestConfig)}`); @@ -447,10 +450,9 @@ async function handleCollectMode( console.log(`[ConfigCollector] ${isTestConfig ? 'Test' : 'Main'} configuration: ${analysis.filledCount} filled`); // Determine the message to show to user - const testConfigExists = isTestConfig && fs.existsSync(configPath); const userMessage = isTestConfig ? (analysis.hasActualValues - ? (testConfigExists + ? (testConfigPreExisted ? "Found existing test values. You can update them." : "Found values from main config. You can reuse or update them for testing.") : "Test configuration values needed") diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts index a6a51c317b4..aadec4204e8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts @@ -18,7 +18,7 @@ import { Task, MACHINE_VIEW } from "@wso2/ballerina-core/lib/state-machine-types"; import { CopilotEventHandler } from "../utils/events"; -import { ConfigVariable } from "src/utils/toml-utils"; +import { ConfigVariable } from "../../../utils/toml-utils"; import { StateMachine } from "../../../stateMachine"; import { approvalViewManager } from './ApprovalViewManager'; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts index ec43e34a508..f5cc1d5887e 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/toml-utils.ts @@ -231,7 +231,8 @@ export function writeConfigValuesToConfig( const intValue = config[intKey]; if (typeof intValue === 'number') { // Replace formatted number (with underscores) with plain number - const formattedPattern = new RegExp(`${intKey}\\s*=\\s*[0-9_]+`, 'g'); + const escapedKey = intKey.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const formattedPattern = new RegExp(`^\\s*${escapedKey}\\s*=\\s*[0-9_]+`, 'gm'); tomlContent = tomlContent.replace(formattedPattern, `${intKey} = ${intValue}`); } } From 586bc125f4ca71e8f81e6e23495d7fa27752cf12 Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Mon, 16 Feb 2026 09:57:09 +0530 Subject: [PATCH 227/247] Remove colored border variants from ConfigurationCollectorSegment --- .../ConfigurationCollectorSegment.tsx | 63 +++---------------- 1 file changed, 8 insertions(+), 55 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx index e828fe3b31d..8accdd27311 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ConfigurationCollectorSegment.tsx @@ -21,47 +21,14 @@ import styled from "@emotion/styled"; import { Button, Codicon } from "@wso2/ui-toolkit"; import type { BallerinaRpcClient } from "@wso2/ballerina-rpc-client"; -const Container = styled.div<{ variant: string }>` +const Container = styled.div` padding: 12px; border-radius: 4px; margin: 8px 0; font-family: var(--vscode-font-family); font-size: var(--vscode-font-size); - - ${(props: { variant: string }) => - props.variant === "error" && - ` - background-color: var(--vscode-inputValidation-errorBackground); - border: 1px solid var(--vscode-inputValidation-errorBorder); - `} - - ${(props: { variant: string }) => - props.variant === "done" && - ` - background-color: var(--vscode-editorWidget-background); - border: 1px solid var(--vscode-testing-iconPassed); - `} - - ${(props: { variant: string }) => - props.variant === "skipped" && - ` - background-color: var(--vscode-editorWidget-background); - border: 1px solid var(--vscode-testing-iconFailed); - `} - - ${(props: { variant: string }) => - props.variant === "creating_file" && - ` - background-color: var(--vscode-editorWidget-background); - border: 1px solid var(--vscode-focusBorder); - `} - - ${(props: { variant: string }) => - props.variant === "collecting" && - ` - background-color: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - `} + border: 1px solid var(--vscode-panel-border); + background-color: var(--vscode-textCodeBlock-background); `; const Header = styled.div` @@ -76,16 +43,6 @@ const Title = styled.span` color: var(--vscode-foreground); `; -const TestBadge = styled.span` - display: inline-block; - padding: 2px 8px; - margin-left: 8px; - border-radius: 3px; - font-size: 11px; - font-weight: 600; - background-color: var(--vscode-badge-background); - color: var(--vscode-badge-foreground); -`; const ErrorContainer = styled.div` display: flex; @@ -158,11 +115,10 @@ export const ConfigurationCollectorSegment: React.FC<ConfigurationCollectorSegme if (currentStage === "creating_file") { return ( - <Container variant="creating_file"> + <Container> <Header> <Codicon name="file" /> <Title>{data.message}</Title> - {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} </Header> </Container> ); @@ -170,11 +126,10 @@ export const ConfigurationCollectorSegment: React.FC<ConfigurationCollectorSegme if (currentStage === "collecting") { return ( - <Container variant="collecting"> + <Container> <Header> <Codicon name="key" /> <Title>{data.message}</Title> - {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} </Header> <ButtonGroup> <Button appearance="secondary" onClick={handleSkip}> @@ -190,7 +145,7 @@ export const ConfigurationCollectorSegment: React.FC<ConfigurationCollectorSegme if (currentStage === "error" && data.error) { return ( - <Container variant="error"> + <Container> <Header> <Codicon name="warning" /> <Title>Configuration Collection Failed</Title> @@ -205,11 +160,10 @@ export const ConfigurationCollectorSegment: React.FC<ConfigurationCollectorSegme if (currentStage === "done") { return ( - <Container variant="done"> + <Container> <Header> <Codicon name="pass" /> <Title>{data.message}</Title> - {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} </Header> </Container> ); @@ -217,11 +171,10 @@ export const ConfigurationCollectorSegment: React.FC<ConfigurationCollectorSegme if (currentStage === "skipped") { return ( - <Container variant="skipped"> + <Container> <Header> <Codicon name="error" /> <Title>{data.message}</Title> - {data.isTestConfig && <TestBadge>Test Configuration</TestBadge>} </Header> </Container> ); From 58c4e39aaec3499281cd7071e34af8b840d82908 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 14 Feb 2026 16:14:22 +0530 Subject: [PATCH 228/247] Update getEvalsets to return relative paths for evalset files --- .../src/rpc-managers/test-manager/rpc-manager.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts index 8996ff0bc85..416b216b8bc 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/test-manager/rpc-manager.ts @@ -113,11 +113,14 @@ export class TestServiceManagerRpcManager implements TestManagerServiceAPI { const threadCount = evalsetData.threads.length; const name = evalsetData.name || path.basename(uri.fsPath, '.evalset.json'); const description = evalsetData.description || ''; + const filePath = params.projectPath + ? path.relative(params.projectPath, uri.fsPath) + : uri.fsPath; evalsets.push({ id: evalsetData.id || uri.fsPath, name: name, - filePath: uri.fsPath, + filePath: filePath, threadCount: threadCount, description: description }); From 6d5f9e4d0e1d9951edc50181a1d14eba5c1c7399 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 14 Feb 2026 16:33:39 +0530 Subject: [PATCH 229/247] Avoid showing discard confirmation in EvalThreadViewer even if changes were not made --- .../src/views/EvalsetViewer/EvalThreadViewer.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index b847165840a..df7521d956e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -537,6 +537,14 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, } }; + const handleDiscardClick = () => { + if (hasUnsavedChanges) { + setShowDiscardConfirmation(true); + } else { + handleExitEditMode(); + } + }; + const handleDiscard = () => { setWorkingEvalThread(cloneEvalThread(originalEvalThread)); setHasUnsavedChanges(false); @@ -638,7 +646,7 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, {hasUnsavedChanges && ( <UnsavedIndicator><Dot /><span>Unsaved changes</span></UnsavedIndicator> )} - <Button appearance="secondary" onClick={() => setShowDiscardConfirmation(true)} disabled={isSaving}> + <Button appearance="secondary" onClick={handleDiscardClick} disabled={isSaving}> <Icon name="bi-close" sx={{ marginRight: "4px" }} iconSx={{ fontSize: "16px" }} /> Discard </Button> From d9cad522b45b09edcd19ba0aa457e522a6586e29 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 14 Feb 2026 17:37:17 +0530 Subject: [PATCH 230/247] Fix tools list not getting populated for new message turns in evalset editor --- .../views/EvalsetViewer/ConfirmationModal.tsx | 2 +- .../EvalsetViewer/EditableToolCallsList.tsx | 36 +------ .../views/EvalsetViewer/EvalThreadViewer.tsx | 95 ++++++++++++++++++- .../views/EvalsetViewer/ToolEditorModal.tsx | 49 +++------- .../EvalsetViewer/utils/traceAdapters.ts | 6 +- 5 files changed, 113 insertions(+), 75 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx index 26a59f42dc8..9db83635fa2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ConfirmationModal.tsx @@ -30,7 +30,7 @@ const Overlay = styled.div` display: flex; align-items: center; justify-content: center; - z-index: 3000; + z-index: 100000; `; const ModalContainer = styled.div` diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx index 9a737c35066..f0bc55ec0ad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { useState } from 'react'; +import React from 'react'; import styled from '@emotion/styled'; import { DndContext, @@ -37,7 +37,6 @@ import { import { CSS } from '@dnd-kit/utilities'; import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; import { Icon } from '@wso2/ui-toolkit'; -import { ConfirmationModal } from './ConfirmationModal'; // --- STYLES --- @@ -252,6 +251,7 @@ interface EditableToolCallsListProps { availableTools: EvalToolSchema[]; onUpdate: (traceId: string, toolCalls: EvalFunctionCall[]) => void; onEditToolCall: (traceId: string, toolCallIndex: number) => void; + onDeleteRequest: (traceId: string, toolCallIndex: number) => void; } export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ @@ -260,9 +260,8 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ availableTools, onUpdate, onEditToolCall, + onDeleteRequest, }) => { - const [deleteIndex, setDeleteIndex] = useState<number | null>(null); - const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { @@ -287,22 +286,6 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ } }; - const handleDeleteRequest = (index: number) => { - setDeleteIndex(index); - }; - - const handleDeleteConfirm = () => { - if (deleteIndex !== null) { - const updatedToolCalls = toolCalls.filter((_, i) => i !== deleteIndex); - onUpdate(traceId, updatedToolCalls); - setDeleteIndex(null); - } - }; - - const handleDeleteCancel = () => { - setDeleteIndex(null); - }; - if (toolCalls.length === 0) { return null; } @@ -331,23 +314,12 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ toolCall={toolCall} index={index} onEdit={() => onEditToolCall(traceId, index)} - onDelete={() => handleDeleteRequest(index)} + onDelete={() => onDeleteRequest(traceId, index)} /> ); })} </SortableContext> </DndContext> - - {deleteIndex !== null && ( - <ConfirmationModal - title="Delete Tool Execution" - message="Are you sure you want to delete this tool call? This action cannot be undone." - confirmLabel="Delete" - cancelLabel="Cancel" - onConfirm={handleDeleteConfirm} - onCancel={handleDeleteCancel} - /> - )} </TimelineContainer> ); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index df7521d956e..d9d23f4b5f7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -18,7 +18,7 @@ import React, { useState } from "react"; import styled from "@emotion/styled"; -import { EvalThread, EvalSet, EvalFunctionCall, EvalsetTrace } from "@wso2/ballerina-core"; +import { EvalThread, EvalSet, EvalFunctionCall, EvalsetTrace, EvalToolSchema, AvailableNode } from "@wso2/ballerina-core"; import { MessageContainer, ProfilePic } from "../AgentChatPanel/Components/ChatInterface"; import { ToolCallsTimeline } from "./ToolCallsTimeline"; import { Button, Icon } from "@wso2/ui-toolkit"; @@ -452,6 +452,8 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, } | null>(null); const [showDiscardConfirmation, setShowDiscardConfirmation] = useState(false); const [deleteTraceIndex, setDeleteTraceIndex] = useState<number | null>(null); + const [deleteToolCall, setDeleteToolCall] = useState<{ traceId: string; toolCallIndex: number } | null>(null); + const [availableToolsCache, setAvailableToolsCache] = useState<EvalToolSchema[] | null>(null); const sensors = useSensors( useSensor(PointerSensor), @@ -460,6 +462,50 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, }) ); + const fetchAvailableTools = async (): Promise<EvalToolSchema[]> => { + if (availableToolsCache !== null) { + return availableToolsCache; + } + + try { + const response = await rpcClient.getBIDiagramRpcClient().search({ + filePath: projectPath, + queryMap: { q: "", limit: 50 }, + searchKind: "AGENT_TOOL" + }); + + const tools: EvalToolSchema[] = response.categories + .flatMap(category => category.items as AvailableNode[]) + .map(node => { + const metadataData = node.metadata?.data as any; + const inputParameters = metadataData?.inputParameters || []; + + // Transform inputParameters array to JSON Schema properties format + const properties: { [key: string]: any } = {}; + inputParameters.forEach((param: any) => { + if (param.name) { + properties[param.name] = { + type: param.type === 'int' ? 'number' : param.type, + description: param.description || '' + }; + } + }); + + return { + name: node.metadata?.label || node.codedata?.symbol || 'unknown', + description: node.metadata?.description || '', + parametersSchema: inputParameters.length > 0 ? { properties } : undefined + }; + }); + + setAvailableToolsCache(tools); + return tools; + } catch (error) { + console.error('Error fetching available tools:', error); + return []; + } + }; + const handleEnterEditMode = () => { setOriginalEvalThread(cloneEvalThread(evalThread)); setWorkingEvalThread(cloneEvalThread(evalThread)); @@ -597,10 +643,11 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, setSelectedToolCall(null); }; - const handleAddTurnAtIndex = (index: number) => { + const handleAddTurnAtIndex = async (index: number) => { + const tools = await fetchAvailableTools(); setWorkingEvalThread(prev => { const newTraces = [...prev.traces]; - newTraces.splice(index, 0, createNewTrace()); + newTraces.splice(index, 0, createNewTrace(tools)); return { ...prev, traces: newTraces }; }); setHasUnsavedChanges(true); @@ -629,6 +676,23 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, } }; + const handleDeleteToolCallRequest = (traceId: string, toolCallIndex: number) => { + setDeleteToolCall({ traceId, toolCallIndex }); + }; + + const handleDeleteToolCallConfirm = () => { + if (deleteToolCall) { + const { traceId, toolCallIndex } = deleteToolCall; + const trace = workingEvalThread.traces.find(t => t.id === traceId); + if (trace) { + const currentToolCalls = getToolCallsFromTrace(trace); + const updatedToolCalls = currentToolCalls.filter((_, i) => i !== toolCallIndex); + handleUpdateToolCalls(traceId, updatedToolCalls); + } + setDeleteToolCall(null); + } + }; + const displayCase = isEditMode ? workingEvalThread : evalThread; return ( @@ -719,12 +783,25 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, availableTools={trace.tools} onUpdate={handleUpdateToolCalls} onEditToolCall={handleEditToolCall} + onDeleteRequest={handleDeleteToolCallRequest} /> ) : ( <ToolCallsTimeline toolCalls={toolCalls} /> )} {isEditMode && ( - <AddToolButton className="add-tool-button" onClick={() => handleEditToolCall(trace.id, -1)}> + <AddToolButton className="add-tool-button" onClick={async () => { + const tools = await fetchAvailableTools(); + // Update trace with fetched tools if it has an empty tools array + if (trace.tools.length === 0 && tools.length > 0) { + setWorkingEvalThread(prev => ({ + ...prev, + traces: prev.traces.map(t => + t.id === trace.id ? { ...t, tools } : t + ) + })); + } + handleEditToolCall(trace.id, -1); + }}> <Icon name="bi-plus" iconSx={{ fontSize: "16px" }} /> Add Tool Execution </AddToolButton> @@ -792,6 +869,16 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, onCancel={() => setDeleteTraceIndex(null)} /> )} + + {deleteToolCall !== null && ( + <ConfirmationModal + title="Delete Tool Execution" + message="Are you sure you want to delete this tool call? This action cannot be undone." + confirmLabel="Delete" + onConfirm={handleDeleteToolCallConfirm} + onCancel={() => setDeleteToolCall(null)} + /> + )} </PageWrapper> ); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx index 00febf2d429..c10e66b1fee 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolEditorModal.tsx @@ -16,11 +16,11 @@ * under the License. */ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import styled from '@emotion/styled'; import { motion } from 'framer-motion'; import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; -import { Icon } from '@wso2/ui-toolkit'; +import { Button, Icon } from '@wso2/ui-toolkit'; const Overlay = styled.div` position: fixed; @@ -174,35 +174,7 @@ const ModalFooter = styled.div` display: flex; align-items: center; justify-content: flex-end; - gap: 12px; -`; - -const CancelButton = styled.button` - background: none; - border: none; - padding: 8px 16px; - font-size: 13px; - color: var(--vscode-foreground); - cursor: pointer; - opacity: 0.8; - - &:hover { - opacity: 1; - } -`; - -const SaveButton = styled.button` - background-color: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border: none; - border-radius: 3px; - padding: 8px 16px; - font-size: 13px; - cursor: pointer; - - &:hover { - background-color: var(--vscode-button-hoverBackground); - } + gap: 6px; `; interface ToolEditorModalProps { @@ -222,13 +194,20 @@ export const ToolEditorModal: React.FC<ToolEditorModalProps> = ({ const [argumentsValue, setArgumentsValue] = useState<Record<string, any>>( toolCall.arguments || {} ); + const isInitialMount = useRef(true); const selectedTool = availableTools.find(t => t.name === name); const parametersSchema = selectedTool?.parametersSchema; - // Reset arguments when the selected tool changes + // Reset arguments when the selected tool changes (but not on initial mount) useEffect(() => { - // Initialize with defaults from schema if available, otherwise empty object + // Skip reset on initial mount to preserve existing argument values + if (isInitialMount.current) { + isInitialMount.current = false; + return; + } + + // When tool changes, initialize with defaults from schema const newArguments: Record<string, any> = {}; if (parametersSchema?.properties) { @@ -368,8 +347,8 @@ export const ToolEditorModal: React.FC<ToolEditorModalProps> = ({ </ModalBody> <ModalFooter> - <CancelButton onClick={onClose}>Cancel</CancelButton> - <SaveButton onClick={handleSave}>Save Changes</SaveButton> + <Button appearance="secondary" onClick={onClose}>Cancel</Button> + <Button appearance="primary" onClick={handleSave}>Save Changes</Button> </ModalFooter> </ModalContainer> </Overlay> diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index 9fd2cd48010..6a58bdbb234 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -16,7 +16,7 @@ * under the License. */ -import { EvalThread, EvalsetTrace, EvalFunctionCall } from "@wso2/ballerina-core"; +import { EvalThread, EvalsetTrace, EvalFunctionCall, EvalToolSchema } from "@wso2/ballerina-core"; /** * Deep clone an EvalThread for editing @@ -127,7 +127,7 @@ export const generateTraceId = (): string => { /** * Create a new empty trace */ -export const createNewTrace = (): EvalsetTrace => { +export const createNewTrace = (tools: EvalToolSchema[] = []): EvalsetTrace => { const timestamp = new Date().toISOString(); return { @@ -140,7 +140,7 @@ export const createNewTrace = (): EvalsetTrace => { role: 'assistant', content: 'Agent Response', }, - tools: [], + tools: tools, toolCalls: [], iterations: [], startTime: timestamp, From d4013aa92dd3e3f4ca163fcf75493bd2e160408f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 14 Feb 2026 17:51:18 +0530 Subject: [PATCH 231/247] Fix drag and drop issues with message turns in evalset editor --- .../src/views/AgentChatPanel/Components/ChatInterface.tsx | 4 ++-- .../src/views/EvalsetViewer/EvalThreadViewer.tsx | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 0cb92473038..37ecc70f6af 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -128,8 +128,8 @@ export const ProfilePic = styled.div` padding: 4px; border: 1px solid var(--vscode-panel-border); background-color: var(--vscode-editor-background); - width: 18px; - height: 18px; + width: 28px; + height: 28px; border-radius: 50%; object-fit: cover; `; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index d9d23f4b5f7..c0723f73d96 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -76,7 +76,7 @@ const Container = styled.div` overflow: hidden; *, *::before, *::after { - box-sizing: content-box; /* Fixed: standard box-sizing prevents width math errors */ + box-sizing: border-box; } `; @@ -409,6 +409,7 @@ const SortableTraceWrapper: React.FC<SortableTraceWrapperProps> = ({ const style = { transform: CSS.Transform.toString(transform), transition, + width: '100%', }; return ( From 3509c16250b8bec654da7afa2bf4e4e0d4a7b7c1 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 14 Feb 2026 21:50:42 +0530 Subject: [PATCH 232/247] Add support for creating new evalsets from evalset tree view --- .../ballerina-extension/package.json | 46 ++++ .../src/features/test-explorer/activator.ts | 9 +- .../test-explorer/evalset-commands.ts | 248 ++++++++++++++++++ .../features/test-explorer/evalset-utils.ts | 90 +++++++ .../features/tracing/trace-details-webview.ts | 84 +----- .../EvalsetViewer/utils/traceAdapters.ts | 4 +- 6 files changed, 403 insertions(+), 78 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-utils.ts diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index dd38b796198..21fc781d1be 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -753,6 +753,30 @@ "icon": "$(clear-all)", "hidden": true, "enablement": "isSupportedProject" + }, + { + "command": "ballerina.createNewEvalset", + "title": "Create New Evalset", + "category": "Ballerina", + "icon": "$(add)" + }, + { + "command": "ballerina.createNewThread", + "title": "Add Thread", + "category": "Ballerina", + "icon": "$(add)" + }, + { + "command": "ballerina.deleteEvalset", + "title": "Delete Evalset", + "category": "Ballerina", + "icon": "$(trash)" + }, + { + "command": "ballerina.deleteThread", + "title": "Delete Thread", + "category": "Ballerina", + "icon": "$(trash)" } ], "views": { @@ -865,6 +889,28 @@ "when": "view == ballerina-traceView && ballerina.tracingEnabled && !ballerina.tracesEmpty", "group": "navigation", "title": "Clear Traces" + }, + { + "command": "ballerina.createNewEvalset", + "when": "view == ballerina-evalsets", + "group": "navigation" + } + ], + "view/item/context": [ + { + "command": "ballerina.createNewThread", + "when": "view == ballerina-evalsets && viewItem == evalsetFile", + "group": "inline" + }, + { + "command": "ballerina.deleteEvalset", + "when": "view == ballerina-evalsets && viewItem == evalsetFile", + "group": "inline" + }, + { + "command": "ballerina.deleteThread", + "when": "view == ballerina-evalsets && viewItem == evalsetThread", + "group": "inline" } ], "BI.test.add.submenu": [ diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index 81b2de7c945..426fd278a26 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -21,6 +21,7 @@ import { tests, workspace, TestRunProfileKind, TestController, Uri, window, comm import { BallerinaExtension } from "../../core"; import { runHandler } from "./runner"; import { activateEditBiTest } from "./commands"; +import { createNewEvalset, createNewThread, deleteEvalset, deleteThread } from "./evalset-commands"; import { discoverTestFunctionsInProject, handleFileChange as handleTestFileUpdate, handleFileDelete as handleTestFileDelete } from "./discover"; import { getCurrentBallerinaProject, getWorkspaceRoot } from "../../utils/project-utils"; import { checkIsBallerinaPackage, checkIsBallerinaWorkspace } from "../../utils"; @@ -74,6 +75,12 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { } }); + // Register commands for creating evalsets and threads + const createEvalsetCommand = commands.registerCommand('ballerina.createNewEvalset', createNewEvalset); + const createThreadCommand = commands.registerCommand('ballerina.createNewThread', createNewThread); + const deleteEvalsetCommand = commands.registerCommand('ballerina.deleteEvalset', deleteEvalset); + const deleteThreadCommand = commands.registerCommand('ballerina.deleteThread', deleteThread); + testController = tests.createTestController('ballerina-integrator-tests', 'WSO2 Integrator: BI Tests'); const workspaceRoot = getWorkspaceRoot(); @@ -114,7 +121,7 @@ export async function activate(ballerinaExtInstance: BallerinaExtension) { discoverTestFunctionsInProject(ballerinaExtInstance, testController); // Register the test controller and file watcher with the extension context - ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand, saveEvalThreadCommand); + ballerinaExtInstance.context?.subscriptions.push(testController, fileWatcher, evalsetTreeView, evalsetTreeDataProvider, openEvalsetCommand, saveEvalThreadCommand, createEvalsetCommand, createThreadCommand, deleteEvalsetCommand, deleteThreadCommand); activateEditBiTest(ballerinaExtInstance); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts new file mode 100644 index 00000000000..e741b805a85 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts @@ -0,0 +1,248 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import { EvalSet, EvalThread, EvalsetTrace } from '@wso2/ballerina-core'; +import { ensureEvalsetsDirectory, validateEvalsetName, validateThreadName } from './evalset-utils'; + +export async function createNewEvalset(): Promise<void> { + try { + // 1. Ensure evalsets directory exists + const evalsetsDir = await ensureEvalsetsDirectory(); + + // 2. Prompt for name + const name = await vscode.window.showInputBox({ + prompt: 'Enter evalset name', + placeHolder: 'my-evalset', + validateInput: (value) => validateEvalsetName(value, evalsetsDir) + }); + + if (!name) { return; } // User cancelled + + // 3. Create EvalSet with empty threads array + const evalset: EvalSet = { + id: crypto.randomUUID(), + name: name, + threads: [], + created_on: new Date().toISOString() + }; + + // 4. Write file + const filePath = path.join(evalsetsDir, `${name}.evalset.json`); + const jsonContent = JSON.stringify(evalset, null, 2); + const fileUri = vscode.Uri.file(filePath); + + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + + // 5. Success message with Open option + const action = await vscode.window.showInformationMessage( + `Evalset created: ${name}.evalset.json`, + 'Open' + ); + + if (action === 'Open') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri); + } + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to create evalset: ${errorMessage}`); + } +} + +export async function createNewThread(evalsetFileNode?: any): Promise<void> { + try { + // Validate that this was called from tree view with proper node + if (!evalsetFileNode || !evalsetFileNode.uri) { + vscode.window.showErrorMessage('Please use the + button next to an evalset in the tree view'); + return; + } + + const filePath = evalsetFileNode.uri.fsPath; + + // 1. Read existing evalset file + const fileContent = fs.readFileSync(filePath, 'utf8'); + let evalset: EvalSet; + + try { + evalset = JSON.parse(fileContent); + } catch (parseError) { + vscode.window.showErrorMessage('Failed to parse evalset file: Invalid JSON'); + return; + } + + // 2. Validate evalset structure + if (!evalset.threads || !Array.isArray(evalset.threads)) { + vscode.window.showErrorMessage('Invalid evalset file: missing threads array'); + return; + } + + // 3. Prompt for thread name + const threadCount = evalset.threads.length; + const defaultName = `Thread ${threadCount + 1}`; + + const threadName = await vscode.window.showInputBox({ + prompt: 'Enter thread name', + placeHolder: defaultName, + value: defaultName, + validateInput: (value) => validateThreadName(value) + }); + + if (!threadName) { return; } // User cancelled + + // 4. Create default trace with empty message turn + const now = new Date().toISOString(); + const defaultTrace: EvalsetTrace = { + id: crypto.randomUUID(), + userMessage: { + role: 'user', + content: 'User message' + }, + iterations: [], + output: { + role: 'assistant', + content: 'Agent response' + }, + tools: [], + toolCalls: [], + startTime: now, + endTime: now + }; + + // 5. Create new thread with default trace + const newThread: EvalThread = { + id: crypto.randomUUID(), + name: threadName, + traces: [defaultTrace], + created_on: new Date().toISOString() + }; + + // 6. Add to evalset and write file + evalset.threads.push(newThread); + const jsonContent = JSON.stringify(evalset, null, 2); + const fileUri = vscode.Uri.file(filePath); + + await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + + // 7. Success message with Open option + const action = await vscode.window.showInformationMessage( + `Thread "${threadName}" added to evalset`, + 'Open' + ); + + if (action === 'Open') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, newThread.id); + } + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to create thread: ${errorMessage}`); + } +} + +export async function deleteEvalset(evalsetFileNode?: any): Promise<void> { + try { + // Validate that this was called from tree view with proper node + if (!evalsetFileNode || !evalsetFileNode.uri) { + vscode.window.showErrorMessage('Please use the delete button on an evalset in the tree view'); + return; + } + + const filePath = evalsetFileNode.uri.fsPath; + const fileName = path.basename(filePath); + + // Confirm deletion + const confirmation = await vscode.window.showWarningMessage( + `Are you sure you want to delete "${fileName}"? This action cannot be undone.`, + { modal: true }, + 'Delete' + ); + + if (confirmation !== 'Delete') { + return; // User cancelled + } + + // Delete the file + await vscode.workspace.fs.delete(evalsetFileNode.uri); + + vscode.window.showInformationMessage(`Evalset "${fileName}" deleted successfully`); + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to delete evalset: ${errorMessage}`); + } +} + +export async function deleteThread(threadNode?: any): Promise<void> { + try { + // Validate that this was called from tree view with proper node + if (!threadNode || !threadNode.parentUri || !threadNode.threadId) { + vscode.window.showErrorMessage('Please use the delete button on a thread in the tree view'); + return; + } + + const filePath = threadNode.parentUri.fsPath; + const threadId = threadNode.threadId; + + // Read existing evalset file + const fileContent = fs.readFileSync(filePath, 'utf8'); + let evalset: EvalSet; + + try { + evalset = JSON.parse(fileContent); + } catch (parseError) { + vscode.window.showErrorMessage('Failed to parse evalset file: Invalid JSON'); + return; + } + + // Find the thread to get its name for confirmation + const threadToDelete = evalset.threads.find(t => t.id === threadId); + if (!threadToDelete) { + vscode.window.showErrorMessage('Thread not found in evalset'); + return; + } + + // Confirm deletion + const confirmation = await vscode.window.showWarningMessage( + `Are you sure you want to delete thread "${threadToDelete.name}"? This action cannot be undone.`, + { modal: true }, + 'Delete' + ); + + if (confirmation !== 'Delete') { + return; // User cancelled + } + + // Remove the thread from evalset + evalset.threads = evalset.threads.filter(t => t.id !== threadId); + + // Write updated evalset back to file + const jsonContent = JSON.stringify(evalset, null, 2); + const fileUri = vscode.Uri.file(filePath); + await vscode.workspace.fs.writeFile(fileUri, new TextEncoder().encode(jsonContent)); + + vscode.window.showInformationMessage(`Thread "${threadToDelete.name}" deleted successfully`); + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Failed to delete thread: ${errorMessage}`); + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-utils.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-utils.ts new file mode 100644 index 00000000000..30f26f60b41 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-utils.ts @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as fs from 'fs'; +import { getCurrentProjectRoot } from '../../utils/project-utils'; + +export async function ensureEvalsetsDirectory(): Promise<string> { + // Check if workspace is open + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { + throw new Error('Please open a workspace first'); + } + + let projectRoot: string; + try { + projectRoot = await getCurrentProjectRoot(); + } catch (error) { + // Fallback to workspace root if project root cannot be determined + projectRoot = vscode.workspace.workspaceFolders[0].uri.fsPath; + } + + const evalsetsDir = path.join(projectRoot, 'evalsets'); + const evalsetsDirUri = vscode.Uri.file(evalsetsDir); + + try { + await vscode.workspace.fs.createDirectory(evalsetsDirUri); + } catch (e) { + // Directory might exist, ignore + } + + return evalsetsDir; +} + +export function validateEvalsetName(name: string, evalsetsDir: string): string | null { + if (!name || name.trim().length === 0) { + return 'Evalset name cannot be empty'; + } + if (!/^[a-zA-Z0-9-_]+$/.test(name)) { + return 'Name can only contain letters, numbers, hyphens, and underscores'; + } + if (name.length > 100) { + return 'Name is too long (max 100 characters)'; + } + const filePath = path.join(evalsetsDir, `${name}.evalset.json`); + if (fs.existsSync(filePath)) { + return 'An evalset with this name already exists'; + } + return null; // Valid +} + +export function validateThreadName(name: string): string | null { + if (!name || name.trim().length === 0) { + return 'Thread name cannot be empty'; + } + if (name.length > 100) { + return 'Thread name is too long (max 100 characters)'; + } + return null; // Valid +} + +export async function findExistingEvalsets(evalsetsDir: string): Promise<Array<{ + label: string; + description: string; + filePath: string; +}>> { + const pattern = new vscode.RelativePattern(evalsetsDir, '*.evalset.json'); + const files = await vscode.workspace.findFiles(pattern); + + return files.map(uri => ({ + label: path.basename(uri.fsPath, '.evalset.json'), + description: uri.fsPath, + filePath: uri.fsPath + })); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts index 6d85f594660..bddd5a0fcba 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-details-webview.ts @@ -28,6 +28,7 @@ import { getLibraryWebViewContent, getComposerWebViewOptions, WebViewOptions } f import { convertTraceToEvalset, convertTracesToEvalset } from './trace-converter'; import { EvalThread, EvalSet } from '@wso2/ballerina-core'; import { getCurrentProjectRoot } from '../../utils/project-utils'; +import { ensureEvalsetsDirectory, validateEvalsetName, findExistingEvalsets } from '../test-explorer/evalset-utils'; // TraceData interface matching the trace-visualizer component interface TraceData { @@ -383,73 +384,6 @@ export class TraceDetailsWebview { } } - /** - * Ensures evalsets/ directory exists, returns path - */ - private async ensureEvalsetsDirectory(): Promise<string> { - // Check if workspace is open - if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { - throw new Error('Please open a workspace first'); - } - - let projectRoot: string; - try { - projectRoot = await getCurrentProjectRoot(); - } catch (error) { - // Fallback to workspace root if project root cannot be determined - projectRoot = vscode.workspace.workspaceFolders[0].uri.fsPath; - } - - const evalsetsDir = path.join(projectRoot, 'evalsets'); - const evalsetsDirUri = vscode.Uri.file(evalsetsDir); - - try { - await vscode.workspace.fs.createDirectory(evalsetsDirUri); - } catch (e) { - // Directory might exist, ignore - } - - return evalsetsDir; - } - - /** - * Validates evalset name - */ - private validateEvalsetName(name: string, evalsetsDir: string): string | null { - if (!name || name.trim().length === 0) { - return 'Evalset name cannot be empty'; - } - if (!/^[a-zA-Z0-9-_]+$/.test(name)) { - return 'Name can only contain letters, numbers, hyphens, and underscores'; - } - if (name.length > 100) { - return 'Name is too long (max 100 characters)'; - } - const filePath = path.join(evalsetsDir, `${name}.evalset.json`); - if (fs.existsSync(filePath)) { - return 'An evalset with this name already exists'; - } - return null; // Valid - } - - /** - * Finds existing evalsets for QuickPick - */ - private async findExistingEvalsets(evalsetsDir: string): Promise<Array<{ - label: string; - description: string; - filePath: string; - }>> { - const pattern = new vscode.RelativePattern(evalsetsDir, '*.evalset.json'); - const files = await vscode.workspace.findFiles(pattern); - - return files.map(uri => ({ - label: path.basename(uri.fsPath, '.evalset.json'), - description: uri.fsPath, - filePath: uri.fsPath - })); - } - /** * Creates thread from traces */ @@ -508,14 +442,14 @@ export class TraceDetailsWebview { ): Promise<void> { try { // 1. Ensure evalsets directory exists - const evalsetsDir = await this.ensureEvalsetsDirectory(); + const evalsetsDir = await ensureEvalsetsDirectory(); // 2. Prompt for name const name = await vscode.window.showInputBox({ prompt: 'Enter evalset name', placeHolder: `session-${sessionId.substring(0, 8)}`, value: `session-${sessionId.substring(0, 8)}`, - validateInput: (value) => this.validateEvalsetName(value, evalsetsDir) + validateInput: (value) => validateEvalsetName(value, evalsetsDir) }); if (!name) { return; } // User cancelled @@ -561,14 +495,14 @@ export class TraceDetailsWebview { ): Promise<void> { try { // 1. Ensure evalsets directory exists - const evalsetsDir = await this.ensureEvalsetsDirectory(); + const evalsetsDir = await ensureEvalsetsDirectory(); // 2. Prompt for name const name = await vscode.window.showInputBox({ prompt: 'Enter evalset name', placeHolder: `trace-${traceData.traceId.substring(0, 8)}`, value: `trace-${traceData.traceId.substring(0, 8)}`, - validateInput: (value) => this.validateEvalsetName(value, evalsetsDir) + validateInput: (value) => validateEvalsetName(value, evalsetsDir) }); if (!name) { return; } // User cancelled @@ -614,8 +548,8 @@ export class TraceDetailsWebview { ): Promise<void> { try { // 1. Ensure evalsets directory and find files - const evalsetsDir = await this.ensureEvalsetsDirectory(); - const existingEvalsets = await this.findExistingEvalsets(evalsetsDir); + const evalsetsDir = await ensureEvalsetsDirectory(); + const existingEvalsets = await findExistingEvalsets(evalsetsDir); if (existingEvalsets.length === 0) { vscode.window.showErrorMessage('No evalsets found. Create a new one first.'); @@ -699,8 +633,8 @@ export class TraceDetailsWebview { ): Promise<void> { try { // 1. Ensure evalsets directory and find files - const evalsetsDir = await this.ensureEvalsetsDirectory(); - const existingEvalsets = await this.findExistingEvalsets(evalsetsDir); + const evalsetsDir = await ensureEvalsetsDirectory(); + const existingEvalsets = await findExistingEvalsets(evalsetsDir); if (existingEvalsets.length === 0) { vscode.window.showErrorMessage('No evalsets found. Create a new one first.'); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index 6a58bdbb234..5ea79bf6e03 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -134,11 +134,11 @@ export const createNewTrace = (tools: EvalToolSchema[] = []): EvalsetTrace => { id: generateTraceId(), userMessage: { role: 'user', - content: 'User Query', + content: 'User message', }, output: { role: 'assistant', - content: 'Agent Response', + content: 'Agent response', }, tools: tools, toolCalls: [], From 313c3ee20f12328abfbfe826128bcfb31d172a5f Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sat, 14 Feb 2026 23:11:09 +0530 Subject: [PATCH 233/247] Update evalset viewer to show all threads as an overview page --- .../test-explorer/evalset-commands.ts | 38 ++- .../test-explorer/evalset-tree-view.ts | 5 + .../views/EvalsetViewer/EvalThreadViewer.tsx | 33 ++- .../src/views/EvalsetViewer/EvalsetViewer.tsx | 272 +++++++++++++++--- 4 files changed, 297 insertions(+), 51 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts index e741b805a85..f046a972410 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts @@ -68,7 +68,7 @@ export async function createNewEvalset(): Promise<void> { } } -export async function createNewThread(evalsetFileNode?: any): Promise<void> { +export async function createNewThread(evalsetFileNode?: any, autoRefresh?: boolean): Promise<void> { try { // Validate that this was called from tree view with proper node if (!evalsetFileNode || !evalsetFileNode.uri) { @@ -142,14 +142,30 @@ export async function createNewThread(evalsetFileNode?: any): Promise<void> { await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); - // 7. Success message with Open option - const action = await vscode.window.showInformationMessage( - `Thread "${threadName}" added to evalset`, - 'Open' - ); + // 7. Handle UI refresh based on where the command was called from + if (autoRefresh) { + // Called from evalset viewer - refresh immediately to show new thread in list + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri); - if (action === 'Open') { - vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, newThread.id); + // Show non-blocking notification + vscode.window.showInformationMessage( + `Thread "${threadName}" added to evalset`, + 'Open' + ).then((action) => { + if (action === 'Open') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, newThread.id); + } + }); + } else { + // Called from tree view - use original behavior with blocking notification + const action = await vscode.window.showInformationMessage( + `Thread "${threadName}" added to evalset`, + 'Open' + ); + + if (action === 'Open') { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri, newThread.id); + } } } catch (error) { @@ -191,7 +207,7 @@ export async function deleteEvalset(evalsetFileNode?: any): Promise<void> { } } -export async function deleteThread(threadNode?: any): Promise<void> { +export async function deleteThread(threadNode?: any, autoRefresh?: boolean): Promise<void> { try { // Validate that this was called from tree view with proper node if (!threadNode || !threadNode.parentUri || !threadNode.threadId) { @@ -239,6 +255,10 @@ export async function deleteThread(threadNode?: any): Promise<void> { const fileUri = vscode.Uri.file(filePath); await vscode.workspace.fs.writeFile(fileUri, new TextEncoder().encode(jsonContent)); + // Handle UI refresh based on where the command was called from + if (autoRefresh) { + vscode.commands.executeCommand('ballerina.openEvalsetViewer', fileUri); + } vscode.window.showInformationMessage(`Thread "${threadToDelete.name}" deleted successfully`); } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts index c29cf8cca82..9c73b33d07a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-tree-view.ts @@ -109,6 +109,11 @@ export class EvalsetTreeDataProvider implements vscode.TreeDataProvider<EvalsetN item.iconPath = new vscode.ThemeIcon('collection'); item.contextValue = 'evalsetFile'; item.resourceUri = element.uri; + item.command = { + command: 'ballerina.openEvalsetViewer', + title: 'Open Evalset', + arguments: [element.uri] + }; return item; } else { const item = new vscode.TreeItem( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index c0723f73d96..d22cef6da3f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -123,6 +123,9 @@ const BannerDescription = styled.div` const HeaderLeft = styled.div` flex: 1; + display: flex; + align-items: center; + gap: 12px; `; const HeaderRight = styled.div` @@ -131,6 +134,19 @@ const HeaderRight = styled.div` gap: 12px; `; +const IconButton = styled.div` + padding: 4px; + cursor: pointer; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + } +`; + const UnsavedIndicator = styled.div` display: flex; align-items: center; @@ -456,6 +472,13 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, const [deleteToolCall, setDeleteToolCall] = useState<{ traceId: string; toolCallIndex: number } | null>(null); const [availableToolsCache, setAvailableToolsCache] = useState<EvalToolSchema[] | null>(null); + // Handle back navigation to thread list view + const handleBack = () => { + rpcClient.getCommonRpcClient().executeCommand({ + commands: ['ballerina.openEvalsetViewer', { fsPath: filePath }] + }); + }; + const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { @@ -702,8 +725,14 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, <Container> <Header> <HeaderLeft> - <Title>{evalSet.name}</Title> - <Subtitle>{displayCase.name}</Subtitle> + <IconButton onClick={handleBack} title="Back to thread list"> + <Icon name="chevron-left" isCodicon sx={{ display: "flex", alignItems: "center", justifyContent: "center" }} + iconSx={{ display: "flex", fontSize: "20px", color: "var(--vscode-foreground)" }} /> + </IconButton> + <div> + <Title>{evalSet.name}</Title> + <Subtitle>{displayCase.name}</Subtitle> + </div> </HeaderLeft> <HeaderRight> {isEditMode ? ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx index 02c7930ee8e..708d1b372a8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalsetViewer.tsx @@ -16,53 +16,141 @@ * under the License. */ -import React from "react"; +import React, { useState } from "react"; import styled from "@emotion/styled"; -import { EvalSet } from "@wso2/ballerina-core"; +import { EvalSet, EVENT_TYPE, MACHINE_VIEW } from "@wso2/ballerina-core"; import { EvalThreadViewer } from "./EvalThreadViewer"; +import { TopNavigationBar } from "../../components/TopNavigationBar"; +import { Button, Icon } from "@wso2/ui-toolkit"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; + +// --- LAYOUT COMPONENTS --- + +const PageWrapper = styled.div` + height: 100%; + width: 100%; + display: flex; + flex-direction: column; +`; const Container = styled.div` - padding: 20px; + flex: 1; + width: 100%; background-color: var(--vscode-editor-background); color: var(--vscode-editor-foreground); - font-family: var(--vscode-font-family); - height: 100%; - overflow-y: auto; + display: flex; + flex-direction: column; + overflow: hidden; + + *, *::before, *::after { + box-sizing: border-box; + } `; const Header = styled.div` - margin-bottom: 20px; - padding-bottom: 10px; + top: 0; + padding: 16px 24px; + position: sticky; + background-color: var(--vscode-editorWidget-background); + border-top: 1px solid var(--vscode-panel-border); border-bottom: 1px solid var(--vscode-panel-border); + z-index: 10; + display: flex; + align-items: flex-start; + justify-content: space-between; +`; + +const HeaderLeft = styled.div` + display: flex; + flex-direction: column; + gap: 4px; +`; + +const HeaderRight = styled.div` + display: flex; + align-items: center; + gap: 8px; `; const Title = styled.h1` - font-size: 1.5em; + font-size: 18px; font-weight: 600; - margin: 0 0 10px 0; + margin: 0; color: var(--vscode-foreground); `; const Subtitle = styled.p` - font-size: 13px; + font-size: 12px; color: var(--vscode-descriptionForeground); margin: 0; `; -const ContentSection = styled.div` - background-color: var(--vscode-textCodeBlock-background); - padding: 15px; - border-radius: 4px; +const ThreadListContainer = styled.div` + flex: 1; + overflow-y: auto; + padding: 24px; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 16px; + align-content: start; +`; + +const ThreadCard = styled.div` + padding: 16px; + background-color: var(--vscode-editorWidget-background); border: 1px solid var(--vscode-panel-border); + border-radius: 6px; + cursor: pointer; + transition: all 0.15s ease; + position: relative; + + &:hover { + border-color: var(--vscode-focusBorder); + background-color: var(--vscode-list-hoverBackground); + } `; -const Preformatted = styled.pre` - margin: 0; - font-family: var(--vscode-editor-font-family); - font-size: var(--vscode-editor-font-size); - white-space: pre-wrap; - word-break: break-word; - color: var(--vscode-editor-foreground); +const ThreadName = styled.div` + font-size: 14px; + font-weight: 600; + color: var(--vscode-foreground); + margin-bottom: 8px; +`; + +const ThreadMeta = styled.div` + font-size: 12px; + color: var(--vscode-descriptionForeground); + display: flex; + flex-direction: column; + gap: 4px; +`; + +const DeleteIconButton = styled.div` + position: absolute; + top: 8px; + right: 8px; + padding: 4px; + cursor: pointer; + border-radius: 4px; + transition: all 0.15s ease; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + } +`; + +const EmptyState = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 24px; + text-align: center; + color: var(--vscode-descriptionForeground); + gap: 8px; `; const ErrorMessage = styled.div` @@ -71,6 +159,7 @@ const ErrorMessage = styled.div` border: 1px solid var(--vscode-inputValidation-errorBorder); border-radius: 4px; color: var(--vscode-errorForeground); + margin: 24px; `; interface EvalsetViewerProps { @@ -81,34 +170,137 @@ interface EvalsetViewerProps { } export const EvalsetViewer: React.FC<EvalsetViewerProps> = ({ projectPath, filePath, content, threadId }) => { + const { rpcClient } = useRpcContext(); + const [isAddingThread, setIsAddingThread] = useState(false); + + // If a specific thread is selected, delegate to EvalThreadViewer if (threadId) { const evalThread = content.threads.find(c => c.id === threadId); if (!evalThread) { return ( - <Container> - <Header> - <Title>{filePath}</Title> - <Subtitle>Thread not found</Subtitle> - </Header> - <ErrorMessage> - Thread with ID "{threadId}" not found in this evalset. - </ErrorMessage> - </Container> + <PageWrapper> + <TopNavigationBar projectPath={projectPath} /> + <Container> + <ErrorMessage> + Thread with ID "{threadId}" not found in this evalset. + </ErrorMessage> + </Container> + </PageWrapper> ); } return <EvalThreadViewer projectPath={projectPath} filePath={filePath} evalSet={content} evalThread={evalThread} />; } + + // Handle thread creation by calling the existing VS Code command + const handleAddThread = async () => { + if (isAddingThread) { return; } + + setIsAddingThread(true); + try { + // Call the existing VS Code command that handles thread creation + // Pass autoRefresh=true to immediately refresh the view (vs waiting for notification) + await rpcClient.getCommonRpcClient().executeCommand({ + commands: [ + 'ballerina.createNewThread', + { uri: { fsPath: filePath } }, + true // autoRefresh parameter + ] + }); + } catch (error) { + console.error('Error adding thread:', error); + } finally { + setIsAddingThread(false); + } + }; + + // Handle clicking on a thread card + const handleThreadClick = (clickedThreadId: string) => { + rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { + view: MACHINE_VIEW.EvalsetViewer, + evalsetData: { + filePath, + content, + threadId: clickedThreadId + } + } + }); + }; + + // Handle deleting a thread + const handleDeleteThread = async (e: React.MouseEvent, threadId: string) => { + e.stopPropagation(); + + try { + await rpcClient.getCommonRpcClient().executeCommand({ + commands: [ + 'ballerina.deleteThread', + { + parentUri: { fsPath: filePath }, + threadId: threadId + }, + true + ] + }); + } catch (error) { + console.error('Error deleting thread:', error); + } + }; + + // Render thread list view return ( - <Container> - <Header> - <Title>{filePath}</Title> - <Subtitle>{content.threads.length} thread(s)</Subtitle> - </Header> - <ContentSection> - <Preformatted>{JSON.stringify(content, null, 2)}</Preformatted> - </ContentSection> - </Container> + <PageWrapper> + <TopNavigationBar projectPath={projectPath} /> + <Container> + <Header> + <HeaderLeft> + <Title>{content.name}</Title> + <Subtitle> + {content.threads.length} thread{content.threads.length !== 1 ? 's' : ''} + </Subtitle> + </HeaderLeft> + <HeaderRight> + <Button + onClick={handleAddThread} + disabled={isAddingThread} + appearance="primary" + > + <Icon name="add" isCodicon sx={{ marginRight: "4px" }} /> + Add Thread + </Button> + </HeaderRight> + </Header> + {content.threads.length === 0 ? ( + <EmptyState> + <div style={{ fontSize: '13px', fontWeight: 500 }}>No threads yet</div> + <div style={{ fontSize: '12px' }}>Click "Add Thread" to create your first thread</div> + </EmptyState> + ) : ( + <ThreadListContainer> + {content.threads.map((thread) => ( + <ThreadCard key={thread.id} onClick={() => handleThreadClick(thread.id)}> + <DeleteIconButton + className="delete-icon" + onClick={(e) => handleDeleteThread(e, thread.id)} + title="Delete thread" + > + <Icon name="bi-delete" iconSx={{ fontSize: "16px", display: "flex" }} sx={{ display: "flex", alignItems: "center", justifyContent: "center" }} /> + </DeleteIconButton> + <ThreadName>{thread.name}</ThreadName> + <ThreadMeta> + <div>{thread.traces.length} turn{thread.traces.length !== 1 ? 's' : ''}</div> + {thread.created_on && ( + <div>Created: {new Date(thread.created_on).toLocaleDateString()}</div> + )} + </ThreadMeta> + </ThreadCard> + ))} + </ThreadListContainer> + )} + </Container> + </PageWrapper> ); }; From f68252de9c2f913996d49500e54ac1ba0c7feb45 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 15 Feb 2026 17:49:20 +0530 Subject: [PATCH 234/247] Clean up group names by removing leading/trailing quotes in test creation --- .../src/features/test-explorer/discover.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 98d80744175..cfffe73c28e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts @@ -119,6 +119,8 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr // Iterate over the result map (test groups) for (const [group, testFunctions] of entries) { let groupItem: TestItem | undefined; + // Remove leading/trailing quotes from group name for display + const cleanedGroupName = group.replace(/^["']|["']$/g, ''); // For workspace context with DEFAULT_GROUP, skip the group level and add tests directly to project if (isWorkspaceContext && group === 'DEFAULT_GROUP' && projectGroupItem) { @@ -128,7 +130,7 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr const groupId = `group:${path.basename(projectPath)}:${group}`; groupItem = projectGroupItem.children.get(groupId); if (!groupItem) { - groupItem = testController.createTestItem(groupId, group); + groupItem = testController.createTestItem(groupId, cleanedGroupName); projectGroupItem.children.add(groupItem); groups.push(groupId); } @@ -137,7 +139,7 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr const groupId = `group:${group}`; groupItem = testController.items.get(groupId); if (!groupItem) { - groupItem = testController.createTestItem(groupId, group); + groupItem = testController.createTestItem(groupId, cleanedGroupName); testController.items.add(groupItem); groups.push(groupId); } From 3e7a3cd36b98969ec2a464dba077499543d25bc5 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 15 Feb 2026 18:28:17 +0530 Subject: [PATCH 235/247] Make toolCalls optional on EvalsetTrace type --- .../ballerina-core/src/state-machine-types.ts | 2 +- .../src/features/test-explorer/evalset-commands.ts | 1 - .../src/features/tracing/trace-converter.ts | 2 +- .../AgentChatPanel/Components/ChatInterface.tsx | 2 -- .../src/views/EvalsetViewer/EvalThreadViewer.tsx | 4 ++-- .../src/views/EvalsetViewer/utils/traceAdapters.ts | 12 +++++++----- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index b56a181e16d..f691afc5df2 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -263,7 +263,7 @@ export interface EvalsetTrace { iterations: EvalIteration[]; output: EvalChatAssistantMessage | any; tools: EvalToolSchema[]; - toolCalls: EvalFunctionCall[]; + toolCalls?: EvalFunctionCall[]; startTime: string; endTime: string; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts index f046a972410..d96b6593869 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts @@ -122,7 +122,6 @@ export async function createNewThread(evalsetFileNode?: any, autoRefresh?: boole content: 'Agent response' }, tools: [], - toolCalls: [], startTime: now, endTime: now }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts index c2e4c3e872b..777a69c73c6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/trace-converter.ts @@ -313,7 +313,7 @@ export function convertTraceToEvalset(traceData: TraceData): EvalsetTrace { iterations: iterations, output: finalOutput, tools: tools, - toolCalls: finalOutputToolCalls, + ...(finalOutputToolCalls.length > 0 && { toolCalls: finalOutputToolCalls }), startTime: startTime, endTime: endTime }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx index 37ecc70f6af..b61d2f20842 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AgentChatPanel/Components/ChatInterface.tsx @@ -128,8 +128,6 @@ export const ProfilePic = styled.div` padding: 4px; border: 1px solid var(--vscode-panel-border); background-color: var(--vscode-editor-background); - width: 28px; - height: 28px; border-radius: 50%; object-fit: cover; `; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index d22cef6da3f..40f9b6231b6 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -797,13 +797,13 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, onSave={handleSaveUserMessage} /> <ProfilePic> - <Icon name="bi-user" iconSx={{ fontSize: "18px", color: "var(--vscode-foreground)" }} /> + <Icon name="bi-user" sx={{ width: 18, height: 18 }} iconSx={{ fontSize: "18px", color: "var(--vscode-foreground)" }} /> </ProfilePic> </StyledMessageContainer> <StyledMessageContainer isUser={false}> <ProfilePic> - <Icon name="bi-ai-agent" iconSx={{ fontSize: "18px", color: "var(--vscode-terminal-ansiBrightCyan)" }} /> + <Icon name="bi-ai-agent" sx={{ width: 18, height: 18 }} iconSx={{ fontSize: "18px", color: "var(--vscode-terminal-ansiBrightCyan)" }} /> </ProfilePic> <AgentContentWrapper> {isEditMode ? ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts index 5ea79bf6e03..c742f78307a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/utils/traceAdapters.ts @@ -68,10 +68,13 @@ export const updateToolCallsInTrace = ( trace: EvalsetTrace, toolCalls: EvalFunctionCall[] ): EvalsetTrace => { - return { - ...trace, - toolCalls: toolCalls || [], - }; + const updated = { ...trace }; + if (toolCalls && toolCalls.length > 0) { + updated.toolCalls = toolCalls; + } else { + delete updated.toolCalls; + } + return updated; }; /** @@ -141,7 +144,6 @@ export const createNewTrace = (tools: EvalToolSchema[] = []): EvalsetTrace => { content: 'Agent response', }, tools: tools, - toolCalls: [], iterations: [], startTime: timestamp, endTime: timestamp, From 256e5252632c6c998ab802a3c1fc134b84da5091 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 15 Feb 2026 18:42:46 +0530 Subject: [PATCH 236/247] Add a delay when hovering over editable components in evalthread viewer --- .../src/views/EvalsetViewer/EvalThreadViewer.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index 40f9b6231b6..ec10aae5a73 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -355,11 +355,13 @@ const StyledMessageContainer = styled(MessageContainer)` padding-bottom: 4px; margin-bottom: 8px; border-width: 1px; + transition-delay: 0.2s; } &:hover .edit-button { opacity: 1; transform: translate(0, 0); + transition-delay: 0.2s; } `; @@ -392,12 +394,17 @@ const AddToolButton = styled.button` max-height: 0; overflow: hidden; transition: all 0.2s ease; + pointer-events: none; &:hover { background-color: var(--vscode-list-hoverBackground); border-color: var(--vscode-focusBorder); color: var(--vscode-foreground); } + + .message-container:hover & { + pointer-events: auto; + } `; interface SortableTraceWrapperProps { @@ -801,7 +808,7 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, </ProfilePic> </StyledMessageContainer> - <StyledMessageContainer isUser={false}> + <StyledMessageContainer isUser={false} className="message-container"> <ProfilePic> <Icon name="bi-ai-agent" sx={{ width: 18, height: 18 }} iconSx={{ fontSize: "18px", color: "var(--vscode-terminal-ansiBrightCyan)" }} /> </ProfilePic> From 9954fee3b0701bd647fd8f6a85929ad35738f29e Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Sun, 15 Feb 2026 18:57:50 +0530 Subject: [PATCH 237/247] Unify ToolCallsTimeline and EditableToolCallsList --- .../views/EvalsetViewer/EvalThreadViewer.tsx | 24 +- ...bleToolCallsList.tsx => ToolCallsList.tsx} | 187 +++++++++------ .../views/EvalsetViewer/ToolCallsTimeline.tsx | 215 ------------------ 3 files changed, 133 insertions(+), 293 deletions(-) rename workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/{EditableToolCallsList.tsx => ToolCallsList.tsx} (53%) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index ec10aae5a73..e0e3ef141a2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -20,12 +20,11 @@ import React, { useState } from "react"; import styled from "@emotion/styled"; import { EvalThread, EvalSet, EvalFunctionCall, EvalsetTrace, EvalToolSchema, AvailableNode } from "@wso2/ballerina-core"; import { MessageContainer, ProfilePic } from "../AgentChatPanel/Components/ChatInterface"; -import { ToolCallsTimeline } from "./ToolCallsTimeline"; import { Button, Icon } from "@wso2/ui-toolkit"; import { TopNavigationBar } from "../../components/TopNavigationBar"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { EditableTraceMessage } from "./EditableTraceMessage"; -import { EditableToolCallsList } from "./EditableToolCallsList"; +import { ToolCallsList } from "./ToolCallsList"; import { ToolEditorModal } from "./ToolEditorModal"; import { ConfirmationModal } from "./ConfirmationModal"; import { @@ -813,18 +812,15 @@ export const EvalThreadViewer: React.FC<EvalThreadViewerProps> = ({ projectPath, <Icon name="bi-ai-agent" sx={{ width: 18, height: 18 }} iconSx={{ fontSize: "18px", color: "var(--vscode-terminal-ansiBrightCyan)" }} /> </ProfilePic> <AgentContentWrapper> - {isEditMode ? ( - <EditableToolCallsList - traceId={trace.id} - toolCalls={toolCalls} - availableTools={trace.tools} - onUpdate={handleUpdateToolCalls} - onEditToolCall={handleEditToolCall} - onDeleteRequest={handleDeleteToolCallRequest} - /> - ) : ( - <ToolCallsTimeline toolCalls={toolCalls} /> - )} + <ToolCallsList + traceId={trace.id} + toolCalls={toolCalls} + availableTools={trace.tools} + isEditMode={isEditMode} + onUpdate={handleUpdateToolCalls} + onEditToolCall={handleEditToolCall} + onDeleteRequest={handleDeleteToolCallRequest} + /> {isEditMode && ( <AddToolButton className="add-tool-button" onClick={async () => { const tools = await fetchAvailableTools(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsList.tsx similarity index 53% rename from workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx rename to workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsList.tsx index f0bc55ec0ad..71d8a6407de 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EditableToolCallsList.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsList.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React from 'react'; +import React, { useState } from 'react'; import styled from '@emotion/styled'; import { DndContext, @@ -36,7 +36,7 @@ import { } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { EvalFunctionCall, EvalToolSchema } from '@wso2/ballerina-core'; -import { Icon } from '@wso2/ui-toolkit'; +import { Codicon, Icon } from '@wso2/ui-toolkit'; // --- STYLES --- @@ -47,26 +47,55 @@ const TimelineContainer = styled.div` padding-left: 0; `; -const TimelineTrack = styled.div` +const TimelineTrack = styled.div<{ $isVisible: boolean }>` position: absolute; - left: 15px; + left: 15px; top: 24px; bottom: -2px; width: 2px; background-color: var(--vscode-button-background); - opacity: 0.3; + opacity: ${(props: { $isVisible: any; }) => props.$isVisible ? 0.3 : 0}; z-index: 0; + transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1); +`; + +const TimelineHeader = styled.button` + display: flex; + align-items: center; + gap: 4px; + background: transparent; + border: none; + padding: 0 0 8px 4px; + cursor: pointer; + margin-bottom: 0; `; const HeaderTitle = styled.div` font-size: 11px; font-weight: 600; color: var(--vscode-descriptionForeground); - margin-bottom: 8px; - padding-left: 4px; `; -const ToolCard = styled.div<{ $isDragging?: boolean }>` +const ToggleIcon = styled.span<{ $isOpen: boolean }>` + color: var(--vscode-descriptionForeground); + display: inline-flex; + align-items: center; + justify-content: center; + transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); + transform: ${(props: { $isOpen: any; }) => props.$isOpen ? "rotate(90deg)" : "rotate(0deg)"}; +`; + +const TimelineList = styled.div<{ $isCollapsed: boolean }>` + display: flex; + flex-direction: column; + max-height: ${(props: { $isCollapsed: any; }) => props.$isCollapsed ? '0px' : '2000px'}; + opacity: ${(props: { $isCollapsed: any; }) => props.$isCollapsed ? 0 : 1}; + overflow: hidden; + transition: max-height 0.6s cubic-bezier(0.4, 0, 0.2, 1), + opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); +`; + +const ToolCard = styled.div<{ $isDragging?: boolean; $isEditMode: boolean }>` background-color: var(--vscode-textBlockQuote-background); border: 1px solid var(--vscode-panel-border); border-radius: 6px; @@ -77,13 +106,13 @@ const ToolCard = styled.div<{ $isDragging?: boolean }>` position: relative; z-index: 1; margin-bottom: 8px; - + opacity: ${(props: { $isDragging: any; }) => props.$isDragging ? 0.5 : 1}; transition: border-color 0.2s, background-color 0.2s; &:hover { background-color: var(--vscode-list-hoverBackground); - border-color: var(--vscode-focusBorder); + border-color: ${(props: { $isEditMode: any; }) => props.$isEditMode ? 'var(--vscode-focusBorder)' : 'var(--vscode-panel-border)'}; } `; @@ -117,13 +146,14 @@ const DragHandle = styled.div` } `; -const ToolInfo = styled.div` +const ToolInfo = styled.div<{ $isClickable: boolean }>` flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; padding-top: 2px; + cursor: ${(props: { $isClickable: any; }) => props.$isClickable ? 'pointer' : 'default'}; `; const ToolName = styled.div` @@ -150,7 +180,6 @@ const Actions = styled.div` opacity: 0; transition: opacity 0.2s; - /* Fixed interpolation: Target the parent class name */ .tool-card-row:hover & { opacity: 1; } @@ -179,7 +208,6 @@ const formatArgs = (args: any) => { if (!args) return "()"; if (typeof args === 'string') return args; try { - // Create a compact representation: { a: 1, b: 2 } return JSON.stringify(args).replace(/"/g, '').replace(/:/g, ': ').replace(/,/g, ', '); } catch (e) { return "Invalid arguments"; @@ -191,13 +219,15 @@ const formatArgs = (args: any) => { interface SortableToolCallItemProps { toolCall: EvalFunctionCall; index: number; - onEdit: () => void; - onDelete: () => void; + isEditMode: boolean; + onEdit?: () => void; + onDelete?: () => void; } const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ toolCall, index, + isEditMode, onEdit, onDelete, }) => { @@ -209,7 +239,7 @@ const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ transform, transition, isDragging, - } = useSortable({ id: sortableId }); + } = useSortable({ id: sortableId, disabled: !isEditMode }); const style = { transform: CSS.Transform.toString(transform), @@ -218,50 +248,59 @@ const SortableToolCallItem: React.FC<SortableToolCallItemProps> = ({ return ( <div ref={setNodeRef} style={style}> - {/* Added className for the CSS selector in Actions */} - <ToolCard $isDragging={isDragging} className="tool-card-row"> - <DragHandle {...attributes} {...listeners}> - <Icon name="bi-drag" iconSx={{ fontSize: "16px" }} /> - </DragHandle> + <ToolCard $isDragging={isDragging} $isEditMode={isEditMode} className="tool-card-row"> + {isEditMode && ( + <DragHandle {...attributes} {...listeners}> + <Icon name="bi-drag" iconSx={{ fontSize: "16px" }} /> + </DragHandle> + )} <IconBadgeWrapper> <Icon name="bi-wrench" sx={{ display: "flex", justifyContent: "center", alignItems: "center" }} iconSx={{ display: "flex", fontSize: "16px" }} /> </IconBadgeWrapper> - <ToolInfo onClick={onEdit} style={{ cursor: 'pointer' }}> + <ToolInfo + $isClickable={isEditMode && !!onEdit} + onClick={isEditMode && onEdit ? onEdit : undefined} + > <ToolName>{toolCall.name}</ToolName> <ArgumentsPreview> {formatArgs(toolCall.arguments)} </ArgumentsPreview> </ToolInfo> - <Actions> - <ActionButton $danger onClick={(e) => { e.stopPropagation(); onDelete(); }} title="Delete"> - <Icon name="bi-delete" iconSx={{ fontSize: "16px" }} /> - </ActionButton> - </Actions> + {isEditMode && onDelete && ( + <Actions> + <ActionButton $danger onClick={(e) => { e.stopPropagation(); onDelete(); }} title="Delete"> + <Icon name="bi-delete" iconSx={{ fontSize: "16px" }} /> + </ActionButton> + </Actions> + )} </ToolCard> </div> ); }; -interface EditableToolCallsListProps { - traceId: string; +interface ToolCallsListProps { + traceId?: string; toolCalls: EvalFunctionCall[]; - availableTools: EvalToolSchema[]; - onUpdate: (traceId: string, toolCalls: EvalFunctionCall[]) => void; - onEditToolCall: (traceId: string, toolCallIndex: number) => void; - onDeleteRequest: (traceId: string, toolCallIndex: number) => void; + availableTools?: EvalToolSchema[]; + isEditMode: boolean; + onUpdate?: (traceId: string, toolCalls: EvalFunctionCall[]) => void; + onEditToolCall?: (traceId: string, toolCallIndex: number) => void; + onDeleteRequest?: (traceId: string, toolCallIndex: number) => void; } -export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ - traceId, +export const ToolCallsList: React.FC<ToolCallsListProps> = ({ + traceId = '', toolCalls, - availableTools, + isEditMode, onUpdate, onEditToolCall, onDeleteRequest, }) => { + const [isOpen, setIsOpen] = useState(false); + const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { @@ -270,10 +309,11 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ ); const handleDragEnd = (event: DragEndEvent) => { + if (!isEditMode || !onUpdate) return; + const { active, over } = event; if (over && active.id !== over.id) { - // Extract index from composite ID: "id-index" or "name-index" const oldIndex = toolCalls.findIndex( (tc, idx) => `${tc.id ?? tc.name}-${idx}` === active.id ); @@ -290,36 +330,55 @@ export const EditableToolCallsList: React.FC<EditableToolCallsListProps> = ({ return null; } + const headerTitle = isEditMode ? "Tool Execution Chain" : `Tool Executions (${toolCalls.length})`; + const showHeader = !isEditMode || toolCalls.length > 0; + const isCollapsed = !isEditMode && !isOpen; + return ( <TimelineContainer> - <HeaderTitle>Tool Execution Chain</HeaderTitle> - - {/* Visual Line connecting the tools */} - <TimelineTrack /> - - <DndContext - sensors={sensors} - collisionDetection={closestCenter} - onDragEnd={handleDragEnd} - > - <SortableContext - items={toolCalls.map((tc, idx) => `${tc.id ?? tc.name}-${idx}`)} - strategy={verticalListSortingStrategy} + {showHeader && ( + <> + {!isEditMode ? ( + <TimelineHeader onClick={() => setIsOpen(!isOpen)} aria-expanded={isOpen}> + <HeaderTitle>{headerTitle}</HeaderTitle> + <ToggleIcon $isOpen={isOpen}> + <Codicon name="chevron-right" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> + </ToggleIcon> + </TimelineHeader> + ) : ( + <HeaderTitle style={{ paddingBottom: '8px', paddingLeft: '4px' }}>{headerTitle}</HeaderTitle> + )} + </> + )} + + <TimelineTrack $isVisible={isEditMode || isOpen} /> + + <TimelineList $isCollapsed={isCollapsed}> + <DndContext + sensors={sensors} + collisionDetection={closestCenter} + onDragEnd={handleDragEnd} > - {toolCalls.map((toolCall, index) => { - const sortableId = `${toolCall.id ?? toolCall.name}-${index}`; - return ( - <SortableToolCallItem - key={sortableId} - toolCall={toolCall} - index={index} - onEdit={() => onEditToolCall(traceId, index)} - onDelete={() => onDeleteRequest(traceId, index)} - /> - ); - })} - </SortableContext> - </DndContext> + <SortableContext + items={toolCalls.map((tc, idx) => `${tc.id ?? tc.name}-${idx}`)} + strategy={verticalListSortingStrategy} + > + {toolCalls.map((toolCall, index) => { + const sortableId = `${toolCall.id ?? toolCall.name}-${index}`; + return ( + <SortableToolCallItem + key={sortableId} + toolCall={toolCall} + index={index} + isEditMode={isEditMode} + onEdit={isEditMode && onEditToolCall ? () => onEditToolCall(traceId, index) : undefined} + onDelete={isEditMode && onDeleteRequest ? () => onDeleteRequest(traceId, index) : undefined} + /> + ); + })} + </SortableContext> + </DndContext> + </TimelineList> </TimelineContainer> ); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx deleted file mode 100644 index a88f0071750..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/ToolCallsTimeline.tsx +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { useState } from "react"; -import styled from "@emotion/styled"; -import { Codicon, Icon } from "@wso2/ui-toolkit"; -import { EvalFunctionCall } from "@wso2/ballerina-core"; - -interface ToolCallsTimelineProps { - toolCalls: EvalFunctionCall[]; -} - -const TimelineContainer = styled.div` - max-width: 600px; - margin: 12px 0 8px; -`; - -const TimelineTitle = styled.div` - font-size: 11px; - color: var(--vscode-descriptionForeground); - letter-spacing: 0.5px; -`; - -const TimelineHeader = styled.button` - display: flex; - align-items: center; - gap: 2px; - background: transparent; - border: none; - padding: 0; - cursor: pointer; -`; - -const ToggleIcon = styled.span<{ isOpen: boolean }>` - color: var(--vscode-descriptionForeground); - display: inline-flex; - align-items: center; - justify-content: center; - transition: transform 0.15s ease; - transform: ${(props: { isOpen: boolean }) => (props.isOpen ? "rotate(90deg)" : "rotate(0deg)")}; -`; - -const TimelineList = styled.div` - margin-top: 8px; - margin-bottom: 4px; - display: flex; - flex-direction: column; - gap: 0; -`; - -const TimelineItem = styled.div` - display: flex; - align-items: flex-start; - position: relative; - margin-bottom: 8px; - - &:last-of-type { - margin-bottom: 0; - } -`; - -const ConnectorColumn = styled.div<{ isLast: boolean }>` - width: 20px; - display: flex; - flex-direction: column; - align-items: center; - position: relative; - flex-shrink: 0; - padding-top: 4px; - - &::after { - content: ''; - position: absolute; - top: 14px; - left: 50%; - transform: translateX(-50%); - width: 1px; - height: calc(100% + 8px); - background-color: var(--vscode-panel-border); - display: ${(props: { isLast: boolean }) => props.isLast ? 'none' : 'block'}; - } -`; - -const Dot = styled.div` - width: 8px; - height: 8px; - border-radius: 50%; - background-color: var(--vscode-panel-border); - z-index: 1; - flex-shrink: 0; -`; - -const ContentCard = styled.div` - width: 60%; - background-color: transparent; - border: 1px solid var(--vscode-widget-border); - border-radius: 6px; - padding: 12px; - transition: background-color 0.2s; - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } -`; - -const CardContent = styled.div` - display: flex; - align-items: center; - gap: 12px; -`; - -const IconBadge = styled.div` - display: flex; - align-items: center; - justify-content: center; - color: var(--vscode-terminal-ansiBrightMagenta); - flex-shrink: 0; -`; - -const ToolInfo = styled.div` - flex: 1; - min-width: 0; -`; - -const ToolName = styled.div` - font-size: 14px; - font-weight: 600; - color: var(--vscode-foreground); - margin-bottom: 4px; -`; - -const ToolArgs = styled.div` - font-size: 12px; - color: var(--vscode-descriptionForeground); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -`; - -export function ToolCallsTimeline({ toolCalls }: ToolCallsTimelineProps) { - const [open, setOpen] = useState(false); - - if (!toolCalls || toolCalls.length === 0) { - return null; - } - - return ( - <TimelineContainer> - <TimelineHeader onClick={() => setOpen(!open)} aria-expanded={open}> - <TimelineTitle>Tool Executions ({toolCalls.length})</TimelineTitle> - <ToggleIcon isOpen={open}> - <Codicon name="chevron-right" sx={{ fontSize: "14px", width: "14px", height: "14px", display: "flex", alignItems: "center", justifyContent: "center" }} iconSx={{ display: "flex" }} /> - </ToggleIcon> - </TimelineHeader> - {open && ( - <TimelineList> - {toolCalls.map((toolCall, index) => { - const argsPreview = toolCall.arguments - ? Object.entries(toolCall.arguments) - .map(([key, value]) => `${key}: ${JSON.stringify(value)}`) - .join(', ') - : 'No arguments'; - - return ( - <TimelineItem key={toolCall.id || index}> - <ContentCard title={toolCall.name}> - <CardContent> - <IconBadge> - <Icon - name="bi-wrench" - sx={{ - fontSize: '16px', - width: '16px', - height: '16px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - iconSx={{ - fontSize: "16px", - display: 'flex', - alignItems: 'center', - justifyContent: 'center' - }} - /> - </IconBadge> - <ToolInfo> - <ToolName>{toolCall.name}</ToolName> - <ToolArgs>{argsPreview}</ToolArgs> - </ToolInfo> - </CardContent> - </ContentCard> - </TimelineItem> - ); - })} - </TimelineList> - )} - </TimelineContainer> - ); -} From aaf8516c604bbaeb8b108f922c6e69eb8463d3a4 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 16 Feb 2026 11:01:59 +0530 Subject: [PATCH 238/247] Fix advanced configurations not showing in forms --- .../src/components/Form/index.tsx | 85 ++++++++++++++++++- 1 file changed, 82 insertions(+), 3 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 0382a1d9a58..7b6092665fb 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -1054,9 +1054,88 @@ export const Form = forwardRef((props: FormProps) => { }); } - return renderedComponents; - })()} - </S.CategoryRow> + return renderedComponents; + })()} + {hasAdvanceFields && ( + <S.Row> + {optionalFieldsTitle} + <S.ButtonContainer> + {!showAdvancedOptions && ( + <LinkButton + onClick={handleOnShowAdvancedOptions} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={"chevron-down"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + /> + Expand + </LinkButton> + )} + {showAdvancedOptions && ( + <LinkButton + onClick={handleOnHideAdvancedOptions} + sx={{ fontSize: 12, padding: 8, color: ThemeColors.PRIMARY, gap: 4 }} + > + <Codicon + name={"chevron-up"} + iconSx={{ fontSize: 12 }} + sx={{ height: 12 }} + />Collapse + </LinkButton> + )} + </S.ButtonContainer> + </S.Row> + )} + {hasAdvanceFields && + showAdvancedOptions && + formFields.map((field) => { + if (field.advanced && !field.hidden) { + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + onBlur={handleOnBlur} + /> + </S.Row> + ); + } + return null; + })} + {hasAdvanceFields && + showAdvancedOptions && + advancedChoiceFields.map((field) => { + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + <S.Row key={updatedField.key}> + <EditorFactory + field={updatedField} + openRecordEditor={ + openRecordEditor && + ((open: boolean, newType?: string | NodeProperties) => handleOpenRecordEditor(open, updatedField, newType)) + } + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + onBlur={handleOnBlur} + /> + </S.Row> + ); + })} + </S.CategoryRow> {!preserveOrder && (variableField || typeField || targetTypeField) && ( <S.CategoryRow topBorder={!compact && hasParameters}> From 5f2ad23558ca6909d005c53d7682247e8f3afa99 Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 16 Feb 2026 11:22:21 +0530 Subject: [PATCH 239/247] Generate test report when running evals --- .../src/features/test-explorer/activator.ts | 2 + .../src/features/test-explorer/commands.ts | 5 +- .../src/features/test-explorer/runner.ts | 70 ++++++++++++------- .../views/EvalsetViewer/EvalThreadViewer.tsx | 6 +- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index 426fd278a26..e7f83ef2844 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -33,6 +33,8 @@ import * as fs from 'fs'; export let testController: TestController; +export const EVALUATION_GROUP = '"evaluations"'; + export async function activate(ballerinaExtInstance: BallerinaExtension) { // Register command to open evalset viewer const openEvalsetCommand = commands.registerCommand('ballerina.openEvalsetViewer', async (uri: Uri, threadId?: string) => { diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index 62149622b94..652910e30fa 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -30,6 +30,7 @@ import { findBallerinaPackageRoot } from "../../utils"; import { MESSAGES } from "../project"; import { BallerinaExtension } from "../../core"; import { isSupportedSLVersion, createVersionNumber } from "../../utils/config"; +import { EVALUATION_GROUP } from "./activator"; export function activateEditBiTest(ballerinaExtInstance: BallerinaExtension) { // Check if AI Evaluation features are supported @@ -312,10 +313,8 @@ function hasEvaluationGroup(testFunction: any): boolean { if (!Array.isArray(groupsField.value)) { return false; } // Check if "evaluations" is in the groups array - // Note: The values may include quotes, so we need to strip them const hasEvaluation = groupsField.value.some((group: string) => { - const cleanedGroup = group.replace(/^["']|["']$/g, ''); // Remove leading/trailing quotes - return cleanedGroup === 'evaluations'; + return group === EVALUATION_GROUP; }); return hasEvaluation; } 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 c1d6aafd496..77ae8f4cafa 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts @@ -19,7 +19,7 @@ import { exec } from 'child_process'; import { CancellationToken, TestRunRequest, TestMessage, TestRun, TestItem, debug, Uri, WorkspaceFolder, DebugConfiguration, workspace, TestRunProfileKind } from 'vscode'; -import { testController } from './activator'; +import { EVALUATION_GROUP, testController } from './activator'; import { StateMachine } from "../../stateMachine"; import { isTestFunctionItem, isTestGroupItem, isProjectGroupItem } from './discover'; import { extension } from '../../BalExtensionContext'; @@ -35,7 +35,7 @@ function getProjectPathFromTestItem(test: TestItem): string | undefined { if (isTestFunctionItem(test)) { // Extract from test ID: test:${projectPath}:${fileName}:${functionName} const parts = test.id.split(':'); - if (parts.length >= 2 && parts[0] === 'test') { + if (parts.length >= 2 && parts[0] === 'test') { return parts[1]; } } else if (isProjectGroupItem(test)) { @@ -84,6 +84,44 @@ function getProjectNameIfWorkspace(projectPath: string): string | undefined { return undefined; } +function isAiEvaluations(test: TestItem): boolean { + // Check if the test item itself is the evaluations group + if (isTestGroupItem(test) && test.label === EVALUATION_GROUP) { + return true; + } + + // Check if the test function's parent is the evaluations group + if (isTestFunctionItem(test) && test.parent && test.parent.label === EVALUATION_GROUP) { + return true; + } + + // Check if the project group contains any evaluations group + if (isProjectGroupItem(test)) { + let hasEvaluationsGroup = false; + test.children.forEach((child) => { + if (isTestGroupItem(child) && child.label === EVALUATION_GROUP) { + hasEvaluationsGroup = true; + } + }); + return hasEvaluationsGroup; + } + + return false; +} + +function buildTestCommand(test: TestItem, executor: string, projectName: string | undefined, testCaseNames?: string[]): string { + if (isAiEvaluations(test)) { + // Evaluations tests use group-based execution with test report + const projectPart = projectName ? ` ${projectName}` : ''; + return `${executor} test --groups ${EVALUATION_GROUP} --test-report --test-report-dir=evaluation-reports${projectPart}`; + } else { + // Standard tests use code coverage and optional test filtering + const testsPart = testCaseNames && testCaseNames.length > 0 ? ` --tests ${testCaseNames.join(',')}` : ''; + const projectPart = projectName ? ` ${projectName}` : ''; + return `${executor} test --code-coverage${testsPart}${projectPart}`; + } +} + export async function runHandler(request: TestRunRequest, token: CancellationToken) { if (!request.include) { return; @@ -153,17 +191,7 @@ export async function runHandler(request: TestRunRequest, token: CancellationTok } }); - if (projectName) { - // Workspace context - include project name in command - command = testCaseNames.length > 0 - ? `${executor} test --code-coverage --tests ${testCaseNames.join(',')} ${projectName}` - : `${executor} test --code-coverage ${projectName}`; - } else { - // Single project context - command = testCaseNames.length > 0 - ? `${executor} test --code-coverage --tests ${testCaseNames.join(',')}` - : `${executor} test --code-coverage`; - } + command = buildTestCommand(test, executor, projectName, testCaseNames.length > 0 ? testCaseNames : undefined); const startTime = Date.now(); // For workspace, run from workspace root; for single project, run from project path @@ -197,13 +225,7 @@ export async function runHandler(request: TestRunRequest, token: CancellationTok run.started(child); }); - if (projectName) { - // Workspace context - include project name in command - command = `${executor} test --code-coverage --tests ${testCaseNames.join(',')} ${projectName}`; - } else { - // Single project context - command = `${executor} test --code-coverage --tests ${testCaseNames.join(',')}`; - } + command = buildTestCommand(test, executor, projectName, testCaseNames); const startTime = Date.now(); // For workspace, run from workspace root; for single project, run from project path @@ -228,13 +250,7 @@ export async function runHandler(request: TestRunRequest, token: CancellationTok }); }); } else if (isTestFunctionItem(test)) { - if (projectName) { - // Workspace context - include project name in command - command = `${executor} test --code-coverage --tests ${test.label} ${projectName}`; - } else { - // Single project context - command = `${executor} test --code-coverage --tests ${test.label}`; - } + command = buildTestCommand(test, executor, projectName, [test.label]); const parentGroup = test.parent; let testItems: TestItem[] = []; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx index e0e3ef141a2..d97b56dadba 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/EvalsetViewer/EvalThreadViewer.tsx @@ -106,7 +106,7 @@ const EditModeBanner = styled.div<{ $isVisible: boolean }>` opacity: ${(props: { $isVisible: any; }) => (props.$isVisible ? 1 : 0)}; padding: ${(props: { $isVisible: any; }) => (props.$isVisible ? '12px 24px' : '0px 24px')}; border-bottom: 1px solid ${(props: { $isVisible: any; }) => (props.$isVisible ? 'var(--vscode-panel-border)' : 'transparent')}; - margin-bottom: ${(props: { $isVisible: any; }) => (props.$isVisible ? '0px' : '-1px')}; /* Compensate for border */ + margin-bottom: ${(props: { $isVisible: any; }) => (props.$isVisible ? '0px' : '-1px')}; `; const BannerContent = styled.div` @@ -304,8 +304,8 @@ const HoverAddTurnContainer = styled.div<{ $visible: boolean }>` /* Animation Logic */ height: ${(props: { $visible: any; }) => props.$visible ? '32px' : '0px'}; - margin: ${(props: { $visible: any; }) => props.$visible ? '-16px 0' : '0px'}; /* Overlap traces slightly in edit mode */ - opacity: ${(props: { $visible: any; }) => props.$visible ? 0 : 0}; /* Default hidden, show on hover */ + margin: ${(props: { $visible: any; }) => props.$visible ? '-16px 0' : '0px'}; + opacity: ${(props: { $visible: any; }) => props.$visible ? 0 : 0}; pointer-events: ${(props: { $visible: any; }) => props.$visible ? 'auto' : 'none'}; transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1), margin 0.3s ease, opacity 0.2s ease; From 008a1ae42d51e4b5cd9a49acdec8886cbe447b7e Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 16 Feb 2026 11:38:03 +0530 Subject: [PATCH 240/247] Fix EVALUATION_GROUP constant value by removing extra quotes --- .../ballerina-extension/src/features/test-explorer/activator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts index e7f83ef2844..6ca3ec97975 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/activator.ts @@ -33,7 +33,7 @@ import * as fs from 'fs'; export let testController: TestController; -export const EVALUATION_GROUP = '"evaluations"'; +export const EVALUATION_GROUP = 'evaluations'; export async function activate(ballerinaExtInstance: BallerinaExtension) { // Register command to open evalset viewer From a5c3b6e7b6c66be2ca6eed78e10ffca385ee376b Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 16 Feb 2026 11:42:24 +0530 Subject: [PATCH 241/247] Refactor file reading and writing methods to use promises and TextEncoder --- .../src/features/test-explorer/evalset-commands.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts index d96b6593869..42a909dddc9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/evalset-commands.ts @@ -50,7 +50,7 @@ export async function createNewEvalset(): Promise<void> { const jsonContent = JSON.stringify(evalset, null, 2); const fileUri = vscode.Uri.file(filePath); - await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + await vscode.workspace.fs.writeFile(fileUri, new TextEncoder().encode(jsonContent)); // 5. Success message with Open option const action = await vscode.window.showInformationMessage( @@ -79,7 +79,7 @@ export async function createNewThread(evalsetFileNode?: any, autoRefresh?: boole const filePath = evalsetFileNode.uri.fsPath; // 1. Read existing evalset file - const fileContent = fs.readFileSync(filePath, 'utf8'); + const fileContent = await fs.promises.readFile(filePath, 'utf8'); let evalset: EvalSet; try { @@ -139,7 +139,7 @@ export async function createNewThread(evalsetFileNode?: any, autoRefresh?: boole const jsonContent = JSON.stringify(evalset, null, 2); const fileUri = vscode.Uri.file(filePath); - await vscode.workspace.fs.writeFile(fileUri, Buffer.from(jsonContent, 'utf8')); + await vscode.workspace.fs.writeFile(fileUri, new TextEncoder().encode(jsonContent)); // 7. Handle UI refresh based on where the command was called from if (autoRefresh) { @@ -218,7 +218,7 @@ export async function deleteThread(threadNode?: any, autoRefresh?: boolean): Pro const threadId = threadNode.threadId; // Read existing evalset file - const fileContent = fs.readFileSync(filePath, 'utf8'); + const fileContent = await fs.promises.readFile(filePath, 'utf8'); let evalset: EvalSet; try { From 9b5188c99d39fb3278b98c1ae32a1b82f2b42ce4 Mon Sep 17 00:00:00 2001 From: RNViththagan <viththagan.rn@gmail.com> Date: Mon, 16 Feb 2026 11:42:02 +0530 Subject: [PATCH 242/247] Minor fixes to ConfigurationCollector UI and skip message --- .../src/features/ai/agent/tools/config-collector.ts | 2 +- .../src/views/BI/ConfigurationCollector/index.tsx | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts index a0af9a75077..062ee98273a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/config-collector.ts @@ -478,7 +478,7 @@ async function handleCollectMode( type: "configuration_collection_event", requestId, stage: "skipped", - message: `Configuration collection cancelled${userResponse.comment ? ": " + userResponse.comment : ""}`, + message: `Configuration collection skipped${userResponse.comment ? ": " + userResponse.comment : ""}`, isTestConfig, }); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx index 0142f0601f2..c62bfb3cae5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ConfigurationCollector/index.tsx @@ -86,9 +86,7 @@ const FieldError = styled.div` color: ${ThemeColors.ERROR}; `; -const ActionButton = styled(Button)` - min-width: 100px; -`; +const ActionButton = styled(Button)``; const LoadingContainer = styled.div` display: flex; @@ -266,7 +264,7 @@ export const ConfigurationCollector: React.FC<ConfigurationCollectorProps> = ({ </PopupContent> <PopupFooter> <ActionButton appearance="secondary" onClick={handleCancel} disabled={isProcessing}> - Cancel + Skip </ActionButton> <ActionButton appearance="primary" From 3f213023423afecd9f7650e85622ff46a59ad8ee Mon Sep 17 00:00:00 2001 From: Dan Niles <niles_dan@live.com> Date: Mon, 16 Feb 2026 11:45:38 +0530 Subject: [PATCH 243/247] Improve evaluation group check to ensure all children are evaluation groups --- .../src/features/test-explorer/runner.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 77ae8f4cafa..796559a5497 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts @@ -95,15 +95,20 @@ function isAiEvaluations(test: TestItem): boolean { return true; } - // Check if the project group contains any evaluations group + // Check if the project group contains only evaluations groups if (isProjectGroupItem(test)) { - let hasEvaluationsGroup = false; + // Return true only if all children are evaluation groups + let allChildrenAreEvaluations = true; + let hasChildren = false; + test.children.forEach((child) => { - if (isTestGroupItem(child) && child.label === EVALUATION_GROUP) { - hasEvaluationsGroup = true; + hasChildren = true; + if (!isTestGroupItem(child) || child.label !== EVALUATION_GROUP) { + allChildrenAreEvaluations = false; } }); - return hasEvaluationsGroup; + + return hasChildren && allChildrenAreEvaluations; } return false; From c2e04554ab35f5e0598bd8df668e5b3e492834ef Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Mon, 16 Feb 2026 13:24:43 +0530 Subject: [PATCH 244/247] Update @emotion/react and @emotion/styled to version 11.14.0 in package.json files across multiple workspaces, ensuring compatibility with the latest dependencies. --- common/config/rush/pnpm-lock.yaml | 133 +++++++++++------- workspaces/ballerina/bi-diagram/package.json | 4 +- .../common-libs/ui-toolkit/package.json | 4 +- 3 files changed, 86 insertions(+), 55 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index bd6e1e42c5d..314f16a1ab5 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1322,11 +1322,11 @@ importers: ../../workspaces/ballerina/bi-diagram: dependencies: '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0) + specifier: 11.14.0 + version: 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': - specifier: 11.10.5 - version: 11.10.5(@babel/core@7.27.1)(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + 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 @@ -1335,16 +1335,16 @@ importers: version: 6.7.4(lodash@4.17.23)(react@18.2.0) '@projectstorm/react-diagrams': specifier: 7.0.4 - version: 7.0.4(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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 @@ -3099,11 +3099,11 @@ importers: specifier: 11.10.5 version: 11.10.5(@babel/core@7.29.0) '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0) + specifier: 11.14.0 + version: 11.14.0(@types/react@18.2.0)(react@19.1.0) '@emotion/styled': - specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) + specifier: 11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) '@headlessui/react': specifier: 1.7.18 version: 1.7.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -3118,10 +3118,10 @@ importers: version: 6.7.4(lodash@4.17.23)(react@19.1.0) '@projectstorm/react-diagrams': specifier: 6.7.4 - version: 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: 7.0.3 - version: 7.0.3(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0) + version: 7.0.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0) '@vscode/codicons': specifier: 0.0.44 version: 0.0.44 @@ -28312,6 +28312,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.28.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': 18.2.0 + transitivePeerDependencies: + - supports-color + '@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 @@ -28508,12 +28524,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.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@19.1.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.2.0) '@emotion/utils': 1.4.2 @@ -28523,12 +28539,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.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@19.1.0))(@types/react@18.2.0)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.14.0(@types/react@18.2.0)(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': 18.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.9.3(@babel/core@7.27.1)(@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 @@ -28538,12 +28569,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@18.2.0)': + '@emotion/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0) + '@emotion/react': 11.9.3(@babel/core@7.29.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 @@ -30821,9 +30852,9 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': + '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)': dependencies: - '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.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@19.1.0))(@types/react@18.2.0)(react@18.2.0) '@projectstorm/geometry': 7.0.3 '@projectstorm/react-canvas-core': 7.0.3(@types/react@18.2.0) lodash: 4.17.23 @@ -30834,9 +30865,9 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': + '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': dependencies: - '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.27.1)(@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.23 @@ -30847,9 +30878,9 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)': + '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': dependencies: - '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.29.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.23 @@ -30870,23 +30901,23 @@ snapshots: transitivePeerDependencies: - resize-observer-polyfill - '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: - '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.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.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) lodash: 4.17.23 - react: 18.2.0 + react: 19.1.0 transitivePeerDependencies: - resize-observer-polyfill - '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: - '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0) - '@emotion/styled': 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.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.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) lodash: 4.17.23 - react: 19.1.0 + react: 18.2.0 transitivePeerDependencies: - resize-observer-polyfill @@ -30918,31 +30949,31 @@ snapshots: - '@emotion/styled' - resize-observer-polyfill - '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/geometry': 6.7.4 - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) dagre: 0.8.5 lodash: 4.17.23 pathfinding: 0.4.18 paths-js: 0.4.11 - react: 18.2.0 + react: 19.1.0 transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' - resize-observer-polyfill - '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/geometry': 6.7.4 - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) dagre: 0.8.5 lodash: 4.17.23 pathfinding: 0.4.18 paths-js: 0.4.11 - react: 19.1.0 + react: 18.2.0 transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' @@ -31011,11 +31042,11 @@ snapshots: - react - resize-observer-polyfill - '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' @@ -31026,11 +31057,11 @@ snapshots: - react - resize-observer-polyfill - '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' diff --git a/workspaces/ballerina/bi-diagram/package.json b/workspaces/ballerina/bi-diagram/package.json index ee6c5a04c38..7e0d1fe6671 100644 --- a/workspaces/ballerina/bi-diagram/package.json +++ b/workspaces/ballerina/bi-diagram/package.json @@ -37,8 +37,8 @@ "@wso2/ui-toolkit": "workspace:*", "@wso2/ballerina-core": "workspace:*", "@wso2/ballerina-side-panel": "workspace:*", - "@emotion/react": "11.9.3", - "@emotion/styled": "11.10.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "dagre": "0.8.5", "lodash": "4.17.23" }, diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index b320b8063fc..ecf2511b701 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@emotion/css": "11.10.5", - "@emotion/react": "11.9.3", - "@emotion/styled": "11.10.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "@headlessui/react": "1.7.18", "@monaco-editor/react": "4.7.0", "@projectstorm/geometry": "6.7.4", From a3ba97caf48d601c0688b2f0f9e763cbcf86283b Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama <axewilledge123@gmail.com> Date: Mon, 16 Feb 2026 13:40:07 +0530 Subject: [PATCH 245/247] Update @emotion/react and @emotion/styled to version 11.14.0 in pnpm-lock.yaml and package.json files across multiple workspaces for improved compatibility and performance. --- common/config/rush/pnpm-lock.yaml | 240 ++++-------------- .../ballerina/overview-view/package.json | 4 +- .../persist-layer-diagram/package.json | 4 +- .../ballerina/sequence-diagram/package.json | 4 +- .../ballerina/statement-editor/package.json | 4 +- .../ballerina/type-diagram/package.json | 2 +- 6 files changed, 56 insertions(+), 202 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 314f16a1ab5..2ca1c0489df 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -1858,11 +1858,11 @@ importers: ../../workspaces/ballerina/overview-view: dependencies: '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0) + specifier: 11.14.0 + version: 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': - specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + 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) '@vscode/webview-ui-toolkit': specifier: 1.2.0 version: 1.2.0(react@18.2.0) @@ -1916,11 +1916,11 @@ importers: specifier: 11.13.5 version: 11.13.5 '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0) + specifier: 11.14.0 + version: 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': - specifier: 11.10.5 - version: 11.10.5(@babel/core@7.27.1)(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + 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 @@ -1929,16 +1929,16 @@ importers: version: 7.0.3(@types/react@18.2.0) '@projectstorm/react-diagrams': specifier: 7.0.4 - version: 7.0.4(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.14.189 @@ -2110,11 +2110,11 @@ importers: ../../workspaces/ballerina/sequence-diagram: dependencies: '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0) + specifier: 11.14.0 + version: 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': - specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + 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 @@ -2123,16 +2123,16 @@ importers: version: 7.0.3(@types/react@18.2.0) '@projectstorm/react-diagrams': specifier: 7.0.4 - version: 7.0.4(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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 @@ -2198,11 +2198,11 @@ importers: specifier: 11.13.5 version: 11.13.5 '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.29.0)(@types/react@17.0.37)(react@19.1.0) + specifier: 11.14.0 + version: 11.14.0(@types/react@17.0.37)(react@19.1.0) '@emotion/styled': - specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@17.0.37)(react@19.1.0))(@types/react@17.0.37)(react@19.1.0) + specifier: 11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@17.0.37)(react@19.1.0))(@types/react@17.0.37)(react@19.1.0) '@tanstack/query-core': specifier: 5.77.1 version: 5.77.1 @@ -2407,11 +2407,11 @@ importers: specifier: 11.13.5 version: 11.13.5 '@emotion/react': - specifier: 11.9.3 - version: 11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.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 @@ -2420,16 +2420,16 @@ importers: version: 7.0.3(@types/react@18.2.0) '@projectstorm/react-diagrams': specifier: 7.0.4 - version: 7.0.4(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) + 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.16 @@ -28296,23 +28296,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.28.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/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': + '@emotion/react@11.14.0(@types/react@17.0.37)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 @@ -28324,39 +28308,39 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.0 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 17.0.37 transitivePeerDependencies: - supports-color - '@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0)': + '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.28.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.2.5 + '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 optionalDependencies: - '@babel/core': 7.27.1 '@types/react': 18.2.0 transitivePeerDependencies: - supports-color - '@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@17.0.37)(react@19.1.0)': + '@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.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.2.5 + '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 19.1.0 optionalDependencies: - '@babel/core': 7.29.0 - '@types/react': 17.0.37 + '@types/react': 18.2.0 transitivePeerDependencies: - supports-color @@ -28430,39 +28414,39 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/styled@11.10.5(@babel/core@7.27.1)(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': + '@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.9.3(@babel/core@7.29.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: - '@babel/core': 7.27.1 + '@babel/core': 7.29.0 '@types/react': 18.2.0 transitivePeerDependencies: - supports-color - '@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@17.0.37)(react@19.1.0))(@types/react@17.0.37)(react@19.1.0)': + '@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@17.0.37)(react@19.1.0) + '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(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: '@babel/core': 7.29.0 - '@types/react': 17.0.37 + '@types/react': 18.2.0 transitivePeerDependencies: - supports-color - '@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': + '@emotion/styled@11.11.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 @@ -28473,39 +28457,22 @@ snapshots: '@emotion/utils': 1.4.2 react: 18.2.0 optionalDependencies: - '@babel/core': 7.29.0 '@types/react': 18.2.0 transitivePeerDependencies: - supports-color - '@emotion/styled@11.10.5(@babel/core@7.29.0)(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0)': + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@17.0.37)(react@19.1.0))(@types/react@17.0.37)(react@19.1.0)': dependencies: '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0) + '@emotion/react': 11.14.0(@types/react@17.0.37)(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: - '@babel/core': 7.29.0 - '@types/react': 18.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/styled@11.11.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.28.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.29.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 + '@types/react': 17.0.37 transitivePeerDependencies: - supports-color @@ -28554,36 +28521,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.28.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.27.1)(@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/styled@11.14.0(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.28.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.9.3(@babel/core@7.29.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/stylis@0.8.5': {} '@emotion/unitless@0.10.0': {} @@ -30865,32 +30802,6 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': - dependencies: - '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.27.1)(@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.23 - react: 18.2.0 - resize-observer-polyfill: 1.5.1 - transitivePeerDependencies: - - '@emotion/react' - - '@types/react' - - supports-color - - '@projectstorm/react-diagrams-core@7.0.3(@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': - dependencies: - '@emotion/styled': 11.14.0(@emotion/react@11.9.3(@babel/core@7.29.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.23 - 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.23)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) @@ -30995,38 +30906,6 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams-routing@7.1.3(@emotion/react@11.9.3(@babel/core@7.27.1)(@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.9.3(@babel/core@7.27.1)(@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.23 - pathfinding: 0.4.18 - paths-js: 0.4.11 - react: 18.2.0 - transitivePeerDependencies: - - '@emotion/react' - - '@types/react' - - supports-color - - '@projectstorm/react-diagrams-routing@7.1.3(@emotion/react@11.9.3(@babel/core@7.29.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.9.3(@babel/core@7.29.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.23 - 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.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) @@ -31083,28 +30962,6 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams@7.0.4(@emotion/react@11.9.3(@babel/core@7.27.1)(@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.9.3(@babel/core@7.27.1)(@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.9.3(@babel/core@7.27.1)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - transitivePeerDependencies: - - '@emotion/react' - - '@types/react' - - supports-color - - '@projectstorm/react-diagrams@7.0.4(@emotion/react@11.9.3(@babel/core@7.29.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.9.3(@babel/core@7.29.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.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - transitivePeerDependencies: - - '@emotion/react' - - '@types/react' - - supports-color - '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -49051,10 +48908,7 @@ snapshots: pretty-format: 25.5.0 throat: 5.0.0 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate jest-leak-detector@25.5.0: dependencies: diff --git a/workspaces/ballerina/overview-view/package.json b/workspaces/ballerina/overview-view/package.json index 766eb366bef..29315fa7f33 100644 --- a/workspaces/ballerina/overview-view/package.json +++ b/workspaces/ballerina/overview-view/package.json @@ -13,8 +13,8 @@ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0" }, "dependencies": { - "@emotion/react": "11.9.3", - "@emotion/styled": "11.10.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "@vscode/webview-ui-toolkit": "1.2.0", "@wso2/ballerina-core": "workspace:*", "@wso2/ballerina-rpc-client": "workspace:*", diff --git a/workspaces/ballerina/persist-layer-diagram/package.json b/workspaces/ballerina/persist-layer-diagram/package.json index 173c618fb89..9fbe019640c 100644 --- a/workspaces/ballerina/persist-layer-diagram/package.json +++ b/workspaces/ballerina/persist-layer-diagram/package.json @@ -15,8 +15,8 @@ }, "keywords": [], "dependencies": { - "@emotion/react": "11.9.3", - "@emotion/styled": "11.10.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "@projectstorm/geometry": "7.0.3", "@projectstorm/react-canvas-core": "7.0.3", "@projectstorm/react-diagrams": "7.0.4", diff --git a/workspaces/ballerina/sequence-diagram/package.json b/workspaces/ballerina/sequence-diagram/package.json index 7ab3d2a5aaf..b0f51ad6faf 100644 --- a/workspaces/ballerina/sequence-diagram/package.json +++ b/workspaces/ballerina/sequence-diagram/package.json @@ -31,8 +31,8 @@ "@projectstorm/react-diagrams-core": "7.0.3", "@projectstorm/react-diagrams-defaults": "7.1.3", "@projectstorm/react-diagrams-routing": "7.1.3", - "@emotion/react": "11.9.3", - "@emotion/styled": "11.10.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "@wso2/ui-toolkit": "workspace:*", "@wso2/ballerina-core": "workspace:*", "@wso2/ballerina-rpc-client": "workspace:*", diff --git a/workspaces/ballerina/statement-editor/package.json b/workspaces/ballerina/statement-editor/package.json index 1afefbab8c2..fa9caa122cd 100644 --- a/workspaces/ballerina/statement-editor/package.json +++ b/workspaces/ballerina/statement-editor/package.json @@ -26,8 +26,8 @@ "@wso2/ballerina-rpc-client": "workspace:*", "@wso2/ui-toolkit": "workspace:*", "@vscode/webview-ui-toolkit": "1.2.0", - "@emotion/styled": "11.10.5", - "@emotion/react": "11.9.3", + "@emotion/styled": "11.14.0", + "@emotion/react": "11.14.0", "classnames": "2.2.6", "lodash.debounce": "4.0.8", "@emotion/css": "11.13.5", diff --git a/workspaces/ballerina/type-diagram/package.json b/workspaces/ballerina/type-diagram/package.json index d204e672e8f..b52681bdf27 100644 --- a/workspaces/ballerina/type-diagram/package.json +++ b/workspaces/ballerina/type-diagram/package.json @@ -15,7 +15,7 @@ }, "keywords": [], "dependencies": { - "@emotion/react": "11.9.3", + "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", "@projectstorm/geometry": "7.0.3", "@projectstorm/react-canvas-core": "7.0.3", From 6c176baa188691a4528addcb780c9b8585e77280 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Mon, 16 Feb 2026 18:19:03 +0530 Subject: [PATCH 246/247] Remove changes that need LS support --- .../sidePanel/dataServices/input-mapping.tsx | 5 +++-- .../sidePanel/dataServices/output-mapping.tsx | 5 +++-- workspaces/mi/mi-extension/package.json | 19 ------------------- .../mi/mi-extension/src/constants/index.ts | 1 + .../mi-extension/src/debugger/debugAdapter.ts | 10 +++++----- 5 files changed, 12 insertions(+), 28 deletions(-) diff --git a/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/input-mapping.tsx b/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/input-mapping.tsx index 0817190c8a1..6668b3cd747 100644 --- a/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/input-mapping.tsx +++ b/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/input-mapping.tsx @@ -435,12 +435,13 @@ const InputMappingsForm = (props: AddMediatorProps) => { Cancel </Button> : <> - <Button + {/* LS support for the feature will be added in the major release */} + {/* <Button appearance="secondary" onClick={handleSubmit(generateMappings)} > Generate Mappings - </Button> + </Button> */} <Button appearance="primary" onClick={handleSubmit(onClick)} diff --git a/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/output-mapping.tsx b/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/output-mapping.tsx index 61016235979..65aa981ae06 100644 --- a/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/output-mapping.tsx +++ b/workspaces/mi/mi-diagram/src/components/sidePanel/dataServices/output-mapping.tsx @@ -703,14 +703,15 @@ const OutputMappingsForm = (props: AddMediatorProps) => { </Button> : <> - {!sidePanelContext?.formValues?.outputJson && + {/* LS support for the feature will be added in the major release */} + {/* {!sidePanelContext?.formValues?.outputJson && <Button appearance="secondary" onClick={handleSubmit(generateMappings)} > Generate Mappings </Button> - } + } */} <Button appearance="primary" onClick={handleSubmit(onClick)} diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 12b81fc67e1..1ee439a0b11 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -107,25 +107,6 @@ "properties": { "type": "local" } - }, - { - "type": "mi", - "name": "MI: Remote Server Run and Debug", - "request": "launch", - "internalConsoleOptions": "openOnSessionStart", - "vmArgs": [], - "properties": { - "type": "remote", - "commandPort": 9005, - "eventPort": 9006, - "serverHost": "localhost", - "serverPort": 8290, - "serverReadinessPort": 9201, - "managementPort": 9164, - "managementUsername": "admin", - "managementPassword": "admin", - "connectionTimeoutInSecs": 10 - } } ] } diff --git a/workspaces/mi/mi-extension/src/constants/index.ts b/workspaces/mi/mi-extension/src/constants/index.ts index 69ecaa28b0c..cd59f771d22 100644 --- a/workspaces/mi/mi-extension/src/constants/index.ts +++ b/workspaces/mi/mi-extension/src/constants/index.ts @@ -209,3 +209,4 @@ export const ERROR_MESSAGES = { export const WI_EXTENSION_ID = 'wso2.wso2-integrator'; export const WI_PROJECT_EXPLORER_VIEW_ID = 'wso2-integrator.explorer'; export const MI_PROJECT_EXPLORER_VIEW_ID = 'MI.project-explorer'; +export const MI_RUNTIME_SERVICES_PANEL_ID = 'micro-integrator.runtime-services-panel'; diff --git a/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts b/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts index ee60c9896e3..ffba010e225 100644 --- a/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts +++ b/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts @@ -25,7 +25,7 @@ import { Debugger } from './debugger'; import { getStateMachine, openView, refreshUI } from '../stateMachine'; import { webviews } from '../visualizer/webview'; import { ViewColumn } from 'vscode'; -import { COMMANDS } from '../constants'; +import { COMMANDS, MI_RUNTIME_SERVICES_PANEL_ID } from '../constants'; import { LOCALHOST, ADMIN, REMOTE } from './constants'; import { INCORRECT_SERVER_PATH_MSG } from './constants'; import { extension } from '../MIExtensionContext'; @@ -316,7 +316,7 @@ export class MiDebugAdapter extends LoggingDebugSession { this.debuggerHandler?.initializeDebugger().then(() => { openRuntimeServicesWebview(this.projectUri); extension.isServerStarted = true; - RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: 'micro-integrator.runtime-services-panel' }, 'Running'); + RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: MI_RUNTIME_SERVICES_PANEL_ID }, 'Running'); response.success = true; this.sendResponse(response); }).catch(error => { @@ -333,7 +333,7 @@ export class MiDebugAdapter extends LoggingDebugSession { checkServerReadiness(this.projectUri).then(() => { openRuntimeServicesWebview(this.projectUri); extension.isServerStarted = true; - RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: 'micro-integrator.runtime-services-panel' }, 'Running'); + RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: MI_RUNTIME_SERVICES_PANEL_ID }, 'Running'); response.success = true; this.sendResponse(response); @@ -346,7 +346,7 @@ export class MiDebugAdapter extends LoggingDebugSession { this.debuggerHandler?.initializeDebugger().then(() => { openRuntimeServicesWebview(this.projectUri); extension.isServerStarted = true; - RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: 'micro-integrator.runtime-services-panel' }, 'Running'); + RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: MI_RUNTIME_SERVICES_PANEL_ID }, 'Running'); response.success = true; this.sendResponse(response); }).catch(error => { @@ -399,7 +399,7 @@ export class MiDebugAdapter extends LoggingDebugSession { DebuggerConfig.resetCappandLibs(); extension.isServerStarted = false; - RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: 'micro-integrator.runtime-services-panel' }, 'Stopped'); + RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: MI_RUNTIME_SERVICES_PANEL_ID }, 'Stopped'); } protected async attachRequest(response: DebugProtocol.AttachResponse, args: DebugProtocol.LaunchRequestArguments) { From d956720b4042df8498b1ca920e12d431b9301568 Mon Sep 17 00:00:00 2001 From: choreo-cicd <choreo-cicd@wso2.com> Date: Mon, 16 Feb 2026 16:38:24 +0000 Subject: [PATCH 247/247] Update version to micro-integrator-3.1.4 --- workspaces/mi/mi-extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 1ee439a0b11..db52190c6ad 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -3,7 +3,7 @@ "displayName": "WSO2 Integrator: MI", "description": "An extension which gives a development environment for designing, developing, debugging, and testing integration solutions.", "icon": "resources/images/wso2-micro-integrator-image.png", - "version": "3.1.3", + "version": "3.1.4", "publisher": "wso2", "engines": { "vscode": "^1.100.0"