From 71eb7f4ed08ed08ef8915dd38c2319674dd6959f Mon Sep 17 00:00:00 2001 From: Isuru Wijesiri Date: Wed, 27 May 2026 00:25:56 +0530 Subject: [PATCH 001/114] Switch agent file tools to a binary deny-list Replace VALID_FILE_EXTENSIONS / VALID_SPECIAL_FILE_NAMES with BLOCKED_BINARY_EXTENSIONS so the agent can read/write any text file (including extensionless ones like Dockerfile, Makefile, .gitignore) while still blocking archives, executables, office docs, images, etc. Shell sandbox now enforces the same deny-list on mutation paths. The @-mention picker keeps its own short UX allow-list, decoupled from the security gate. Also enable XML validation for .dbs data services. --- .../agent-mode/tools/file_tools.ts | 48 ++++------- .../agent-mode/tools/shell_sandbox.ts | 14 ++++ .../src/ai-features/agent-mode/tools/types.ts | 81 +++++++++++-------- .../agent-mode/tools/validation-utils.ts | 5 +- .../rpc-managers/agent-mode/rpc-manager.ts | 16 +++- 5 files changed, 92 insertions(+), 72 deletions(-) diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts index 7bc7c063ddf..dd12e6e49ea 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts @@ -26,8 +26,7 @@ import * as vscode from 'vscode'; import { ValidationResult, ToolResult, - VALID_FILE_EXTENSIONS, - VALID_SPECIAL_FILE_NAMES, + hasBlockedBinaryExtension, MAX_LINE_LENGTH, ErrorMessages, FILE_READ_TOOL_NAME, @@ -119,40 +118,22 @@ function getPdfDocumentStatic(): PdfDocumentStaticLike { } } +/** + * Returns true if a path is safe to read or write as text — anything not in + * the binary deny-list. This includes files with no extension (Dockerfile, + * Makefile, .gitignore, etc.). + */ function isTextAllowedFilePath(filePath: string): boolean { const normalizedPath = filePath.trim(); if (!normalizedPath) { return false; } - - const fileName = path.basename(normalizedPath); - const lowerFileName = fileName.toLowerCase(); - const hasValidExtension = VALID_FILE_EXTENSIONS.some(ext => - lowerFileName.endsWith(ext) - ); - if (hasValidExtension) { - return true; - } - - return VALID_SPECIAL_FILE_NAMES.some( - (specialName) => specialName.toLowerCase() === lowerFileName - ); -} - -function getAllowedFileTypesDescription(): string { - return [...VALID_FILE_EXTENSIONS, ...VALID_SPECIAL_FILE_NAMES].join(', '); -} - -function getReadAllowedFileTypesDescription(): string { - return [...VALID_FILE_EXTENSIONS, ...VALID_SPECIAL_FILE_NAMES, READ_PDF_EXTENSION, ...READ_IMAGE_EXTENSIONS].join(', '); + return !hasBlockedBinaryExtension(path.basename(normalizedPath)); } function getReadFileKind(filePath: string): ReadFileKind { - if (isTextAllowedFilePath(filePath)) { - return 'text'; - } - const lowerExt = path.extname(filePath).toLowerCase(); + if (lowerExt === READ_PDF_EXTENSION) { return 'pdf'; } @@ -161,7 +142,12 @@ function getReadFileKind(filePath: string): ReadFileKind { return 'image'; } - return 'unsupported'; + // For everything else, the deny-list is authoritative — anything not + // blocked is treated as text (including extensionless files). + if (hasBlockedBinaryExtension(path.basename(filePath))) { + return 'unsupported'; + } + return 'text'; } function getImageMediaType(filePath: string): string | undefined { @@ -333,11 +319,11 @@ function validateTextFilePath(projectPath: string, filePath: string): Validation return securityValidation; } - // Reject non-text files (images, PDFs, binaries) to prevent corrupt overwrites + // Reject binary files (images, PDFs, archives, native binaries, etc.) to prevent corrupt overwrites. if (!isTextAllowedFilePath(filePath)) { return { valid: false, - error: `Cannot write/edit binary or non-text file '${filePath}'. Allowed text file types: ${getAllowedFileTypesDescription()}` + error: `Cannot write/edit binary file '${filePath}'. The extension is on the blocked-binary list (archives, executables, images, PDFs, office docs, fonts, media, etc.).` }; } @@ -359,7 +345,7 @@ function validateReadableFilePath(projectPath: string, filePath: string): Valida if (getReadFileKind(filePath) === 'unsupported') { return { valid: false, - error: `File must use an allowed read type: ${getReadAllowedFileTypesDescription()}` + error: `Cannot read binary file '${filePath}'. The extension is on the blocked-binary list (archives, executables, native libraries, office docs, fonts, audio/video, etc.). Use shell tools for binary inspection if needed.` }; } diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts index f00e8154a84..85d34978256 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts @@ -20,6 +20,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import { analyzePowerShellCommand } from './shell_sandbox_powershell'; +import { hasBlockedBinaryExtension } from './types'; /** * Shell sandbox policy summary: @@ -1259,6 +1260,12 @@ function analyzeSegment( const disallowedMutationPaths = isMutation ? findDisallowedMutationPaths(projectPath, allowedMutationRoots, writePathTokens) : []; + // Block mutations whose destination is a binary file (matches the file_tool deny-list). + // Skip tokens that still contain unresolved shell expansion — those are handled by + // dynamicMutationPathTokens above, and naive endsWith checks would miss them anyway. + const blockedBinaryMutationPaths = writePathTokens.filter( + (token) => !hasDynamicShellExpansion(token) && hasBlockedBinaryExtension(path.basename(token)) + ); const resolvedMutationPaths = isMutation ? resolveMutationPaths(projectPath, writePathTokens) : []; const writesOnlyToExternalAllowedRoots = resolvedMutationPaths.length > 0 && resolvedMutationPaths.every((resolvedPath) => @@ -1285,6 +1292,13 @@ function analyzeSegment( `Mutating paths outside allowed roots is blocked. Disallowed path(s): ${disallowedMutationPaths.join(', ')}. ` + `Allowed roots: project root${outsideRoots ? `, ${outsideRoots}` : ''}.` ); + } else if (blockedBinaryMutationPaths.length > 0) { + blocked = true; + reasons.push( + `Writing to binary file paths is blocked (matches the file-tool deny-list). ` + + `Blocked path(s): ${blockedBinaryMutationPaths.join(', ')}. ` + + `Use directory-level operations (e.g. \`rm -rf dist\`) instead of targeting binary files by name.` + ); } else if (isMutation && !writesOnlyToExternalAllowedRoots) { reasons.push('Commands that may modify files or system state require approval.'); } diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/types.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/types.ts index c1be3623e40..283b1b3a208 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/types.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/types.ts @@ -62,46 +62,57 @@ export interface FileEditHunk { // Constants // ============================================================================ -// TODO: This should be checked. Some files might be in the project that are not in this list. /** - * Valid file extensions for MI/Synapse projects - * - .xml: Synapse configurations (APIs, sequences, endpoints, etc.) - * - .yaml/.yml: Configuration files - * - .properties: Property files - * - .md: Documentation - * - .json: JSON configurations - * - .dmc: Data mapper configurations - * - .ts: TypeScript files (for data mapper) + * Binary / non-text file extensions that the agent must not open or mutate + * as text. Anything else is treated as text-writable by file_write/file_edit + * and as text-readable by file_read (images and PDFs are routed to multimodal + * read paths separately and so are also listed here to block text writes). + * + * Keep entries lowercase, leading-dot. Order is informational only. */ -export const VALID_FILE_EXTENSIONS = [ - '.xml', - '.yaml', - '.yml', - '.properties', - '.md', - '.json', - '.dmc', - '.ts', - '.toml', - '.txt', - '.log', - '.java', - '.xslt', - '.sql', - '.xsd', - '.wsdl', - '.csv', - '.html', - '.sh', - '.bat' -]; +export const BLOCKED_BINARY_EXTENSIONS = [ + // Archives / compressed + '.zip', '.tar', '.gz', '.tgz', '.bz2', '.tbz2', '.7z', '.rar', '.xz', '.lz', '.lzma', '.zst', + // JVM compiled artifacts + '.jar', '.war', '.ear', '.class', + // Native binaries / object files + '.exe', '.dll', '.so', '.dylib', '.bin', '.o', '.a', '.lib', '.obj', '.pdb', + // Compiled Python + '.pyc', '.pyo', '.pyd', + // Office documents (binary; the agent can't meaningfully edit these as text) + '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.odt', '.ods', '.odp', + // Image formats not handled by the multimodal read path + '.bmp', '.tiff', '.tif', '.ico', '.heic', '.heif', '.avif', + // Images handled by the multimodal read path — blocked for writes only. + // file_read special-cases these (see READ_IMAGE_EXTENSIONS in file_tools.ts). + '.png', '.jpg', '.jpeg', '.gif', '.webp', + // PDF — blocked for writes only; file_read routes to the PDF multimodal path. + '.pdf', + // Audio + '.mp3', '.wav', '.flac', '.ogg', '.aac', '.m4a', '.wma', + // Video + '.mp4', '.mov', '.avi', '.mkv', '.webm', '.flv', '.wmv', '.mpeg', '.mpg', '.m4v', + // Fonts + '.ttf', '.otf', '.woff', '.woff2', '.eot', + // Databases + '.db', '.sqlite', '.sqlite3', '.mdb', '.accdb', + // Installers / disk images + '.iso', '.dmg', '.deb', '.rpm', '.msi', '.pkg', '.apk', '.ipa', + // Design assets + '.psd', '.ai', '.sketch', '.fig' +] as const; /** - * Valid file names without extensions + * Returns true if `filePath` ends with an extension in {@link BLOCKED_BINARY_EXTENSIONS}. + * Case-insensitive; safe to call with a basename or a full path. */ -export const VALID_SPECIAL_FILE_NAMES = [ - 'Dockerfile', -]; +export function hasBlockedBinaryExtension(filePath: string): boolean { + if (!filePath) { + return false; + } + const lower = filePath.toLowerCase(); + return BLOCKED_BINARY_EXTENSIONS.some((ext) => lower.endsWith(ext)); +} export const MAX_LINE_LENGTH = 2000; export const DEFAULT_READ_LIMIT = 2000; diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/validation-utils.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/validation-utils.ts index 8ff815bb5b7..44bbc03047e 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/validation-utils.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/validation-utils.ts @@ -115,8 +115,9 @@ export async function validateXmlFile( projectPath: string, includeCodeActions: boolean = false ): Promise { - // Only validate XML files - if (!absolutePath.toLowerCase().endsWith('.xml')) { + // Only validate XML files (incl. .dbs data services, which are XML in the SynapseXml language). + const lowerPath = absolutePath.toLowerCase(); + if (!lowerPath.endsWith('.xml') && !lowerPath.endsWith('.dbs')) { return null; } diff --git a/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts index 4546f6f094a..d5059a85dbc 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts @@ -68,7 +68,6 @@ import { } from '../../ai-features/agent-mode/tools/plan_mode_tools'; import { cleanupPersistedToolResultsForProject } from '../../ai-features/agent-mode/tools/tool-result-persistence'; import { validateAttachments } from '../../ai-features/agent-mode/attachment-utils'; -import { VALID_FILE_EXTENSIONS, VALID_SPECIAL_FILE_NAMES } from '../../ai-features/agent-mode/tools/types'; import { cleanupRunningBackgroundShells } from '../../ai-features/agent-mode/tools/bash_tools'; import { cleanupRunningBackgroundSubagents } from '../../ai-features/agent-mode/tools/subagent_tool'; import { beginServerManagementRunTracking, cleanupServerManagementOnAgentEnd } from '../../ai-features/agent-mode/tools/runtime_tools'; @@ -92,6 +91,15 @@ const MENTION_MAX_CACHE_ITEMS = 5000; const SHELL_APPROVAL_RULES_FILE_NAME = 'shell-approval-rules.json'; const MENTION_ROOT_DIRS = ['deployment', 'src']; const MENTION_POM_FILE = 'pom.xml'; +// Extensions surfaced in the @-mention picker. This is a UX allow-list (keep +// it short to avoid noisy results), not a security boundary — file-tool +// security uses the deny-list in tools/types.ts. Keep entries lowercase. +const MENTIONABLE_FILE_EXTENSIONS = new Set([ + '.xml', '.dbs', '.yaml', '.yml', '.properties', '.md', '.json', + '.dmc', '.ts', '.toml', '.txt', '.log', '.java', '.xslt', '.sql', + '.xsd', '.wsdl', '.csv', '.html', '.sh', '.bat' +]); +const MENTIONABLE_SPECIAL_FILE_NAMES = ['Dockerfile']; const MENTION_SKIP_DIRS = new Set([ '.git', 'node_modules', @@ -1403,10 +1411,10 @@ export class MIAgentPanelRpcManager implements MIAgentPanelAPI { private isMentionableFile(fileName: string): boolean { const lowerFileName = fileName.toLowerCase(); const ext = path.extname(fileName).toLowerCase(); - if (VALID_FILE_EXTENSIONS.includes(ext)) { + if (MENTIONABLE_FILE_EXTENSIONS.has(ext)) { return true; } - return VALID_SPECIAL_FILE_NAMES.some( + return MENTIONABLE_SPECIAL_FILE_NAMES.some( (specialName) => specialName.toLowerCase() === lowerFileName ); } @@ -1534,7 +1542,7 @@ export class MIAgentPanelRpcManager implements MIAgentPanelAPI { } }; - const rootTopLevelFiles = [MENTION_POM_FILE, ...VALID_SPECIAL_FILE_NAMES]; + const rootTopLevelFiles = [MENTION_POM_FILE, ...MENTIONABLE_SPECIAL_FILE_NAMES]; for (const topLevelFile of rootTopLevelFiles) { if (mentionables.size >= MENTION_MAX_CACHE_ITEMS) { break; From 1e0f0a7ef62789eff8cb945d82cdc6ce82c8ef86 Mon Sep 17 00:00:00 2001 From: Isuru Wijesiri Date: Wed, 27 May 2026 12:22:04 +0530 Subject: [PATCH 002/114] Fix PR review comments on binary deny-list changes Trim filePath in getReadFileKind() to keep classification consistent with validateReadableFilePath(), and update shell sandbox error message to accurately describe all mutation types (write/edit/delete/rename). --- .../src/ai-features/agent-mode/tools/file_tools.ts | 5 +++-- .../src/ai-features/agent-mode/tools/shell_sandbox.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts index dd12e6e49ea..e14793c1cda 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/file_tools.ts @@ -132,7 +132,8 @@ function isTextAllowedFilePath(filePath: string): boolean { } function getReadFileKind(filePath: string): ReadFileKind { - const lowerExt = path.extname(filePath).toLowerCase(); + const trimmed = filePath.trim(); + const lowerExt = path.extname(trimmed).toLowerCase(); if (lowerExt === READ_PDF_EXTENSION) { return 'pdf'; @@ -144,7 +145,7 @@ function getReadFileKind(filePath: string): ReadFileKind { // For everything else, the deny-list is authoritative — anything not // blocked is treated as text (including extensionless files). - if (hasBlockedBinaryExtension(path.basename(filePath))) { + if (hasBlockedBinaryExtension(path.basename(trimmed))) { return 'unsupported'; } return 'text'; diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts index 85d34978256..dcd1344325a 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/tools/shell_sandbox.ts @@ -1295,7 +1295,7 @@ function analyzeSegment( } else if (blockedBinaryMutationPaths.length > 0) { blocked = true; reasons.push( - `Writing to binary file paths is blocked (matches the file-tool deny-list). ` + + `Mutating binary file paths is blocked (write/edit/delete/rename; matches the file-tool deny-list). ` + `Blocked path(s): ${blockedBinaryMutationPaths.join(', ')}. ` + `Use directory-level operations (e.g. \`rm -rf dist\`) instead of targeting binary files by name.` ); From 61894b2aeab17ddbce5717b7d8ce878a94208382 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Wed, 27 May 2026 13:43:51 +0530 Subject: [PATCH 003/114] Improve the build and run flow --- .../mi/mi-extension/src/debugger/activate.ts | 24 ++++++- .../mi-extension/src/debugger/debugAdapter.ts | 70 ++++++------------- .../mi-extension/src/debugger/debugHelper.ts | 11 +++ 3 files changed, 54 insertions(+), 51 deletions(-) diff --git a/workspaces/mi/mi-extension/src/debugger/activate.ts b/workspaces/mi/mi-extension/src/debugger/activate.ts index 09f975be29c..aeed2f569fa 100644 --- a/workspaces/mi/mi-extension/src/debugger/activate.ts +++ b/workspaces/mi/mi-extension/src/debugger/activate.ts @@ -39,7 +39,7 @@ import { getModules, parseConsolidatedProjectPom, updateCopyModulesInAggregatePo class MiConfigurationProvider implements vscode.DebugConfigurationProvider { - resolveDebugConfiguration(folder: WorkspaceFolder | undefined, config: DebugConfiguration, token?: CancellationToken): ProviderResult { + async resolveDebugConfiguration(folder: WorkspaceFolder | undefined, config: DebugConfiguration, token?: CancellationToken): Promise { // if launch.json is missing or empty if (!config.type && !config.request && !config.name) { config.type = 'mi'; @@ -49,6 +49,28 @@ class MiConfigurationProvider implements vscode.DebugConfigurationProvider { config.internalConsoleOptions = config.noDebug ? 'neverOpen' : 'openOnSessionStart'; + if (!config.projectList || config.projectList.length === 0){ + const folderPaths = workspace.workspaceFolders?.map(f => f.uri.fsPath) ?? []; + if (folderPaths.length === 0) { + window.showErrorMessage('No workspace folder is opened'); + return undefined; + } + if (folderPaths.length === 1) { + config.projectList = [folderPaths[0]]; + } else if (isConsolidatedProject(path.dirname(folderPaths[0]))) { + config.projectList = folderPaths; + } else { + const selectedItems = await window.showQuickPick( + folderPaths.map(p => ({ label: p })), + { canPickMany: true, placeHolder: 'Select the projects to build and run' } + ); + if (!selectedItems || selectedItems.length === 0) { + return undefined; + } + config.projectList = selectedItems.map(item => item.label); + } + } + return config; } } diff --git a/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts b/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts index dcbe30c16f4..ea9507e8ebd 100644 --- a/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts +++ b/workspaces/mi/mi-extension/src/debugger/debugAdapter.ts @@ -19,7 +19,7 @@ import { Breakpoint, BreakpointEvent, Handles, InitializedEvent, LoggingDebugSession, Scope, StoppedEvent, TerminatedEvent, Thread } from 'vscode-debugadapter'; import { DebugProtocol } from 'vscode-debugprotocol'; import * as vscode from 'vscode'; -import { checkServerReadiness, deleteCopiedCapAndLibs, executeTasks, getServerPath, isADiagramView, readPortOffset, removeTempDebugBatchFile, setManagementCredentials, stopServer } from './debugHelper'; +import { checkServerReadiness, deleteCopiedCapAndLibs, executeTasks, getServerPath, isADiagramView, readPortOffset, removeTempDebugBatchFile, setManagementCredentials, stopServer, abortBuildAndRun } from './debugHelper'; import { Subject } from 'await-notify'; import { Debugger } from './debugger'; import { getStateMachine, openView, refreshUI } from '../stateMachine'; @@ -34,17 +34,17 @@ import { DebuggerConfig } from './config'; import { openRuntimeServicesWebview } from '../runtime-services-panel/activate'; import { RPCLayer } from '../RPCLayer'; import { getWSO2AIEnvVariables } from '../ai-features/configUtils'; -import path = require("path"); -import { isConsolidatedProject } from '../util/onboardingUtils'; interface ILaunchRequestArguments extends DebugProtocol.LaunchRequestArguments { /** Env variables setup through launch.json */ env?: any; vmArgs?: string[]; + projectList?: string[]; } export class MiDebugAdapter extends LoggingDebugSession { private _configurationDone = new Subject(); + private _isDisconnecting = false; private debuggerHandler: Debugger | undefined; // we don't support multiple threads, so we can use a hardcoded ID for the default thread private static threadID = 1; @@ -296,53 +296,23 @@ export class MiDebugAdapter extends LoggingDebugSession { private currentServerPath; protected launchRequest(response: DebugProtocol.LaunchResponse, args?: ILaunchRequestArguments, request?: DebugProtocol.Request): void { - this._configurationDone.wait().then(async () => { - const workspaceFolders = vscode.workspace.workspaceFolders; - const folderPaths = workspaceFolders?.map(f => f.uri.fsPath) || []; - - let selectedOptions: string[] = []; - - // Show an error when no project is opened - if (folderPaths.length === 0) { - const message = 'No workspace folder is opened'; + this._configurationDone.wait().then(() => { + // Project selection is resolved upstream by MiConfigurationProvider.resolveDebugConfiguration + // before the session is created, so the toolbar doesn't appear during selection. + if (!args?.projectList || args.projectList.length === 0) { + const message = 'No project selected'; this.sendError(response, 1, message); vscode.window.showErrorMessage(message); return; } - - // Auto select when a single project is opened - if (folderPaths.length === 1) { - selectedOptions = [folderPaths[0]]; - DebuggerConfig.setProjectList(selectedOptions); - this.continueLaunch(response, args); - return; - } - - if (isConsolidatedProject(path.dirname(folderPaths[0]))) { - selectedOptions = folderPaths; - DebuggerConfig.setProjectList(selectedOptions); - this.continueLaunch(response, args); - return; - } - - // Give user quick pick options when multiple projects are opened - vscode.window.showQuickPick( - folderPaths.map(p => ({ label: p })), - { canPickMany: true, placeHolder: 'Select the projects to build and run' } - ).then(selectedItems => { - if (!selectedItems || selectedItems.length === 0) { - this.sendError(response, 1, 'No project selected'); - return; - } - - selectedOptions = selectedItems.map(item => item.label); - DebuggerConfig.setProjectList(selectedOptions); - this.continueLaunch(response, args); - }); + DebuggerConfig.setProjectList(args.projectList); + this.continueLaunch(response, args); }); } protected async disconnectRequest(response: DebugProtocol.DisconnectResponse, args?: DebugProtocol.DisconnectArguments, request?: DebugProtocol.Request): Promise { + this._isDisconnecting = true; + abortBuildAndRun(); this.debuggerHandler?.closeDebugger(); vscode.commands.executeCommand('setContext', 'MI.isRunning', 'false'); try { @@ -577,6 +547,8 @@ export class MiDebugAdapter extends LoggingDebugSession { }); } else { await setManagementCredentials(serverPath); + response.success = true; + this.sendResponse(response); executeTasks(this.projectUri, serverPath, isDebugAllowed) .then(async () => { if (args?.noDebug) { @@ -584,30 +556,28 @@ export class MiDebugAdapter extends LoggingDebugSession { openRuntimeServicesWebview(this.projectUri); extension.isServerStarted = true; RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: MI_RUNTIME_SERVICES_PANEL_ID }, 'Running'); - - response.success = true; - this.sendResponse(response); }).catch(error => { vscode.window.showErrorMessage(error); - this.sendError(response, 1, error); vscode.commands.executeCommand('setContext', 'MI.isRunning', 'false'); + this.sendEvent(new TerminatedEvent()); }); } else { this.debuggerHandler?.initializeDebugger().then(() => { openRuntimeServicesWebview(this.projectUri); extension.isServerStarted = true; RPCLayer._messengers.get(this.projectUri)?.sendNotification(miServerRunStateChanged, { type: 'webview', webviewType: MI_RUNTIME_SERVICES_PANEL_ID }, 'Running'); - response.success = true; - this.sendResponse(response); }).catch(error => { const completeError = `Error while initializing the Debugger: ${error}`; vscode.window.showErrorMessage(completeError); - this.sendError(response, 1, completeError); vscode.commands.executeCommand('setContext', 'MI.isRunning', 'false'); + this.sendEvent(new TerminatedEvent()); }); } }) .catch(error => { + if (this._isDisconnecting) { + return; + } vscode.commands.executeCommand('setContext', 'MI.isRunning', 'false'); deleteCopiedCapAndLibs(); const completeError = `Error while launching run and debug: ${error}`; @@ -616,7 +586,7 @@ export class MiDebugAdapter extends LoggingDebugSession { } else { vscode.window.showErrorMessage(completeError); } - this.sendError(response, 1, completeError); + this.sendEvent(new TerminatedEvent()); }); } }); diff --git a/workspaces/mi/mi-extension/src/debugger/debugHelper.ts b/workspaces/mi/mi-extension/src/debugger/debugHelper.ts index cde5896a0d4..7bdada53ea2 100644 --- a/workspaces/mi/mi-extension/src/debugger/debugHelper.ts +++ b/workspaces/mi/mi-extension/src/debugger/debugHelper.ts @@ -213,6 +213,7 @@ export async function executeBuildTask(projectUri: string, serverPath: string, s [], { shell: true, cwd: project, env: envVariables } ); + activeBuildProcess = buildProcess; showServerOutputChannel(); buildProcess.stdout.on('data', (data) => { @@ -240,6 +241,7 @@ export async function executeBuildTask(projectUri: string, serverPath: string, s if (shouldCopyTarget) { buildProcess.on('exit', async (code) => { + activeBuildProcess = undefined; if (shouldCopyTarget && code === 0) { if (!fs.existsSync(serverPath)) { reject(INCORRECT_SERVER_PATH_MSG); @@ -297,6 +299,7 @@ export async function executeBuildTask(projectUri: string, serverPath: string, s }); } else { buildProcess.on('exit', async (code) => { + activeBuildProcess = undefined; if (code === 0) { resolve(); } else { @@ -388,6 +391,7 @@ async function getCarFiles(targetDirectory) { } let serverProcess: ChildProcess; +let activeBuildProcess: ChildProcess | undefined; const debugConsole = vscode.debug.activeDebugConsole; export function isCipherToolEnabled(serverPath: string): boolean { @@ -432,6 +436,13 @@ export async function promptAndWriteCipherToolPassword(serverPath: string): Prom } } +export function abortBuildAndRun(): void { + if (activeBuildProcess) { + treeKill(activeBuildProcess.pid!, 'SIGKILL'); + activeBuildProcess = undefined; + } +} + // Start the server export async function startServer(projectUri: string, serverPath: string, isDebug: boolean): Promise { return new Promise(async (resolve, reject) => { From e8cf688ca29a21e8c6f3e8256d38befae1b102ea Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Wed, 27 May 2026 17:22:15 +0530 Subject: [PATCH 004/114] Update dependencies --- common/config/rush/.pnpmfile.cjs | 8 +- common/config/rush/pnpm-lock.yaml | 3498 +++++++++-------- package.json | 3 +- .../api-designer-visualizer/package.json | 2 +- .../ballerina-low-code-diagram/package.json | 2 +- .../ballerina-visualizer/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 +- 12 files changed, 1885 insertions(+), 1642 deletions(-) diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 26f74729739..217b1c922cc 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -28,7 +28,7 @@ module.exports = { if (deps['fast-xml-parser']) deps['fast-xml-parser'] = '5.7.0'; if (deps['esbuild']) deps['esbuild'] = '0.25.12'; if (deps['lodash']) deps['lodash'] = '4.18.0'; - if (deps['qs']) deps['qs'] = '6.15.2'; + if (deps['qs']) deps['qs'] = '6.15.2'; // security fix: CVE-2026-8723 if (deps['hono']) deps['hono'] = '4.12.18'; // CVE-2026-44455 (JSX injection), CVE-2026-44456 (bodyLimit bypass) if (deps['@hono/node-server']) deps['@hono/node-server'] = '1.19.13'; if (deps['@tootallnate/once']) deps['@tootallnate/once'] = '3.0.1'; @@ -50,12 +50,6 @@ module.exports = { if (deps['undici']) deps['undici'] = '7.24.0'; // security fix: header injection if (deps['uuid']) deps['uuid'] = '14.0.0'; // security fix if (deps['@nevware21/ts-utils']) deps['@nevware21/ts-utils'] = '0.14.0'; // security fix: CVE-2026-46681 (prototype pollution) - if (deps['webpack-dev-server']) deps['webpack-dev-server'] = '5.2.4'; // security fix: CVE-2026-6402 (info disclosure) - if (deps['ws']) { - if (/^[\s\^~><=]*8[.\s]/.test(deps['ws'])) { - deps['ws'] = '8.20.1'; // security fix: CVE-2026-45736 - } - } if (deps['protobufjs']) { const currentVersion = deps['protobufjs']; if (currentVersion.startsWith('^8') || currentVersion.startsWith('8')) { diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index c51486a6fc2..e5d886eaab6 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -195,13 +195,13 @@ importers: dependencies: '@emotion/css': specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0) + version: 11.10.5(@babel/core@7.29.7) '@emotion/react': specifier: 11.9.3 - version: 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0) + version: 11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': specifier: 11.11.0 - version: 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) + version: 11.11.0(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) '@hookform/resolvers': specifier: 3.3.4 version: 3.3.4(react-hook-form@7.56.4(react@18.2.0)) @@ -259,10 +259,10 @@ importers: devDependencies: '@babel/plugin-syntax-flow': specifier: 7.22.5 - version: 7.22.5(@babel/core@7.29.0) + version: 7.22.5(@babel/core@7.29.7) '@babel/preset-typescript': specifier: 7.22.11 - version: 7.22.11(@babel/core@7.29.0) + version: 7.22.11(@babel/core@7.29.7) '@storybook/addon-actions': specifier: 8.6.14 version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) @@ -274,7 +274,7 @@ importers: version: 8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) '@storybook/cli': specifier: 8.6.14 - version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.0))(prettier@3.5.3) + version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.7))(prettier@3.5.3) '@storybook/react': specifier: 8.6.14 version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) @@ -396,7 +396,7 @@ importers: version: 30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)) ts-jest: specifier: 29.4.1 - version: 29.4.1(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.4.1)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.12)(jest-util@30.4.1)(jest@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.1(@babel/core@7.29.7)(@jest/transform@30.1.2)(@jest/types@30.4.1)(babel-jest@30.1.2(@babel/core@7.29.7))(esbuild@0.25.12)(jest-util@30.4.1)(jest@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -432,7 +432,7 @@ importers: version: 30.2.0 ts-jest: specifier: 29.4.1 - version: 29.4.1(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.4.1)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.12)(jest-util@30.4.1)(jest@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.1(@babel/core@7.29.7)(@jest/transform@30.1.2)(@jest/types@30.4.1)(babel-jest@30.1.2(@babel/core@7.29.7))(esbuild@0.25.12)(jest-util@30.4.1)(jest@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -504,7 +504,7 @@ importers: version: 4.7.9 isomorphic-ws: specifier: 5.0.0 - version: 5.0.0(ws@8.20.1) + version: 5.0.0(ws@8.21.0) mousetrap: specifier: 1.6.5 version: 1.6.5 @@ -972,7 +972,7 @@ importers: version: 11.1.0 react-scripts-ts: specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.1))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.1))(babel-runtime@6.26.0)(typescript@5.8.3) react-test-renderer: specifier: 19.1.0 version: 19.1.0(react@18.2.0) @@ -1223,7 +1223,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.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.29.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: 4.17.16 version: 4.17.16 @@ -2291,7 +2291,7 @@ importers: version: 9.39.4(jiti@2.7.0) react-scripts-ts: specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.29.0))(babel-runtime@6.26.0)(typescript@5.8.3) + version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.29.7))(babel-runtime@6.26.0)(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2494,7 +2494,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.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1) + version: 6.5.9(@babel/core@7.29.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: 2.2.9 version: 2.2.9 @@ -2875,7 +2875,7 @@ importers: version: 9.39.4(jiti@2.7.0) react-scripts-ts: specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.29.0))(babel-runtime@6.26.0)(typescript@5.8.3) + version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.29.7))(babel-runtime@6.26.0)(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3297,13 +3297,13 @@ importers: dependencies: '@emotion/css': specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0) + version: 11.10.5(@babel/core@7.29.7) '@emotion/react': specifier: 11.9.3 - version: 11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@19.1.0) + version: 11.9.3(@babel/core@7.29.7)(@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) + version: 11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) '@vscode/codicons': specifier: 0.0.44 version: 0.0.44 @@ -3331,7 +3331,7 @@ importers: version: 8.6.14(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) '@storybook/cli': specifier: 8.6.14 - version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.0))(prettier@3.5.3) + version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.7))(prettier@3.5.3) '@storybook/react': specifier: 8.6.14 version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) @@ -3373,7 +3373,7 @@ importers: dependencies: '@emotion/css': specifier: 11.10.5 - version: 11.10.5(@babel/core@7.29.0) + version: 11.10.5(@babel/core@7.29.7) '@emotion/react': specifier: 11.14.0 version: 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -3431,7 +3431,7 @@ importers: version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) '@storybook/cli': specifier: 8.6.14 - version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.0))(prettier@3.5.3) + version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.7))(prettier@3.5.3) '@storybook/react': specifier: 8.6.14 version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) @@ -3617,10 +3617,10 @@ importers: 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) + version: 11.9.3(@babel/core@7.29.7)(@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) + version: 11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@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 @@ -3629,16 +3629,16 @@ importers: version: 6.7.4(lodash@4.18.1)(react@18.2.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@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.18.1)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.18.1)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: 6.7.4 version: 6.7.4(lodash@4.18.1)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-defaults': specifier: 6.7.4 - version: 6.7.4(@emotion/react@11.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.18.1)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.18.1)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-routing': specifier: 6.7.4 - version: 6.7.4(@emotion/react@11.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.18.1)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.18.1)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@wso2/ui-toolkit': specifier: workspace:* version: link:../../common-libs/ui-toolkit @@ -3657,7 +3657,7 @@ importers: devDependencies: '@storybook/react': specifier: 6.3.7 - version: 6.3.7(@babel/core@7.29.0)(@types/react@18.2.0)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) + version: 6.3.7(@babel/core@7.29.7)(@types/react@18.2.0)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: 0.7.52 version: 0.7.52 @@ -4538,10 +4538,10 @@ importers: devDependencies: '@babel/plugin-syntax-flow': specifier: 7.27.1 - version: 7.27.1(@babel/core@7.29.0) + version: 7.27.1(@babel/core@7.29.7) '@babel/preset-typescript': specifier: 7.27.1 - version: 7.27.1(@babel/core@7.29.0) + version: 7.27.1(@babel/core@7.29.7) '@headlessui/react': specifier: 2.2.4 version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -5303,12 +5303,12 @@ packages: '@babel/code-frame@7.10.4': resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': - resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} '@babel/core@7.12.9': @@ -5323,30 +5323,30 @@ packages: resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.3': - resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5366,106 +5366,106 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.10.4': resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.28.6': - resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} '@babel/highlight@7.25.9': resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': - resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5477,14 +5477,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-decorators@7.29.0': - resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} + '@babel/plugin-proposal-decorators@7.29.7': + resolution: {integrity: sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-export-default-from@7.27.1': - resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} + '@babel/plugin-proposal-export-default-from@7.29.7': + resolution: {integrity: sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5557,8 +5557,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.28.6': - resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} + '@babel/plugin-syntax-decorators@7.29.7': + resolution: {integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5580,14 +5580,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.28.6': - resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + '@babel/plugin-syntax-flow@7.29.7': + resolution: {integrity: sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5607,8 +5613,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5655,8 +5661,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5667,308 +5673,308 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.29.0': - resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.28.6': - resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.6': - resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.28.6': - resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.28.6': - resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.6': - resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.28.6': - resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.28.6': - resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.6': - resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.27.1': - resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + '@babel/plugin-transform-flow-strip-types@7.29.7': + resolution: {integrity: sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.28.6': - resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.6': - resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.4': - resolution: {integrity: sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==} + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': - resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.28.6': - resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.6': - resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.28.6': - resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.6': - resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.28.6': - resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.28.6': - resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.28.0': - resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + '@babel/plugin-transform-react-display-name@7.29.7': + resolution: {integrity: sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.27.1': - resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + '@babel/plugin-transform-react-jsx-development@7.29.7': + resolution: {integrity: sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.28.6': - resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} + '@babel/plugin-transform-react-jsx@7.29.7': + resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.27.1': - resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + '@babel/plugin-transform-react-pure-annotations@7.29.7': + resolution: {integrity: sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.0': - resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.28.6': - resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.28.6': - resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5979,26 +5985,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.28.6': - resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.28.6': - resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -6009,8 +6015,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.27.1': - resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + '@babel/preset-flow@7.29.7': + resolution: {integrity: sha512-KYIRV0BuaN68CDdsqFkAD7MU7yipUqQNuNElwATdxaIdpTjhvtY82QvkBJs7zV3Evxj2jFAAZ1iO8nyy0nhjqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6038,30 +6044,30 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.29.3': - resolution: {integrity: sha512-F6C1KpIdoImKQfsD6HSxZ+mS4YY/2Q+JsqrmTC5ApVkTR2rG+nnbpjhWwzA5bDNu8mJjB3AryqDaWFLd4gCbJQ==} + '@babel/register@7.29.7': + resolution: {integrity: sha512-AMGJoWuES861riy6pcB0fphE1YXybtQnBYQMuIyPv6mKLiosfa79BKTnAOyx215c/3RJPJpdQwoHZ3earVH7AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.29.2': - resolution: {integrity: sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==} + '@babel/runtime-corejs3@7.29.7': + resolution: {integrity: sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.1': @@ -10585,8 +10591,8 @@ packages: resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} engines: {node: '>=12.20.0'} - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -10663,14 +10669,14 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.25': - resolution: {integrity: sha512-bmNoqMu6gcAW9JGrKVB0Q1tN1i5RONZF8r1fW0bbE4Oyf3DwEGnzzQJ2OW+Ozg1P4s8PyugkHg2ULZoFQN+cqw==} + '@tanstack/react-virtual@3.13.26': + resolution: {integrity: sha512-DosdgjOxCLahkn0o+ilmZYwEjo1glfMGuRT/j3PQ18yr5XqA8N/BCaL9IJ3B5TRl+nnzyK2IOFgAILwzN3a9xQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.15.0': - resolution: {integrity: sha512-0AwPGx0I8QxPYjAxShT/+z+ZOe9u8mW5rsXvivCTjRfRmz9a43+3mRyi4wwlyoUqOC56q/jatKa0Bh9M99BEHQ==} + '@tanstack/virtual-core@3.16.0': + resolution: {integrity: sha512-Er2N7q3WOiH6y2JLxsxNX+u2/sLqSsL0bxFgDjuiPiA7vKhZRm+IzcS17vRee3GNXr64UsesA5CAp9yTiIYw9A==} '@tavily/core@0.6.4': resolution: {integrity: sha512-PppC0p2SwkoImLiYFT/uqDyWKPivpVsIM16HUf1Apmtbqg1YhI7Yg5Hq6eYSojC6COVCGXE4CotBnWqUmrai+A==} @@ -12324,6 +12330,9 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -13075,6 +13084,9 @@ packages: bonjour-service@1.4.0: resolution: {integrity: sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==} + bonjour@3.5.1: + resolution: {integrity: sha512-xONzj4PfpPJw6xSqCcT2SmQkBOXpUINUz3o3qXcWJwYlXbkZNcNaUae0o5lle7tKt4HHV6dTgkIRhAXZ3nBMsQ==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -13141,8 +13153,8 @@ packages: resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} engines: {node: '>= 0.10'} - browserify-sign@4.2.5: - resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} + browserify-sign@4.2.6: + resolution: {integrity: sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==} engines: {node: '>= 0.10'} browserify-zlib@0.2.0: @@ -13200,6 +13212,9 @@ packages: resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} engines: {node: '>=0.10'} + buffer-indexof@1.1.1: + resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} @@ -13377,8 +13392,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001793: - resolution: {integrity: sha512-ZnQVGVdVmPSi8A/g2M5rn5kBDCmcqZYjgbpqs1iHQPl2pnV1UrHHEQajnZPUWB3l3MsIJK1HO2a92sTMQ1qBWw==} + caniuse-db@1.0.30001795: + resolution: {integrity: sha512-9zN51QoG+vAqanu7ldYqN0cHzWF/eFjZ5SZ9MflMvyi7nSDv2xwJKjriJNQeS7V8qa3K9Qz5xd/aj7ksT0qldg==} caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} @@ -13899,6 +13914,10 @@ packages: confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} @@ -14448,6 +14467,10 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -14526,6 +14549,10 @@ packages: resolution: {integrity: sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==} engines: {node: '>=0.10.0'} + del@3.0.0: + resolution: {integrity: sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A==} + engines: {node: '>=4'} + del@7.1.0: resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} engines: {node: '>=14.16'} @@ -14641,10 +14668,16 @@ packages: dnd-core@16.0.1: resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + dns-packet@5.6.1: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} + dns-txt@2.0.2: + resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -14800,8 +14833,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.361: - resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} + electron-to-chromium@1.5.362: + resolution: {integrity: sha512-PUY2DrLvkjkUuWqq+KPL2iWshrJsZOcIojzRQ7eXFacc9dWga7MGMJAa15VbiejSZB1PAXaRLAiKgruHP8LB1w==} element-resize-detector@1.2.4: resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} @@ -14968,8 +15001,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.46.1: - resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} + es-toolkit@1.47.0: + resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} @@ -15485,6 +15518,10 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + faye-websocket@0.10.0: + resolution: {integrity: sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==} + engines: {node: '>=0.4.0'} + faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -16160,6 +16197,10 @@ packages: resolution: {integrity: sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==} engines: {node: '>=0.10.0'} + globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + globby@9.2.0: resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} engines: {node: '>=6'} @@ -16241,6 +16282,9 @@ packages: resolution: {integrity: sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==} engines: {node: '>=6'} + handle-thing@1.2.5: + resolution: {integrity: sha512-Ld9EYcBflMUF6SsJLGDADVH50jSzLNIUUrOFlFGK/zwqimATg9+wY4jsLWCR7DZSxt2BfK0+liHUMdoR11bjLg==} + handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -16577,6 +16621,9 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-proxy-middleware@0.17.4: + resolution: {integrity: sha512-JtH3UZju4oXDdca28/kknbm/CFmt35vy0YV0PNOMWWWpn3rT9WV95IXN451xwBGSjy9L0Cah1O9TCMytboLdfw==} + http-proxy-middleware@2.0.9: resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} engines: {node: '>=12.0.0'} @@ -16730,6 +16777,11 @@ packages: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} + import-local@1.0.0: + resolution: {integrity: sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==} + engines: {node: '>=4'} + hasBin: true + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -16783,6 +16835,11 @@ packages: inquirer@3.3.0: resolution: {integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==} + internal-ip@1.2.0: + resolution: {integrity: sha512-DzGfTasXPmwizQP4XV2rR6r2vp8TjlOpMnJqG9Iy2i1pl1lkZdZj5rSpIc7YFGX2nS46PPgAGEyT+Q5hE2FB2g==} + engines: {node: '>=0.10.0'} + hasBin: true + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -18285,6 +18342,9 @@ packages: resolution: {integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==} hasBin: true + killable@1.0.1: + resolution: {integrity: sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==} + kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} @@ -18384,8 +18444,8 @@ packages: linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} lint-staged@16.0.0: resolution: {integrity: sha512-sUCprePs6/rbx4vKC60Hez6X10HPkpDJaGcy3D1NdwR7g1RcNkWL8q9mJMreOqmHBTs+1sNFp+wOiX9fr+hoOQ==} @@ -19302,6 +19362,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multicast-dns-service-types@1.1.0: + resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} + multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true @@ -19450,6 +19513,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@0.10.0: + resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} + engines: {node: '>= 6.0.0'} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -19718,6 +19785,10 @@ packages: resolution: {integrity: sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==} engines: {node: '>=4'} + opn@5.5.0: + resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} + engines: {node: '>=4'} + optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -20095,8 +20166,8 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} - pbkdf2@3.1.5: - resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + pbkdf2@3.1.6: + resolution: {integrity: sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==} engines: {node: '>= 0.10'} pdf-lib@1.17.1: @@ -21950,6 +22021,10 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@2.0.0: + resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} + engines: {node: '>=4'} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -21958,6 +22033,10 @@ packages: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -22320,6 +22399,9 @@ packages: resolution: {integrity: sha512-7RbYoKK0zET+KMVak11UDCtKvNulOU6gFZp8HI5GN9K8+BhqrliIJU/FP6QADrvRAXFMr3wHxfE3JHOcAxO3GQ==} engines: {node: '>= 20.0.0'} + selfsigned@1.10.14: + resolution: {integrity: sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==} + selfsigned@5.5.0: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} @@ -22553,6 +22635,9 @@ packages: sockjs-client@1.1.5: resolution: {integrity: sha512-PmPRkAYIeuRgX+ZSieViT4Z3Q23bLS2Itm/ck1tSf5P0/yVuFDiI5q9mcnpXoMdToaPSRS9MEyUx/aaBxrFzyw==} + sockjs@0.3.19: + resolution: {integrity: sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==} + sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -22652,9 +22737,16 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + spdy-transport@2.1.1: + resolution: {integrity: sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==} + spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + spdy@3.4.7: + resolution: {integrity: sha512-jEvgkLRpMza5GON0oDzvLTLMAVfB5BxeOPbsWyisEyE8IbxL6cCiKbr8xrJdScs6XoOUp7pQy4PI+GVczHbO4w==} + engines: {'0': node >= 0.7.0} + spdy@4.0.2: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} @@ -23443,6 +23535,10 @@ packages: tiktoken@1.0.22: resolution: {integrity: sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==} + time-stamp@2.2.0: + resolution: {integrity: sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==} + engines: {node: '>=0.10.0'} + timed-out@4.0.1: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} @@ -24757,6 +24853,12 @@ packages: webpack-dev-server: optional: true + webpack-dev-middleware@1.12.2: + resolution: {integrity: sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==} + engines: {node: '>=0.6'} + peerDependencies: + webpack: ^1.0.0 || ^2.0.0 || ^3.0.0 + webpack-dev-middleware@3.7.3: resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} engines: {node: '>= 6'} @@ -24787,6 +24889,13 @@ packages: webpack: optional: true + webpack-dev-server@2.11.3: + resolution: {integrity: sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==} + engines: {node: '>=4.7'} + hasBin: true + peerDependencies: + webpack: ^2.2.0 || ^3.0.0 + webpack-dev-server@5.2.4: resolution: {integrity: sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==} engines: {node: '>= 18.12.0'} @@ -24951,8 +25060,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.21: + resolution: {integrity: sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -25074,8 +25183,8 @@ packages: utf-8-validate: optional: true - ws@8.20.1: - resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -25196,6 +25305,9 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@4.2.1: + resolution: {integrity: sha512-+QQWqC2xeL0N5/TE+TY6OGEqyNRM+g2/r712PDNYgiCdXYCApXf1vzfmDSLBxfGRwV+moTq/V8FnMI24JCm2Yg==} + yargs-parser@5.0.1: resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} @@ -25227,6 +25339,9 @@ packages: yargs@3.10.0: resolution: {integrity: sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==} + yargs@6.6.0: + resolution: {integrity: sha512-6/QWTdisjnu5UHUzQGst+UOEuEVwIzFVGBjq3jMTFNs5WJQsH/X6nMURSaScIdF5txylr1Ao9bvbWiKi2yXbwA==} + yargs@7.1.2: resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} @@ -26033,24 +26148,24 @@ snapshots: dependencies: '@babel/highlight': 7.25.9 - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} '@babel/core@7.12.9': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.12.9) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.12.9) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 convert-source-map: 1.9.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -26065,15 +26180,15 @@ snapshots: '@babel/core@7.24.4': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 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.24.4) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.24.4) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -26085,15 +26200,15 @@ snapshots: '@babel/core@7.27.1': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 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.1) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.27.1) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -26102,17 +26217,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.29.0': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 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.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -26122,73 +26237,73 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.7': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.3 - '@babel/helper-validator-option': 7.27.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.27.1)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.1) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.27.1)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.0.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.12 @@ -26199,10 +26314,10 @@ snapshots: '@babel/helper-define-polyfill-provider@0.1.5(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.12 @@ -26213,254 +26328,254 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.12.9)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.24.4)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.24.4)': dependencies: '@babel/core': 7.24.4 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.27.1)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/helper-plugin-utils@7.10.4': {} - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.1)': + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.27.1)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helper-wrap-function@7.28.6': + '@babel/helper-wrap-function@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@babel/highlight@7.25.9': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.29.3': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.27.1)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.27.1)': + '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.27.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9)': @@ -26468,22 +26583,22 @@ snapshots: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.10.4 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.12.9) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.12.9) '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.27.1)': dependencies: - '@babel/compat-data': 7.29.3 + '@babel/compat-data': 7.29.7 '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.1) transitivePeerDependencies: - supports-color @@ -26491,8 +26606,8 @@ snapshots: '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -26500,16 +26615,16 @@ snapshots: dependencies: '@babel/core': 7.27.1 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) transitivePeerDependencies: - supports-color @@ -26517,1043 +26632,1048 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.27.1)': + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.27.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.1) + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.27.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/template': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/template': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.27.1)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.27.1)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.27.1) - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.27.1)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.12.9)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.27.1)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.27.1)': + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.29.0)': + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@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.1) - '@babel/types': 7.29.0 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.27.1) + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.27.1)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.1) + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.27.1)': + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.1) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 '@babel/preset-env@7.27.2(@babel/core@7.27.1)': dependencies: - '@babel/compat-data': 7.29.3 + '@babel/compat-data': 7.29.7 '@babel/core': 7.27.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.27.1) + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.1) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.27.1) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.27.1) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.27.1) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.1) babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.27.1) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.1) @@ -27563,167 +27683,167 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-env@7.27.2(@babel/core@7.29.0)': - dependencies: - '@babel/compat-data': 7.29.3 - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.29.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + '@babel/preset-env@7.27.2(@babel/core@7.29.7)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.29.7) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.27.1(@babel/core@7.27.1)': + '@babel/preset-flow@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.27.1) - '@babel/preset-flow@7.27.1(@babel/core@7.29.0)': + '@babel/preset-flow@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.7 esutils: 2.0.3 - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.7 esutils: 2.0.3 '@babel/preset-react@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.27.1) - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/preset-react@7.27.1(@babel/core@7.29.0)': + '@babel/preset-react@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.22.11(@babel/core@7.29.0)': + '@babel/preset-typescript@7.22.11(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.29.7) transitivePeerDependencies: - supports-color '@babel/preset-typescript@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.27.1) '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.29.0)': + '@babel/preset-typescript@7.27.1(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/register@7.29.3(@babel/core@7.27.1)': + '@babel/register@7.29.7(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 clone-deep: 4.0.1 @@ -27732,34 +27852,34 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 - '@babel/runtime-corejs3@7.29.2': + '@babel/runtime-corejs3@7.29.7': dependencies: core-js-pure: 3.49.0 - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@base2/pretty-print-object@1.0.1': {} @@ -28257,8 +28377,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.28.6 - '@babel/runtime': 7.29.2 + '@babel/helper-module-imports': 7.29.7 + '@babel/runtime': 7.29.7 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -28288,7 +28408,7 @@ snapshots: '@emotion/core@10.3.1(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/cache': 10.0.29 '@emotion/css': 10.0.27 '@emotion/serialize': 0.11.16 @@ -28306,7 +28426,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/css@11.10.5(@babel/core@7.29.0)': + '@emotion/css@11.10.5(@babel/core@7.29.7)': dependencies: '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 @@ -28314,7 +28434,7 @@ snapshots: '@emotion/sheet': 1.4.0 '@emotion/utils': 1.4.2 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 transitivePeerDependencies: - supports-color @@ -28346,7 +28466,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@17.0.37)(react@19.1.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -28362,7 +28482,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -28378,7 +28498,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -28392,9 +28512,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/react@11.9.3(@babel/core@7.29.0)(@types/react@18.2.0)(react@18.2.0)': + '@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -28403,14 +28523,14 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.2.0 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@types/react': 18.2.0 transitivePeerDependencies: - supports-color - '@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.7)(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -28419,7 +28539,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.0 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@types/react': 18.2.0 transitivePeerDependencies: - supports-color @@ -28446,7 +28566,7 @@ snapshots: '@emotion/styled-base@10.3.0(@emotion/core@10.3.1(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/core': 10.3.1(react@18.2.0) '@emotion/is-prop-valid': 0.8.8 '@emotion/serialize': 0.11.16 @@ -28462,44 +28582,44 @@ snapshots: 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.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@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.9.3(@babel/core@7.29.7)(@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.29.0 + '@babel/core': 7.29.7 '@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.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@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.7)(@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 + '@babel/core': 7.29.7 '@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)': + '@emotion/styled@11.11.0(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@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.9.3(@babel/core@7.29.7)(@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 @@ -28511,7 +28631,7 @@ snapshots: '@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.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@17.0.37)(react@19.1.0) @@ -28526,7 +28646,7 @@ snapshots: '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) @@ -28541,7 +28661,7 @@ snapshots: '@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.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -28556,7 +28676,7 @@ snapshots: '@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.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -28870,14 +28990,14 @@ snapshots: '@headlessui/react@1.7.18(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/react-virtual': 3.13.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-virtual': 3.13.26(react-dom@18.2.0(react@18.2.0))(react@18.2.0) client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) '@headlessui/react@1.7.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/react-virtual': 3.13.25(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-virtual': 3.13.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0) client-only: 0.0.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -28887,7 +29007,7 @@ snapshots: '@floating-ui/react': 0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-aria/focus': 3.22.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-aria/interactions': 3.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-virtual': 3.13.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-virtual': 3.13.26(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) @@ -28896,7 +29016,7 @@ snapshots: '@floating-ui/react': 0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-aria/focus': 3.22.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-aria/interactions': 3.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-virtual': 3.13.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-virtual': 3.13.26(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) @@ -28943,15 +29063,15 @@ snapshots: '@internationalized/date@3.12.1': dependencies: - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 '@internationalized/number@3.6.6': dependencies: - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 '@internationalized/string@3.2.8': dependencies: - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 '@isaacs/cliui@8.0.2': dependencies: @@ -29655,7 +29775,7 @@ snapshots: '@jest/transform@30.0.0': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/types': 30.0.0 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 @@ -29675,7 +29795,7 @@ snapshots: '@jest/transform@30.1.2': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/types': 30.0.5 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 @@ -30474,7 +30594,7 @@ snapshots: shell-quote: 1.8.4 shx: 0.3.4 spawn-rx: 5.1.2 - ws: 8.20.1 + ws: 8.21.0 zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' @@ -31245,10 +31365,10 @@ 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.18.1)(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.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.18.1)(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@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) + '@emotion/react': 11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@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.18.1)(react@18.2.0)(resize-observer-polyfill@1.5.1) lodash: 4.18.1 react: 18.2.0 @@ -31298,11 +31418,11 @@ 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.18.1)(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.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.18.1)(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.18.1)(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.18.1)(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.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.18.1)(react@18.2.0)(resize-observer-polyfill@1.5.1) dagre: 0.8.5 lodash: 4.18.1 pathfinding: 0.4.18 @@ -31359,11 +31479,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.18.1)(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.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.18.1)(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.18.1)(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.18.1)(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.18.1)(pathfinding@0.4.18)(paths-js@0.4.11)(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.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.18.1)(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.7)(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.10.5(@babel/core@7.29.7)(@emotion/react@11.9.3(@babel/core@7.29.7)(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.18.1)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' @@ -32250,7 +32370,7 @@ snapshots: '@react-aria/focus@3.22.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 react: 18.2.0 react-aria: 3.48.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-dom: 18.2.0(react@18.2.0) @@ -32258,7 +32378,7 @@ snapshots: '@react-aria/interactions@3.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-types/shared': 3.34.0(react@18.2.0) - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 react: 18.2.0 react-aria: 3.48.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-dom: 18.2.0(react@18.2.0) @@ -32301,7 +32421,7 @@ snapshots: '@rollup/plugin-babel@5.3.1(@babel/core@7.27.1)(@types/babel__core@7.20.5)(rollup@1.32.1)': dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.28.6 + '@babel/helper-module-imports': 7.29.7 '@rollup/pluginutils': 3.1.0(rollup@1.32.1) rollup: 1.32.1 optionalDependencies: @@ -32994,7 +33114,7 @@ snapshots: '@storybook/addon-docs@6.5.16(@babel/core@7.27.1)(eslint@9.39.4(jiti@2.7.0))(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.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@jest/transform': 26.6.2 '@mdx-js/react': 1.6.22(react@18.2.0) @@ -33037,7 +33157,7 @@ snapshots: '@storybook/addon-docs@6.5.9(@babel/core@7.27.1)(eslint@9.39.4(jiti@2.7.0))(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.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@jest/transform': 26.6.2 '@mdx-js/react': 1.6.22(react@18.2.0) @@ -33569,22 +33689,22 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) @@ -34261,10 +34381,10 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 - '@storybook/cli@8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.0))(prettier@3.5.3)': + '@storybook/cli@8.6.14(@babel/preset-env@7.27.2(@babel/core@7.29.7))(prettier@3.5.3)': dependencies: '@babel/core': 7.27.1 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@storybook/codemod': 8.6.14(storybook@8.6.14(prettier@3.5.3)) '@types/semver': 7.7.1 commander: 12.1.0 @@ -34276,7 +34396,7 @@ snapshots: giget: 1.2.5 glob: 10.5.0 globby: 14.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.29.0)) + jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.29.7)) leven: 3.1.0 p-limit: 6.2.0 prompts: 2.4.2 @@ -34410,13 +34530,13 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@storybook/core': 8.6.14(prettier@3.5.3)(storybook@8.6.14(prettier@3.5.3)) '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 - es-toolkit: 1.46.1 + es-toolkit: 1.47.0 globby: 14.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.29.0)) + jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.29.7)) prettier: 3.5.3 recast: 0.23.11 tiny-invariant: 1.3.3 @@ -34733,25 +34853,25 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) '@storybook/node-logger': 6.3.7 '@storybook/semver': 7.3.2 '@types/glob-base': 0.3.2 @@ -34794,26 +34914,26 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 @@ -34857,26 +34977,26 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 @@ -34920,26 +35040,26 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) '@storybook/node-logger': 6.5.9 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 @@ -34983,26 +35103,26 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) '@storybook/node-logger': 6.5.9 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 @@ -35046,26 +35166,26 @@ snapshots: dependencies: '@babel/core': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.1) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.27.1) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.1) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.1) '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.1) '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.1) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.1) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.1) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.1) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.1) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) '@storybook/node-logger': 6.5.9 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 @@ -35166,12 +35286,12 @@ snapshots: - webpack-cli - webpack-command - '@storybook/core-server@6.3.7(@babel/core@7.29.0)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.3.7(@babel/core@7.29.7)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/builder-webpack4': 6.3.7(@types/react@18.2.0)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-client': 6.3.7(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0) '@storybook/core-common': 6.3.7(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/csf-tools': 6.3.7(@babel/core@7.29.0) + '@storybook/csf-tools': 6.3.7(@babel/core@7.29.7) '@storybook/manager-webpack4': 6.3.7(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.3.7 '@storybook/semver': 7.3.2 @@ -35262,7 +35382,7 @@ snapshots: util-deprecate: 1.0.2 watchpack: 2.5.1 webpack: 4.47.0(webpack-cli@6.0.1) - ws: 8.20.1 + ws: 8.21.0 x-default-browser: 0.4.0 optionalDependencies: '@storybook/builder-webpack5': 6.5.16(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -35326,7 +35446,7 @@ snapshots: util-deprecate: 1.0.2 watchpack: 2.5.1 webpack: 4.47.0 - ws: 8.20.1 + ws: 8.21.0 x-default-browser: 0.4.0 optionalDependencies: typescript: 5.8.3 @@ -35388,7 +35508,7 @@ snapshots: util-deprecate: 1.0.2 watchpack: 2.5.1 webpack: 4.47.0(webpack-cli@4.10.0) - ws: 8.20.1 + ws: 8.21.0 x-default-browser: 0.4.0 optionalDependencies: '@storybook/builder-webpack5': 6.5.9(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -35452,7 +35572,7 @@ snapshots: util-deprecate: 1.0.2 watchpack: 2.5.1 webpack: 4.47.0 - ws: 8.20.1 + ws: 8.21.0 x-default-browser: 0.4.0 optionalDependencies: typescript: 4.9.4 @@ -35492,10 +35612,10 @@ snapshots: - webpack-cli - webpack-command - '@storybook/core@6.3.7(@babel/core@7.29.0)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0)': + '@storybook/core@6.3.7(@babel/core@7.29.7)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0)': dependencies: '@storybook/core-client': 6.3.7(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0) - '@storybook/core-server': 6.3.7(@babel/core@7.29.0)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-server': 6.3.7(@babel/core@7.29.7)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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) optionalDependencies: @@ -35608,7 +35728,7 @@ snapshots: recast: 0.23.11 semver: 7.8.1 util: 0.12.5 - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -35629,7 +35749,7 @@ snapshots: recast: 0.23.11 semver: 7.8.1 util: 0.12.5 - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -35645,12 +35765,12 @@ snapshots: '@storybook/csf-tools@6.3.7(@babel/core@7.27.1)': dependencies: - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.1) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@mdx-js/mdx': 1.6.22 '@storybook/csf': 0.0.1 core-js: 3.49.0 @@ -35663,14 +35783,14 @@ snapshots: - '@babel/core' - supports-color - '@storybook/csf-tools@6.3.7(@babel/core@7.29.0)': + '@storybook/csf-tools@6.3.7(@babel/core@7.29.7)': dependencies: - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/preset-env': 7.27.2(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/preset-env': 7.27.2(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@mdx-js/mdx': 1.6.22 '@storybook/csf': 0.0.1 core-js: 3.49.0 @@ -35686,12 +35806,12 @@ snapshots: '@storybook/csf-tools@6.5.16': dependencies: '@babel/core': 7.27.1 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.1) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.1) core-js: 3.49.0 @@ -35705,12 +35825,12 @@ snapshots: '@storybook/csf-tools@6.5.9': dependencies: '@babel/core': 7.27.1 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.1) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.1) core-js: 3.49.0 @@ -35796,7 +35916,7 @@ snapshots: '@storybook/manager-webpack4@6.3.7(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@storybook/addons': 6.3.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.3.7(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0) @@ -35848,7 +35968,7 @@ snapshots: '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@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@4.47.0) @@ -35897,7 +36017,7 @@ snapshots: '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@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@4.47.0(webpack-cli@6.0.1)) @@ -35946,7 +36066,7 @@ snapshots: '@storybook/manager-webpack4@6.5.9(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@storybook/addons': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0(webpack-cli@4.10.0)) @@ -35995,7 +36115,7 @@ snapshots: '@storybook/manager-webpack4@6.5.9(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.4)': dependencies: '@babel/core': 7.27.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@storybook/addons': 6.5.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/core-client': 6.5.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.4)(webpack@4.47.0) @@ -36044,7 +36164,7 @@ snapshots: '@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(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.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@storybook/addons': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) @@ -36103,7 +36223,7 @@ snapshots: '@storybook/manager-webpack5@6.5.9(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(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.1 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@storybook/addons': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-client': 6.5.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) @@ -36161,10 +36281,10 @@ snapshots: '@storybook/mdx1-csf@0.0.1(@babel/core@7.27.1)': dependencies: - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.3 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.17.17 js-string-escape: 1.0.1 @@ -36647,7 +36767,7 @@ snapshots: '@storybook/react@6.3.7(@babel/core@7.27.1)(@types/react@18.2.0)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) + '@babel/preset-flow': 7.29.7(@babel/core@7.27.1) '@babel/preset-react': 7.27.1(@babel/core@7.27.1) '@pmmmwh/react-refresh-webpack-plugin': 0.4.3(@types/webpack@4.41.40)(react-refresh@0.8.3)(webpack-hot-middleware@2.26.1)(webpack@4.47.0) '@storybook/addons': 6.3.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -36692,20 +36812,20 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.3.7(@babel/core@7.29.0)(@types/react@18.2.0)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.3.7(@babel/core@7.29.7)(@types/react@18.2.0)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.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) + '@babel/preset-flow': 7.29.7(@babel/core@7.29.7) + '@babel/preset-react': 7.27.1(@babel/core@7.29.7) '@pmmmwh/react-refresh-webpack-plugin': 0.4.3(@types/webpack@4.41.40)(react-refresh@0.8.3)(webpack-hot-middleware@2.26.1)(webpack@4.47.0) '@storybook/addons': 6.3.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core': 6.3.7(@babel/core@7.29.0)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0) + '@storybook/core': 6.3.7(@babel/core@7.29.7)(@types/react@18.2.0)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@4.47.0) '@storybook/core-common': 6.3.7(eslint@9.39.4(jiti@2.7.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.3.7 '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.253f8c1.0(typescript@5.8.3)(webpack@4.47.0) '@storybook/semver': 7.3.2 '@types/webpack-env': 1.18.8 babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.29.0) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.29.7) babel-plugin-react-docgen: 4.2.1 core-js: 3.49.0 global: 4.4.0 @@ -36720,7 +36840,7 @@ snapshots: ts-dedent: 2.2.0 webpack: 4.47.0 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 typescript: 5.8.3 transitivePeerDependencies: - '@storybook/builder-webpack5' @@ -36741,7 +36861,7 @@ snapshots: '@storybook/react@6.5.16(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.16(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(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(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(postcss@8.5.13)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(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.4)(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) + '@babel/preset-flow': 7.29.7(@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(postcss@8.5.13)(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.4)(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) @@ -36815,7 +36935,7 @@ snapshots: '@storybook/react@6.5.16(@babel/core@7.27.1)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) + '@babel/preset-flow': 7.29.7(@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)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.4(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) @@ -36885,10 +37005,10 @@ 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.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.29.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.4(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) + '@babel/preset-flow': 7.29.7(@babel/core@7.29.7) + '@babel/preset-react': 7.27.1(@babel/core@7.29.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.4(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 @@ -36926,7 +37046,7 @@ snapshots: util-deprecate: 1.0.2 webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 typescript: 5.8.3 transitivePeerDependencies: - '@minify-html/node' @@ -36959,7 +37079,7 @@ snapshots: '@storybook/react@6.5.9(@babel/core@7.27.1)(@storybook/builder-webpack5@6.5.9(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(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.4(jiti@2.7.0))(postcss@8.5.13)(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(postcss@8.5.13)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(postcss@8.5.13)(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.4)(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) + '@babel/preset-flow': 7.29.7(@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(postcss@8.5.13)(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.4)(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) @@ -37031,10 +37151,10 @@ 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.4(jiti@2.7.0))(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.4(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.9(@babel/core@7.29.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.4(jiti@2.7.0))(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.4(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) + '@babel/preset-flow': 7.29.7(@babel/core@7.29.7) + '@babel/preset-react': 7.27.1(@babel/core@7.29.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.4(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 @@ -37072,7 +37192,7 @@ snapshots: util-deprecate: 1.0.2 webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 typescript: 4.9.4 transitivePeerDependencies: - '@minify-html/node' @@ -37534,7 +37654,7 @@ snapshots: '@swagger-api/apidom-ast@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-error': 1.11.1 '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -37543,7 +37663,7 @@ snapshots: '@swagger-api/apidom-core@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-ast': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@types/ramda': 0.30.2 @@ -37555,18 +37675,18 @@ snapshots: '@swagger-api/apidom-error@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-json-pointer@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swaggerexpert/json-pointer': 2.10.2 '@swagger-api/apidom-ns-api-design-systems@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-openapi-3-1': 1.11.1 @@ -37578,7 +37698,7 @@ snapshots: '@swagger-api/apidom-ns-arazzo-1@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-json-schema-2020-12': 1.11.1 '@types/ramda': 0.30.2 @@ -37589,7 +37709,7 @@ snapshots: '@swagger-api/apidom-ns-asyncapi-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-json-schema-draft-7': 1.11.1 '@types/ramda': 0.30.2 @@ -37600,7 +37720,7 @@ snapshots: '@swagger-api/apidom-ns-asyncapi-3@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-asyncapi-2': 1.11.1 '@types/ramda': 0.30.2 @@ -37611,7 +37731,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-2019-09@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-json-schema-draft-7': 1.11.1 @@ -37622,7 +37742,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-2020-12@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-json-schema-2019-09': 1.11.1 @@ -37633,7 +37753,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-draft-4@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-ast': 1.11.1 '@swagger-api/apidom-core': 1.11.1 '@types/ramda': 0.30.2 @@ -37643,7 +37763,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-draft-6@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.1 @@ -37654,7 +37774,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-draft-7@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-json-schema-draft-6': 1.11.1 @@ -37665,7 +37785,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.1 @@ -37677,7 +37797,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-3-0@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@swagger-api/apidom-ns-json-schema-draft-4': 1.11.1 @@ -37688,7 +37808,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-3-1@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-ast': 1.11.1 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-json-pointer': 1.11.1 @@ -37701,7 +37821,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-3-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-ast': 1.11.1 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-json-pointer': 1.11.1 @@ -37715,7 +37835,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-api-design-systems': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37726,7 +37846,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-api-design-systems': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37737,7 +37857,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-arazzo-1': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37748,7 +37868,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-arazzo-1': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37759,7 +37879,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-asyncapi-2': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37770,7 +37890,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-asyncapi-3': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37781,7 +37901,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-asyncapi-2': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37792,7 +37912,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-asyncapi-3': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37803,7 +37923,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-json@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-ast': 1.11.1 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 @@ -37817,7 +37937,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-2': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37828,7 +37948,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-3-0': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37839,7 +37959,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-3-1': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37850,7 +37970,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-3-2': 1.11.1 '@swagger-api/apidom-parser-adapter-json': 1.11.1 @@ -37861,7 +37981,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-2': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37872,7 +37992,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-3-0': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37883,7 +38003,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-3-1': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37894,7 +38014,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-ns-openapi-3-2': 1.11.1 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.11.1 @@ -37905,7 +38025,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-yaml-1-2@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-ast': 1.11.1 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 @@ -37919,7 +38039,7 @@ snapshots: '@swagger-api/apidom-reference@1.11.1': dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 '@types/ramda': 0.30.2 @@ -37964,7 +38084,7 @@ snapshots: dependencies: apg-lite: 1.0.5 - '@swc/helpers@0.5.21': + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 @@ -38033,19 +38153,19 @@ snapshots: '@tanstack/query-core': 5.77.1 react: 18.2.0 - '@tanstack/react-virtual@3.13.25(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-virtual@3.13.26(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/virtual-core': 3.15.0 + '@tanstack/virtual-core': 3.16.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@tanstack/react-virtual@3.13.25(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-virtual@3.13.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/virtual-core': 3.15.0 + '@tanstack/virtual-core': 3.16.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/virtual-core@3.15.0': {} + '@tanstack/virtual-core@3.16.0': {} '@tavily/core@0.6.4': dependencies: @@ -38058,8 +38178,8 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -38089,7 +38209,7 @@ snapshots: '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -38196,24 +38316,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@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.29.0 + '@babel/types': 7.29.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@types/blueimp-md5@2.18.2': {} @@ -39175,7 +39295,7 @@ snapshots: '@uiw/react-codemirror@4.23.12(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.38.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@codemirror/commands': 6.10.0 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.2 @@ -40120,6 +40240,8 @@ snapshots: array-flatten@1.1.1: {} + array-flatten@2.1.2: {} + array-includes@3.1.9: dependencies: call-bind: 1.0.9 @@ -40332,7 +40454,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001793 + caniuse-db: 1.0.30001795 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -40373,7 +40495,7 @@ snapshots: axios@1.15.2: dependencies: - follow-redirects: 1.16.0 + follow-redirects: 1.16.0(debug@3.2.7) form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -40418,16 +40540,16 @@ snapshots: dependencies: '@babel/core': 7.27.1 - babel-core@7.0.0-bridge.0(@babel/core@7.29.0): + babel-core@7.0.0-bridge.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 babel-eslint@10.1.0(eslint@9.39.4(jiti@2.7.0)): dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 1.3.0 resolve: 1.22.12 @@ -40574,26 +40696,26 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@30.0.0(@babel/core@7.29.0): + babel-jest@30.0.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/transform': 30.0.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.0.0(@babel/core@7.29.0) + babel-preset-jest: 30.0.0(@babel/core@7.29.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-jest@30.1.2(@babel/core@7.29.0): + babel-jest@30.1.2(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/transform': 30.1.2 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.0.1(@babel/core@7.29.0) + babel-preset-jest: 30.0.1(@babel/core@7.29.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -40614,9 +40736,9 @@ snapshots: mkdirp: 0.5.6 webpack: 3.8.1 - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.29.0))(webpack@3.8.1): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.29.7))(webpack@3.8.1): dependencies: - babel-core: 7.0.0-bridge.0(@babel/core@7.29.0) + babel-core: 7.0.0-bridge.0(@babel/core@7.29.7) find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 @@ -40690,7 +40812,7 @@ snapshots: babel-plugin-emotion@10.2.2: dependencies: - '@babel/helper-module-imports': 7.28.6 + '@babel/helper-module-imports': 7.29.7 '@emotion/hash': 0.8.0 '@emotion/memoize': 0.7.4 '@emotion/serialize': 0.11.16 @@ -40716,7 +40838,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.6 istanbul-lib-instrument: 5.2.1 @@ -40726,7 +40848,7 @@ snapshots: babel-plugin-istanbul@7.0.1: dependencies: - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.6 istanbul-lib-instrument: 6.0.3 @@ -40740,38 +40862,38 @@ snapshots: babel-plugin-jest-hoist@25.5.0: dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__traverse': 7.28.0 babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 babel-plugin-jest-hoist@30.0.0: dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 babel-plugin-jest-hoist@30.0.1: dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 babel-plugin-macros@2.8.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 cosmiconfig: 6.0.0 resolve: 1.22.12 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 cosmiconfig: 7.1.0 resolve: 1.22.12 @@ -40779,26 +40901,26 @@ snapshots: dependencies: '@babel/core': 7.27.1 - babel-plugin-named-asset-import@0.3.8(@babel/core@7.29.0): + babel-plugin-named-asset-import@0.3.8(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 babel-plugin-named-exports-order@0.0.2: {} babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.27.1): dependencies: - '@babel/compat-data': 7.29.3 + '@babel/compat-data': 7.29.7 '@babel/core': 7.27.1 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.27.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: - '@babel/compat-data': 7.29.3 - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -40819,10 +40941,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color @@ -40841,10 +40963,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -41086,7 +41208,7 @@ snapshots: '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.1) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.1) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.27.1) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.1) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.1) @@ -41098,24 +41220,24 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.1) - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) babel-preset-env@1.6.1: dependencies: @@ -41181,17 +41303,17 @@ snapshots: babel-plugin-jest-hoist: 30.0.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.27.1) - babel-preset-jest@30.0.0(@babel/core@7.29.0): + babel-preset-jest@30.0.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 babel-plugin-jest-hoist: 30.0.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) - babel-preset-jest@30.0.1(@babel/core@7.29.0): + babel-preset-jest@30.0.1(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 babel-plugin-jest-hoist: 30.0.1 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) babel-preset-react-app@3.1.2(babel-runtime@6.26.0): dependencies: @@ -41385,6 +41507,15 @@ snapshots: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 + bonjour@3.5.1: + dependencies: + array-flatten: 2.1.2 + deep-equal: 1.1.2 + dns-equal: 1.0.0 + dns-txt: 2.0.2 + multicast-dns: 7.2.5 + multicast-dns-service-types: 1.1.0 + boolbase@1.0.0: {} boundary@2.0.0: {} @@ -41485,7 +41616,7 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 - browserify-sign@4.2.5: + browserify-sign@4.2.6: dependencies: bn.js: 5.2.3 browserify-rsa: 4.1.1 @@ -41503,18 +41634,18 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001793 - electron-to-chromium: 1.5.361 + caniuse-db: 1.0.30001795 + electron-to-chromium: 1.5.362 browserslist@2.11.3: dependencies: caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.361 + electron-to-chromium: 1.5.362 browserslist@4.14.2: dependencies: caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.361 + electron-to-chromium: 1.5.362 escalade: 3.2.0 node-releases: 1.1.77 @@ -41522,7 +41653,7 @@ snapshots: dependencies: baseline-browser-mapping: 2.10.32 caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.361 + electron-to-chromium: 1.5.362 node-releases: 2.0.46 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -41555,6 +41686,8 @@ snapshots: buffer-indexof-polyfill@1.0.2: {} + buffer-indexof@1.1.1: {} + buffer-xor@1.0.3: {} buffer@4.9.2: @@ -41802,7 +41935,7 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001793 + caniuse-db: 1.0.30001795 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -41813,7 +41946,7 @@ snapshots: lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001793: {} + caniuse-db@1.0.30001795: {} caniuse-lite@1.0.30001793: {} @@ -41969,7 +42102,6 @@ snapshots: upath: 1.2.0 optionalDependencies: fsevents: 1.2.13 - optional: true chokidar@3.5.3: dependencies: @@ -42377,6 +42509,8 @@ snapshots: confusing-browser-globals@1.0.11: {} + connect-history-api-fallback@1.6.0: {} + connect-history-api-fallback@2.0.0: {} consola@3.4.2: {} @@ -42464,7 +42598,7 @@ snapshots: cors-anywhere@0.4.4: dependencies: - http-proxy: 1.18.1 + http-proxy: 1.18.1(debug@3.2.7) proxy-from-env: 0.0.1 transitivePeerDependencies: - debug @@ -42672,14 +42806,14 @@ snapshots: crypto-browserify@3.12.1: dependencies: browserify-cipher: 1.0.1 - browserify-sign: 4.2.5 + browserify-sign: 4.2.6 create-ecdh: 4.0.4 create-hash: 1.2.0 create-hmac: 1.1.7 diffie-hellman: 5.0.3 hash-base: 3.0.5 inherits: 2.0.4 - pbkdf2: 3.1.5 + pbkdf2: 3.1.6 public-encrypt: 4.0.3 randombytes: 2.1.0 randomfill: 1.0.4 @@ -43135,6 +43269,12 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.4.3(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -43180,6 +43320,15 @@ snapshots: deep-eql@5.0.2: {} + deep-equal@1.1.2: + dependencies: + is-arguments: 1.2.0 + is-date-object: 1.1.0 + is-regex: 1.2.1 + object-is: 1.1.6 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.4 + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.2 @@ -43199,7 +43348,7 @@ snapshots: side-channel: 1.1.0 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.21 deep-extend@0.6.0: {} @@ -43273,6 +43422,15 @@ snapshots: pinkie-promise: 2.0.1 rimraf: 2.7.1 + del@3.0.0: + dependencies: + globby: 6.1.0 + is-path-cwd: 1.0.0 + is-path-in-cwd: 1.0.1 + p-map: 1.2.0 + pify: 3.0.0 + rimraf: 2.7.1 + del@7.1.0: dependencies: globby: 13.2.2 @@ -43387,10 +43545,16 @@ snapshots: '@react-dnd/invariant': 4.0.2 redux: 4.2.1 + dns-equal@1.0.0: {} + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 + dns-txt@2.0.2: + dependencies: + buffer-indexof: 1.1.1 + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -43495,7 +43659,7 @@ snapshots: downshift@6.1.12(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 compute-scroll-into-view: 1.0.20 prop-types: 15.8.1 react: 18.2.0 @@ -43504,7 +43668,7 @@ snapshots: downshift@7.6.2(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 compute-scroll-into-view: 2.0.4 prop-types: 15.8.1 react: 18.2.0 @@ -43555,7 +43719,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.361: {} + electron-to-chromium@1.5.362: {} element-resize-detector@1.2.4: dependencies: @@ -43591,7 +43755,7 @@ snapshots: emotion-theming@10.3.0(@emotion/core@10.3.1(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/core': 10.3.1(react@18.2.0) '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 @@ -43731,7 +43895,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.21 es-array-method-boxes-properly@1.0.0: {} @@ -43795,7 +43959,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.46.1: {} + es-toolkit@1.47.0: {} es5-ext@0.10.64: dependencies: @@ -44191,8 +44355,8 @@ snapshots: estree-to-babel@3.2.1: dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -44565,6 +44729,10 @@ snapshots: dependencies: format: 0.2.2 + faye-websocket@0.10.0: + dependencies: + websocket-driver: 0.7.4 + faye-websocket@0.11.4: dependencies: websocket-driver: 0.7.4 @@ -44848,7 +45016,9 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.16.0: {} + follow-redirects@1.16.0(debug@3.2.7): + optionalDependencies: + debug: 3.2.7 for-each@0.3.5: dependencies: @@ -44891,7 +45061,7 @@ snapshots: fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.4(jiti@2.7.0))(typescript@4.9.4)(webpack@4.47.0): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -44911,7 +45081,7 @@ snapshots: fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.4(jiti@2.7.0))(typescript@5.8.3)(webpack@4.47.0(webpack-cli@4.10.0)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -44931,7 +45101,7 @@ snapshots: fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.4(jiti@2.7.0))(typescript@5.8.3)(webpack@4.47.0(webpack-cli@6.0.1)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -44951,7 +45121,7 @@ snapshots: fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.4(jiti@2.7.0))(typescript@5.8.3)(webpack@4.47.0): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -44971,7 +45141,7 @@ snapshots: fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.4(jiti@2.7.0))(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -44991,7 +45161,7 @@ snapshots: fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(esbuild@0.25.12)(postcss@8.5.13)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -45008,7 +45178,7 @@ snapshots: fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(postcss@8.5.13)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -45025,7 +45195,7 @@ snapshots: fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -45042,7 +45212,7 @@ snapshots: fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chalk: 4.1.2 chokidar: 4.0.3 cosmiconfig: 8.3.6(typescript@5.8.3) @@ -45559,6 +45729,14 @@ snapshots: pify: 2.3.0 pinkie-promise: 2.0.1 + globby@6.1.0: + dependencies: + array-union: 1.0.2 + glob: 7.2.3 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + globby@9.2.0: dependencies: '@types/glob': 7.2.0 @@ -45680,6 +45858,8 @@ snapshots: duplexer: 0.1.2 pify: 4.0.1 + handle-thing@1.2.5: {} + handle-thing@2.0.1: {} handlebars@4.7.9: @@ -46216,10 +46396,19 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-middleware@0.17.4(debug@3.2.7): + dependencies: + http-proxy: 1.18.1(debug@3.2.7) + is-glob: 3.1.0 + lodash: 4.18.1 + micromatch: 4.0.8 + transitivePeerDependencies: + - debug + http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 - http-proxy: 1.18.1 + http-proxy: 1.18.1(debug@3.2.7) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 @@ -46228,10 +46417,10 @@ snapshots: transitivePeerDependencies: - debug - http-proxy@1.18.1: + http-proxy@1.18.1(debug@3.2.7): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.16.0 + follow-redirects: 1.16.0(debug@3.2.7) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -46243,7 +46432,7 @@ snapshots: corser: 2.0.1 he: 1.2.0 html-encoding-sniffer: 3.0.0 - http-proxy: 1.18.1 + http-proxy: 1.18.1(debug@3.2.7) mime: 1.6.0 minimist: 1.2.8 opener: 1.5.2 @@ -46375,6 +46564,11 @@ snapshots: import-lazy@2.1.0: {} + import-local@1.0.0: + dependencies: + pkg-dir: 2.0.0 + resolve-cwd: 2.0.0 + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -46428,6 +46622,10 @@ snapshots: strip-ansi: 4.0.0 through: 2.3.8 + internal-ip@1.2.0: + dependencies: + meow: 3.7.0 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -46751,7 +46949,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.21 is-typedarray@1.0.0: {} @@ -46827,9 +47025,9 @@ snapshots: transitivePeerDependencies: - encoding - isomorphic-ws@5.0.0(ws@8.20.1): + isomorphic-ws@5.0.0(ws@8.21.0): dependencies: - ws: 8.20.1 + ws: 8.21.0 isstream@0.1.2: {} @@ -46877,7 +47075,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -46887,7 +47085,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.29.3 + '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.8.1 @@ -47410,12 +47608,12 @@ snapshots: jest-config@30.0.0(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.8.3)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/get-type': 30.0.0 '@jest/pattern': 30.0.0 '@jest/test-sequencer': 30.0.0 '@jest/types': 30.0.0 - babel-jest: 30.0.0(@babel/core@7.29.0) + babel-jest: 30.0.0(@babel/core@7.29.7) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 @@ -47444,12 +47642,12 @@ snapshots: jest-config@30.0.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.8.3)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/get-type': 30.0.0 '@jest/pattern': 30.0.0 '@jest/test-sequencer': 30.0.0 '@jest/types': 30.0.0 - babel-jest: 30.0.0(@babel/core@7.29.0) + babel-jest: 30.0.0(@babel/core@7.29.7) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 @@ -47478,12 +47676,12 @@ snapshots: jest-config@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)): dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 '@jest/test-sequencer': 30.1.3 '@jest/types': 30.0.5 - babel-jest: 30.1.2(@babel/core@7.29.0) + babel-jest: 30.1.2(@babel/core@7.29.7) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 @@ -47831,7 +48029,7 @@ snapshots: jest-jasmine2@25.5.4: dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.29.7 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -47935,7 +48133,7 @@ snapshots: jest-message-util@22.4.3: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chalk: 2.4.2 micromatch: 4.0.8 slash: 1.0.0 @@ -47943,7 +48141,7 @@ snapshots: jest-message-util@25.5.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@jest/types': 25.5.0 '@types/stack-utils': 1.0.1 chalk: 3.0.0 @@ -47954,7 +48152,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -47966,7 +48164,7 @@ snapshots: jest-message-util@30.0.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@jest/types': 30.0.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -47978,7 +48176,7 @@ snapshots: jest-message-util@30.1.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@jest/types': 30.0.5 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -47990,7 +48188,7 @@ snapshots: jest-message-util@30.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -48002,7 +48200,7 @@ snapshots: jest-message-util@30.4.1: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@jest/types': 30.4.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -48440,7 +48638,7 @@ snapshots: jest-snapshot@25.5.1: dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -48459,10 +48657,10 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.27.1 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.1) - '@babel/types': 7.29.0 + '@babel/generator': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.27.1) + '@babel/types': 7.29.7 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -48483,17 +48681,17 @@ snapshots: jest-snapshot@30.0.0: dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 '@jest/expect-utils': 30.0.0 '@jest/get-type': 30.0.0 '@jest/snapshot-utils': 30.0.0 '@jest/transform': 30.0.0 '@jest/types': 30.0.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) chalk: 4.1.2 expect: 30.0.0 graceful-fs: 4.2.11 @@ -48509,17 +48707,17 @@ snapshots: jest-snapshot@30.1.2: dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.7 '@jest/expect-utils': 30.1.2 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.1.2 '@jest/transform': 30.1.2 '@jest/types': 30.0.5 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) chalk: 4.1.2 expect: 30.1.2 graceful-fs: 4.2.11 @@ -48877,18 +49075,18 @@ snapshots: jschardet@3.1.4: {} - jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.29.0)): + jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.29.7)): dependencies: '@babel/core': 7.27.1 - '@babel/parser': 7.29.3 - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.27.1) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.27.1) - '@babel/preset-flow': 7.27.1(@babel/core@7.27.1) + '@babel/parser': 7.29.7 + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.27.1) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.27.1) + '@babel/preset-flow': 7.29.7(@babel/core@7.27.1) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.1) - '@babel/register': 7.29.3(@babel/core@7.27.1) + '@babel/register': 7.29.7(@babel/core@7.27.1) babel-core: 7.0.0-bridge.0(@babel/core@7.27.1) chalk: 4.1.2 flow-parser: 0.314.0 @@ -48900,7 +49098,7 @@ snapshots: temp: 0.8.4 write-file-atomic: 2.4.3 optionalDependencies: - '@babel/preset-env': 7.27.2(@babel/core@7.29.0) + '@babel/preset-env': 7.27.2(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -48993,7 +49191,7 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.20.1 + ws: 8.21.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -49042,7 +49240,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 ts-algebra: 2.0.0 json-schema-traverse@0.3.1: {} @@ -49176,6 +49374,8 @@ snapshots: get-them-args: 1.3.2 shell-exec: 1.0.2 + killable@1.0.1: {} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 @@ -49221,7 +49421,7 @@ snapshots: lazy-universal-dotenv@3.0.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 app-root-dir: 1.0.2 core-js: 3.49.0 dotenv: 8.6.0 @@ -49263,7 +49463,7 @@ snapshots: dependencies: uc.micro: 1.0.6 - linkify-it@5.0.0: + linkify-it@5.0.1: dependencies: uc.micro: 2.1.0 @@ -49624,7 +49824,7 @@ snapshots: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.0 + linkify-it: 5.0.1 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 @@ -50598,6 +50798,8 @@ snapshots: ms@2.1.3: {} + multicast-dns-service-types@1.1.0: {} + multicast-dns@7.2.5: dependencies: dns-packet: 5.6.1 @@ -50715,6 +50917,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-forge@0.10.0: {} + node-gyp-build@4.8.4: optional: true @@ -51065,6 +51269,10 @@ snapshots: dependencies: is-wsl: 1.1.0 + opn@5.5.0: + dependencies: + is-wsl: 1.1.0 + optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -51281,7 +51489,7 @@ snapshots: asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 - pbkdf2: 3.1.5 + pbkdf2: 3.1.6 safe-buffer: 5.2.1 parse-entities@2.0.0: @@ -51309,14 +51517,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 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.29.0 + '@babel/code-frame': 7.29.7 index-to-position: 1.2.0 type-fest: 4.41.0 @@ -51444,7 +51652,7 @@ snapshots: pathval@2.0.1: {} - pbkdf2@3.1.5: + pbkdf2@3.1.6: dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 @@ -51573,7 +51781,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 popmotion@11.0.3: dependencies: @@ -51595,6 +51803,13 @@ snapshots: transitivePeerDependencies: - supports-color + portfinder@1.0.37(supports-color@5.5.0): + dependencies: + async: 3.2.6 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + possible-typed-array-names@1.1.0: {} postcss-calc@10.1.1(postcss@8.5.13): @@ -52775,7 +52990,7 @@ snapshots: '@internationalized/number': 3.6.6 '@internationalized/string': 3.2.8 '@react-types/shared': 3.34.0(react@18.2.0) - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 aria-hidden: 1.2.6 clsx: 2.1.1 react: 18.2.0 @@ -52891,8 +53106,8 @@ snapshots: react-docgen@5.4.3: dependencies: '@babel/core': 7.27.1 - '@babel/generator': 7.29.1 - '@babel/runtime': 7.29.2 + '@babel/generator': 7.29.7 + '@babel/runtime': 7.29.7 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -52906,8 +53121,8 @@ snapshots: react-docgen@7.1.1: dependencies: '@babel/core': 7.27.1 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -52960,17 +53175,17 @@ snapshots: react-error-boundary@3.1.4(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 react: 18.2.0 react-error-boundary@6.0.0(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 react: 18.2.0 react-error-boundary@6.0.0(react@19.1.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 react: 19.1.0 react-error-overlay@4.0.1: {} @@ -52981,7 +53196,7 @@ snapshots: react-helmet-async@1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 invariant: 2.2.4 prop-types: 15.8.1 react: 18.2.0 @@ -53033,7 +53248,7 @@ snapshots: react-inspector@5.1.1(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 is-dom: 1.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -53173,7 +53388,7 @@ snapshots: react-popper-tooltip@3.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@popperjs/core': 2.11.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -53238,7 +53453,7 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.1))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): + react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.1))(babel-runtime@6.26.0)(typescript@5.8.3): dependencies: autoprefixer: 7.1.6 babel-jest: 20.0.3 @@ -53275,7 +53490,7 @@ snapshots: uglifyjs-webpack-plugin: 1.2.5(webpack@3.8.1) url-loader: 0.6.2(file-loader@1.1.5(webpack@3.8.1)) webpack: 3.8.1 - webpack-dev-server: 5.2.4(webpack-cli@6.0.1)(webpack@3.8.1) + webpack-dev-server: 2.11.3(webpack@3.8.1) webpack-manifest-plugin: 1.3.2(webpack@3.8.1) whatwg-fetch: 2.0.3 optionalDependencies: @@ -53283,17 +53498,12 @@ snapshots: transitivePeerDependencies: - babel-core - babel-runtime - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-cli - react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.29.0))(babel-runtime@6.26.0)(typescript@5.8.3): + react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.29.7))(babel-runtime@6.26.0)(typescript@5.8.3): dependencies: autoprefixer: 7.1.6 babel-jest: 20.0.3 - babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.29.0))(webpack@3.8.1) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.29.7))(webpack@3.8.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 @@ -53326,7 +53536,7 @@ snapshots: uglifyjs-webpack-plugin: 1.2.5(webpack@3.8.1) url-loader: 0.6.2(file-loader@1.1.5(webpack@3.8.1)) webpack: 3.8.1 - webpack-dev-server: 5.2.4(webpack-cli@6.0.1)(webpack@3.8.1) + webpack-dev-server: 2.11.3(webpack@3.8.1) webpack-manifest-plugin: 1.3.2(webpack@3.8.1) whatwg-fetch: 2.0.3 optionalDependencies: @@ -53334,11 +53544,6 @@ snapshots: transitivePeerDependencies: - babel-core - babel-runtime - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-cli react-shallow-renderer@16.15.0(react@18.2.0): dependencies: @@ -53372,7 +53577,7 @@ snapshots: '@internationalized/number': 3.6.6 '@internationalized/string': 3.2.8 '@react-types/shared': 3.34.0(react@18.2.0) - '@swc/helpers': 0.5.21 + '@swc/helpers': 0.5.23 react: 18.2.0 use-sync-external-store: 1.6.0(react@18.2.0) @@ -53398,7 +53603,7 @@ snapshots: react-syntax-highlighter@13.5.3(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.30.0 @@ -53407,7 +53612,7 @@ snapshots: react-syntax-highlighter@15.6.1(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -53417,7 +53622,7 @@ snapshots: react-syntax-highlighter@15.6.1(react@19.1.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -53440,7 +53645,7 @@ snapshots: react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 react: 18.2.0 use-composed-ref: 1.4.0(@types/react@18.2.0)(react@18.2.0) use-latest: 1.3.0(@types/react@18.2.0)(react@18.2.0) @@ -53638,7 +53843,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 redux@5.0.1: {} @@ -53948,6 +54153,10 @@ snapshots: resolve-alpn@1.2.1: {} + resolve-cwd@2.0.0: + dependencies: + resolve-from: 3.0.0 + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -53957,6 +54166,8 @@ snapshots: expand-tilde: 2.0.2 global-modules: 1.0.0 + resolve-from@3.0.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -54096,7 +54307,7 @@ snapshots: rollup-plugin-terser@5.3.1(rollup@1.32.1): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 jest-worker: 24.9.0 rollup: 1.32.1 rollup-pluginutils: 2.8.2 @@ -54368,11 +54579,15 @@ snapshots: '@bazel/runfiles': 6.5.0 jszip: 3.10.1 tmp: 0.2.4 - ws: 8.20.1 + ws: 8.21.0 transitivePeerDependencies: - bufferutil - utf-8-validate + selfsigned@1.10.14: + dependencies: + node-forge: 0.10.0 + selfsigned@5.5.0: dependencies: '@peculiar/x509': 1.14.3 @@ -54654,6 +54869,11 @@ snapshots: json3: 3.3.3 url-parse: 1.5.10 + sockjs@0.3.19: + dependencies: + faye-websocket: 0.10.0 + uuid: 14.0.0 + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -54760,6 +54980,16 @@ snapshots: spdx-license-ids@3.0.23: {} + spdy-transport@2.1.1: + dependencies: + debug: 2.6.9 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + wbuf: 1.7.3 + spdy-transport@3.0.0: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -54771,6 +55001,15 @@ snapshots: transitivePeerDependencies: - supports-color + spdy@3.4.7: + dependencies: + debug: 2.6.9 + handle-thing: 1.2.5 + http-deceiver: 1.2.7 + safe-buffer: 5.2.1 + select-hose: 2.0.0 + spdy-transport: 2.1.1 + spdy@4.0.2: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -55422,7 +55661,7 @@ snapshots: swagger-client@3.37.4: dependencies: - '@babel/runtime-corejs3': 7.29.2 + '@babel/runtime-corejs3': 7.29.7 '@scarf/scarf': 1.4.0 '@swagger-api/apidom-core': 1.11.1 '@swagger-api/apidom-error': 1.11.1 @@ -55445,7 +55684,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.29.2 + '@babel/runtime-corejs3': 7.29.7 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -55486,7 +55725,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.29.2 + '@babel/runtime-corejs3': 7.29.7 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -55972,6 +56211,8 @@ snapshots: tiktoken@1.0.22: {} + time-stamp@2.2.0: {} + timed-out@4.0.1: {} timers-browserify@2.0.12: @@ -56226,7 +56467,7 @@ snapshots: babel-jest: 30.0.0(@babel/core@7.27.1) esbuild: 0.25.12 - ts-jest@29.4.1(@babel/core@7.29.0)(@jest/transform@30.1.2)(@jest/types@30.4.1)(babel-jest@30.1.2(@babel/core@7.29.0))(esbuild@0.25.12)(jest-util@30.4.1)(jest@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.1(@babel/core@7.29.7)(@jest/transform@30.1.2)(@jest/types@30.4.1)(babel-jest@30.1.2(@babel/core@7.29.7))(esbuild@0.25.12)(jest-util@30.4.1)(jest@30.1.3(@types/node@20.19.17)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -56240,10 +56481,10 @@ snapshots: typescript: 5.8.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@jest/transform': 30.1.2 '@jest/types': 30.4.1 - babel-jest: 30.1.2(@babel/core@7.29.0) + babel-jest: 30.1.2(@babel/core@7.29.7) esbuild: 0.25.12 jest-util: 30.4.1 @@ -56459,11 +56700,11 @@ snapshots: tsdx@0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.21)(jiti@2.7.0): dependencies: '@babel/core': 7.27.1 - '@babel/helper-module-imports': 7.28.6 - '@babel/parser': 7.29.3 + '@babel/helper-module-imports': 7.29.7 + '@babel/parser': 7.29.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.1) '@babel/preset-env': 7.27.2(@babel/core@7.27.1) - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.29.7 '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.1)(@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) @@ -56576,7 +56817,7 @@ snapshots: tslint@5.20.1(typescript@5.8.3): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -56593,7 +56834,7 @@ snapshots: tslint@6.1.3(typescript@4.2.4): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -56610,7 +56851,7 @@ snapshots: tslint@6.1.3(typescript@4.9.4): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -56627,7 +56868,7 @@ snapshots: tslint@6.1.3(typescript@5.8.3): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 @@ -57147,8 +57388,7 @@ snapshots: graceful-fs: 4.2.11 node-int64: 0.4.0 - upath@1.2.0: - optional: true + upath@1.2.0: {} upath@2.0.1: {} @@ -57311,7 +57551,7 @@ snapshots: is-arguments: 1.2.0 is-generator-function: 1.1.2 is-typed-array: 1.1.15 - which-typed-array: 1.1.20 + which-typed-array: 1.1.21 utila@0.4.0: {} @@ -57789,6 +58029,15 @@ snapshots: webpack: 5.104.1(webpack-cli@6.0.1) webpack-merge: 6.0.1 + webpack-dev-middleware@1.12.2(webpack@3.8.1): + dependencies: + memory-fs: 0.4.1 + mime: 1.6.0 + path-is-absolute: 1.0.1 + range-parser: 1.2.1 + time-stamp: 2.2.0 + webpack: 3.8.1 + webpack-dev-middleware@3.7.3(webpack@4.47.0(webpack-cli@4.10.0)): dependencies: memory-fs: 0.4.1 @@ -57856,17 +58105,6 @@ snapshots: optionalDependencies: webpack: 5.104.1(postcss@8.5.13)(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.5(webpack@3.8.1): - dependencies: - colorette: 2.0.20 - memfs: 4.57.2 - mime-types: 3.0.2 - on-finished: 2.4.1 - range-parser: 1.2.1 - schema-utils: 4.3.3 - optionalDependencies: - webpack: 3.8.1 - webpack-dev-middleware@7.4.5(webpack@5.104.1): dependencies: colorette: 2.0.20 @@ -57878,6 +58116,37 @@ snapshots: optionalDependencies: webpack: 5.104.1(postcss@8.5.13)(webpack-cli@5.1.4) + webpack-dev-server@2.11.3(webpack@3.8.1): + dependencies: + ansi-html: 0.0.7 + array-includes: 3.1.9 + bonjour: 3.5.1 + chokidar: 2.1.8 + compression: 1.8.1 + connect-history-api-fallback: 1.6.0 + debug: 3.2.7 + del: 3.0.0 + express: 4.22.1 + html-entities: 1.4.0 + http-proxy-middleware: 0.17.4(debug@3.2.7) + import-local: 1.0.0 + internal-ip: 1.2.0 + ip: 1.1.9 + killable: 1.0.1 + loglevel: 1.9.2 + opn: 5.5.0 + portfinder: 1.0.37(supports-color@5.5.0) + selfsigned: 1.10.14 + serve-index: 1.9.2 + sockjs: 0.3.19 + sockjs-client: 1.1.5 + spdy: 3.4.7 + strip-ansi: 3.0.1 + supports-color: 5.5.0 + webpack: 3.8.1 + webpack-dev-middleware: 1.12.2(webpack@3.8.1) + yargs: 6.6.0 + webpack-dev-server@5.2.4(webpack-cli@4.10.0)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 @@ -57907,7 +58176,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: webpack: 5.104.1(postcss@8.5.13)(webpack-cli@4.10.0) webpack-cli: 4.10.0(webpack-dev-server@5.2.4)(webpack@5.104.1) @@ -57947,7 +58216,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: webpack: 5.104.1(postcss@8.5.13)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-dev-server@5.2.4)(webpack@5.104.1) @@ -57957,45 +58226,6 @@ snapshots: - supports-color - utf-8-validate - webpack-dev-server@5.2.4(webpack-cli@6.0.1)(webpack@3.8.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.4.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.4.0 - launch-editor: 2.13.2 - 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 - webpack-dev-middleware: 7.4.5(webpack@3.8.1) - ws: 8.20.1 - optionalDependencies: - webpack: 3.8.1 - webpack-cli: 6.0.1(webpack-dev-server@5.2.4)(webpack@5.104.1) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - webpack-dev-server@5.2.4(webpack-cli@6.0.1)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 @@ -58025,7 +58255,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: webpack: 5.104.1(postcss@8.5.13)(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.4)(webpack@5.104.1) @@ -58064,7 +58294,7 @@ snapshots: sockjs: 0.3.24 spdy: 4.0.2 webpack-dev-middleware: 7.4.5(webpack@5.104.1) - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: webpack: 5.104.1(webpack-cli@5.1.4) transitivePeerDependencies: @@ -58750,7 +58980,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.21 which-collection@1.0.2: dependencies: @@ -58763,7 +58993,7 @@ snapshots: which-module@2.0.1: {} - which-typed-array@1.1.20: + which-typed-array@1.1.21: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -58904,7 +59134,7 @@ snapshots: ws@7.5.11: {} - ws@8.20.1: {} + ws@8.21.0: {} wsl-utils@0.1.0: dependencies: @@ -58988,6 +59218,10 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@4.2.1: + dependencies: + camelcase: 3.0.0 + yargs-parser@5.0.1: dependencies: camelcase: 3.0.0 @@ -59064,6 +59298,22 @@ snapshots: decamelize: 1.2.0 window-size: 0.1.0 + yargs@6.6.0: + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + y18n: 3.2.2 + yargs-parser: 4.2.1 + yargs@7.1.2: dependencies: camelcase: 3.0.0 diff --git a/package.json b/package.json index 1717692b596..c899e00402b 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "http-proxy": "1.18.1", "js-yaml": "4.1.1", "lodash": "4.18.0", + "qs": "6.15.2", "micromatch": "4.0.8", "minimatch": "3.1.5", "path-to-regexp": "0.1.13", @@ -27,8 +28,6 @@ "@nevware21/ts-utils": "0.14.0", "protobufjs": "7.5.8", "serialize-javascript": "7.0.5", - "webpack-dev-server": "5.2.4", - "ws": "8.20.1", "tmp": "0.2.4", "undici": "7.24.0", "uuid": "14.0.0", diff --git a/workspaces/api-designer/api-designer-visualizer/package.json b/workspaces/api-designer/api-designer-visualizer/package.json index 9aff47d33e6..dfc284a2ae9 100644 --- a/workspaces/api-designer/api-designer-visualizer/package.json +++ b/workspaces/api-designer/api-designer-visualizer/package.json @@ -46,7 +46,7 @@ "@storybook/react-webpack5": "8.6.14", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.3", + "webpack-dev-server": "5.2.4", "@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 20fa3d82fee..f2c52448d37 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.3" + "webpack-dev-server": "5.2.4" }, "repository": { "type": "git", diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index 419250e9536..2d81339ea35 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -107,7 +107,7 @@ "@types/react-lottie": "1.2.5", "@types/lodash.debounce": "4.0.6", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.3" + "webpack-dev-server": "5.2.4" }, "author": "wso2", "license": "UNLICENSED", diff --git a/workspaces/ballerina/persist-layer-diagram/package.json b/workspaces/ballerina/persist-layer-diagram/package.json index 9fbe019640c..072dc2a5fa1 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.3" + "webpack-dev-server": "5.2.4" }, "author": "wso2", "license": "UNLICENSED" diff --git a/workspaces/ballerina/trace-visualizer/package.json b/workspaces/ballerina/trace-visualizer/package.json index 44b9a6aad7f..e0a45f3bc98 100644 --- a/workspaces/ballerina/trace-visualizer/package.json +++ b/workspaces/ballerina/trace-visualizer/package.json @@ -40,7 +40,7 @@ "typescript": "5.8.3", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.3" + "webpack-dev-server": "5.2.4" }, "author": "wso2", "license": "UNLICENSED", diff --git a/workspaces/ballerina/type-diagram/package.json b/workspaces/ballerina/type-diagram/package.json index 10aa021cd04..b5a64a678c3 100644 --- a/workspaces/ballerina/type-diagram/package.json +++ b/workspaces/ballerina/type-diagram/package.json @@ -69,7 +69,7 @@ "ts-loader": "9.4.1", "webpack": "5.104.1", "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.3" + "webpack-dev-server": "5.2.4" }, "author": "wso2", "license": "UNLICENSED" diff --git a/workspaces/choreo/choreo-webviews/package.json b/workspaces/choreo/choreo-webviews/package.json index 35bd6648103..d31bbbc5f09 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.3", + "webpack-dev-server": "5.2.4", "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 a4a3e6c7000..04633c2c8de 100644 --- a/workspaces/mi/mi-visualizer/package.json +++ b/workspaces/mi/mi-visualizer/package.json @@ -71,7 +71,7 @@ "@storybook/react-webpack5": "8.6.14", "webpack": "5.104.1", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.2.3", + "webpack-dev-server": "5.2.4", "@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 80ef88166fd..7152fe0e995 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.3", + "webpack-dev-server": "5.2.4", "source-map-loader": "5.0.0", "postcss": "8.5.13", "postcss-loader" :"8.1.1", From 1df27f20a8e243c4ef8e08a44604efee8ea1b002 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Thu, 28 May 2026 10:28:49 +0530 Subject: [PATCH 005/114] Fix issues in the MI Extension --- workspaces/mi/mi-visualizer/src/MainPanel.tsx | 1 - .../src/views/Forms/RegistryResourceForm.tsx | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/MainPanel.tsx b/workspaces/mi/mi-visualizer/src/MainPanel.tsx index 8f96874c867..71ceccea68d 100644 --- a/workspaces/mi/mi-visualizer/src/MainPanel.tsx +++ b/workspaces/mi/mi-visualizer/src/MainPanel.tsx @@ -122,7 +122,6 @@ const MainPanel = (props: MainPanelProps) => { if (typeof formState === 'object' && 'open' in formState) { rpcClient?.getMiVisualizerRpcClient().openView({ type: POPUP_EVENT_TYPE.CLOSE_VIEW, location: { view: null }, isPopup: true }); } - fetchContext(); }, [visualizerState.view]); useEffect(() => { diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/RegistryResourceForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/RegistryResourceForm.tsx index 47fbe799a16..9b0d8084492 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/RegistryResourceForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/RegistryResourceForm.tsx @@ -42,6 +42,8 @@ const policyTypes = [{ value: "Username Token" }, { value: "Non-repudiation" }, { value: "Sign and Encrypt - X509 Authentication" }, { value: "Sign and Encrypt - Anonymous Clients" }, { value: "Encrypt Only - Username Token Authentication" }, { value: "Sign and Encrypt - Username Token Authentication" }]; +const PATH_SEPARATORS = ['/', '\\']; + const REGISTRY_ROOT_ALIASES = ['registry', '_system']; const REGISTRY_SUB_ROOT_ALIASES: Record<'gov' | 'conf', string[]> = { @@ -274,13 +276,13 @@ export function RegistryResourceForm(props: RegistryWizardProps) { const formatResourcePath = (resourceDirPath: string) => { let resPath = 'resources:'; - resPath = resourceDirPath.startsWith('/') ? resPath + resourceDirPath.substring(1) : resPath + resourceDirPath; + resPath = PATH_SEPARATORS.some(sep => resourceDirPath.startsWith(sep)) ? resPath + resourceDirPath.substring(1) : resPath + resourceDirPath; if (createOptionValue) { - resPath.endsWith('/') ? resPath = resPath + getValues("resourceName") + getFileExtension(getValues('templateType')) + PATH_SEPARATORS.some(sep => resPath.endsWith(sep)) ? resPath = resPath + getValues("resourceName") + getFileExtension(getValues('templateType')) : resPath = resPath + '/' + getValues("resourceName") + getFileExtension(getValues('templateType')); } else { - const filename = getValues("filePath").split('/').pop(); - resPath.endsWith('/') ? resPath = resPath + filename : resPath = resPath + '/' + filename; + const filename = getValues("filePath").split(/[/\\]/).pop(); + PATH_SEPARATORS.some(sep => resPath.endsWith(sep)) ? resPath = resPath + filename : resPath = resPath + '/' + filename; } return resPath; } @@ -292,13 +294,13 @@ export function RegistryResourceForm(props: RegistryWizardProps) { } else { regPath = 'conf:'; } - path.startsWith('/') ? regPath = regPath + path.substring(1) : regPath = regPath + path; + PATH_SEPARATORS.some(sep => path.startsWith(sep)) ? regPath = regPath + path.substring(1) : regPath = regPath + path; if (createOptionValue) { - regPath.endsWith('/') ? regPath = regPath + getValues("resourceName") + getFileExtension(getValues('templateType')) + PATH_SEPARATORS.some(sep => regPath.endsWith(sep)) ? regPath = regPath + getValues("resourceName") + getFileExtension(getValues('templateType')) : regPath = regPath + '/' + getValues("resourceName") + getFileExtension(getValues('templateType')); } else { - const filename = getValues("filePath").split('/').pop(); - regPath.endsWith('/') ? regPath = regPath + filename : regPath = regPath + '/' + filename; + const filename = getValues("filePath").split(/[/\\]/).pop(); + PATH_SEPARATORS.some(sep => regPath.endsWith(sep)) ? regPath = regPath + filename : regPath = regPath + '/' + filename; } return regPath; } From bc54f455aed206c90dc6d9ebb3a20f24a5c3912a Mon Sep 17 00:00:00 2001 From: Isuru Wijesiri Date: Thu, 28 May 2026 13:13:27 +0530 Subject: [PATCH 006/114] Add AGENTS.md support for project-level agent instructions Loads a root-level AGENTS.md (CLAUDE.md / Cursor convention) as a tracked context block. Re-injected only on content drift via the existing session-context hash system, so it does not waste tokens every turn. Files over 30 KB are truncated before being shipped to the model. The block carries an explicit truncation banner so the agent knows context is missing (and can file_read the tail on demand), and a persistent in-chat warning segment tells the user. Truncation warnings fire only when the block is actually being injected, so an unchanged large file does not re-warn each turn. --- .../mi-core/src/rpc-types/agent-mode/types.ts | 10 +- .../agent-mode/agents/main/agent.ts | 20 ++++ .../agent-mode/agents/main/prompt.ts | 108 ++++++++++++++++++ .../agent-mode/agents/main/system.ts | 6 + .../agent-mode/chat-history-manager.ts | 49 +++++++- .../rpc-managers/agent-mode/rpc-manager.ts | 1 + .../views/AIPanel/component/AIChatFooter.tsx | 17 +++ .../views/AIPanel/component/AIChatMessage.tsx | 3 + .../component/ContextWarningSegment.tsx | 60 ++++++++++ .../mi-visualizer/src/views/AIPanel/utils.ts | 7 +- .../AIPanel/utils/eventToMessageConverter.ts | 17 +++ 11 files changed, 295 insertions(+), 3 deletions(-) create mode 100644 workspaces/mi/mi-visualizer/src/views/AIPanel/component/ContextWarningSegment.tsx diff --git a/workspaces/mi/mi-core/src/rpc-types/agent-mode/types.ts b/workspaces/mi/mi-core/src/rpc-types/agent-mode/types.ts index 15d4edef5df..db908100acc 100644 --- a/workspaces/mi/mi-core/src/rpc-types/agent-mode/types.ts +++ b/workspaces/mi/mi-core/src/rpc-types/agent-mode/types.ts @@ -162,6 +162,8 @@ export type AgentEventType = | "plan_approval_requested" // Agent requesting approval for plan (exit_plan_mode) // Compact event | "compact" // Conversation was compacted (auto-summarized) + // Context warning event (e.g. AGENTS.md truncated to fit size limit) + | "context_warning" // Usage event | "usage"; // Token usage update (emitted per step) @@ -274,6 +276,8 @@ export interface AgentEvent { suggestedPrefixRule?: string[]; /** Summary text for compact event */ summary?: string; + /** Human-readable warning text for context_warning event (e.g. AGENTS.md truncated). */ + warningMessage?: string; // Usage fields (for usage event) /** Total input tokens (input + cached) for context usage tracking */ @@ -316,7 +320,7 @@ export interface PlanApprovalRequestedEvent extends AgentEvent { * Frontend will convert these to UI messages with inline tool call formatting */ export interface ChatHistoryEvent { - type: 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'compact_summary' | 'undo_checkpoint' | 'checkpoint_anchor'; + type: 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'compact_summary' | 'context_warning' | 'undo_checkpoint' | 'checkpoint_anchor'; /** Stable UI chat id for grouping a user turn and its assistant output */ chatId?: number; content?: string; @@ -333,6 +337,8 @@ export interface ChatHistoryEvent { checkpointAnchor?: CheckpointAnchorSummary; /** Assistant chat id this undo checkpoint should attach to during UI replay */ targetChatId?: number; + /** Warning message body for context_warning events (e.g. AGENTS.md truncated) */ + warningMessage?: string; timestamp: string; // Shell tool fields (for history display) @@ -441,6 +447,8 @@ export interface SessionContextBlocksState { modePolicy?: string; /** sha256-16 of the canonicalized preconfigured-payloads JSON */ payloads?: string; + /** sha256-16 of the (possibly truncated) AGENTS.md bytes + truncation banner inputs */ + agentsMd?: string; } /** diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts index 1d9c3354265..2c968cb6cc3 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts @@ -35,6 +35,7 @@ import { getLoginMethod, getTavilyApiKey } from '../../../auth'; import { getSystemPrompt } from '../main/system'; import { BlockInjectionStatus, + AGENTS_MD_MAX_BYTES, BlockInjectionStatuses, computeSessionContextBlockHashes, getUserPrompt, @@ -259,6 +260,7 @@ function buildUpdatedBlocksState( apply('webAvailability', statuses.webAvailability, current.webAvailability); apply('modePolicy', statuses.modePolicy, current.modePolicy); apply('payloads', statuses.payloads, current.payloads); + apply('agentsMd', statuses.agentsMd, current.agentsMd); return touched ? updated : undefined; } @@ -285,6 +287,7 @@ function logBlockInjectionDrift( note('webAvailability', statuses.webAvailability, previous.webAvailability, current.webAvailability); note('mode', statuses.modePolicy, previous.modePolicy, current.modePolicy); note('payloads', statuses.payloads, previous.payloads, current.payloads); + note('agentsMd', statuses.agentsMd, previous.agentsMd, current.agentsMd); if (driftedBlocks.length > 0) { logInfo(`[Agent] Session-context drift — re-injecting: ${driftedBlocks.join(', ')}`); } @@ -619,6 +622,7 @@ export async function executeAgent( webAvailability: decideBlockStatus(currentBlockHashes.webAvailability, previousBlocks.webAvailability, forceFirstInjection), modePolicy: decideBlockStatus(currentBlockHashes.modePolicy, previousBlocks.modePolicy, forceFirstInjection), payloads: decideBlockStatus(currentBlockHashes.payloads, previousBlocks.payloads, forceFirstInjection), + agentsMd: decideBlockStatus(currentBlockHashes.agentsMd, previousBlocks.agentsMd, forceFirstInjection), }; const previousMode = previousBlocks.modePolicy as AgentMode | undefined; @@ -692,6 +696,22 @@ export async function executeAgent( }); } + // Surface an AGENTS.md truncation warning to the user — only when the + // block is actually being injected this turn (not on quiet 'omit' turns + // where the model already has the same truncated content), so the + // warning isn't repeated every turn for an unchanged-but-large file. + const agentsMdInjected = blockStatuses.agentsMd === 'first-injection' + || blockStatuses.agentsMd === 're-injection'; + if (agentsMdInjected && sessionContextResult.snapshot.agentsMdTruncated) { + const originalKb = Math.round(sessionContextResult.snapshot.agentsMdOriginalSize / 1024); + const cappedKb = Math.round(AGENTS_MD_MAX_BYTES / 1024); + const warningMessage = `Your AGENTS.md is ${originalKb} KB; only the first ${cappedKb} KB is included in the model's context. Rules in the truncated portion will NOT be followed. Shorten the file or split sections out into prose to fit within ${cappedKb} KB.`; + if (request.chatHistoryManager) { + await request.chatHistoryManager.saveAgentsMdWarning(warningMessage); + } + emitEvent({ type: 'context_warning', warningMessage, content: warningMessage }); + } + // Track how many messages have been saved from step.response.messages // This counter tracks messages from the current turn only (not history) let savedMessageCount = 0; diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts index f9bb86bf455..430b3593d3b 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts @@ -33,6 +33,7 @@ import { getStateMachine } from '../../../../stateMachine'; const MAX_PROJECT_STRUCTURE_FILES = 50; const MAX_PROJECT_STRUCTURE_CHARS = 10000; +export const AGENTS_MD_MAX_BYTES = 30 * 1024; // ============================================================================ // User Prompt Template @@ -109,6 +110,12 @@ The user has opened the file {{currentlyOpenedFile}} in the IDE. This may or may {{/if}} +{{#if agents_md_block}} + +{{{agents_md_block}}} + +{{/if}} + {{#if runtime_version_detection_warning}} # Runtime Version Warning @@ -179,6 +186,7 @@ export interface BlockInjectionStatuses { /** Plan-only. For Ask/Edit, the full policy is always rendered regardless of this status. */ modePolicy: BlockInjectionStatus; payloads: BlockInjectionStatus; + agentsMd: BlockInjectionStatus; } /** @@ -467,6 +475,15 @@ export interface SessionContextSnapshot { * every turn. Empty array = no `.tryout/` folder or no payload files. */ tryoutPayloads: TryoutPayloadEntry[]; + /** + * Raw AGENTS.md content (already truncated to AGENTS_MD_MAX_BYTES when + * needed). `undefined` when no AGENTS.md exists at the project root. + */ + agentsMdContent: string | undefined; + /** True when AGENTS.md was larger than AGENTS_MD_MAX_BYTES and was cut. */ + agentsMdTruncated: boolean; + /** Original (untruncated) raw byte size of AGENTS.md, or 0 when absent. */ + agentsMdOriginalSize: number; } interface SessionContextWithCatalog { @@ -488,6 +505,8 @@ export interface SessionContextBlockHashes { webAvailability: string; modePolicy: AgentMode; payloads: string | undefined; + /** sha256-16 of full untruncated AGENTS.md raw bytes, or `undefined` when no AGENTS.md exists. */ + agentsMd: string | undefined; } /** @@ -548,6 +567,49 @@ function scanTryoutPayloads(projectPath: string): TryoutPayloadEntry[] { } } +/** + * Read `AGENTS.md` from the project root. Returns the raw content (truncated + * to `AGENTS_MD_MAX_BYTES` when oversized) along with the original byte size + * so the model and the user can both be told the file was cut. Returns + * `undefined` when the file is missing or unreadable — the block is then + * omitted entirely on the next turn (same shape as an empty `.tryout/`). + */ +function readAgentsMd(projectPath: string): { content: string; truncated: boolean; originalSize: number } | undefined { + const agentsMdPath = path.join(projectPath, 'AGENTS.md'); + if (!fs.existsSync(agentsMdPath)) { + return undefined; + } + try { + const stat = fs.statSync(agentsMdPath); + if (!stat.isFile()) { + return undefined; + } + const originalSize = stat.size; + if (originalSize <= AGENTS_MD_MAX_BYTES) { + const content = fs.readFileSync(agentsMdPath, 'utf8'); + return { content, truncated: false, originalSize }; + } + // Oversized — read only the first AGENTS_MD_MAX_BYTES bytes. Open as + // a file descriptor so we don't pull the whole file into memory just + // to slice it. + const fd = fs.openSync(agentsMdPath, 'r'); + try { + const buffer = Buffer.allocUnsafe(AGENTS_MD_MAX_BYTES); + const bytesRead = fs.readSync(fd, buffer, 0, AGENTS_MD_MAX_BYTES, 0); + const content = buffer.subarray(0, bytesRead).toString('utf8'); + return { content, truncated: true, originalSize }; + } finally { + fs.closeSync(fd); + } + } catch (error) { + logDebug( + `[Prompt] Failed to read AGENTS.md for project ${projectPath}: ` + + `${error instanceof Error ? error.message : String(error)}` + ); + return undefined; + } +} + async function buildSessionContextSnapshot(params: SessionContextParams): Promise { const isGitRepo = fs.existsSync(path.join(params.projectPath, '.git')); let gitBranch: string | null = null; @@ -572,6 +634,7 @@ async function buildSessionContextSnapshot(params: SessionContextParams): Promis const runtimeVersion = params.runtimeVersion ?? await getRuntimeVersionFromPom(params.projectPath); const runtimePaths = getRuntimePaths(params.projectPath); const catalog = await getAvailableConnectorCatalog(params.projectPath); + const agentsMd = readAgentsMd(params.projectPath); return { snapshot: { @@ -596,6 +659,9 @@ async function buildSessionContextSnapshot(params: SessionContextParams): Promis webSearchUnavailable: params.webSearchUnavailable === true, mode: params.mode || 'edit', tryoutPayloads: scanTryoutPayloads(params.projectPath), + agentsMdContent: agentsMd?.content, + agentsMdTruncated: agentsMd?.truncated ?? false, + agentsMdOriginalSize: agentsMd?.originalSize ?? 0, }, catalogWarnings: catalog.warnings, catalogStoreStatus: catalog.storeStatus, @@ -639,6 +705,19 @@ function deriveBlockHashes(snapshot: SessionContextSnapshot): SessionContextBloc // `undefined` when the folder is empty so 'cleared' fires correctly // when the user wipes all saved payloads. payloads: snapshot.tryoutPayloads.length > 0 ? hashJson(snapshot.tryoutPayloads) : undefined, + // Hash over what we actually surface to the model: the (possibly + // truncated) bytes plus the truncation banner inputs. Edits inside the + // truncated tail are intentionally invisible — if the bytes we ship + // and the banner are unchanged, the model has no new information to + // see. `undefined` when no AGENTS.md exists so 'cleared' fires when + // the user deletes it. + agentsMd: snapshot.agentsMdContent !== undefined + ? hashJson({ + content: snapshot.agentsMdContent, + truncated: snapshot.agentsMdTruncated, + originalSize: snapshot.agentsMdOriginalSize, + }) + : undefined, }; } @@ -686,6 +765,7 @@ const DEFAULT_BLOCK_STATUSES: BlockInjectionStatuses = { webAvailability: 'first-injection', modePolicy: 'first-injection', payloads: 'first-injection', + agentsMd: 'first-injection', }; function buildEnvBlockText(snapshot: SessionContextSnapshot, status: BlockInjectionStatus): string | undefined { @@ -804,6 +884,32 @@ The user has saved sample request payloads in .tryout/ (one file per artifact). ${list}`; } +/** + * Render the AGENTS.md block. The user authors `AGENTS.md` at the project + * root to pin custom project-level instructions (analogous to CLAUDE.md for + * Claude Code). Treat its contents as user-authored guidance that augments + * and (on conflict) overrides the system prompt defaults. When the file is + * too large to ship verbatim we cut it at AGENTS_MD_MAX_BYTES and tell the + * model the rest is missing so it doesn't claim to follow rules it never saw. + */ +function buildAgentsMdBlockText(snapshot: SessionContextSnapshot, status: BlockInjectionStatus): string | undefined { + if (status === 'cleared') { + return `# Project AGENTS.md [removed] +The user has deleted AGENTS.md. Discard any prior project-level instructions sourced from it.`; + } + if (status === 'omit' || snapshot.agentsMdContent === undefined) { + return undefined; + } + const headerSuffix = status === 're-injection' ? ` ${CONTEXT_UPDATED}` : ''; + const truncationFooter = snapshot.agentsMdTruncated + ? `\n\n[file truncated — original size: ${Math.round(snapshot.agentsMdOriginalSize / 1024)} KB, showing first ${Math.round(AGENTS_MD_MAX_BYTES / 1024)} KB. Inform the user that their AGENTS.md exceeds the size limit and any rules beyond this point are NOT in your context.]` + : ''; + return `# Project AGENTS.md${headerSuffix} +The user has provided custom project-level instructions at AGENTS.md (project root). Follow these in addition to the system prompt; on conflict, these take precedence. + +${snapshot.agentsMdContent}${truncationFooter}`; +} + // ============================================================================ // User Prompt Generation // ============================================================================ @@ -864,6 +970,7 @@ export async function getUserPrompt(params: UserPromptParams): Promise `- ${name}: $ - Read on demand only when reasoning about runtime inputs (body/header/query/path field names, expression mapping). Otherwise ignore. - Format: APIs nest requests under \`"/"\` keys; other artifacts are flat. Pick the request whose \`name\` equals \`defaultRequest\`. +## Project AGENTS.md +- If a \`\` titled \`# Project AGENTS.md\` is present in this turn or any prior turn, treat its contents as user-authored project-level instructions that augment this system prompt and override defaults where they conflict. +- AGENTS.md content is re-sent only when it changes; an absent reminder means either no \`AGENTS.md\` exists at the project root, or its content is unchanged since the last time it was injected — assume the prior content is still in effect. +- If the reminder ends with a \`[file truncated — ...]\` notice, rules beyond the cut are NOT in your persistent context. When a user request plausibly depends on rules past the cut, read \`AGENTS.md\` on demand with ${FILE_READ_TOOL_NAME} (use \`offset\` to start at the truncated tail so you don't re-fetch what's already in the reminder). Do not pre-fetch — only read when the task actually needs it. Also tell the user once that AGENTS.md exceeds the in-context size limit and ask them to shorten the file or split rules out so the full set stays in context every turn. + ## Connectors and inbound endpoints (${CONNECTOR_TOOL_NAME}, ${MANAGE_CONNECTOR_TOOL_NAME}) - Workflow: mode='summary' to learn operations / init style → mode='details' for the specific ops/connections you will actually use → write XML → ${MANAGE_CONNECTOR_TOOL_NAME} to add the artifact to the project. - Bundled inbound ids (http, jms, ...) skip ${MANAGE_CONNECTOR_TOOL_NAME} — reference them straight from Synapse XML. diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/chat-history-manager.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/chat-history-manager.ts index 8512df3915d..cc564d7bc4f 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/chat-history-manager.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/chat-history-manager.ts @@ -78,6 +78,8 @@ export interface SessionContextBlocksState { /** Verbatim mode name (`"ask" | "edit" | "plan"`) for "[mode changed from EDIT]" notices. */ modePolicy?: string; payloads?: string; + /** sha256-16 of the (possibly truncated) AGENTS.md bytes + truncation banner inputs */ + agentsMd?: string; } export const TOOL_USE_INTERRUPTION_CONTEXT = `The user interrupted while a tool was running. The tool use was rejected and any pending mutations were NOT applied. Stop immediately and wait for the user's next message.`; @@ -127,6 +129,7 @@ export interface JournalEntry { | 'session_start' | 'session_end' | 'compact_summary' + | 'context_warning' | 'mode_change' | 'undo_checkpoint' | 'checkpoint_anchor' @@ -148,6 +151,8 @@ export interface JournalEntry { }; /** Summary content (compact_summary) */ summary?: string; + /** Warning message body (context_warning) */ + warningMessage?: string; /** Mode value (mode_change) */ mode?: AgentMode; /** Undo checkpoint summary (undo_checkpoint) */ @@ -736,6 +741,28 @@ export class ChatHistoryManager { } } + /** + * Save an AGENTS.md truncation warning entry to history. Rendered on + * reload as a synthetic assistant-side message with an `` + * tag so the warning persists across panel reconnects. + */ + async saveAgentsMdWarning(warningMessage: string): Promise { + const entry: JournalEntry = { + type: 'context_warning', + timestamp: new Date().toISOString(), + sessionId: this.sessionId, + warningMessage, + }; + + try { + await this.writeEntry(entry); + logInfo(`[ChatHistory] Saved AGENTS.md truncation warning (${warningMessage.length} chars)`); + } catch (error) { + logError('[ChatHistory] Failed to save AGENTS.md warning', error); + throw error; + } + } + /** * Save a mode change entry to history */ @@ -936,6 +963,7 @@ export class ChatHistoryManager { includeCompactSummaryEntry?: boolean; includeUndoCheckpointEntry?: boolean; includeCheckpointAnchorEntry?: boolean; + includeContextWarningEntry?: boolean; }): Promise { // Sanitize tool-result / text content blocks on load. Older sessions // may have persisted raw control bytes (e.g. ANSI codes from a Maven @@ -981,6 +1009,7 @@ export class ChatHistoryManager { const includeCompactSummaryEntry = options?.includeCompactSummaryEntry === true; const includeUndoCheckpointEntry = options?.includeUndoCheckpointEntry === true; const includeCheckpointAnchorEntry = options?.includeCheckpointAnchorEntry === true; + const includeContextWarningEntry = options?.includeContextWarningEntry === true; const content = await fs.readFile(this.sessionFile, 'utf8'); const allEntries = this.parseJournalEntries(content, 'loading messages'); @@ -1037,6 +1066,8 @@ export class ChatHistoryManager { messages.push(entry); } else if (includeCheckpointAnchorEntry && entry.type === 'checkpoint_anchor') { messages.push(entry); + } else if (includeContextWarningEntry && entry.type === 'context_warning') { + messages.push(entry); } } @@ -1066,6 +1097,8 @@ export class ChatHistoryManager { messages.push(entry); } else if (includeCheckpointAnchorEntry && entry.type === 'checkpoint_anchor') { messages.push(entry); + } else if (includeContextWarningEntry && entry.type === 'context_warning') { + messages.push(entry); } } return messages; @@ -1483,7 +1516,7 @@ export class ChatHistoryManager { * @returns UI events for display */ static convertToEventFormat(messages: any[]): Array<{ - type: 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'compact_summary' | 'undo_checkpoint' | 'checkpoint_anchor'; + type: 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'compact_summary' | 'context_warning' | 'undo_checkpoint' | 'checkpoint_anchor'; chatId?: number; content?: string; files?: Array<{ name: string; mimetype: string; content: string }>; @@ -1496,6 +1529,7 @@ export class ChatHistoryManager { undoCheckpoint?: UndoCheckpointSummary; checkpointAnchor?: CheckpointAnchorSummary; targetChatId?: number; + warningMessage?: string; timestamp: string; }> { const events: any[] = []; @@ -1515,6 +1549,19 @@ export class ChatHistoryManager { continue; } + // Handle context_warning entries (e.g. AGENTS.md truncation). Rendered + // on reload as a standalone synthetic assistant message so the warning + // persists across panel reconnects (mirrors compact_summary). + if (msg.type === 'context_warning') { + events.push({ + type: 'context_warning', + warningMessage: msg.warningMessage, + content: msg.warningMessage, + timestamp: msg.timestamp || timestamp, + }); + continue; + } + if (msg.type === 'undo_checkpoint') { if (msg.undoCheckpoint) { events.push({ diff --git a/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts index 4546f6f094a..a6c23d51566 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/agent-mode/rpc-manager.ts @@ -494,6 +494,7 @@ export class MIAgentPanelRpcManager implements MIAgentPanelAPI { includeCompactSummaryEntry: true, includeUndoCheckpointEntry: true, includeCheckpointAnchorEntry: true, + includeContextWarningEntry: true, }); const events = ChatHistoryManager.convertToEventFormat(messages); const normalizedEvents = this.applyLatestUndoAvailabilityToEvents(events); diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx index 8a7e9c87b01..1191ff29edd 100644 --- a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx @@ -809,6 +809,23 @@ const AIChatFooter: React.FC = ({ isUsageExceeded = false }) } break; + case "context_warning": { + // AGENTS.md (or similar) was truncated. Show as a standalone synthetic + // assistant message so the warning renders even before the model starts + // streaming text for this turn. Persisted to JSONL by the extension so + // it also reappears on reload via the converter. + const warningText = (event as any).warningMessage || event.content || ''; + if (warningText) { + setMessages((prev) => [...prev, { + id: generateId(), + role: Role.MICopilot, + content: `${warningText}`, + type: MessageType.AssistantMessage, + }]); + } + break; + } + case "usage": // Update context usage via shared context state if (event.totalInputTokens !== undefined) { diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatMessage.tsx b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatMessage.tsx index 84f7b487b1f..11ca2b62058 100644 --- a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatMessage.tsx +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatMessage.tsx @@ -38,6 +38,7 @@ import ToolCallSegment from "./ToolCallSegment"; import TodoListSegment from "./TodoListSegment"; import BashOutputSegment from "./BashOutputSegment"; import CompactSummarySegment from "./CompactSummarySegment"; +import ContextWarningSegment from "./ContextWarningSegment"; import ThinkingSegment from "./ThinkingSegment"; import ErrorSegment from "./ErrorSegment"; @@ -340,6 +341,8 @@ const AIChatMessage: React.FC = ({ message, index }) => { } } else if (segment.isCompactSummary) { return ; + } else if (segment.isContextWarning) { + return ; } else if (segment.isFileChanges) { return null; } else if (segment.isPlan) { diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/ContextWarningSegment.tsx b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/ContextWarningSegment.tsx new file mode 100644 index 00000000000..292323adbaa --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/ContextWarningSegment.tsx @@ -0,0 +1,60 @@ +/** + * 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"; + +const WarningContainer = styled.div` + margin: 6px 0; + padding: 8px 10px; + border-left: 3px solid var(--vscode-inputValidation-warningBorder, var(--vscode-editorWarning-foreground, #f1c40f)); + background: var(--vscode-inputValidation-warningBackground, transparent); + color: var(--vscode-inputValidation-warningForeground, var(--vscode-foreground)); + font-size: 12px; + line-height: 1.45; + border-radius: 2px; +`; + +const WarningHeader = styled.div` + display: flex; + align-items: center; + gap: 6px; + font-weight: 500; + margin-bottom: 4px; +`; + +const WarningBody = styled.div` + overflow-wrap: anywhere; + white-space: pre-wrap; +`; + +interface ContextWarningSegmentProps { + text: string; +} + +const ContextWarningSegment: React.FC = ({ text }) => ( + + + + AGENTS.md truncated + + {text} + +); + +export default ContextWarningSegment; diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/utils.ts b/workspaces/mi/mi-visualizer/src/views/AIPanel/utils.ts index eb873041512..fa17be622bb 100644 --- a/workspaces/mi/mi-visualizer/src/views/AIPanel/utils.ts +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/utils.ts @@ -97,6 +97,7 @@ interface ContentSegment { isTodoList?: boolean; isBashOutput?: boolean; isCompactSummary?: boolean; + isContextWarning?: boolean; isFileChanges?: boolean; isPlan?: boolean; isThinking?: boolean; @@ -121,7 +122,7 @@ export function splitContent(content: string): ContentSegment[] { // opening fence's \n already sits right before the closer, so we fall back // to a `(?<=\n)` lookbehind (which doesn't consume) — otherwise `\`\`\`\n\`\`\`` // wouldn't match at all. - const regex = /```(\w*)\n([\s\S]*?)(?:\r?\n|(?<=\n))```(?=\r?\n|$)|]*)>([^<]*?)<\/toolcall>|([\s\S]*?)<\/todolist>|]*)?>([\s\S]*?)<\/bashoutput>|([\s\S]*?)<\/compact>|([\s\S]*?)<\/filechanges>|([\s\S]*?)<\/plan>|]*)?>([\s\S]*?)<\/thinking>/g; + const regex = /```(\w*)\n([\s\S]*?)(?:\r?\n|(?<=\n))```(?=\r?\n|$)|]*)>([^<]*?)<\/toolcall>|([\s\S]*?)<\/todolist>|]*)?>([\s\S]*?)<\/bashoutput>|([\s\S]*?)<\/compact>|([\s\S]*?)<\/filechanges>|([\s\S]*?)<\/plan>|]*)?>([\s\S]*?)<\/thinking>|([\s\S]*?)<\/agents-md-warning>/g; let start = 0; // Helper function to mark the last toolcall segment as complete @@ -183,6 +184,10 @@ export function splitContent(content: string): ContentSegment[] { const thinkingAttrs = match[10] || ''; const isLoading = /data-loading="true"/.test(thinkingAttrs); segments.push({ isThinking: true, loading: isLoading, text: match[11] }); + } else if (match[12] !== undefined) { + // block matched + updateLastToolCallSegmentLoading(); + segments.push({ isContextWarning: true, loading: false, text: match[12] }); } start = regex.lastIndex; } diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts b/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts index 24ec336f6c6..ef6faa5710b 100644 --- a/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts @@ -343,6 +343,23 @@ export function convertEventsToMessages( }); break; + case 'context_warning': + // Flush any pending assistant message and emit a standalone synthetic + // message wrapping . Parsed by splitContent and + // rendered by ContextWarningSegment (mirrors the compact_summary path). + if (currentAssistantMessage) { + messages.push(currentAssistantMessage); + currentAssistantMessage = null; + } + activeChatId = undefined; + messages.push({ + id: generateId(), + role: Role.MICopilot, + content: `${(event as any).warningMessage || event.content || ''}`, + type: MessageType.AssistantMessage, + }); + break; + case 'undo_checkpoint': { // Undo checkpoint entries from history/stream are ignored. // Review card state is ephemeral and managed from live stop events only. From 399793452ffb8a73ee232a67e2ba6f7fdcf1cdd3 Mon Sep 17 00:00:00 2001 From: Isuru Wijesiri Date: Thu, 28 May 2026 13:41:19 +0530 Subject: [PATCH 007/114] Address AGENTS.md review feedback - agent.ts: make `saveAgentsMdWarning` failure non-fatal. The live event still fires so the user sees the warning this turn; only the JSONL replay across reconnects is sacrificed on persistence failure. - prompt.ts: neutralize embedded `` / `` tags in user-authored AGENTS.md so they can't break out of the surrounding envelope. Replaces the angle brackets with U+27E8 / U+27E9. - prompt.ts: fix the `SessionContextBlockHashes.agentsMd` doc comment to describe what the code actually hashes (surfaced bytes + truncation metadata) instead of the old "full untruncated raw bytes" claim. - AIChatFooter.tsx: splice the warning before the optimistic streaming placeholder. Appending at the end displaced the placeholder, causing subsequent content_block / thinking_* events to land in the warning bubble instead of the assistant message. - eventToMessageConverter.ts: drop `(event as any)` cast now that `warningMessage` is a typed field on AgentEvent / ChatHistoryEvent. --- .../agent-mode/agents/main/agent.ts | 12 +++++++++- .../agent-mode/agents/main/prompt.ts | 24 +++++++++++++++++-- .../views/AIPanel/component/AIChatFooter.tsx | 22 ++++++++++++++--- .../AIPanel/utils/eventToMessageConverter.ts | 2 +- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts index 2c968cb6cc3..123a19f4f7c 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/agent.ts @@ -706,8 +706,18 @@ export async function executeAgent( const originalKb = Math.round(sessionContextResult.snapshot.agentsMdOriginalSize / 1024); const cappedKb = Math.round(AGENTS_MD_MAX_BYTES / 1024); const warningMessage = `Your AGENTS.md is ${originalKb} KB; only the first ${cappedKb} KB is included in the model's context. Rules in the truncated portion will NOT be followed. Shorten the file or split sections out into prose to fit within ${cappedKb} KB.`; + // Persistence is a non-fatal side-effect — a JSONL write failure + // must not abort the agent run. The warning is purely informational + // (the truncation banner inside the prompt block tells the model + // separately), so on persistence failure we still emit the live + // event so the user sees it this turn; only the cross-reconnect + // replay is sacrificed. if (request.chatHistoryManager) { - await request.chatHistoryManager.saveAgentsMdWarning(warningMessage); + try { + await request.chatHistoryManager.saveAgentsMdWarning(warningMessage); + } catch (error) { + logError('[Agent] Failed to persist AGENTS.md warning to history', error); + } } emitEvent({ type: 'context_warning', warningMessage, content: warningMessage }); } diff --git a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts index 430b3593d3b..b947ee380b0 100644 --- a/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts +++ b/workspaces/mi/mi-extension/src/ai-features/agent-mode/agents/main/prompt.ts @@ -505,7 +505,13 @@ export interface SessionContextBlockHashes { webAvailability: string; modePolicy: AgentMode; payloads: string | undefined; - /** sha256-16 of full untruncated AGENTS.md raw bytes, or `undefined` when no AGENTS.md exists. */ + /** + * sha256-16 over the bytes we actually surface to the model (i.e. the + * possibly truncated AGENTS.md content) combined with the truncation + * metadata (`truncated`, `originalSize`). `undefined` when no AGENTS.md + * exists at the project root, which is what drives the `cleared` notice + * on deletion. + */ agentsMd: string | undefined; } @@ -884,6 +890,19 @@ The user has saved sample request payloads in .tryout/ (one file per artifact). ${list}`; } +/** + * Neutralize prompt-envelope tags embedded inside user-authored content + * (AGENTS.md) so a malicious or accidental `` or + * `` can't break out of the surrounding wrapper. Replaces the + * angle brackets of those specific tag sequences with mathematical-angle + * lookalikes (U+27E8 / U+27E9): visually obvious to humans, the model can + * still read the surrounding text fine, but the regex/parser our envelope + * relies on no longer matches. + */ +function neutralizePromptEnvelopeTags(content: string): string { + return content.replace(/<(\/?)(system-reminder|user_query)>/g, '⟨$1$2⟩'); +} + /** * Render the AGENTS.md block. The user authors `AGENTS.md` at the project * root to pin custom project-level instructions (analogous to CLAUDE.md for @@ -904,10 +923,11 @@ The user has deleted AGENTS.md. Discard any prior project-level instructions sou const truncationFooter = snapshot.agentsMdTruncated ? `\n\n[file truncated — original size: ${Math.round(snapshot.agentsMdOriginalSize / 1024)} KB, showing first ${Math.round(AGENTS_MD_MAX_BYTES / 1024)} KB. Inform the user that their AGENTS.md exceeds the size limit and any rules beyond this point are NOT in your context.]` : ''; + const safeContent = neutralizePromptEnvelopeTags(snapshot.agentsMdContent); return `# Project AGENTS.md${headerSuffix} The user has provided custom project-level instructions at AGENTS.md (project root). Follow these in addition to the system prompt; on conflict, these take precedence. -${snapshot.agentsMdContent}${truncationFooter}`; +${safeContent}${truncationFooter}`; } // ============================================================================ diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx index 1191ff29edd..3cb13fe0162 100644 --- a/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/component/AIChatFooter.tsx @@ -814,14 +814,30 @@ const AIChatFooter: React.FC = ({ isUsageExceeded = false }) // assistant message so the warning renders even before the model starts // streaming text for this turn. Persisted to JSONL by the extension so // it also reappears on reload via the converter. - const warningText = (event as any).warningMessage || event.content || ''; + const warningText = event.warningMessage || event.content || ''; if (warningText) { - setMessages((prev) => [...prev, { + const warningMsg: ChatMessage = { id: generateId(), role: Role.MICopilot, content: `${warningText}`, type: MessageType.AssistantMessage, - }]); + }; + // sendAgentMessage optimistically appends an empty assistant + // placeholder before the stream starts, and content_block / + // thinking_* events target that placeholder via + // updateLastMessage. If we append the warning at the end we'd + // displace the placeholder and subsequent stream updates would + // land on the warning bubble instead. Splice the warning + // just before the active placeholder so the placeholder stays + // last and remains the streaming target. + setMessages((prev) => { + if (prev.length > 0 + && prev[prev.length - 1].role === Role.MICopilot + && backendRequestTriggeredRef.current) { + return [...prev.slice(0, -1), warningMsg, prev[prev.length - 1]]; + } + return [...prev, warningMsg]; + }); } break; } diff --git a/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts b/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts index ef6faa5710b..7a0765cea33 100644 --- a/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts +++ b/workspaces/mi/mi-visualizer/src/views/AIPanel/utils/eventToMessageConverter.ts @@ -355,7 +355,7 @@ export function convertEventsToMessages( messages.push({ id: generateId(), role: Role.MICopilot, - content: `${(event as any).warningMessage || event.content || ''}`, + content: `${event.warningMessage || event.content || ''}`, type: MessageType.AssistantMessage, }); break; From 09bc3d55238b13ea5f33c6a8492b61e98e3ae6eb Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Fri, 29 May 2026 10:31:52 +0530 Subject: [PATCH 008/114] Support the startOnLoad attribute for tasks in MI 4.1.0 --- .../mi-core/src/rpc-types/mi-diagram/types.ts | 2 ++ .../rpc-managers/mi-diagram/rpc-manager.ts | 4 +++- .../mustach-templates/tasks.ts | 3 ++- .../mi/mi-visualizer/src/constants/index.ts | 1 + .../src/views/Forms/TaskForm.tsx | 23 ++++++++++++++++++- 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts index 32123920c5d..dd3e64c905a 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts @@ -947,6 +947,7 @@ export interface CreateTaskRequest { taskProperties: taskProperty[]; customProperties: any[]; sequence: CreateSequenceRequest | undefined; + startOnLoad?: string; } export interface taskProperty { @@ -973,6 +974,7 @@ export interface GetTaskResponse { triggerInterval: number; triggerCron: string; taskProperties: taskProperty[]; + startOnLoad?: string; } export interface CreateTemplateRequest { diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts index 753520615ce..3b528a1ccc1 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts @@ -1798,7 +1798,9 @@ ${endpointAttributes} triggerCount: null, triggerInterval: 1, triggerCron: '', - taskProperties: [] + taskProperties: [], + startOnLoad: jsonData.task["@_"]["startOnLoad"] !== undefined ? + String(jsonData.task["@_"]["startOnLoad"]) : undefined }; if (jsonData.task.trigger["@_"]["once"] !== undefined) { diff --git a/workspaces/mi/mi-extension/src/util/template-engine/mustach-templates/tasks.ts b/workspaces/mi/mi-extension/src/util/template-engine/mustach-templates/tasks.ts index da63517d06b..4f45d1ce6e3 100644 --- a/workspaces/mi/mi-extension/src/util/template-engine/mustach-templates/tasks.ts +++ b/workspaces/mi/mi-extension/src/util/template-engine/mustach-templates/tasks.ts @@ -34,11 +34,12 @@ export interface GetTaskTemplatesArgs { triggerCron: string; taskProperties: Property[]; customProperties: any[]; + startOnLoad?: string; } export function getTaskMustacheTemplate() { return ` - + {{#taskProperties}} {{#key}} diff --git a/workspaces/mi/mi-visualizer/src/constants/index.ts b/workspaces/mi/mi-visualizer/src/constants/index.ts index 2ffb134030e..e95073fd8ee 100644 --- a/workspaces/mi/mi-visualizer/src/constants/index.ts +++ b/workspaces/mi/mi-visualizer/src/constants/index.ts @@ -130,6 +130,7 @@ export enum InboundEndpointTypes { export const connectorFailoverIconUrl = "https://mi-connectors.wso2.com/icons/wordpress.gif"; export const RUNTIME_VERSION_440 = "4.4.0"; +export const RUNTIME_VERSION_410 = "4.1.0"; export const DATASOURCE = { TYPE: { diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/TaskForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/TaskForm.tsx index 9c40cce1b14..de6bff59c02 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/TaskForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/TaskForm.tsx @@ -32,6 +32,8 @@ import { XMLValidator } from "fast-xml-parser"; import cronValidator from 'cron-expression-validator'; import path from "path"; import { SequenceWizard } from "./SequenceForm"; +import { compareVersions } from "@wso2/mi-diagram/lib/utils/commons"; +import { RUNTIME_VERSION_410 } from "../../constants"; export interface Region { label: string; value: string; @@ -108,6 +110,9 @@ export function TaskForm(props: TaskFormProps) { text: "" }); const [isCustomPropsUpdated, setIsCustomPropsUpdated] = useState(false); + const [startOnLoad, setStartOnLoad] = useState(true); + const [isStartOnLoadUpdated, setIsStartOnLoadUpdated] = useState(false); + const [isStartOnLoadSupported, setIsStartOnLoadSupported] = useState(false); const paramConfigs: ParamConfig = { paramValues: [], @@ -209,6 +214,7 @@ export function TaskForm(props: TaskFormProps) { if (taskRes.taskProperties) { setValue("message", taskRes.taskProperties.find((prop: any) => prop.key === "message")?.value); setMessageIsXML(!taskRes.taskProperties.find((prop: any) => prop.key === "message")?.isLiteral); + setStartOnLoad(taskRes.startOnLoad !== "false"); setValue("injectTo", taskRes.taskProperties.find((prop: any) => prop.key === "injectTo")?.value); setValue("registryKey", taskRes.taskProperties.find((prop: any) => prop.key === "registryKey")?.value); setValue("invokeHandlers", Boolean(taskRes.taskProperties.find((prop: any) => prop.key === "invokeHandlers")?.value)); @@ -258,6 +264,9 @@ export function TaskForm(props: TaskFormProps) { path: props.path, }); setArtifactNames(regArtifactRes.artifacts.map(name => name.toLowerCase())); + const projectDetails = await rpcClient.getMiVisualizerRpcClient().getProjectDetails(); + const runtimeVersion = projectDetails.primaryDetails.runtimeVersion.value; + setIsStartOnLoadSupported(compareVersions(runtimeVersion, RUNTIME_VERSION_410) === 0); })(); }, []); @@ -296,6 +305,7 @@ export function TaskForm(props: TaskFormProps) { ...values, taskProperties: taskProperties, customProperties: customProperties, + startOnLoad: isStartOnLoadSupported ? String(startOnLoad) : undefined, directory: props.path }; // Hanlde the case where user do not secify a sequence @@ -540,6 +550,17 @@ export function TaskForm(props: TaskFormProps) { errorMsg={errors.implementation?.message} {...register("implementation")} /> + {isStartOnLoadSupported && ( + { + setStartOnLoad(isChecked); + setIsStartOnLoadUpdated(true); + }} + /> + )} + + + + + )} + + { setShowAddAPIDialog(false); setSelectedAPIForTool(''); }} + /> + + setShowAddSeqDialog(false)} + /> + + setShowCreateScratchDialog(false)} + /> + + + ); +} + +export default MCPServerToolsForm; diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/exports.ts b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/exports.ts new file mode 100644 index 00000000000..2d87bb2a2fa --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/exports.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export { default as MCPServerWizard } from './index'; +export { default as MCPServerToolsForm } from './MCPServerToolsForm'; +export { default as AddAPIToolDialog } from './AddAPIToolDialog'; +export { default as AddSequenceToolDialog } from './AddSequenceToolDialog'; +export { default as CreateScratchToolDialog } from './CreateScratchToolDialog'; +export type { UnifiedTool, APITool, SequenceTool, API, Sequence, APIOperation } from '@wso2/mi-core'; diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx new file mode 100644 index 00000000000..d2bd2bd95e1 --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx @@ -0,0 +1,355 @@ +/** + * 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, useEffect } from 'react'; +import styled from '@emotion/styled'; +import { TextField, Button, FormView, FormActions } from '@wso2/ui-toolkit'; +import { useForm, useWatch } from 'react-hook-form'; +import * as yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { MACHINE_VIEW, EVENT_TYPE } from '@wso2/mi-core'; +import { useVisualizerContext } from '@wso2/mi-rpc-client'; +import * as pathModule from 'path'; +import { getUsedInboundPorts } from './utils'; + +const CORS_ALLOW_ORIGIN_VALUE = '*'; +const CORS_ALLOW_METHODS_VALUE = 'GET, POST, OPTIONS'; +const CORS_ALLOW_HEADERS_VALUE = 'Content-Type, Mcp-Session-Id'; +const CORS_EXPOSE_HEADERS_VALUE = 'Mcp-Session-Id'; +const SSE_KEEPALIVE_INTERVAL_MS = 30000; + +// localStorage keys for CORS settings +const CORS_STORAGE_PREFIX = 'mcp_server_cors_'; +const CORS_ALLOW_ORIGIN_KEY = `${CORS_STORAGE_PREFIX}allow_origin`; +const CORS_ALLOW_METHODS_KEY = `${CORS_STORAGE_PREFIX}allow_methods`; +const CORS_ALLOW_HEADERS_KEY = `${CORS_STORAGE_PREFIX}allow_headers`; +const CORS_EXPOSE_HEADERS_KEY = `${CORS_STORAGE_PREFIX}expose_headers`; +const SSE_KEEPALIVE_INTERVAL_KEY = `${CORS_STORAGE_PREFIX}keepalive_interval`; + +const ErrorMessage = styled.div` + color: var(--vscode-inputValidation-errorBorder); + padding: 10px; + border: 1px solid var(--vscode-inputValidation-errorBorder); + border-radius: 4px; + background: var(--vscode-inputValidation-errorBackground); + font-size: 12px; +`; + +const AdvancedSection = styled.div` + margin-top: 20px; + padding: 15px; + border: 1px solid var(--vscode-editorGroup-border); + border-radius: 4px; + background: var(--vscode-editor-background); +`; + +const SectionTitle = styled.h3` + margin: 0 0 15px 0; + font-size: 13px; + font-weight: 600; + color: var(--vscode-foreground); + cursor: pointer; + display: flex; + align-items: center; + user-select: none; + + &:hover { + color: var(--vscode-focusBorder); + } +`; + +const ToggleIcon = styled.span<{ isExpanded: boolean }>` + margin-right: 8px; + display: inline-block; + transition: transform 0.2s ease; + transform: ${(props: { isExpanded: boolean }) => (props.isExpanded ? 'rotate(90deg)' : 'rotate(0deg)')}; +`; + +// Utility functions for localStorage +const loadCorsSettingsFromStorage = () => { + try { + return { + corsAllowOrigin: localStorage.getItem(CORS_ALLOW_ORIGIN_KEY) || CORS_ALLOW_ORIGIN_VALUE, + corsAllowMethods: localStorage.getItem(CORS_ALLOW_METHODS_KEY) || CORS_ALLOW_METHODS_VALUE, + corsAllowHeaders: localStorage.getItem(CORS_ALLOW_HEADERS_KEY) || CORS_ALLOW_HEADERS_VALUE, + corsExposeHeaders: localStorage.getItem(CORS_EXPOSE_HEADERS_KEY) || CORS_EXPOSE_HEADERS_VALUE, + keepAliveInterval: Number(localStorage.getItem(SSE_KEEPALIVE_INTERVAL_KEY)) || SSE_KEEPALIVE_INTERVAL_MS, + }; + } catch { + return { + corsAllowOrigin: CORS_ALLOW_ORIGIN_VALUE, + corsAllowMethods: CORS_ALLOW_METHODS_VALUE, + corsAllowHeaders: CORS_ALLOW_HEADERS_VALUE, + corsExposeHeaders: CORS_EXPOSE_HEADERS_VALUE, + keepAliveInterval: SSE_KEEPALIVE_INTERVAL_MS, + }; + } +}; + +const saveCorsSettingsToStorage = (settings: { + corsAllowOrigin: string; + corsAllowMethods: string; + corsAllowHeaders: string; + corsExposeHeaders: string; + keepAliveInterval: number; +}) => { + try { + localStorage.setItem(CORS_ALLOW_ORIGIN_KEY, settings.corsAllowOrigin); + localStorage.setItem(CORS_ALLOW_METHODS_KEY, settings.corsAllowMethods); + localStorage.setItem(CORS_ALLOW_HEADERS_KEY, settings.corsAllowHeaders); + localStorage.setItem(CORS_EXPOSE_HEADERS_KEY, settings.corsExposeHeaders); + localStorage.setItem(SSE_KEEPALIVE_INTERVAL_KEY, String(settings.keepAliveInterval)); + } catch { + // Silently fail if localStorage is not available + } +}; + +const schema = yup.object({ + serverName: yup.string() + .required('Server name is required') + .min(3, 'Server name must be at least 3 characters') + .matches(/^[a-zA-Z0-9_-]+$/, 'Server name can only contain letters, numbers, hyphens, and underscores'), + port: yup.number() + .typeError('Port must be a number') + .required('Port is required') + .integer('Port must be an integer'), + corsAllowOrigin: yup.string() + .default(CORS_ALLOW_ORIGIN_VALUE), + corsAllowMethods: yup.string() + .default(CORS_ALLOW_METHODS_VALUE), + corsAllowHeaders: yup.string() + .default(CORS_ALLOW_HEADERS_VALUE), + corsExposeHeaders: yup.string() + .default(CORS_EXPOSE_HEADERS_VALUE), + keepAliveInterval: yup.number() + .typeError('Keep-alive interval must be a number') + .default(SSE_KEEPALIVE_INTERVAL_MS) + .integer('Keep-alive interval must be an integer'), +}); + +export interface MCPServerWizardProps { + path: string; + forceCreate?: boolean; +} + +export function MCPServerWizard({ path }: MCPServerWizardProps) { + const { rpcClient } = useVisualizerContext(); + const corsSettings = loadCorsSettingsFromStorage(); + + const { register, handleSubmit, setError: setFieldError, formState: { errors }, watch } = useForm({ + resolver: yupResolver(schema), + defaultValues: { + serverName: '', + port: 8300, + corsAllowOrigin: corsSettings.corsAllowOrigin, + corsAllowMethods: corsSettings.corsAllowMethods, + corsAllowHeaders: corsSettings.corsAllowHeaders, + corsExposeHeaders: corsSettings.corsExposeHeaders, + keepAliveInterval: corsSettings.keepAliveInterval, + }, + }); + const [submitting, setSubmitting] = useState(false); + const [error, setError] = useState(null); + const [usedPorts, setUsedPorts] = useState>(new Set()); + const [showAdvanced, setShowAdvanced] = useState(false); + + // Watch CORS fields and save to localStorage when they change + const corsAllowOrigin = watch('corsAllowOrigin'); + const corsAllowMethods = watch('corsAllowMethods'); + const corsAllowHeaders = watch('corsAllowHeaders'); + const corsExposeHeaders = watch('corsExposeHeaders'); + const keepAliveInterval = watch('keepAliveInterval'); + + useEffect(() => { + saveCorsSettingsToStorage({ + corsAllowOrigin, + corsAllowMethods, + corsAllowHeaders, + corsExposeHeaders, + keepAliveInterval, + }); + }, [corsAllowOrigin, corsAllowMethods, corsAllowHeaders, corsExposeHeaders, keepAliveInterval]); + + useEffect(() => { + const loadUsedPorts = async () => { + try { + const projectRootResp = await rpcClient.getMiDiagramRpcClient().getProjectRoot({ path }); + const projectDir = projectRootResp.path; + const projectStructure = await rpcClient.getMiVisualizerRpcClient().getProjectStructure({ + documentUri: projectDir, + }); + const inboundEndpoints: Array<{ path: string }> = + projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts?.inboundEndpoints || []; + const ports = await getUsedInboundPorts( + inboundEndpoints.map(ep => ep.path), + async (filePath) => { + const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ filePath }); + return resp.fileContent ?? null; + } + ); + setUsedPorts(ports); + } catch {} + }; + loadUsedPorts(); + }, [rpcClient, path]); + + const handleClose = () => { + rpcClient.getMiVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { view: MACHINE_VIEW.Overview }, + }); + }; + + const onSubmit = async (data: any) => { + if (usedPorts.has(Number(data.port))) { + setFieldError('port', { message: `Port ${data.port} is already in use by another inbound endpoint in this project` }); + return; + } + setSubmitting(true); + setError(null); + try { + const projectRootResp = await rpcClient.getMiDiagramRpcClient().getProjectRoot({ path }); + const projectDir = projectRootResp.path; + + const localEntriesDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'artifacts', 'local-entries').toString(); + const inboundEndpointsDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'artifacts', 'inbound-endpoints').toString(); + + const localEntryName = `${data.serverName}-mcp-config`; + const emptyXml = `\n \n `; + + await rpcClient.getMiDiagramRpcClient().createLocalEntry({ + directory: localEntriesDir, + name: localEntryName, + type: 'In-Line XML Entry', + value: emptyXml, + URL: '', + getContentOnly: false, + }); + + await rpcClient.getMiDiagramRpcClient().createInboundEndpoint({ + directory: inboundEndpointsDir, + attributes: { + name: `${data.serverName}-endpoint`, + sequence: '', + onError: '', + class: 'org.wso2.carbon.inbound.SSE.McpInboundListener', + }, + parameters: { + 'inbound.mcp.port': data.port, + 'inbound.http.port': data.port, + 'inbound.http.context': '/mcp', + 'mcp.tools.localentry': localEntryName, + 'inbound.behavior': 'listening', + 'inbound.cors.allow.origin': data.corsAllowOrigin, + 'inbound.cors.allow.methods': data.corsAllowMethods, + 'inbound.cors.allow.headers': data.corsAllowHeaders, + 'inbound.cors.expose.headers': data.corsExposeHeaders, + 'inbound.sse.keepalive.interval': data.keepAliveInterval, + }, + }); + + const localEntryPath = pathModule.join(localEntriesDir, localEntryName + '.xml').toString(); + rpcClient.getMiVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { + view: MACHINE_VIEW.MCPServerFromAPIsForm, + documentUri: path, + customProps: { editData: { serverName: data.serverName, localEntryPath } }, + }, + }); + } catch (err) { + setError(`Failed to create MCP Server: ${err instanceof Error ? err.message : String(err)}`); + } finally { + setSubmitting(false); + } + }; + + return ( + + + + + setShowAdvanced(!showAdvanced)}> + + Advanced Options + + {showAdvanced && ( + <> + + + + + + + )} + + {error && {error}} + + + + + + ); +} + +export default MCPServerWizard; diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts new file mode 100644 index 00000000000..b6dbe0ea2e4 --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts @@ -0,0 +1,278 @@ +/** + * 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 pathModule from 'path'; +import * as yaml from 'yaml'; +import { APIOperation, APITool, UnifiedTool } from '@wso2/mi-core'; + +export function cleanPathForToolName(path: string): string { + return path + .replace(/[{}]/g, '') + .replace(/[^a-zA-Z0-9]/g, '_') + .replace(/_{2,}/g, '_') + .replace(/^_+|_+$/g, ''); +} + +export function convertToJsonSchema(input: string): string | null { + if (!input.trim()) return null; + try { + const sanitized = input.replace(/:\s*(string|number|integer|boolean|array|object|null)\b/g, ': "$1"'); + const parsed = JSON.parse(sanitized); + if (parsed.type || parsed.properties) return JSON.stringify(parsed); + const properties: Record = {}; + for (const [k, v] of Object.entries(parsed)) properties[k] = { type: v as string }; + return JSON.stringify({ type: 'object', properties, additionalProperties: false }); + } catch { + return null; + } +} + +export function extractInputSchema(spec: any, method: string, operationPath: string): object { + const pathItem = spec?.paths?.[operationPath]; + if (!pathItem) return { type: 'object', properties: {}, additionalProperties: false }; + const operation = pathItem[method.toLowerCase()]; + if (!operation) return { type: 'object', properties: {}, additionalProperties: false }; + + const properties: Record = {}; + const required: string[] = []; + + if (Array.isArray(operation.parameters)) { + for (const param of operation.parameters) { + if ((param.in === 'path' || param.in === 'query') && param.name && param.schema) { + properties[param.name] = { ...param.schema, ...(param.description ? { description: param.description } : {}) }; + if (param.required) required.push(param.name); + } + } + } + + const bodySchema = operation.requestBody?.content?.['application/json']?.schema; + if (bodySchema?.properties) { + for (const [key, value] of Object.entries(bodySchema.properties)) { + properties[key] = value; + } + if (Array.isArray(bodySchema.required)) required.push(...bodySchema.required); + } + + const schema: any = { type: 'object', properties, additionalProperties: false }; + if (required.length > 0) schema.required = required; + return schema; +} + +export function parseToolsFromXML(xmlContent: string): UnifiedTool[] { + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(xmlContent, 'text/xml'); + const toolElements = Array.from(doc.querySelectorAll('tool')); + + return toolElements.map(toolEl => { + const name = toolEl.getAttribute('name') || ''; + const description = toolEl.querySelector('description')?.textContent?.trim() || ''; + const seqEl = toolEl.querySelector('sequence'); + const apiEl = toolEl.querySelector('api'); + + if (seqEl) { + return { + kind: 'sequence' as const, + id: crypto.randomUUID(), + name, + description, + sequenceName: seqEl.textContent?.trim() || '', + sequenceXmlPath: '', + inputSchema: toolEl.querySelector('inputSchema')?.textContent?.trim() + || '{"type":"object","properties":{},"additionalProperties":false}', + }; + } else { + const method = toolEl.querySelector('method')?.textContent?.trim() || ''; + const resource = toolEl.querySelector('resource')?.textContent?.trim() || ''; + const apiName = apiEl?.textContent?.trim() || ''; + const existingSchema = toolEl.querySelector('inputSchema')?.textContent?.trim(); + return { + kind: 'api' as const, + id: crypto.randomUUID(), + name, + description, + apiId: apiName, + apiName, + apiVersion: '1.0.0', + apiRawVersion: '', + apiXmlPath: '', + operationId: `${method}_${resource}`.replace(/[^a-zA-Z0-9_]/g, '_'), + operationMethod: method, + operationPath: resource, + operationSummary: description, + inputSchema: existingSchema, + }; + } + }); + } catch { + return []; + } +} + +export function parsePortFromInboundEndpoint(xmlContent: string): number | null { + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(xmlContent, 'text/xml'); + const params = Array.from(doc.querySelectorAll('parameter')); + for (const param of params) { + const pname = param.getAttribute('name') || ''; + if (pname === 'inbound.mcp.port' || pname === 'inbound.http.port') { + const val = parseInt(param.textContent?.trim() || '', 10); + if (!isNaN(val)) return val; + } + } + } catch {} + return null; +} + +export async function getUsedInboundPorts( + inboundEndpointPaths: string[], + readFile: (path: string) => Promise, + excludePath?: string +): Promise> { + const usedPorts = new Set(); + for (const epPath of inboundEndpointPaths) { + if (excludePath && epPath === excludePath) continue; + try { + const content = await readFile(epPath); + if (content) { + const port = parsePortFromInboundEndpoint(content); + if (port !== null) usedPorts.add(port); + } + } catch {} + } + return usedPorts; +} + +export function generateToolsXml(tools: UnifiedTool[], inputSchemas: Record): string { + let toolsXml = ''; + + tools.forEach(tool => { + if (tool.kind === 'api') { + const derived = inputSchemas[tool.id]; + const isEmpty = !derived || (Object.keys((derived as any).properties ?? {}).length === 0 && !(derived as any).required); + const inputSchema = (!isEmpty ? derived : null) + ?? (tool.inputSchema ? JSON.parse(tool.inputSchema) : null) + ?? { type: 'object', properties: {} }; + const description = tool.description || tool.operationSummary + || `${tool.operationMethod} ${tool.operationPath} - ${tool.apiName}`; + toolsXml += ` + + ${tool.apiName} + ${tool.operationPath} + ${tool.operationMethod} + ${description} + ${JSON.stringify(inputSchema)} + `; + } else { + toolsXml += ` + + ${tool.sequenceName} + ${tool.description || tool.sequenceName} + ${tool.inputSchema} + `; + } + }); + + return ` + ${toolsXml} + `; +} + +export async function buildInputSchemasForAPITools( + tools: APITool[], + apiDefDir: string, + readFile: (filePath: string) => Promise +): Promise> { + const inputSchemas: Record = {}; + + const readYaml = async (filePath: string): Promise => { + try { + const content = await readFile(filePath); + return content ? yaml.parse(content) : null; + } catch { + return null; + } + }; + + for (const tool of tools) { + const rawVersion = tool.apiRawVersion || ''; + const xmlBaseName = tool.apiXmlPath + ? pathModule.basename(tool.apiXmlPath, pathModule.extname(tool.apiXmlPath)) + : tool.apiName; + + // On Linux (case-sensitive), the YAML file is named after the API's `name` attribute + // (set at creation time) while the XML file may have a different case. Include both. + const baseNames = [...new Set([xmlBaseName, tool.apiName])]; + const candidates = baseNames + .flatMap(base => [ + ...(rawVersion ? [`${base}_v${rawVersion}.yaml`] : []), + `${base}.yaml`, + ]) + .map(f => pathModule.join(apiDefDir, f).toString()); + + let spec: any = null; + for (const candidate of candidates) { + spec = await readYaml(candidate); + if (spec !== null) break; + } + + inputSchemas[tool.id] = spec + ? extractInputSchema(spec, tool.operationMethod, tool.operationPath) + : { type: 'object', properties: {}, additionalProperties: false }; + } + + return inputSchemas; +} + +export const artifactParserConfig = { + apis: { + pathInStructure: (structure: any) => structure?.directoryMap?.src?.main?.wso2mi?.artifacts?.apis || [], + parseFields: { + id: (art: Record) => art.name || art.id || art.fileName || '', + name: (art: Record) => art.name || art.id || art.fileName || '', + context: (art: Record) => art.context || `/${art.name || art.id || ''}`, + version: (art: Record) => art.version || '1.0.0', + rawVersion: (art: Record) => art.version ?? '', + xmlPath: (art: Record) => art.path || '', + }, + parseOperations: (art: Record): APIOperation[] => { + const operations: APIOperation[] = []; + if (art.resources && Array.isArray(art.resources)) { + for (const res of art.resources) { + const methods = Array.isArray(res.methods) + ? res.methods + : typeof res.methods === 'string' + ? res.methods.split(',') + : []; + const uri = res.path || res.uri || res['uri-template'] || res.uriTemplate || ''; + for (const m of methods) { + const method = String(m).toUpperCase(); + operations.push({ + id: `${method}_${uri}`.replace(/[^a-zA-Z0-9_]/g, '_'), + method, + path: uri, + summary: res.summary || '' + }); + } + } + } + return operations; + } + } +}; diff --git a/workspaces/mi/mi-visualizer/src/views/Overview/ProjectStructureView.tsx b/workspaces/mi/mi-visualizer/src/views/Overview/ProjectStructureView.tsx index 3074156e14d..f9def6954fc 100644 --- a/workspaces/mi/mi-visualizer/src/views/Overview/ProjectStructureView.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Overview/ProjectStructureView.tsx @@ -142,6 +142,14 @@ const artifactTypeMap: Record = { icon: "data-source", description: (entry: any) => "Data Source", path: (entry: any) => entry.path, + }, + mcpServers: { + title: "MCP Servers", + command: "MI.project-explorer.add-mcp-server", + view: MACHINE_VIEW.MCPServerForm, + icon: "inbound-endpoint", + description: (entry: any) => "MCP Server", + path: (entry: any) => entry.inboundEndpoint?.path ?? entry.localEntry?.path ?? '', } // Add more artifact types as needed }; @@ -256,6 +264,21 @@ const ProjectStructureView = (props: { projectStructure: any, workspaceDir: stri } }; + const goToMcpServerTools = (entry: any) => { + const localEntryPath = entry.localEntry?.path ?? ''; + const serverName = localEntryPath + ? localEntryPath.split('/').pop()?.replace('-mcp-config.xml', '') ?? entry.name + : entry.name; + rpcClient.getMiVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { + view: MACHINE_VIEW.MCPServerFromAPIsForm, + documentUri: localEntryPath, + customProps: { editData: { serverName, localEntryPath } }, + }, + }); + }; + const goToConnectionView = async (documentUri: string, view: MACHINE_VIEW, connectionName: string) => { rpcClient.getMiVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, @@ -277,6 +300,17 @@ const ProjectStructureView = (props: { projectStructure: any, workspaceDir: stri }); } + const deleteMCPServer = (entry: any) => { + const inboundPath = entry.inboundEndpoint?.path; + const localEntryPath = entry.localEntry?.path; + if (inboundPath) { + rpcClient.getMiDiagramRpcClient().deleteArtifact({ path: inboundPath, enableUndo: false }); + } + if (localEntryPath) { + rpcClient.getMiDiagramRpcClient().deleteArtifact({ path: localEntryPath, enableUndo: false }); + } + } + const markAsDefaultSequence = (path: string, remove: boolean) => { rpcClient.getMiDiagramRpcClient().markAsDefaultSequence({ path, remove }); } @@ -338,13 +372,14 @@ const ProjectStructureView = (props: { projectStructure: any, workspaceDir: stri {Object.entries(projectStructure.directoryMap.src.main.wso2mi.artifacts) .filter(([key, value]) => artifactTypeMap.hasOwnProperty(key) && Array.isArray(value) && value.length > 0) .map(([key, value]) => { - const hasOnlyUndefinedItems = Object.values(value).every(entry => entry.path === undefined); + const getEntryPath = (entry: any) => artifactTypeMap[key].path(entry); + const hasOnlyUndefinedItems = Object.values(value).every(entry => !getEntryPath(entry)); const hasConnections = hasOnlyUndefinedItems ? checkHasConnections(value) : false; return (!hasOnlyUndefinedItems || hasConnections) && (

{artifactTypeMap[key].title}

{Object.entries(value).map(([_, entry]) => ( - entry.path && ( + getEntryPath(entry) && ( goToView(artifactTypeMap[key].path(entry), artifactTypeMap[key].view, entry.name)} - goToView={() => goToView(artifactTypeMap[key].path(entry), artifactTypeMap[key].view, entry.name)} - goToSource={() => goToSource(artifactTypeMap[key].path(entry))} - deleteArtifact={() => deleteArtifact(artifactTypeMap[key].path(entry))} + onClick={() => key === 'mcpServers' ? goToMcpServerTools(entry) : goToView(getEntryPath(entry), artifactTypeMap[key].view, entry.name)} + goToView={() => key === 'mcpServers' ? goToMcpServerTools(entry) : goToView(getEntryPath(entry), artifactTypeMap[key].view, entry.name)} + goToSource={() => goToSource(getEntryPath(entry))} + deleteArtifact={() => key === 'mcpServers' ? deleteMCPServer(entry) : deleteArtifact(getEntryPath(entry))} isMainSequence={entry.isMainSequence} - markAsDefaultSequence={artifactTypeMap[key].title == "Sequences" ? () => markAsDefaultSequence(artifactTypeMap[key].path(entry), entry.isMainSequence) : undefined} + markAsDefaultSequence={artifactTypeMap[key].title == "Sequences" ? () => markAsDefaultSequence(getEntryPath(entry), entry.isMainSequence) : undefined} /> ) ))} @@ -476,4 +511,4 @@ const Entry: React.FC = ({ icon, name, description, onClick, goToVie }; -export default ProjectStructureView; +export default ProjectStructureView; \ No newline at end of file From a52ab91eaa740bae230de9ca374cb5ea1d828b71 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 4 May 2026 15:00:37 +0530 Subject: [PATCH 025/114] Updated fill with AI implementation for mcp server creation --- .../rpc-managers/mi-visualizer/rpc-manager.ts | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts index 5277b634049..47f4046930e 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts @@ -99,6 +99,8 @@ import { findMultiModuleProjectsInWorkspaceDir } from "../../util/migrationUtils import { MILanguageClient } from "../../lang-client/activator"; import { reorderModulesByBuildOrder } from "../../debugger/pomResolver"; import { buildDeployExtraArgs, executeRemoteDeployTask } from "../../debugger/debugHelper"; +import { getAnthropicClient, ANTHROPIC_HAIKU_4_5 } from "../../ai-features/connection"; +import { generateText } from "ai"; Mustache.escape = escapeXml; @@ -1042,25 +1044,14 @@ Respond ONLY with a JSON object in this exact format, no other text: {"description": "...", "inputSchema": {"param1": "type1", "param2": "type2"}}`; try { - const [model] = await vscode.lm.selectChatModels({ vendor: 'copilot', family: 'gpt-4o' }); - if (!model) { - vscode.window.showWarningMessage( - 'Fill With AI requires GitHub Copilot. Please install and sign in to GitHub Copilot.' - ); - return { description: '', inputSchema: '{}' }; - } - const token = new vscode.CancellationTokenSource().token; - const request = await model.sendRequest( - [vscode.LanguageModelChatMessage.User(prompt)], - {}, - token - ); - let text = ''; - for await (const chunk of request.stream) { - if (chunk instanceof vscode.LanguageModelTextPart) { - text += chunk.value; - } - } + const model = await getAnthropicClient(ANTHROPIC_HAIKU_4_5); + const { text } = await generateText({ + model: model, + prompt: prompt, + temperature: 0.3, + maxOutputTokens: 500, + }); + const cleaned = text.trim().replace(/^```json\s*/i, '').replace(/```\s*$/, ''); const parsed = JSON.parse(cleaned); return { From dbe50f684edc3baa4b059099dbc3b1d7f681c506 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 4 May 2026 23:03:52 +0530 Subject: [PATCH 026/114] Display MCP server label in hierarchical navigation path --- .../NavigationBar/HierachicalPath.tsx | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/components/NavigationBar/HierachicalPath.tsx b/workspaces/mi/mi-visualizer/src/components/NavigationBar/HierachicalPath.tsx index 9f5faf7bd5b..07c3386e93a 100644 --- a/workspaces/mi/mi-visualizer/src/components/NavigationBar/HierachicalPath.tsx +++ b/workspaces/mi/mi-visualizer/src/components/NavigationBar/HierachicalPath.tsx @@ -65,27 +65,38 @@ export function HierachicalPath(props: HierachicalPathProps) { return; } - for (const pathItem of pathItems) { + for (let i = 0; i < pathItems.length; i++) { + const pathItem = pathItems[i]; if (pathItem.endsWith(".xml")) { - try { - const syntaxTree = await rpcClient.getMiDiagramRpcClient().getSyntaxTree({ documentUri: machineView.documentUri }); - if (!syntaxTree || !syntaxTree?.syntaxTree || !syntaxTree.syntaxTree?.api) { - continue; - } - const api = syntaxTree.syntaxTree.api; + if (pathItem.endsWith("-mcp-config.xml")) { segments.push({ - label: `${api.context}`, - onClick: () => { - rpcClient.getMiVisualizerRpcClient().openView({ - type: EVENT_TYPE.OPEN_VIEW, - location: { view: MACHINE_VIEW.ServiceDesigner, documentUri: machineView.documentUri } - }); - }, - isClickable: true + label: `MCP Server`, + onClick: () => { }, + isClickable: false }); - } catch (error) { - console.error(error); + } else { + try { + const syntaxTree = await rpcClient.getMiDiagramRpcClient().getSyntaxTree({ documentUri: machineView.documentUri }); + if (!syntaxTree || !syntaxTree?.syntaxTree || !syntaxTree.syntaxTree?.api) { + continue; + } + const api = syntaxTree.syntaxTree.api; + segments.push({ + label: `${api.context}`, + onClick: () => { + rpcClient.getMiVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { view: MACHINE_VIEW.ServiceDesigner, documentUri: machineView.documentUri } + }); + }, + isClickable: true + }); + } catch (error) { + console.error(error); + } } + } else if (pathItem === "local-entries" && i + 1 < pathItems.length && pathItems[i + 1].endsWith("-mcp-config.xml")) { + continue; } else { segments.push({ label: pathItem, From cc180c8cc3e9b182673c29d01113f98b5de49aa8 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 4 May 2026 23:17:59 +0530 Subject: [PATCH 027/114] Simplify MCP server display in project explorer --- .../project-explorer-provider.ts | 45 ++++--------------- 1 file changed, 8 insertions(+), 37 deletions(-) diff --git a/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts b/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts index 7d534a7ab87..21c7c6fdabc 100644 --- a/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts +++ b/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts @@ -856,8 +856,14 @@ function generateMcpServers(data: any[]): ProjectExplorerEntry[] { for (const server of data) { const serverEntry = new ProjectExplorerEntry( server.name, - isCollapsibleState(true), - { name: server.name, type: 'MCP_SERVER', path: server.localEntry?.path ?? '' }, + isCollapsibleState(false), + { + name: server.name, + type: 'MCP_SERVER', + path: server.localEntry?.path ?? '', + localEntry: server.localEntry, + inboundEndpoint: server.inboundEndpoint + } as any, 'inbound-endpoint' ); serverEntry.contextValue = 'mcpServer'; @@ -867,41 +873,6 @@ function generateMcpServers(data: any[]): ProjectExplorerEntry[] { arguments: [server.localEntry?.path ?? '', server.name] }; - const children: ProjectExplorerEntry[] = []; - - if (server.localEntry) { - const leEntry = new ProjectExplorerEntry( - server.localEntry.name, - isCollapsibleState(false), - server.localEntry, - 'local-entry' - ); - leEntry.contextValue = 'localEntry'; - leEntry.command = { - title: 'Show Local Entry', - command: COMMANDS.SHOW_LOCAL_ENTRY, - arguments: [vscode.Uri.file(server.localEntry.path), undefined, false] - }; - children.push(leEntry); - } - - if (server.inboundEndpoint) { - const ieEntry = new ProjectExplorerEntry( - server.inboundEndpoint.name, - isCollapsibleState(false), - server.inboundEndpoint, - getInboundEndpointIcon(server.inboundEndpoint.subType as InboundEndpointTypes) - ); - ieEntry.contextValue = 'inboundEndpoint'; - ieEntry.command = { - title: 'Show Inbound Endpoint', - command: COMMANDS.SHOW_INBOUND_ENDPOINT, - arguments: [vscode.Uri.file(server.inboundEndpoint.path), undefined, false] - }; - children.push(ieEntry); - } - - serverEntry.children = children; result.push(serverEntry); } return result; From 189e29985703422c559ad3a57865569c360a4dc7 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 4 May 2026 23:18:27 +0530 Subject: [PATCH 028/114] Exclude MCP config files from source navigation --- workspaces/mi/mi-extension/src/RPCLayer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/RPCLayer.ts b/workspaces/mi/mi-extension/src/RPCLayer.ts index 59f582428d9..a6c9a3b20a7 100644 --- a/workspaces/mi/mi-extension/src/RPCLayer.ts +++ b/workspaces/mi/mi-extension/src/RPCLayer.ts @@ -69,7 +69,8 @@ export class RPCLayer { if (state.event.viewLocation?.view) { const documentUri = state.event.viewLocation?.documentUri?.toLowerCase(); - commands.executeCommand('setContext', 'showGoToSource', documentUri?.endsWith('.xml') || documentUri?.endsWith('.ts') || documentUri?.endsWith('.dbs') || documentUri?.endsWith('.json')); + const isMcpConfigFile = documentUri?.includes('/local-entries/') && documentUri?.endsWith('-mcp-config.xml'); + commands.executeCommand('setContext', 'showGoToSource', !isMcpConfigFile && (documentUri?.endsWith('.xml') || documentUri?.endsWith('.ts') || documentUri?.endsWith('.dbs') || documentUri?.endsWith('.json'))); } }); window.onDidChangeActiveColorTheme((theme) => { From 1b7f16847fcf84c1663be68c13795d5ae2471fb6 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 4 May 2026 23:32:27 +0530 Subject: [PATCH 029/114] Fix MCP tool navigation to open the correct resource. --- .../src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index b1bb740875f..d5855f8e1d1 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -646,9 +646,10 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) const xmlPath = tool.apiXmlPath || api?.xmlPath || ''; if (!xmlPath) return; - // Derive the resource index: unique paths in operation order match the XML resource array order - const uniquePaths = api ? [...new Set(api.operations.map(op => op.path))] : []; - const resourceIndex = uniquePaths.indexOf(tool.operationPath); + // Find resource index by matching both method and path + const resourceIndex = api?.operations.findIndex( + op => op.method === tool.operationMethod && op.path === tool.operationPath + ) ?? -1; rpcClient.getMiVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, From 65ed5c1a1ece055014895384cd563cf0da109d08 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Tue, 5 May 2026 16:19:53 +0530 Subject: [PATCH 030/114] Implemented delete functionality for mcp servers --- .../mi/mi-extension/src/constants/index.ts | 1 + .../src/project-explorer/activate.ts | 43 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/constants/index.ts b/workspaces/mi/mi-extension/src/constants/index.ts index 1b75bfe9f1d..ea38ec61a5e 100644 --- a/workspaces/mi/mi-extension/src/constants/index.ts +++ b/workspaces/mi/mi-extension/src/constants/index.ts @@ -77,6 +77,7 @@ export const COMMANDS = { ADD_DATA_SERVICE_COMMAND: 'MI.project-explorer.add-data-service', ADD_MCP_SERVER_COMMAND: 'MI.project-explorer.add-mcp-server', SHOW_MCP_SERVER: 'MI.show.mcp-server', + DELETE_MCP_SERVER_COMMAND: 'MI.project-explorer.delete-mcp-server', CREATE_PROJECT_COMMAND: 'MI.project-explorer.create-project', REVEAL_ITEM_COMMAND: 'MI.project-explorer.revealItem', OPEN_SERVICE_DESIGNER: 'MI.project-explorer.open-service-designer', diff --git a/workspaces/mi/mi-extension/src/project-explorer/activate.ts b/workspaces/mi/mi-extension/src/project-explorer/activate.ts index ba5fadb300b..3cbe6cd5e48 100644 --- a/workspaces/mi/mi-extension/src/project-explorer/activate.ts +++ b/workspaces/mi/mi-extension/src/project-explorer/activate.ts @@ -208,7 +208,11 @@ export async function activateProjectExplorer(treeviewId: string, context: Exten customProps: { editData: { serverName, localEntryPath } } }); }); - + + commands.registerCommand(COMMANDS.DELETE_MCP_SERVER_COMMAND, (entry: ProjectExplorerEntry) => { + commands.executeCommand(COMMANDS.DELETE_PROJECT_EXPLORER_ITEM, entry); + }); + commands.registerCommand(COMMANDS.REVEAL_ITEM_COMMAND, async (viewLocation: VisualizerLocation) => { const data = projectExplorerDataProvider.getChildren(); @@ -642,6 +646,43 @@ export async function activateProjectExplorer(treeviewId: string, context: Exten } break; } + case 'mcpServer': + { + const localEntryPath = (item as any)?.info?.localEntry?.path; + const inboundEndpointPath = (item as any)?.info?.inboundEndpoint?.path; + + if (!localEntryPath) { + window.showErrorMessage('Could not determine local entry path for MCP server'); + return; + } + + const confirmation = await window.showWarningMessage( + `Are you sure you want to delete MCP Server - ${item.label}?`, + { modal: true }, + 'Yes' + ); + + if (confirmation === 'Yes') { + try { + // Delete local entry file + await vscode.workspace.fs.delete(Uri.file(localEntryPath), { recursive: true, useTrash: true }); + + // Delete inbound endpoint file if it exists + if (inboundEndpointPath) { + try { + await vscode.workspace.fs.delete(Uri.file(inboundEndpointPath), { recursive: true, useTrash: true }); + } catch (err) { + console.warn(`Could not delete inbound endpoint at ${inboundEndpointPath}:`, err); + } + } + + window.showInformationMessage(`${item.label} has been deleted.`); + } catch (error) { + window.showErrorMessage(`Failed to delete ${item.label}: ${error}`); + } + } + break; + } } projectExplorerDataProvider.refresh(); if (compareVersions(runtimeVersion, RUNTIME_VERSION_440) < 0 && registryExplorerDataProvider) { From 859d8dba2e581d24ef31facd34d99d2cba715465 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Wed, 6 May 2026 10:07:17 +0530 Subject: [PATCH 031/114] Hide MCP server commands from Command Palette --- workspaces/mi/mi-extension/package.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 1ef6a9cc0a2..08615e6bdb1 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -720,6 +720,18 @@ "command": "MI.project-explorer.add-data-service", "when": "false" }, + { + "command": "MI.project-explorer.add-mcp-server", + "when": "false" + }, + { + "command": "MI.project-explorer.show-mcp-server", + "when": "false" + }, + { + "command": "MI.project-explorer.delete-mcp-server", + "when": "false" + }, { "command": "MI.project-explorer.open-dss-service-designer", "when": "false" @@ -1183,4 +1195,4 @@ "xstate": "4.38.3", "zod": "4.1.11" } -} \ No newline at end of file +} From 9aca2ccd044fb963e55aca44864c14ae8b790020 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Wed, 6 May 2026 11:05:47 +0530 Subject: [PATCH 032/114] Fix MCP server deletion --- .../mi/mi-extension/src/project-explorer/activate.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/workspaces/mi/mi-extension/src/project-explorer/activate.ts b/workspaces/mi/mi-extension/src/project-explorer/activate.ts index 3cbe6cd5e48..34e6e8bda9b 100644 --- a/workspaces/mi/mi-extension/src/project-explorer/activate.ts +++ b/workspaces/mi/mi-extension/src/project-explorer/activate.ts @@ -669,13 +669,10 @@ export async function activateProjectExplorer(treeviewId: string, context: Exten // Delete inbound endpoint file if it exists if (inboundEndpointPath) { - try { - await vscode.workspace.fs.delete(Uri.file(inboundEndpointPath), { recursive: true, useTrash: true }); - } catch (err) { - console.warn(`Could not delete inbound endpoint at ${inboundEndpointPath}:`, err); - } + await vscode.workspace.fs.delete(Uri.file(inboundEndpointPath), { recursive: true, useTrash: true }); } + file = localEntryPath; window.showInformationMessage(`${item.label} has been deleted.`); } catch (error) { window.showErrorMessage(`Failed to delete ${item.label}: ${error}`); From 127221370fe56868beace11be7543ceca3f21ba8 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Wed, 6 May 2026 11:38:45 +0530 Subject: [PATCH 033/114] Fixed the MCP server generation to skip any servers without a valid path. --- .../src/project-explorer/project-explorer-provider.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts b/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts index 21c7c6fdabc..6d8ae3472e3 100644 --- a/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts +++ b/workspaces/mi/mi-extension/src/project-explorer/project-explorer-provider.ts @@ -854,13 +854,17 @@ function getMesaaageStoreIcon(messageStoreType: MessageStoreTypes): string { function generateMcpServers(data: any[]): ProjectExplorerEntry[] { const result: ProjectExplorerEntry[] = []; for (const server of data) { + if (!server.localEntry?.path) { + continue; + } + const serverEntry = new ProjectExplorerEntry( server.name, isCollapsibleState(false), { name: server.name, type: 'MCP_SERVER', - path: server.localEntry?.path ?? '', + path: server.localEntry.path, localEntry: server.localEntry, inboundEndpoint: server.inboundEndpoint } as any, @@ -870,7 +874,7 @@ function generateMcpServers(data: any[]): ProjectExplorerEntry[] { serverEntry.command = { title: 'Show MCP Server', command: COMMANDS.SHOW_MCP_SERVER, - arguments: [server.localEntry?.path ?? '', server.name] + arguments: [server.localEntry.path, server.name] }; result.push(serverEntry); From c7613305b96fc06272a88b857d13fc9555c37943 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Wed, 6 May 2026 11:57:59 +0530 Subject: [PATCH 034/114] Replace forward-slash path check with a cross-platform-aware alternative. --- workspaces/mi/mi-extension/src/RPCLayer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/RPCLayer.ts b/workspaces/mi/mi-extension/src/RPCLayer.ts index a6c9a3b20a7..8f6eb4e012e 100644 --- a/workspaces/mi/mi-extension/src/RPCLayer.ts +++ b/workspaces/mi/mi-extension/src/RPCLayer.ts @@ -69,7 +69,8 @@ export class RPCLayer { if (state.event.viewLocation?.view) { const documentUri = state.event.viewLocation?.documentUri?.toLowerCase(); - const isMcpConfigFile = documentUri?.includes('/local-entries/') && documentUri?.endsWith('-mcp-config.xml'); + const normalizedPath = documentUri?.replace(/\\/g, '/'); + const isMcpConfigFile = normalizedPath?.includes('/local-entries/') && normalizedPath?.endsWith('-mcp-config.xml'); commands.executeCommand('setContext', 'showGoToSource', !isMcpConfigFile && (documentUri?.endsWith('.xml') || documentUri?.endsWith('.ts') || documentUri?.endsWith('.dbs') || documentUri?.endsWith('.json'))); } }); From 5f3e4dd37e5c0380c0765b29d4dc65442fd7131f Mon Sep 17 00:00:00 2001 From: dulavinya Date: Wed, 6 May 2026 22:04:54 +0530 Subject: [PATCH 035/114] Disable create until port scan completes to prevent conflicts when creating mcp servers --- .../src/views/Forms/MCPServerForm/index.tsx | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx index d2bd2bd95e1..e52eb7df9f9 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx @@ -151,7 +151,7 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { const { rpcClient } = useVisualizerContext(); const corsSettings = loadCorsSettingsFromStorage(); - const { register, handleSubmit, setError: setFieldError, formState: { errors }, watch } = useForm({ + const { register, handleSubmit, formState: { errors }, watch, trigger, setError } = useForm({ resolver: yupResolver(schema), defaultValues: { serverName: '', @@ -164,9 +164,11 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { }, }); const [submitting, setSubmitting] = useState(false); - const [error, setError] = useState(null); + const [error, setSubmissionError] = useState(null); const [usedPorts, setUsedPorts] = useState>(new Set()); const [showAdvanced, setShowAdvanced] = useState(false); + const [portDiscoveryLoading, setPortDiscoveryLoading] = useState(true); + const [portDiscoveryError, setPortDiscoveryError] = useState(null); // Watch CORS fields and save to localStorage when they change const corsAllowOrigin = watch('corsAllowOrigin'); @@ -187,27 +189,53 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { useEffect(() => { const loadUsedPorts = async () => { + setPortDiscoveryLoading(true); + setPortDiscoveryError(null); try { const projectRootResp = await rpcClient.getMiDiagramRpcClient().getProjectRoot({ path }); const projectDir = projectRootResp.path; const projectStructure = await rpcClient.getMiVisualizerRpcClient().getProjectStructure({ documentUri: projectDir, }); + const artifacts = projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts; const inboundEndpoints: Array<{ path: string }> = - projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts?.inboundEndpoints || []; + artifacts?.inboundEndpoints || []; + const mcpServers: Array<{ inboundEndpoint?: { path: string } }> = + (artifacts as any)?.mcpServers || []; + + // Collect all inbound endpoint paths from both regular endpoints and MCP servers + const allEndpointPaths = [ + ...inboundEndpoints.map(ep => ep.path), + ...mcpServers.filter(mcp => mcp.inboundEndpoint?.path).map(mcp => mcp.inboundEndpoint!.path) + ]; + + console.log('[MCPServerForm] Found inbound endpoints:', inboundEndpoints.length); + console.log('[MCPServerForm] Found MCP servers:', mcpServers.length); + console.log('[MCPServerForm] All endpoint paths to check:', allEndpointPaths); + const ports = await getUsedInboundPorts( - inboundEndpoints.map(ep => ep.path), + allEndpointPaths, async (filePath) => { const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ filePath }); return resp.fileContent ?? null; } ); + console.log('[MCPServerForm] Discovered used ports:', Array.from(ports)); setUsedPorts(ports); - } catch {} + setPortDiscoveryLoading(false); + } catch (err) { + console.error('[MCPServerForm] Port discovery error:', err); + setPortDiscoveryError(`Failed to check existing ports: ${err instanceof Error ? err.message : String(err)}`); + setPortDiscoveryLoading(false); + } }; loadUsedPorts(); }, [rpcClient, path]); + useEffect(() => { + trigger('port'); + }, [usedPorts, trigger]); + const handleClose = () => { rpcClient.getMiVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, @@ -216,12 +244,18 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { }; const onSubmit = async (data: any) => { + console.log('[MCPServerForm] onSubmit called with data:', data); + console.log('[MCPServerForm] Current used ports:', Array.from(usedPorts)); + + // Check if port is already in use if (usedPorts.has(Number(data.port))) { - setFieldError('port', { message: `Port ${data.port} is already in use by another inbound endpoint in this project` }); + console.log(`[MCPServerForm] Port ${data.port} is already in use!`); + setError('port', { message: `Port ${data.port} is already in use by another inbound endpoint in this project` }); return; } + setSubmitting(true); - setError(null); + setSubmissionError(null); try { const projectRootResp = await rpcClient.getMiDiagramRpcClient().getProjectRoot({ path }); const projectDir = projectRootResp.path; @@ -273,7 +307,7 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { }, }); } catch (err) { - setError(`Failed to create MCP Server: ${err instanceof Error ? err.message : String(err)}`); + setSubmissionError(`Failed to create MCP Server: ${err instanceof Error ? err.message : String(err)}`); } finally { setSubmitting(false); } @@ -336,13 +370,14 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { )} {error && {error}} + {portDiscoveryError && {portDiscoveryError}} + + {descriptionErrors[op.id] && {descriptionErrors[op.id]}} )} - + ))} - + ) : ( - No operations available in this API + No operations available in this API )} )} - Cancel + {someSelected && ( - + {selectedOperationIds.size} operation{selectedOperationIds.size !== 1 ? 's' : ''} selected - + )} - Add Selected Tools ({selectedOperationIds.size}) - + diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx index 99c61846703..5268d4760da 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx @@ -18,236 +18,20 @@ import { ChangeEvent, useRef, useState } from 'react'; import styled from '@emotion/styled'; +import { Button, Typography } from '@wso2/ui-toolkit'; import { convertToJsonSchema } from './utils'; import { Sequence } from '@wso2/mi-core'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; +import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, CustomInput, SelectAllRow, FlexRow, FlexRowStart, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, SchemaTextarea, DialogTitle } from './dialogStyles'; // Styled Components -const DialogOverlay = styled.div` - position: fixed; - 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; -`; - -const DialogContent = styled.div` - background: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 8px; - padding: 20px; - max-width: 600px; - width: 90%; - max-height: 80vh; - overflow-y: auto; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); -`; - -const DialogTitle = styled.h3` - color: var(--vscode-editor-foreground); - margin: 0 0 15px 0; - font-size: 16px; - font-weight: 600; -`; - -const DialogField = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - margin-bottom: 15px; -`; - -const DialogLabel = styled.label` - color: var(--vscode-editor-foreground); - font-size: 12px; - font-weight: 500; -`; - -const SequencesList = styled.div` - background: var(--vscode-input-background); - border: 1px solid var(--vscode-input-border); - border-radius: 3px; - max-height: 400px; - overflow-y: auto; - padding: 8px 0; -`; - -const SequenceItem = styled.div` - display: flex; - flex-direction: column; - gap: 6px; - padding: 10px 12px; - border-bottom: 1px solid var(--vscode-panel-border); - &:last-child { border-bottom: none; } - &:hover { background: var(--vscode-list-hoverBackground); } -`; - -const SequenceItemHeader = styled.div` - display: flex; - align-items: center; - gap: 10px; - cursor: pointer; - user-select: none; -`; - -const SequenceCheckbox = styled.input` - cursor: pointer; - accent-color: var(--vscode-focusBorder); - margin-top: 2px; -`; - -const SequenceName = styled.span` - color: var(--vscode-editor-foreground); - font-family: monospace; - font-size: 12px; -`; - -const SelectAllRow = styled.div` - display: flex; - align-items: center; - gap: 10px; - padding: 8px 12px; - border-bottom: 1px solid var(--vscode-panel-border); - background: var(--vscode-list-activeSelectionBackground); - cursor: pointer; - user-select: none; -`; - -const SelectAllLabel = styled.label` - cursor: pointer; - margin-bottom: 0; - font-size: 12px; - color: var(--vscode-editor-foreground); -`; - -const CustomInputsContainer = styled.div` - display: flex; - flex-direction: column; - gap: 4px; - margin-left: 26px; -`; - -const InputFieldLabel = styled.label` - font-size: 10px; - color: var(--vscode-descriptionForeground); - margin-top: 2px; -`; - -const CustomInput = styled.input` - background: var(--vscode-editor-background); - color: var(--vscode-editor-foreground); - border: 1px solid var(--vscode-input-border); - padding: 4px 6px; - border-radius: 3px; - font-size: 11px; - font-family: inherit; - &:focus { outline: none; border-color: var(--vscode-focusBorder); } -`; - const SchemaRow = styled.div` display: flex; align-items: center; gap: 8px; `; -const SchemaTextarea = styled.textarea` - width: 100%; - min-height: 80px; - padding: 6px 8px; - font-size: 12px; - font-family: var(--vscode-editor-font-family, monospace); - background: var(--vscode-input-background); - color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border, var(--vscode-panel-border)); - border-radius: 3px; - resize: vertical; - box-sizing: border-box; - &:focus { outline: none; border-color: var(--vscode-focusBorder); } -`; - -const SchemaImportBtn = styled.button` - padding: 4px 10px; - font-size: 12px; - white-space: nowrap; - border: 1px solid var(--vscode-button-secondaryBackground); - border-radius: 3px; - cursor: pointer; - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; - -const SchemaError = styled.span` - color: var(--vscode-inputValidation-errorForeground, var(--vscode-errorForeground)); - font-size: 11px; -`; - -const FillAIBtn = styled.button` - padding: 4px 10px; - font-size: 12px; - white-space: nowrap; - border: 1px solid var(--vscode-button-background); - border-radius: 3px; - cursor: pointer; - background: var(--vscode-button-background); - color: var(--vscode-button-foreground); - &:hover { background: var(--vscode-button-hoverBackground); } - &:disabled { opacity: 0.5; cursor: not-allowed; } -`; - -const DescriptionRow = styled.div` - display: flex; - align-items: center; - gap: 6px; -`; - -const EmptyMessage = styled.div` - color: var(--vscode-descriptionForeground); - text-align: center; - padding: 15px; - font-size: 12px; -`; - -const DialogButtonGroup = styled.div` - display: flex; - gap: 10px; - justify-content: space-between; - margin-top: 15px; - padding-top: 15px; - border-top: 1px solid var(--vscode-panel-border); -`; - -const SelectionInfo = styled.span` - color: var(--vscode-descriptionForeground); - font-size: 12px; - align-self: center; -`; - -const DialogBtn = styled.button` - padding: 6px 12px; - font-size: 12px; - border: none; - border-radius: 3px; - cursor: pointer; - font-weight: 500; -`; - -const DialogCancelBtn = styled(DialogBtn)` - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; - -const DialogAddBtn = styled(DialogBtn)` - background: var(--vscode-button-background); - color: var(--vscode-button-foreground); - &:hover { background: var(--vscode-button-hoverBackground); } - &:disabled { opacity: 0.6; cursor: not-allowed; } -`; - // Component export interface AddSequenceToolDialogProps { @@ -389,38 +173,38 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } e.stopPropagation()}> Add Tools from Sequences - Select Sequences ({selectedIds.size} of {sequences.length}) + Select Sequences ({selectedIds.size} of {sequences.length}) {sequences.length === 0 ? ( - No sequences found in the project + No sequences found in the project ) : ( - + - e.stopPropagation()} id="select-all-sequences" /> - e.stopPropagation()} htmlFor="select-all-sequences"> + + {sequences.map(seq => ( - - toggleSequence(seq.id)}> - + toggleSequence(seq.id)}> + toggleSequence(seq.id)} onClick={e => e.stopPropagation()} id={`seq-${seq.id}`} /> - {seq.name} - + {seq.name} + {selectedIds.has(seq.id) && ( - Tool name + Tool name setCustomNames(prev => ({ ...prev, [seq.id]: e.target.value }))} onClick={e => e.stopPropagation()} /> - Description * - + Description * + { if (!customDescriptions[seq.id]?.trim()) setDescriptionErrors(prev => ({ ...prev, [seq.id]: 'Description is required.' })); }} onClick={e => e.stopPropagation()} /> - { e.stopPropagation(); handleFillDescription(seq); }} + onClick={(e: any) => { e.stopPropagation(); handleFillDescription(seq); }} + sx={{ padding: '4px 10px', fontSize: '12px', minWidth: 'auto' }} > {aiDescLoadingIds.has(seq.id) ? 'Filling...' : 'Fill With AI'} - - - {descriptionErrors[seq.id] && {descriptionErrors[seq.id]}} - Input Schema (JSON) + + + {descriptionErrors[seq.id] && {descriptionErrors[seq.id]}} + Input Schema (JSON) handleSchemaChange(seq.id, e.target.value)} onClick={e => e.stopPropagation()} /> - { e.stopPropagation(); handleFillSchema(seq); }} + onClick={(e: any) => { e.stopPropagation(); handleFillSchema(seq); }} + sx={{ padding: '4px 10px', fontSize: '12px', minWidth: 'auto' }} > {aiSchemaLoadingIds.has(seq.id) ? 'Filling...' : 'Fill With AI'} - - { e.stopPropagation(); handleImportFile(seq.id); }} + + { fileInputRefs.current[seq.id] = el; }} type="file" @@ -482,22 +269,22 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } onChange={e => handleFileChange(seq.id, e)} /> - {schemaErrors[seq.id] && {schemaErrors[seq.id]}} + {schemaErrors[seq.id] && {schemaErrors[seq.id]}} )} - + ))} - + )} - Cancel + {selectedIds.size > 0 && ( - {selectedIds.size} sequence{selectedIds.size !== 1 ? 's' : ''} selected + {selectedIds.size} sequence{selectedIds.size !== 1 ? 's' : ''} selected )} - + diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx index 672dd8aa107..646270c52f8 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx @@ -18,72 +18,12 @@ import { ChangeEvent, useRef, useState } from 'react'; import styled from '@emotion/styled'; +import { Button, Typography } from '@wso2/ui-toolkit'; import { convertToJsonSchema } from './utils'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; +import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, StdInput, SchemaTextarea, FlexRowStart, DialogTitle } from './dialogStyles'; -// Styled Components - -const DialogOverlay = styled.div` - position: fixed; - 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; -`; - -const DialogContent = styled.div` - background: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 8px; - padding: 20px; - max-width: 520px; - width: 90%; - max-height: 80vh; - overflow-y: auto; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); -`; - -const DialogTitle = styled.h3` - color: var(--vscode-editor-foreground); - margin: 0 0 16px 0; - font-size: 16px; - font-weight: 600; -`; - -const DialogSubtitle = styled.p` - color: var(--vscode-descriptionForeground); - font-size: 12px; - margin: -8px 0 16px 0; - line-height: 1.5; -`; - -const DialogField = styled.div` - display: flex; - flex-direction: column; - gap: 6px; - margin-bottom: 14px; -`; - -const DialogLabel = styled.label` - color: var(--vscode-editor-foreground); - font-size: 12px; - font-weight: 500; -`; - -const Input = styled.input` - background: var(--vscode-input-background); - color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border, var(--vscode-panel-border)); - padding: 6px 8px; - border-radius: 3px; - font-size: 13px; - font-family: inherit; - width: 100%; - box-sizing: border-box; - &:focus { outline: none; border-color: var(--vscode-focusBorder); } -`; +// Styled Components const SchemaRow = styled.div` display: flex; @@ -91,94 +31,6 @@ const SchemaRow = styled.div` gap: 8px; `; -const SchemaTextarea = styled.textarea` - flex: 1; - min-height: 80px; - padding: 6px 8px; - font-size: 12px; - font-family: var(--vscode-editor-font-family, monospace); - background: var(--vscode-input-background); - color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border, var(--vscode-panel-border)); - border-radius: 3px; - resize: vertical; - box-sizing: border-box; - &:focus { outline: none; border-color: var(--vscode-focusBorder); } -`; - -const SchemaImportBtn = styled.button` - padding: 4px 10px; - font-size: 12px; - white-space: nowrap; - border: 1px solid var(--vscode-button-secondaryBackground); - border-radius: 3px; - cursor: pointer; - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; - -const FillAIBtn = styled.button` - padding: 4px 10px; - font-size: 12px; - white-space: nowrap; - border: 1px solid var(--vscode-button-background); - border-radius: 3px; - cursor: pointer; - background: var(--vscode-button-background); - color: var(--vscode-button-foreground); - &:hover { background: var(--vscode-button-hoverBackground); } - &:disabled { opacity: 0.5; cursor: not-allowed; } -`; - -const SchemaError = styled.span` - color: var(--vscode-inputValidation-errorForeground, var(--vscode-errorForeground)); - font-size: 11px; -`; - -const SequenceHint = styled.div` - font-size: 11px; - color: var(--vscode-descriptionForeground); - font-style: italic; - margin-top: 2px; -`; - -const NameError = styled.span` - color: var(--vscode-inputValidation-errorForeground, var(--vscode-errorForeground)); - font-size: 11px; -`; - -const DialogButtonGroup = styled.div` - display: flex; - justify-content: flex-end; - gap: 10px; - margin-top: 18px; - padding-top: 14px; - border-top: 1px solid var(--vscode-panel-border); -`; - -const Btn = styled.button` - padding: 6px 14px; - font-size: 12px; - border: none; - border-radius: 3px; - cursor: pointer; - font-weight: 500; -`; - -const CancelBtn = styled(Btn)` - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; - -const ConfirmBtn = styled(Btn)` - background: var(--vscode-button-background); - color: var(--vscode-button-foreground); - &:hover { background: var(--vscode-button-hoverBackground); } - &:disabled { opacity: 0.6; cursor: not-allowed; } -`; - // Component export interface ScratchToolData { @@ -327,55 +179,55 @@ export function CreateScratchToolDialog({ e.stopPropagation()}> Create New Tool - + A new sequence will be created automatically. You can implement the logic inside it after. - + - Tool Name * - Tool Name * + handleNameChange(e.target.value)} /> - {nameError && {nameError}} + {nameError && {nameError}} {derivedSequenceName && !nameError && ( - A sequence named "{derivedSequenceName}" will be created. + A sequence named "{derivedSequenceName}" will be created. )} - Description * + Description * - { setDescription(e.target.value); if (e.target.value.trim()) setDescriptionError(''); }} onBlur={() => { if (!description.trim()) setDescriptionError('Description is required.'); }} /> - + - {descriptionError && {descriptionError}} + {descriptionError && {descriptionError}} - Input Schema (JSON) + Input Schema (JSON) handleSchemaChange(e.target.value)} /> - + + - {schemaError && {schemaError}} + {schemaError && {schemaError}} - Cancel - + + diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index 4b76454fd56..eda734f997c 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -18,7 +18,7 @@ import { useEffect, useState, useRef } from 'react'; import styled from '@emotion/styled'; -import { TextField, Button } from '@wso2/ui-toolkit'; +import { TextField, Button, Typography } from '@wso2/ui-toolkit'; import { useForm } from 'react-hook-form'; import * as yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -53,32 +53,12 @@ const Container = styled.div` max-width: 900px; `; -const Title = styled.h2` - color: var(--vscode-editor-foreground); - margin: 0 0 10px 0; - font-size: 20px; - font-weight: 600; -`; - -const Description = styled.p` - color: var(--vscode-descriptionForeground); - margin: 0 0 20px 0; - font-size: 13px; -`; - const FormSection = styled.div` display: flex; flex-direction: column; gap: 15px; `; -const SectionLabel = styled.label` - color: var(--vscode-editor-foreground); - font-weight: 500; - font-size: 14px; - display: block; -`; - const ToolsSectionHeader = styled.div` display: flex; justify-content: space-between; @@ -92,17 +72,6 @@ const ToolInfo = styled.div` flex: 1; `; -const ToolName = styled.span` - font-weight: 600; - font-size: 12px; - color: var(--vscode-editor-foreground); -`; - -const ToolDescription = styled.span` - font-size: 11px; - color: var(--vscode-descriptionForeground); -`; - const ToolsList = styled.div` display: flex; @@ -121,34 +90,6 @@ const ToolItem = styled.div` border-radius: 3px; `; -const ToolMeta = styled.span` - color: var(--vscode-descriptionForeground); - font-size: 11px; - font-family: monospace; -`; - -const RemoveBtn = styled.button` - padding: 4px 8px; - font-size: 11px; - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; - border-radius: 3px; - cursor: pointer; - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; - -const EditBtn = styled.button` - padding: 4px 8px; - font-size: 11px; - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; - border-radius: 3px; - cursor: pointer; - margin-right: 4px; - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; const InlineEditContainer = styled.div` @@ -191,36 +132,7 @@ const InlineEditActions = styled.div` justify-content: flex-end; `; -const SaveBtn = styled.button` - padding: 4px 10px; - font-size: 11px; - background: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border: none; - border-radius: 3px; - cursor: pointer; - &:hover { background: var(--vscode-button-hoverBackground); } -`; - -const CancelEditBtn = styled.button` - padding: 4px 10px; - font-size: 11px; - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; - border-radius: 3px; - cursor: pointer; - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; - -const EmptyMessage = styled.div` - color: var(--vscode-descriptionForeground); - text-align: center; - padding: 15px; - font-size: 12px; -`; - -const ErrorMessage = styled.div` +const ErrorMessageContainer = styled.div` color: var(--vscode-inputValidation-errorBorder); padding: 10px; border: 1px solid var(--vscode-inputValidation-errorBorder); @@ -236,19 +148,6 @@ const ButtonGroup = styled.div` margin-top: 20px; `; -const AddToolBtn = styled.button` - padding: 8px 16px; - font-size: 13px; - background: var(--vscode-button-background); - color: var(--vscode-button-foreground); - border: none; - border-radius: 3px; - cursor: pointer; - font-weight: 500; - &:hover { background: var(--vscode-button-hoverBackground); } - &:disabled { opacity: 0.5; cursor: not-allowed; } -`; - const InfoPanel = styled.div` display: flex; flex-direction: column; @@ -266,20 +165,6 @@ const InfoRow = styled.div` gap: 12px; `; -const InfoLabel = styled.span` - color: var(--vscode-descriptionForeground); - font-size: 13px; - font-weight: 500; - min-width: 80px; -`; - -const InfoValue = styled.span` - color: var(--vscode-editor-foreground); - font-size: 13px; - font-weight: 600; - font-family: var(--vscode-editor-font-family, monospace); -`; - // Tool Type Selection Page const ToolTypePage = styled.div` @@ -312,31 +197,6 @@ const ToolTypePageCard = styled.div` } `; -const ToolTypePageCardTitle = styled.div` - font-weight: 600; - font-size: 16px; - color: var(--vscode-editor-foreground); - margin-bottom: 8px; -`; - -const ToolTypePageCardDesc = styled.div` - font-size: 13px; - color: var(--vscode-descriptionForeground); - line-height: 1.5; -`; - -const BackBtn = styled.button` - align-self: flex-start; - padding: 6px 14px; - font-size: 13px; - background: var(--vscode-button-secondaryBackground); - color: var(--vscode-button-secondaryForeground); - border: none; - border-radius: 3px; - cursor: pointer; - font-weight: 500; - &:hover { background: var(--vscode-button-secondaryHoverBackground); } -`; // Form Schema @@ -825,10 +685,10 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) {showToolTypeSelector ? (
- Select Tool Type - + Select Tool Type + Choose how you want to expose functionality as an MCP tool. - +
@@ -839,11 +699,11 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) setSelectedAPIForTool(''); }} > - From APIs - + From APIs + Expose an API operation as a tool. Select from existing REST API resources defined in this project. - + - From Sequences - + From Sequences + Expose a mediation sequence as a tool. Select from existing sequences defined in this project. - + - New Tool - + New Tool + Create a tool from scratch. - + - setShowToolTypeSelector(false)}> +
) : (
- + {isEditMode ? 'Add or remove tools from this MCP server. Tools can be backed by API operations or sequences.' : 'Select API operations to expose as MCP tools.'} - +
{isEditMode ? ( - Server Name - {editData!.serverName} + Server Name + {editData!.serverName} - Port + Port {loading ? ( - ... + ... ) : (
{errors.port && ( - + {String(errors.port?.message)} - + )}
)} @@ -915,24 +775,24 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) ) : ( <> - Server Name + Server Name {errors.serverName && ( - {String(errors.serverName?.message)} + {String(errors.serverName?.message)} )} - Port + Port {errors.port && ( - {String(errors.port?.message)} + {String(errors.port?.message)} )} @@ -940,18 +800,19 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) - Tools ({tools.length}) - Tools ({tools.length}) + {tools.length === 0 ? ( - No tools added yet. Use the buttons above to add API or sequence tools. + No tools added yet. Use the buttons above to add API or sequence tools. ) : ( {tools.map(tool => ( @@ -987,39 +848,41 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) )} - Cancel - Save + + ) : ( <> - {tool.name} + {tool.name} {tool.description && ( - {tool.description} + {tool.description} )} {tool.kind === 'api' ? ( - + {tool.operationMethod} {tool.operationPath} ({tool.apiName}) - + ) : ( - + SEQUENCE · {tool.sequenceName} - + )} - { e.stopPropagation(); startEditTool(tool); }} - aria-label={`Edit tool ${tool.name}`} + + )} @@ -1028,7 +891,7 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) )} - {error && {error}} + {error && {error}}
)} + setShowCorsSettings(!showCorsSettings)}> + + {showCorsSettings ? '▼' : '▶'} CORS Settings + + + {showCorsSettings && ( +
+
+ Allow Origin + setCorsSettings({ ...corsSettings, corsAllowOrigin: e.target.value })} + onBlur={() => saveCorsSettingsToEndpoint(editData?.inboundEndpointPath || '')} + /> +
+
+ Allow Methods + setCorsSettings({ ...corsSettings, corsAllowMethods: e.target.value })} + onBlur={() => saveCorsSettingsToEndpoint(editData?.inboundEndpointPath || '')} + /> +
+
+ Allow Headers + setCorsSettings({ ...corsSettings, corsAllowHeaders: e.target.value })} + onBlur={() => saveCorsSettingsToEndpoint(editData?.inboundEndpointPath || '')} + /> +
+
+ Expose Headers + setCorsSettings({ ...corsSettings, corsExposeHeaders: e.target.value })} + onBlur={() => saveCorsSettingsToEndpoint(editData?.inboundEndpointPath || '')} + /> +
+
+ Keep-Alive Interval (ms) + setCorsSettings({ ...corsSettings, keepAliveInterval: parseInt(e.target.value, 10) || 30000 })} + onBlur={() => saveCorsSettingsToEndpoint(editData?.inboundEndpointPath || '')} + /> +
+
+ )} ) : ( <> diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx index 323481a9f32..1f1fcccce49 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx @@ -33,14 +33,6 @@ const CORS_ALLOW_HEADERS_VALUE = 'Content-Type, Mcp-Session-Id'; const CORS_EXPOSE_HEADERS_VALUE = 'Mcp-Session-Id'; const SSE_KEEPALIVE_INTERVAL_MS = 30000; -// localStorage keys for CORS settings -const CORS_STORAGE_PREFIX = 'mcp_server_cors_'; -const CORS_ALLOW_ORIGIN_KEY = `${CORS_STORAGE_PREFIX}allow_origin`; -const CORS_ALLOW_METHODS_KEY = `${CORS_STORAGE_PREFIX}allow_methods`; -const CORS_ALLOW_HEADERS_KEY = `${CORS_STORAGE_PREFIX}allow_headers`; -const CORS_EXPOSE_HEADERS_KEY = `${CORS_STORAGE_PREFIX}expose_headers`; -const SSE_KEEPALIVE_INTERVAL_KEY = `${CORS_STORAGE_PREFIX}keepalive_interval`; - const SectionTitle = styled.button` margin: 0; padding: 0; @@ -68,44 +60,6 @@ const ToggleIcon = styled.span<{ isExpanded: boolean }>` transform: ${(props: { isExpanded: boolean }) => (props.isExpanded ? 'rotate(90deg)' : 'rotate(0deg)')}; `; -// Utility functions for localStorage -const loadCorsSettingsFromStorage = () => { - try { - return { - corsAllowOrigin: localStorage.getItem(CORS_ALLOW_ORIGIN_KEY) || CORS_ALLOW_ORIGIN_VALUE, - corsAllowMethods: localStorage.getItem(CORS_ALLOW_METHODS_KEY) || CORS_ALLOW_METHODS_VALUE, - corsAllowHeaders: localStorage.getItem(CORS_ALLOW_HEADERS_KEY) || CORS_ALLOW_HEADERS_VALUE, - corsExposeHeaders: localStorage.getItem(CORS_EXPOSE_HEADERS_KEY) || CORS_EXPOSE_HEADERS_VALUE, - keepAliveInterval: Number(localStorage.getItem(SSE_KEEPALIVE_INTERVAL_KEY)) || SSE_KEEPALIVE_INTERVAL_MS, - }; - } catch { - return { - corsAllowOrigin: CORS_ALLOW_ORIGIN_VALUE, - corsAllowMethods: CORS_ALLOW_METHODS_VALUE, - corsAllowHeaders: CORS_ALLOW_HEADERS_VALUE, - corsExposeHeaders: CORS_EXPOSE_HEADERS_VALUE, - keepAliveInterval: SSE_KEEPALIVE_INTERVAL_MS, - }; - } -}; - -const saveCorsSettingsToStorage = (settings: { - corsAllowOrigin: string; - corsAllowMethods: string; - corsAllowHeaders: string; - corsExposeHeaders: string; - keepAliveInterval: number; -}) => { - try { - localStorage.setItem(CORS_ALLOW_ORIGIN_KEY, settings.corsAllowOrigin); - localStorage.setItem(CORS_ALLOW_METHODS_KEY, settings.corsAllowMethods); - localStorage.setItem(CORS_ALLOW_HEADERS_KEY, settings.corsAllowHeaders); - localStorage.setItem(CORS_EXPOSE_HEADERS_KEY, settings.corsExposeHeaders); - localStorage.setItem(SSE_KEEPALIVE_INTERVAL_KEY, String(settings.keepAliveInterval)); - } catch { - // Silently fail if localStorage is not available - } -}; const schema = yup.object({ serverName: yup.string() @@ -133,22 +87,30 @@ const schema = yup.object({ export interface MCPServerWizardProps { path: string; forceCreate?: boolean; + editData?: { + serverName?: string; + port?: number; + corsAllowOrigin?: string; + corsAllowMethods?: string; + corsAllowHeaders?: string; + corsExposeHeaders?: string; + keepAliveInterval?: number; + }; } -export function MCPServerWizard({ path }: MCPServerWizardProps) { +export function MCPServerWizard({ path, editData }: MCPServerWizardProps) { const { rpcClient } = useVisualizerContext(); - const corsSettings = loadCorsSettingsFromStorage(); - + const { register, handleSubmit, formState: { errors }, watch, trigger, setError } = useForm({ resolver: yupResolver(schema), defaultValues: { - serverName: '', - port: 8300, - corsAllowOrigin: corsSettings.corsAllowOrigin, - corsAllowMethods: corsSettings.corsAllowMethods, - corsAllowHeaders: corsSettings.corsAllowHeaders, - corsExposeHeaders: corsSettings.corsExposeHeaders, - keepAliveInterval: corsSettings.keepAliveInterval, + serverName: editData?.serverName || '', + port: editData?.port || 8300, + corsAllowOrigin: editData?.corsAllowOrigin || CORS_ALLOW_ORIGIN_VALUE, + corsAllowMethods: editData?.corsAllowMethods || CORS_ALLOW_METHODS_VALUE, + corsAllowHeaders: editData?.corsAllowHeaders || CORS_ALLOW_HEADERS_VALUE, + corsExposeHeaders: editData?.corsExposeHeaders || CORS_EXPOSE_HEADERS_VALUE, + keepAliveInterval: editData?.keepAliveInterval || SSE_KEEPALIVE_INTERVAL_MS, }, }); const [submitting, setSubmitting] = useState(false); @@ -158,22 +120,6 @@ export function MCPServerWizard({ path }: MCPServerWizardProps) { const [portDiscoveryLoading, setPortDiscoveryLoading] = useState(true); const [portDiscoveryError, setPortDiscoveryError] = useState(null); - // Watch CORS fields and save to localStorage when they change - const corsAllowOrigin = watch('corsAllowOrigin'); - const corsAllowMethods = watch('corsAllowMethods'); - const corsAllowHeaders = watch('corsAllowHeaders'); - const corsExposeHeaders = watch('corsExposeHeaders'); - const keepAliveInterval = watch('keepAliveInterval'); - - useEffect(() => { - saveCorsSettingsToStorage({ - corsAllowOrigin, - corsAllowMethods, - corsAllowHeaders, - corsExposeHeaders, - keepAliveInterval, - }); - }, [corsAllowOrigin, corsAllowMethods, corsAllowHeaders, corsExposeHeaders, keepAliveInterval]); useEffect(() => { const loadUsedPorts = async () => { From 54c4bfce80b552ed66b44aea9ef40e0aa6d3eae0 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Sun, 10 May 2026 07:42:53 +0530 Subject: [PATCH 059/114] Refactored MCPServerToolsForm --- .../MCPServerForm/MCPServerToolsForm.tsx | 281 ++---------------- .../Forms/MCPServerForm/ToolTypeSelector.tsx | 104 +++++++ .../views/Forms/MCPServerForm/ToolsList.tsx | 210 +++++++++++++ 3 files changed, 339 insertions(+), 256 deletions(-) create mode 100644 workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolTypeSelector.tsx create mode 100644 workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index 28b4b84121c..b5e33ef58af 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -32,7 +32,6 @@ import { artifactParserConfig, buildInputSchemasForAPITools, cleanPathForToolName, - convertToJsonSchema, generateToolsXml, getUsedInboundPorts, MCP_INBOUND_LISTENER_CLASS, @@ -42,6 +41,8 @@ import { import AddAPIToolDialog from './AddAPIToolDialog'; import { AddSequenceToolDialog } from './AddSequenceToolDialog'; import { CreateScratchToolDialog, ScratchToolData } from './CreateScratchToolDialog'; +import { ToolsListComponent } from './ToolsList'; +import { ToolTypeSelector } from './ToolTypeSelector'; // Styled Components @@ -65,73 +66,6 @@ const ToolsSectionHeader = styled.div` align-items: center; `; -const ToolInfo = styled.div` - display: flex; - flex-direction: column; - gap: 2px; - flex: 1; -`; - - -const ToolsList = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 10px; -`; - -const ToolItem = styled.div` - display: flex; - align-items: center; - gap: 8px; - padding: 8px; - background: var(--vscode-editor-background); - border: 1px solid var(--vscode-panel-border); - border-radius: 3px; -`; - - - -const InlineEditContainer = styled.div` - display: flex; - flex-direction: column; - gap: 6px; - flex: 1; -`; - -const InlineInput = styled.input` - background: var(--vscode-input-background); - color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border); - border-radius: 3px; - padding: 4px 6px; - font-size: 12px; - width: 100%; - box-sizing: border-box; - &:focus { outline: 1px solid var(--vscode-focusBorder); border-color: var(--vscode-focusBorder); } -`; - -const InlineTextarea = styled.textarea` - background: var(--vscode-input-background); - color: var(--vscode-input-foreground); - border: 1px solid var(--vscode-input-border); - border-radius: 3px; - padding: 4px 6px; - font-size: 12px; - width: 100%; - box-sizing: border-box; - resize: vertical; - min-height: 48px; - font-family: inherit; - &:focus { outline: 1px solid var(--vscode-focusBorder); border-color: var(--vscode-focusBorder); } -`; - -const InlineEditActions = styled.div` - display: flex; - gap: 6px; - justify-content: flex-end; -`; - const ErrorMessageContainer = styled.div` color: var(--vscode-inputValidation-errorBorder); padding: 10px; @@ -165,38 +99,6 @@ const InfoRow = styled.div` gap: 12px; `; -// Tool Type Selection Page - -const ToolTypePage = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 24px; - width: 100%; - text-align: center; -`; - -const ToolTypePageCards = styled.div` - display: flex; - gap: 20px; -`; - -const ToolTypePageCard = styled.div` - flex: 1; - padding: 32px 24px; - border: 2px solid var(--vscode-panel-border); - border-radius: 10px; - cursor: pointer; - text-align: center; - transition: border-color 0.15s ease, background 0.15s ease, transform 0.1s ease; - &:hover { - border-color: var(--vscode-focusBorder); - background: var(--vscode-list-hoverBackground); - transform: translateY(-2px); - } -`; - // Form Schema @@ -260,10 +162,6 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) const [showCreateScratchDialog, setShowCreateScratchDialog] = useState(false); const [showToolTypeSelector, setShowToolTypeSelector] = useState(false); const [selectedAPIForTool, setSelectedAPIForTool] = useState(''); - const [editingToolId, setEditingToolId] = useState(null); - const [editToolName, setEditToolName] = useState(''); - const [editToolDescription, setEditToolDescription] = useState(''); - const [editToolInputSchema, setEditToolInputSchema] = useState(''); const [corsSettings, setCorsSettings] = useState({ corsAllowOrigin: '*', corsAllowMethods: 'GET, POST, OPTIONS', @@ -638,31 +536,6 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) saveToolsToLocalEntry(updatedTools); }; - const startEditTool = (tool: UnifiedTool) => { - setEditingToolId(tool.id); - setEditToolName(tool.name); - setEditToolDescription(tool.description); - setEditToolInputSchema(tool.kind === 'sequence' ? tool.inputSchema : ''); - }; - - const saveEditTool = () => { - const updatedTools = tools.map(t => { - if (t.id !== editingToolId) return t; - const base = { ...t, name: editToolName.trim() || t.name, description: editToolDescription }; - if (t.kind === 'sequence') { - const normalizedSchema = editToolInputSchema.trim() ? convertToJsonSchema(editToolInputSchema) : null; - return { ...base, inputSchema: normalizedSchema || t.inputSchema }; - } - return base; - }); - setTools(updatedTools); - saveToolsToLocalEntry(updatedTools); - setEditingToolId(null); - }; - - const cancelEditTool = () => { - setEditingToolId(null); - }; // Submit @@ -754,59 +627,22 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) /> {showToolTypeSelector ? ( - -
- Select Tool Type - - Choose how you want to expose functionality as an MCP tool. - -
- - - { - setShowToolTypeSelector(false); - setShowAddAPIDialog(true); - setSelectedAPIForTool(''); - }} - > - From APIs - - Expose an API operation as a tool. Select from existing REST API - resources defined in this project. - - - - { - setShowToolTypeSelector(false); - setShowAddSeqDialog(true); - }} - > - From Sequences - - Expose a mediation sequence as a tool. Select from existing - sequences defined in this project. - - - - { - setShowToolTypeSelector(false); - setShowCreateScratchDialog(true); - }} - > - New Tool - - Create a tool from scratch. - - - - - -
+ { + setShowToolTypeSelector(false); + setShowAddAPIDialog(true); + setSelectedAPIForTool(''); + }} + onSelectFromSequences={() => { + setShowToolTypeSelector(false); + setShowAddSeqDialog(true); + }} + onSelectNewTool={() => { + setShowToolTypeSelector(false); + setShowCreateScratchDialog(true); + }} + onCancel={() => setShowToolTypeSelector(false)} + /> ) : (
@@ -940,80 +776,13 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) {tools.length === 0 ? ( No tools added yet. Use the buttons above to add API or sequence tools. ) : ( - - {tools.map(tool => ( - editingToolId !== tool.id && goToToolSource(tool)} - title={tool.kind === 'api' ? `Open API: ${tool.apiName}` : `Open sequence: ${tool.sequenceName}`} - > - {editingToolId === tool.id ? ( - <> - - setEditToolName(e.target.value)} - placeholder="Tool name" - aria-label="Tool name" - /> - setEditToolDescription(e.target.value)} - placeholder="Tool description" - aria-label="Tool description" - /> - {tool.kind === 'sequence' && ( - setEditToolInputSchema(e.target.value)} - placeholder='Input schema (JSON), e.g. {"type":"object","properties":{}}' - aria-label="Input schema" - style={{ minHeight: '72px', fontFamily: 'monospace' }} - /> - )} - - - - - - - ) : ( - <> - - {tool.name} - {tool.description && ( - {tool.description} - )} - - {tool.kind === 'api' ? ( - - {tool.operationMethod} {tool.operationPath} ({tool.apiName}) - - ) : ( - - SEQUENCE · {tool.sequenceName} - - )} - - - - )} - - ))} - + {}} + onRemove={removeTool} + onSave={saveToolsToLocalEntry} + onGoToSource={goToToolSource} + /> )} diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolTypeSelector.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolTypeSelector.tsx new file mode 100644 index 00000000000..2d1d545b8bf --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolTypeSelector.tsx @@ -0,0 +1,104 @@ +/** + * 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'; +import { Button, Typography } from '@wso2/ui-toolkit'; + +const ToolTypePage = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 24px; + width: 100%; + text-align: center; +`; + +const ToolTypePageCards = styled.div` + display: flex; + gap: 20px; +`; + +const ToolTypePageCard = styled.div` + flex: 1; + padding: 32px 24px; + border: 2px solid var(--vscode-panel-border); + border-radius: 10px; + cursor: pointer; + text-align: center; + transition: border-color 0.15s ease, background 0.15s ease, transform 0.1s ease; + &:hover { + border-color: var(--vscode-focusBorder); + background: var(--vscode-list-hoverBackground); + transform: translateY(-2px); + } +`; + +interface ToolTypeSelectorProps { + onSelectFromAPIs: () => void; + onSelectFromSequences: () => void; + onSelectNewTool: () => void; + onCancel: () => void; +} + +export function ToolTypeSelector({ + onSelectFromAPIs, + onSelectFromSequences, + onSelectNewTool, + onCancel, +}: ToolTypeSelectorProps) { + return ( + +
+ Select Tool Type + + Choose how you want to expose functionality as an MCP tool. + +
+ + + + From APIs + + Expose an API operation as a tool. Select from existing REST API + resources defined in this project. + + + + + From Sequences + + Expose a mediation sequence as a tool. Select from existing + sequences defined in this project. + + + + + New Tool + + Create a tool from scratch. + + + + + +
+ ); +} diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx new file mode 100644 index 00000000000..fbfab1b684a --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx @@ -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 { useState } from 'react'; +import styled from '@emotion/styled'; +import { TextField, Button, Typography } from '@wso2/ui-toolkit'; +import { UnifiedTool, SequenceTool } from '@wso2/mi-core'; +import { convertToJsonSchema } from './utils'; + +const ToolItem = styled.div` + display: flex; + align-items: center; + gap: 8px; + padding: 8px; + background: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 3px; +`; + +const ToolInfo = styled.div` + display: flex; + flex-direction: column; + gap: 2px; + flex: 1; +`; + +const InlineEditContainer = styled.div` + display: flex; + flex-direction: column; + gap: 6px; + flex: 1; +`; + +const InlineInput = styled.input` + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 3px; + padding: 4px 6px; + font-size: 12px; + width: 100%; + box-sizing: border-box; + &:focus { outline: 1px solid var(--vscode-focusBorder); border-color: var(--vscode-focusBorder); } +`; + +const InlineTextarea = styled.textarea` + background: var(--vscode-input-background); + color: var(--vscode-input-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 3px; + padding: 4px 6px; + font-size: 12px; + width: 100%; + box-sizing: border-box; + resize: vertical; + min-height: 48px; + font-family: inherit; + &:focus { outline: 1px solid var(--vscode-focusBorder); border-color: var(--vscode-focusBorder); } +`; + +const InlineEditActions = styled.div` + display: flex; + gap: 6px; + justify-content: flex-end; +`; + +const ToolsList = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 10px; +`; + +interface ToolsListProps { + tools: UnifiedTool[]; + onEdit: (tool: UnifiedTool) => void; + onRemove: (toolId: string) => void; + onSave: (updatedTools: UnifiedTool[]) => void; + onGoToSource: (tool: UnifiedTool) => void; +} + +export function ToolsListComponent({ + tools, + onEdit, + onRemove, + onSave, + onGoToSource, +}: ToolsListProps) { + const [editingToolId, setEditingToolId] = useState(null); + const [editToolName, setEditToolName] = useState(''); + const [editToolDescription, setEditToolDescription] = useState(''); + const [editToolInputSchema, setEditToolInputSchema] = useState(''); + + const startEdit = (tool: UnifiedTool) => { + setEditingToolId(tool.id); + setEditToolName(tool.name); + setEditToolDescription(tool.description); + setEditToolInputSchema(tool.kind === 'sequence' ? tool.inputSchema : ''); + }; + + const saveEdit = () => { + const updatedTools = tools.map(t => { + if (t.id !== editingToolId) return t; + const base = { ...t, name: editToolName.trim() || t.name, description: editToolDescription }; + if (t.kind === 'sequence') { + const normalizedSchema = editToolInputSchema.trim() ? convertToJsonSchema(editToolInputSchema) : null; + return { ...base, inputSchema: normalizedSchema || t.inputSchema }; + } + return base; + }); + onSave(updatedTools); + setEditingToolId(null); + }; + + const cancelEdit = () => { + setEditingToolId(null); + }; + + return ( + + {tools.map(tool => ( + editingToolId !== tool.id && onGoToSource(tool)} + title={tool.kind === 'api' ? `Open API: ${tool.apiName}` : `Open sequence: ${tool.sequenceName}`} + > + {editingToolId === tool.id ? ( + <> + + setEditToolName(e.target.value)} + placeholder="Tool name" + aria-label="Tool name" + /> + setEditToolDescription(e.target.value)} + placeholder="Tool description" + aria-label="Tool description" + /> + {tool.kind === 'sequence' && ( + setEditToolInputSchema(e.target.value)} + placeholder='Input schema (JSON), e.g. {"type":"object","properties":{}}' + aria-label="Input schema" + style={{ minHeight: '72px', fontFamily: 'monospace' }} + /> + )} + + + + + + + ) : ( + <> + + {tool.name} + {tool.description && ( + {tool.description} + )} + + {tool.kind === 'api' ? ( + + {tool.operationMethod} {tool.operationPath} ({tool.apiName}) + + ) : ( + + SEQUENCE · {tool.sequenceName} + + )} + + + + )} + + ))} + + ); +} From 82f4d1425379cb2a04e66b42fc406c7cfb36986c Mon Sep 17 00:00:00 2001 From: dulavinya Date: Sun, 10 May 2026 07:51:52 +0530 Subject: [PATCH 060/114] Fixed issue when editing a mcp tool --- .../src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index b5e33ef58af..fd75379abb4 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -780,7 +780,10 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) tools={tools} onEdit={() => {}} onRemove={removeTool} - onSave={saveToolsToLocalEntry} + onSave={(updatedTools) => { + setTools(updatedTools); + saveToolsToLocalEntry(updatedTools); + }} onGoToSource={goToToolSource} /> )} From a457d92c9effdbbf7d98b5ffc27bdbf0243e4136 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Sun, 10 May 2026 10:32:29 +0530 Subject: [PATCH 061/114] Moved MCP utilities from the visualizer to the extension --- .../mi-core/src/rpc-types/mi-diagram/index.ts | 23 + .../src/rpc-types/mi-diagram/rpc-type.ts | 23 + .../mi-core/src/rpc-types/mi-diagram/types.ts | 77 +++ .../rpc-managers/mi-diagram/rpc-handler.ts | 23 + .../rpc-managers/mi-diagram/rpc-manager.ts | 114 +++++ .../mi-extension/src/util/mcp-server-utils.ts | 439 ++++++++++++++++++ .../src/rpc-clients/mi-diagram/rpc-client.ts | 55 +++ .../MCPServerForm/AddSequenceToolDialog.tsx | 18 +- .../MCPServerForm/CreateScratchToolDialog.tsx | 13 +- .../MCPServerForm/MCPServerToolsForm.tsx | 212 +++------ .../views/Forms/MCPServerForm/ToolsList.tsx | 9 +- .../src/views/Forms/MCPServerForm/index.tsx | 31 +- .../src/views/Forms/MCPServerForm/utils.ts | 280 ----------- 13 files changed, 844 insertions(+), 473 deletions(-) create mode 100644 workspaces/mi/mi-extension/src/util/mcp-server-utils.ts delete mode 100644 workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts index dbef0779162..2b9353e1601 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts @@ -267,6 +267,21 @@ import { ConfigureKubernetesResponse, UpdateRegistryPropertyRequest, Property, + GetMcpUsedInboundPortsRequest, + GetMcpUsedInboundPortsResponse, + GetMcpServerProjectArtifactsRequest, + GetMcpServerProjectArtifactsResponse, + GetMcpServerEditDataRequest, + GetMcpServerEditDataResponse, + BuildMcpToolsXmlRequest, + BuildMcpToolsXmlResponse, + UpdateMcpInboundEndpointCorsRequest, + UpdateMcpInboundEndpointCorsResponse, + CleanMcpToolNamesRequest, + CleanMcpToolNamesResponse, + ConvertMcpJsonSchemaRequest, + ConvertMcpJsonSchemaResponse, + GetMcpInboundListenerClassResponse, GenerateMappingsParamsRequest, ProjectCreationStatusResponse, LoadDriverAndTestConnectionRequest, @@ -476,6 +491,14 @@ export interface MiDiagramAPI { resetConnectorDependencyOverrides: (params: ResetConnectorDependencyOverridesRequest) => Promise; updateConnectorFlags: (params: UpdateConnectorFlagsRequest) => Promise; updateGlobalConnectorFlags: (params: UpdateGlobalConnectorFlagsRequest) => Promise; + getMcpUsedInboundPorts: (params: GetMcpUsedInboundPortsRequest) => Promise; + getMcpServerProjectArtifacts: (params: GetMcpServerProjectArtifactsRequest) => Promise; + getMcpServerEditData: (params: GetMcpServerEditDataRequest) => Promise; + buildMcpToolsXml: (params: BuildMcpToolsXmlRequest) => Promise; + updateMcpInboundEndpointCors: (params: UpdateMcpInboundEndpointCorsRequest) => Promise; + cleanMcpToolNames: (params: CleanMcpToolNamesRequest) => Promise; + convertMcpJsonSchema: (params: ConvertMcpJsonSchemaRequest) => Promise; + getMcpInboundListenerClass: () => Promise; } // Re-export LS-only types (consumed by the extension's LS client; not part of MiDiagramAPI). diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts index 80a497e8897..9402b78fb61 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts @@ -225,6 +225,21 @@ import { GetMediatorResponse, McpToolsRequest, McpToolsResponse, + GetMcpUsedInboundPortsRequest, + GetMcpUsedInboundPortsResponse, + GetMcpServerProjectArtifactsRequest, + GetMcpServerProjectArtifactsResponse, + GetMcpServerEditDataRequest, + GetMcpServerEditDataResponse, + BuildMcpToolsXmlRequest, + BuildMcpToolsXmlResponse, + UpdateMcpInboundEndpointCorsRequest, + UpdateMcpInboundEndpointCorsResponse, + CleanMcpToolNamesRequest, + CleanMcpToolNamesResponse, + ConvertMcpJsonSchemaRequest, + ConvertMcpJsonSchemaResponse, + GetMcpInboundListenerClassResponse, UpdateMediatorRequest, ExpressionCompletionsRequest, ExpressionCompletionsResponse, @@ -486,3 +501,11 @@ export const updateConnectorDependencyOverride: RequestType = { method: `${_preFix}/resetConnectorDependencyOverrides` }; export const updateConnectorFlags: RequestType = { method: `${_preFix}/updateConnectorFlags` }; export const updateGlobalConnectorFlags: RequestType = { method: `${_preFix}/updateGlobalConnectorFlags` }; +export const getMcpUsedInboundPorts: RequestType = { method: `${_preFix}/getMcpUsedInboundPorts` }; +export const getMcpServerProjectArtifacts: RequestType = { method: `${_preFix}/getMcpServerProjectArtifacts` }; +export const getMcpServerEditData: RequestType = { method: `${_preFix}/getMcpServerEditData` }; +export const buildMcpToolsXml: RequestType = { method: `${_preFix}/buildMcpToolsXml` }; +export const updateMcpInboundEndpointCors: RequestType = { method: `${_preFix}/updateMcpInboundEndpointCors` }; +export const cleanMcpToolNames: RequestType = { method: `${_preFix}/cleanMcpToolNames` }; +export const convertMcpJsonSchema: RequestType = { method: `${_preFix}/convertMcpJsonSchema` }; +export const getMcpInboundListenerClass: RequestType = { method: `${_preFix}/getMcpInboundListenerClass` }; diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts index acf47b11129..999912ec139 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts @@ -20,6 +20,7 @@ import { DiagramService, Range, TagRange } from '@wso2/mi-syntax-tree/lib/src'; import { Diagnostic, Position, TextDocumentIdentifier, TextEdit } from "vscode-languageserver-types"; import { HelperPaneData } from '../../interfaces/mi-diagram'; +import { API, Sequence, UnifiedTool } from '../mi-visualizer/types'; interface Record { name: string; @@ -2484,3 +2485,79 @@ export interface UpdateGlobalConnectorFlagsRequest { omitAllDrivers?: boolean; omitAllConnectors?: boolean; } + +// MCP Server Form helpers +export interface McpServerCorsSettings { + corsAllowOrigin: string; + corsAllowMethods: string; + corsAllowHeaders: string; + corsExposeHeaders: string; + keepAliveInterval: number; +} + +export interface GetMcpUsedInboundPortsRequest { + projectUri: string; + excludePath?: string; +} + +export interface GetMcpUsedInboundPortsResponse { + ports: number[]; +} + +export interface GetMcpServerProjectArtifactsRequest { + projectUri: string; +} + +export interface GetMcpServerProjectArtifactsResponse { + apis: API[]; + sequences: Sequence[]; +} + +export interface GetMcpServerEditDataRequest { + localEntryPath?: string; + inboundEndpointPath?: string; +} + +export interface GetMcpServerEditDataResponse { + tools: UnifiedTool[]; + port: number | null; + corsSettings: McpServerCorsSettings; +} + +export interface BuildMcpToolsXmlRequest { + projectRoot: string; + tools: UnifiedTool[]; +} + +export interface BuildMcpToolsXmlResponse { + xml: string; +} + +export interface UpdateMcpInboundEndpointCorsRequest { + inboundEndpointPath: string; + corsSettings: McpServerCorsSettings; +} + +export interface UpdateMcpInboundEndpointCorsResponse { + success: boolean; +} + +export interface CleanMcpToolNamesRequest { + paths: string[]; +} + +export interface CleanMcpToolNamesResponse { + names: string[]; +} + +export interface ConvertMcpJsonSchemaRequest { + input: string; +} + +export interface ConvertMcpJsonSchemaResponse { + schema: string | null; +} + +export interface GetMcpInboundListenerClassResponse { + className: string; +} diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts index bd69433f1c6..7767eb8d765 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts @@ -348,6 +348,21 @@ import { UpdateConnectorFlagsRequest, updateGlobalConnectorFlags, UpdateGlobalConnectorFlagsRequest, + getMcpUsedInboundPorts, + GetMcpUsedInboundPortsRequest, + getMcpServerProjectArtifacts, + GetMcpServerProjectArtifactsRequest, + getMcpServerEditData, + GetMcpServerEditDataRequest, + buildMcpToolsXml, + BuildMcpToolsXmlRequest, + updateMcpInboundEndpointCors, + UpdateMcpInboundEndpointCorsRequest, + cleanMcpToolNames, + CleanMcpToolNamesRequest, + convertMcpJsonSchema, + ConvertMcpJsonSchemaRequest, + getMcpInboundListenerClass, // getBackendRootUrl - REMOVED: Backend URLs deprecated, all AI features use local LLM } from "@wso2/mi-core"; import { Messenger } from "vscode-messenger"; @@ -549,4 +564,12 @@ export function registerMiDiagramRpcHandlers(messenger: Messenger, projectUri: s messenger.onRequest(resetConnectorDependencyOverrides, (args: ResetConnectorDependencyOverridesRequest) => rpcManger.resetConnectorDependencyOverrides(args)); messenger.onRequest(updateConnectorFlags, (args: UpdateConnectorFlagsRequest) => rpcManger.updateConnectorFlags(args)); messenger.onRequest(updateGlobalConnectorFlags, (args: UpdateGlobalConnectorFlagsRequest) => rpcManger.updateGlobalConnectorFlags(args)); + messenger.onRequest(getMcpUsedInboundPorts, (args: GetMcpUsedInboundPortsRequest) => rpcManger.getMcpUsedInboundPorts(args)); + messenger.onRequest(getMcpServerProjectArtifacts, (args: GetMcpServerProjectArtifactsRequest) => rpcManger.getMcpServerProjectArtifacts(args)); + messenger.onRequest(getMcpServerEditData, (args: GetMcpServerEditDataRequest) => rpcManger.getMcpServerEditData(args)); + messenger.onRequest(buildMcpToolsXml, (args: BuildMcpToolsXmlRequest) => rpcManger.buildMcpToolsXml(args)); + messenger.onRequest(updateMcpInboundEndpointCors, (args: UpdateMcpInboundEndpointCorsRequest) => rpcManger.updateMcpInboundEndpointCors(args)); + messenger.onRequest(cleanMcpToolNames, (args: CleanMcpToolNamesRequest) => rpcManger.cleanMcpToolNames(args)); + messenger.onRequest(convertMcpJsonSchema, (args: ConvertMcpJsonSchemaRequest) => rpcManger.convertMcpJsonSchema(args)); + messenger.onRequest(getMcpInboundListenerClass, () => rpcManger.getMcpInboundListenerClass()); } diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts index 2934ca977a9..e2e9d9a1b5f 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts @@ -138,6 +138,23 @@ import { GetMediatorsResponse, McpToolsRequest, McpToolsResponse, + GetMcpUsedInboundPortsRequest, + GetMcpUsedInboundPortsResponse, + GetMcpServerProjectArtifactsRequest, + GetMcpServerProjectArtifactsResponse, + GetMcpServerEditDataRequest, + GetMcpServerEditDataResponse, + BuildMcpToolsXmlRequest, + BuildMcpToolsXmlResponse, + UpdateMcpInboundEndpointCorsRequest, + UpdateMcpInboundEndpointCorsResponse, + CleanMcpToolNamesRequest, + CleanMcpToolNamesResponse, + ConvertMcpJsonSchemaRequest, + ConvertMcpJsonSchemaResponse, + GetMcpInboundListenerClassResponse, + APITool, + UnifiedTool, GetMessageStoreRequest, GetMessageStoreResponse, GetProjectRootRequest, @@ -368,6 +385,19 @@ import { parseStringPromise, Builder } from "xml2js"; import { MILanguageClient } from "../../lang-client/activator"; import { addWSO2AIConfigProperties } from "../../ai-features/configUtils"; import { reorderModulesByBuildOrder, updatePomModules } from "../../debugger/pomResolver"; +import { + MCP_INBOUND_LISTENER_CLASS, + applyCorsParametersToInboundEndpointXml, + buildInputSchemasForAPITools, + cleanPathForToolName, + convertToJsonSchema, + generateToolsXml, + getUsedInboundPorts, + parseApisFromProjectStructure, + parseInboundEndpointConfig, + parseSequencesFromProjectStructure, + parseToolsFromXML, +} from "../../util/mcp-server-utils"; const AdmZip = require('adm-zip'); const { XMLParser, XMLBuilder } = require("fast-xml-parser"); @@ -6650,6 +6680,90 @@ ${keyValuesXML}`; resolve(res); }); } + + async getMcpUsedInboundPorts(params: GetMcpUsedInboundPortsRequest): Promise { + const langClient = await MILanguageClient.getInstance(this.projectUri); + const projectStructure = await langClient.getProjectStructure(params.projectUri); + const artifacts: any = (projectStructure as any)?.directoryMap?.src?.main?.wso2mi?.artifacts; + const inboundEndpoints: Array<{ path: string }> = artifacts?.inboundEndpoints || []; + const mcpServers: Array<{ inboundEndpoint?: { path: string } }> = artifacts?.mcpServers || []; + const allEndpointPaths = [ + ...inboundEndpoints.map(ep => ep.path), + ...mcpServers.filter(m => m.inboundEndpoint?.path).map(m => m.inboundEndpoint!.path), + ]; + const ports = await getUsedInboundPorts(allEndpointPaths, params.excludePath); + return { ports }; + } + + async getMcpServerProjectArtifacts(params: GetMcpServerProjectArtifactsRequest): Promise { + const langClient = await MILanguageClient.getInstance(this.projectUri); + const projectStructure = await langClient.getProjectStructure(params.projectUri); + return { + apis: parseApisFromProjectStructure(projectStructure), + sequences: parseSequencesFromProjectStructure(projectStructure), + }; + } + + async getMcpServerEditData(params: GetMcpServerEditDataRequest): Promise { + const defaultCors = { + corsAllowOrigin: "*", + corsAllowMethods: "GET, POST, OPTIONS", + corsAllowHeaders: "Content-Type, Mcp-Session-Id", + corsExposeHeaders: "Mcp-Session-Id", + keepAliveInterval: 30000, + }; + let tools: UnifiedTool[] = []; + if (params.localEntryPath && fs.existsSync(params.localEntryPath)) { + const content = fs.readFileSync(params.localEntryPath, "utf8"); + tools = parseToolsFromXML(content); + } + let port: number | null = null; + let corsSettings = defaultCors; + if (params.inboundEndpointPath && fs.existsSync(params.inboundEndpointPath)) { + const content = fs.readFileSync(params.inboundEndpointPath, "utf8"); + const cfg = parseInboundEndpointConfig(content); + port = cfg.port; + corsSettings = { + corsAllowOrigin: cfg.corsAllowOrigin, + corsAllowMethods: cfg.corsAllowMethods, + corsAllowHeaders: cfg.corsAllowHeaders, + corsExposeHeaders: cfg.corsExposeHeaders, + keepAliveInterval: cfg.keepAliveInterval, + }; + } + return { tools, port, corsSettings }; + } + + async buildMcpToolsXml(params: BuildMcpToolsXmlRequest): Promise { + const apiTools = params.tools.filter((t): t is APITool => t.kind === "api"); + const apiDefDir = path.join(params.projectRoot, "src", "main", "wso2mi", "resources", "api-definitions"); + const inputSchemas = await buildInputSchemasForAPITools(apiTools, apiDefDir); + return { xml: generateToolsXml(params.tools, inputSchemas) }; + } + + async updateMcpInboundEndpointCors(params: UpdateMcpInboundEndpointCorsRequest): Promise { + try { + if (!fs.existsSync(params.inboundEndpointPath)) return { success: false }; + const original = fs.readFileSync(params.inboundEndpointPath, "utf8"); + const updated = applyCorsParametersToInboundEndpointXml(original, params.corsSettings); + await replaceFullContentToFile(params.inboundEndpointPath, updated); + return { success: true }; + } catch { + return { success: false }; + } + } + + async cleanMcpToolNames(params: CleanMcpToolNamesRequest): Promise { + return { names: params.paths.map(p => cleanPathForToolName(p)) }; + } + + async convertMcpJsonSchema(params: ConvertMcpJsonSchemaRequest): Promise { + return { schema: convertToJsonSchema(params.input) }; + } + + async getMcpInboundListenerClass(): Promise { + return { className: MCP_INBOUND_LISTENER_CLASS }; + } } async function exposeVersionedServices(projectUri: string): Promise { diff --git a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts new file mode 100644 index 00000000000..efc57fdbb35 --- /dev/null +++ b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts @@ -0,0 +1,439 @@ +/** + * 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 as parseYaml } from "yaml"; +import { + API, + APIOperation, + APITool, + Sequence, + UnifiedTool, +} from "@wso2/mi-core"; + +const { XMLParser } = require("fast-xml-parser"); + +const xmlParserOptions = { + ignoreAttributes: false, + allowBooleanAttributes: true, + attributeNamePrefix: "@_", + parseTagValue: false, + parseAttributeValue: false, + trimValues: true, +}; + +export const MCP_INBOUND_LISTENER_CLASS = "org.wso2.carbon.inbound.SSE.McpInboundListener"; + +export function cleanPathForToolName(pathStr: string): string { + return pathStr + .replace(/[{}]/g, "") + .replace(/[^a-zA-Z0-9]/g, "_") + .replace(/_{2,}/g, "_") + .replace(/^_+|_+$/g, ""); +} + +export function convertToJsonSchema(input: string): string | null { + if (!input.trim()) return null; + try { + const sanitized = input.replace(/:\s*(string|number|integer|boolean|array|object|null)\b/g, ': "$1"'); + const parsed = JSON.parse(sanitized); + if (parsed.type || parsed.properties) return JSON.stringify(parsed); + const properties: Record = {}; + for (const [k, v] of Object.entries(parsed)) properties[k] = { type: v as string }; + return JSON.stringify({ type: "object", properties, additionalProperties: false }); + } catch { + return null; + } +} + +export function extractInputSchema(spec: any, method: string, operationPath: string): object { + const pathItem = spec?.paths?.[operationPath]; + if (!pathItem) return { type: "object", properties: {}, additionalProperties: false }; + const operation = pathItem[method.toLowerCase()]; + if (!operation) return { type: "object", properties: {}, additionalProperties: false }; + + const properties: Record = {}; + const required: string[] = []; + + if (Array.isArray(operation.parameters)) { + for (const param of operation.parameters) { + if ((param.in === "path" || param.in === "query") && param.name && param.schema) { + properties[param.name] = { ...param.schema, ...(param.description ? { description: param.description } : {}) }; + if (param.required) required.push(param.name); + } + } + } + + const bodySchema = operation.requestBody?.content?.["application/json"]?.schema; + if (bodySchema?.properties) { + for (const [key, value] of Object.entries(bodySchema.properties)) { + properties[key] = value; + } + if (Array.isArray(bodySchema.required)) required.push(...bodySchema.required); + } + + const schema: any = { type: "object", properties, additionalProperties: false }; + if (required.length > 0) schema.required = required; + return schema; +} + +function asArray(value: T | T[] | undefined): T[] { + if (value === undefined || value === null) return []; + return Array.isArray(value) ? value : [value]; +} + +function findFirstChild(obj: any, key: string): any { + if (!obj || typeof obj !== "object") return undefined; + if (obj[key] !== undefined) return obj[key]; + for (const k of Object.keys(obj)) { + const v = obj[k]; + if (v && typeof v === "object") { + const found = findFirstChild(v, key); + if (found !== undefined) return found; + } + } + return undefined; +} + +function collectToolNodes(node: any): any[] { + if (!node || typeof node !== "object") return []; + const tools: any[] = []; + if (node.tool !== undefined) { + tools.push(...asArray(node.tool)); + } + for (const key of Object.keys(node)) { + if (key === "tool") continue; + const v = node[key]; + if (v && typeof v === "object") { + tools.push(...collectToolNodes(v)); + } + } + return tools; +} + +function textOf(value: any): string { + if (value === undefined || value === null) return ""; + if (typeof value === "string") return value.trim(); + if (typeof value === "object") { + if (typeof value["#text"] === "string") return value["#text"].trim(); + } + return String(value).trim(); +} + +function newId(): string { + if (typeof (globalThis as any).crypto?.randomUUID === "function") { + return (globalThis as any).crypto.randomUUID(); + } + return require("crypto").randomUUID(); +} + +export function parseToolsFromXML(xmlContent: string): UnifiedTool[] { + try { + const parser = new XMLParser(xmlParserOptions); + const doc = parser.parse(xmlContent); + const toolNodes = collectToolNodes(doc); + + return toolNodes.map((toolEl: any): UnifiedTool => { + const name = toolEl["@_name"] ?? ""; + const description = textOf(toolEl.description); + const seq = toolEl.sequence; + const apiNode = toolEl.api; + + if (seq !== undefined) { + return { + kind: "sequence", + id: newId(), + name, + description, + sequenceName: textOf(seq), + sequenceXmlPath: "", + inputSchema: textOf(toolEl.inputSchema) + || '{"type":"object","properties":{},"additionalProperties":false}', + }; + } + const method = textOf(toolEl.method); + const resource = textOf(toolEl.resource); + const apiName = textOf(apiNode); + const existingSchema = textOf(toolEl.inputSchema); + return { + kind: "api", + id: newId(), + name, + description, + apiId: apiName, + apiName, + apiVersion: "1.0.0", + apiRawVersion: "", + apiXmlPath: "", + operationId: `${method}_${resource}`.replace(/[^a-zA-Z0-9_]/g, "_"), + operationMethod: method, + operationPath: resource, + operationSummary: description, + inputSchema: existingSchema || undefined, + }; + }); + } catch { + return []; + } +} + +export function parsePortFromInboundEndpoint(xmlContent: string): number | null { + try { + const parser = new XMLParser(xmlParserOptions); + const doc = parser.parse(xmlContent); + const params = asArray(doc?.inboundEndpoint?.parameters?.parameter); + for (const param of params) { + const pname = param?.["@_name"]; + if (pname === "inbound.mcp.port" || pname === "inbound.http.port") { + const raw = textOf(param); + const val = parseInt(raw, 10); + if (!isNaN(val)) return val; + } + } + } catch { /* fallthrough */ } + return null; +} + +export interface McpInboundEndpointConfig { + port: number | null; + corsAllowOrigin: string; + corsAllowMethods: string; + corsAllowHeaders: string; + corsExposeHeaders: string; + keepAliveInterval: number; +} + +export function parseInboundEndpointConfig(xmlContent: string): McpInboundEndpointConfig { + const defaults: McpInboundEndpointConfig = { + port: null, + corsAllowOrigin: "*", + corsAllowMethods: "GET, POST, OPTIONS", + corsAllowHeaders: "Content-Type, Mcp-Session-Id", + corsExposeHeaders: "Mcp-Session-Id", + keepAliveInterval: 30000, + }; + try { + const parser = new XMLParser(xmlParserOptions); + const doc = parser.parse(xmlContent); + const params = asArray(doc?.inboundEndpoint?.parameters?.parameter); + const byName: Record = {}; + for (const param of params) { + const pname = param?.["@_name"]; + if (typeof pname === "string") byName[pname] = textOf(param); + } + const portRaw = byName["inbound.mcp.port"] ?? byName["inbound.http.port"]; + const port = portRaw ? parseInt(portRaw, 10) : NaN; + return { + port: isNaN(port) ? null : port, + corsAllowOrigin: byName["inbound.cors.allow.origin"] || defaults.corsAllowOrigin, + corsAllowMethods: byName["inbound.cors.allow.methods"] || defaults.corsAllowMethods, + corsAllowHeaders: byName["inbound.cors.allow.headers"] || defaults.corsAllowHeaders, + corsExposeHeaders: byName["inbound.cors.expose.headers"] || defaults.corsExposeHeaders, + keepAliveInterval: parseInt(byName["inbound.sse.keepalive.interval"] || `${defaults.keepAliveInterval}`, 10) || defaults.keepAliveInterval, + }; + } catch { + return defaults; + } +} + +export async function getUsedInboundPorts( + inboundEndpointPaths: string[], + excludePath?: string +): Promise { + const usedPorts = new Set(); + for (const epPath of inboundEndpointPaths) { + if (excludePath && epPath === excludePath) continue; + try { + if (!fs.existsSync(epPath)) continue; + const content = fs.readFileSync(epPath, "utf8"); + const port = parsePortFromInboundEndpoint(content); + if (port !== null) usedPorts.add(port); + } catch { /* ignore unreadable */ } + } + return Array.from(usedPorts); +} + +export function generateToolsXml(tools: UnifiedTool[], inputSchemas: Record): string { + let toolsXml = ""; + + tools.forEach(tool => { + if (tool.kind === "api") { + const derived = inputSchemas[tool.id]; + const isEmpty = !derived || (Object.keys((derived as any).properties ?? {}).length === 0 && !(derived as any).required); + const inputSchema = (!isEmpty ? derived : null) + ?? (tool.inputSchema ? JSON.parse(tool.inputSchema) : null) + ?? { type: "object", properties: {} }; + const description = tool.description || tool.operationSummary + || `${tool.operationMethod} ${tool.operationPath} - ${tool.apiName}`; + toolsXml += ` + + ${tool.apiName} + ${tool.operationPath} + ${tool.operationMethod} + ${description} + ${JSON.stringify(inputSchema)} + `; + } else { + toolsXml += ` + + ${tool.sequenceName} + ${tool.description || tool.sequenceName} + ${tool.inputSchema} + `; + } + }); + + return ` + ${toolsXml} + `; +} + +export async function buildInputSchemasForAPITools( + tools: APITool[], + apiDefDir: string +): Promise> { + const inputSchemas: Record = {}; + + const readYamlSpec = (filePath: string): any => { + try { + if (!fs.existsSync(filePath)) return null; + const content = fs.readFileSync(filePath, "utf8"); + return content ? parseYaml(content) : null; + } catch { + return null; + } + }; + + for (const tool of tools) { + const rawVersion = tool.apiRawVersion || ""; + const xmlBaseName = tool.apiXmlPath + ? path.basename(tool.apiXmlPath, path.extname(tool.apiXmlPath)) + : tool.apiName; + + const baseNames = Array.from(new Set([xmlBaseName, tool.apiName])); + const candidates = baseNames + .flatMap(base => [ + ...(rawVersion ? [`${base}_v${rawVersion}.yaml`] : []), + `${base}.yaml`, + ]) + .map(f => path.join(apiDefDir, f)); + + let spec: any = null; + for (const candidate of candidates) { + spec = readYamlSpec(candidate); + if (spec !== null) break; + } + + inputSchemas[tool.id] = spec + ? extractInputSchema(spec, tool.operationMethod, tool.operationPath) + : { type: "object", properties: {}, additionalProperties: false }; + } + + return inputSchemas; +} + +export const artifactParserConfig = { + apis: { + pathInStructure: (structure: any) => structure?.directoryMap?.src?.main?.wso2mi?.artifacts?.apis || [], + parseFields: { + id: (art: Record) => art.name || art.id || art.fileName || "", + name: (art: Record) => art.name || art.id || art.fileName || "", + context: (art: Record) => art.context || `/${art.name || art.id || ""}`, + version: (art: Record) => art.version || "1.0.0", + rawVersion: (art: Record) => art.version ?? "", + xmlPath: (art: Record) => art.path || "", + }, + parseOperations: (art: Record): APIOperation[] => { + const operations: APIOperation[] = []; + if (art.resources && Array.isArray(art.resources)) { + for (const res of art.resources) { + const methods = Array.isArray(res.methods) + ? res.methods + : typeof res.methods === "string" + ? res.methods.split(",") + : []; + const uri = res.path || res.uri || res["uri-template"] || res.uriTemplate || ""; + for (const m of methods) { + const method = String(m).toUpperCase(); + operations.push({ + id: `${method}_${uri}`.replace(/[^a-zA-Z0-9_]/g, "_"), + method, + path: uri, + summary: res.summary || "", + }); + } + } + } + return operations; + }, + }, +}; + +export function parseApisFromProjectStructure(projectStructure: any): API[] { + const apiArtifacts: any[] = artifactParserConfig.apis.pathInStructure(projectStructure); + return apiArtifacts.map((art: Record) => ({ + id: artifactParserConfig.apis.parseFields.id(art), + name: artifactParserConfig.apis.parseFields.name(art), + context: artifactParserConfig.apis.parseFields.context(art), + version: artifactParserConfig.apis.parseFields.version(art), + rawVersion: artifactParserConfig.apis.parseFields.rawVersion(art), + xmlPath: artifactParserConfig.apis.parseFields.xmlPath(art), + operations: artifactParserConfig.apis.parseOperations(art), + })); +} + +export function parseSequencesFromProjectStructure(projectStructure: any): Sequence[] { + const seqArtifacts: any[] = + projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts?.sequences || []; + return seqArtifacts + .map((art: any) => ({ + id: art.name || art.id || art.fileName || "", + name: art.name || art.id || art.fileName || "", + xmlPath: art.path || "", + })) + .filter((s: Sequence) => s.id !== ""); +} + +export function applyCorsParametersToInboundEndpointXml( + xmlContent: string, + corsSettings: { + corsAllowOrigin: string; + corsAllowMethods: string; + corsAllowHeaders: string; + corsExposeHeaders: string; + keepAliveInterval: number; + } +): string { + let xml = xmlContent; + const updateParam = (paramName: string, paramValue: string) => { + const paramRegex = new RegExp(`]*>[^<]*`, "g"); + const newParam = `${paramValue}`; + if (paramRegex.test(xml)) { + xml = xml.replace(paramRegex, newParam); + } else { + xml = xml.replace("", ` ${newParam}\n `); + } + }; + updateParam("inbound.cors.allow.origin", corsSettings.corsAllowOrigin); + updateParam("inbound.cors.allow.methods", corsSettings.corsAllowMethods); + updateParam("inbound.cors.allow.headers", corsSettings.corsAllowHeaders); + updateParam("inbound.cors.expose.headers", corsSettings.corsExposeHeaders); + updateParam("inbound.sse.keepalive.interval", String(corsSettings.keepAliveInterval)); + return xml; +} diff --git a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts index 1c5f12c7603..2165298cf38 100644 --- a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts +++ b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts @@ -482,6 +482,29 @@ import { resetConnectorDependencyOverrides, updateConnectorFlags, updateGlobalConnectorFlags, + getMcpUsedInboundPorts, + GetMcpUsedInboundPortsRequest, + GetMcpUsedInboundPortsResponse, + getMcpServerProjectArtifacts, + GetMcpServerProjectArtifactsRequest, + GetMcpServerProjectArtifactsResponse, + getMcpServerEditData, + GetMcpServerEditDataRequest, + GetMcpServerEditDataResponse, + buildMcpToolsXml, + BuildMcpToolsXmlRequest, + BuildMcpToolsXmlResponse, + updateMcpInboundEndpointCors, + UpdateMcpInboundEndpointCorsRequest, + UpdateMcpInboundEndpointCorsResponse, + cleanMcpToolNames, + CleanMcpToolNamesRequest, + CleanMcpToolNamesResponse, + convertMcpJsonSchema, + ConvertMcpJsonSchemaRequest, + ConvertMcpJsonSchemaResponse, + getMcpInboundListenerClass, + GetMcpInboundListenerClassResponse, } from "@wso2/mi-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -1270,4 +1293,36 @@ export class MiDiagramRpcClient implements MiDiagramAPI { async updateGlobalConnectorFlags(params: UpdateGlobalConnectorFlagsRequest): Promise { return this._messenger.sendRequest(updateGlobalConnectorFlags, HOST_EXTENSION, params); } + + async getMcpUsedInboundPorts(params: GetMcpUsedInboundPortsRequest): Promise { + return this._messenger.sendRequest(getMcpUsedInboundPorts, HOST_EXTENSION, params); + } + + async getMcpServerProjectArtifacts(params: GetMcpServerProjectArtifactsRequest): Promise { + return this._messenger.sendRequest(getMcpServerProjectArtifacts, HOST_EXTENSION, params); + } + + async getMcpServerEditData(params: GetMcpServerEditDataRequest): Promise { + return this._messenger.sendRequest(getMcpServerEditData, HOST_EXTENSION, params); + } + + async buildMcpToolsXml(params: BuildMcpToolsXmlRequest): Promise { + return this._messenger.sendRequest(buildMcpToolsXml, HOST_EXTENSION, params); + } + + async updateMcpInboundEndpointCors(params: UpdateMcpInboundEndpointCorsRequest): Promise { + return this._messenger.sendRequest(updateMcpInboundEndpointCors, HOST_EXTENSION, params); + } + + async cleanMcpToolNames(params: CleanMcpToolNamesRequest): Promise { + return this._messenger.sendRequest(cleanMcpToolNames, HOST_EXTENSION, params); + } + + async convertMcpJsonSchema(params: ConvertMcpJsonSchemaRequest): Promise { + return this._messenger.sendRequest(convertMcpJsonSchema, HOST_EXTENSION, params); + } + + async getMcpInboundListenerClass(): Promise { + return this._messenger.sendRequest(getMcpInboundListenerClass, HOST_EXTENSION, undefined); + } } diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx index 5268d4760da..3d235c386ca 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx @@ -19,7 +19,6 @@ import { ChangeEvent, useRef, useState } from 'react'; import styled from '@emotion/styled'; import { Button, Typography } from '@wso2/ui-toolkit'; -import { convertToJsonSchema } from './utils'; import { Sequence } from '@wso2/mi-core'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, CustomInput, SelectAllRow, FlexRow, FlexRowStart, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, SchemaTextarea, DialogTitle } from './dialogStyles'; @@ -100,12 +99,13 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } setSelectedIds(selectedIds.size === sequences.length ? new Set() : new Set(sequences.map(s => s.id))); }; - const validateSchema = (id: string, value: string): boolean => { + const validateSchema = async (id: string, value: string): Promise => { if (!value.trim()) { setSchemaErrors(prev => { const n = { ...prev }; delete n[id]; return n; }); return true; } - if (convertToJsonSchema(value) === null) { + const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: value }); + if (schema === null) { setSchemaErrors(prev => ({ ...prev, [id]: 'Invalid JSON. Use shorthand like {"amount": number, "name": string} or full JSON Schema.' })); return false; } @@ -133,7 +133,7 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } e.target.value = ''; }; - const handleConfirm = () => { + const handleConfirm = async () => { if (selectedIds.size === 0) return; const hasSchemaErrors = Array.from(selectedIds).some(id => schemaErrors[id]); if (hasSchemaErrors) return; @@ -146,15 +146,19 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } return; } const emptySchema = JSON.stringify({ type: 'object', properties: {}, additionalProperties: false }); - const selected = Array.from(selectedIds).map(id => { + const ids = Array.from(selectedIds); + const selected = await Promise.all(ids.map(async id => { const raw = inputSchemas[id]?.trim() || ''; + const converted = raw + ? (await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: raw })).schema + : null; return { sequenceId: id, customName: customNames[id]?.trim() || id, description: customDescriptions[id]!.trim(), - inputSchema: (raw ? convertToJsonSchema(raw) : null) || emptySchema, + inputSchema: converted || emptySchema, }; - }); + })); onConfirm(selected); setSelectedIds(new Set()); setCustomNames({}); diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx index 646270c52f8..ef25c23c354 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx @@ -19,7 +19,6 @@ import { ChangeEvent, useRef, useState } from 'react'; import styled from '@emotion/styled'; import { Button, Typography } from '@wso2/ui-toolkit'; -import { convertToJsonSchema } from './utils'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, StdInput, SchemaTextarea, FlexRowStart, DialogTitle } from './dialogStyles'; @@ -127,9 +126,10 @@ export function CreateScratchToolDialog({ ? name.trim().toLowerCase().replace(/[^a-z0-9]/g, '_').replace(/_{2,}/g, '_').replace(/^_+|_+$/, '') + '_tool' : ''; - const validateSchema = (value: string): boolean => { + const validateSchema = async (value: string): Promise => { if (!value.trim()) { setSchemaError(''); return true; } - if (convertToJsonSchema(value) === null) { + const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: value }); + if (schema === null) { setSchemaError('Invalid JSON. Use shorthand like {"city": "string"} or full JSON Schema.'); return false; } @@ -155,17 +155,20 @@ export function CreateScratchToolDialog({ e.target.value = ''; }; - const handleConfirm = () => { + const handleConfirm = async () => { if (!name.trim() || nameError || schemaError) return; if (!description.trim()) { setDescriptionError('Description is required.'); return; } const emptySchema = JSON.stringify({ type: 'object', properties: {}, additionalProperties: false }); + const converted = inputSchema.trim() + ? (await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: inputSchema })).schema + : null; onConfirm({ name: name.trim(), description: description.trim(), - inputSchema: (inputSchema.trim() ? convertToJsonSchema(inputSchema) : null) || emptySchema, + inputSchema: converted || emptySchema, }); setName(''); setNameError(''); diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index fd75379abb4..9f4190e4c94 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -28,16 +28,6 @@ import { View, ViewContent, ViewHeader } from '../../../components/View'; import * as pathModule from 'path'; import { API, APITool, Sequence, SequenceTool, UnifiedTool } from '@wso2/mi-core'; -import { - artifactParserConfig, - buildInputSchemasForAPITools, - cleanPathForToolName, - generateToolsXml, - getUsedInboundPorts, - MCP_INBOUND_LISTENER_CLASS, - parsePortFromInboundEndpoint, - parseToolsFromXML, -} from './utils'; import AddAPIToolDialog from './AddAPIToolDialog'; import { AddSequenceToolDialog } from './AddSequenceToolDialog'; import { CreateScratchToolDialog, ScratchToolData } from './CreateScratchToolDialog'; @@ -178,36 +168,9 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) // Save CORS settings to inbound endpoint const saveCorsSettingsToEndpoint = async (inboundEndpointPath: string) => { try { - const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ - filePath: inboundEndpointPath, - }); - if (!resp.fileContent) return; - - let xmlContent = resp.fileContent; - - // Helper to update or create a parameter in XML string - const updateParamInXml = (xml: string, paramName: string, paramValue: string): string => { - const paramRegex = new RegExp(`]*>[^<]*`, 'g'); - const newParam = `${paramValue}`; - - if (paramRegex.test(xml)) { - return xml.replace(paramRegex, newParam); - } else { - return xml.replace('', ` ${newParam}\n `); - } - }; - - // Update all CORS parameters - xmlContent = updateParamInXml(xmlContent, 'inbound.cors.allow.origin', corsSettings.corsAllowOrigin); - xmlContent = updateParamInXml(xmlContent, 'inbound.cors.allow.methods', corsSettings.corsAllowMethods); - xmlContent = updateParamInXml(xmlContent, 'inbound.cors.allow.headers', corsSettings.corsAllowHeaders); - xmlContent = updateParamInXml(xmlContent, 'inbound.cors.expose.headers', corsSettings.corsExposeHeaders); - xmlContent = updateParamInXml(xmlContent, 'inbound.sse.keepalive.interval', String(corsSettings.keepAliveInterval)); - - // Open the file in the editor and write the updated content - await rpcClient.getMiDiagramRpcClient().openFile({ path: inboundEndpointPath }); - await rpcClient.getMiDiagramRpcClient().writeContentToFile({ - content: xmlContent.split('\n') + await rpcClient.getMiDiagramRpcClient().updateMcpInboundEndpointCors({ + inboundEndpointPath, + corsSettings, }); } catch (err) { console.error('Failed to save CORS settings:', err); @@ -228,17 +191,15 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) const projectRootResp = await rpcClient.getMiDiagramRpcClient().getProjectRoot({ path }); const projectDir = projectRootResp.path; const localEntriesDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'artifacts', 'local-entries').toString(); - const apiDefDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'resources', 'api-definitions').toString(); - const apiTools = toolsToSave.filter((t): t is APITool => t.kind === 'api'); - const inputSchemas = await buildInputSchemasForAPITools(apiTools, apiDefDir, async (filePath) => { - const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ filePath }); - return resp.fileContent ?? null; + const { xml } = await rpcClient.getMiDiagramRpcClient().buildMcpToolsXml({ + projectRoot: projectDir, + tools: toolsToSave, }); await rpcClient.getMiDiagramRpcClient().createLocalEntry({ directory: localEntriesDir, name: `${editData.serverName}-mcp-config`, type: 'In-Line XML Entry', - value: generateToolsXml(toolsToSave, inputSchemas), + value: xml, URL: '', getContentOnly: false, }); @@ -262,33 +223,9 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) projectUri = projectUri.substring(0, artifactsIndex).replace(/\/src\/main\/wso2mi$/, ''); } - const projectStructure = await rpcClient.getMiVisualizerRpcClient().getProjectStructure({ - documentUri: projectUri, - }); - - // Parse APIs - const apiArtifacts = artifactParserConfig.apis.pathInStructure(projectStructure); - const parsedAPIs: API[] = apiArtifacts.map((art: Record) => ({ - id: artifactParserConfig.apis.parseFields.id(art), - name: artifactParserConfig.apis.parseFields.name(art), - context: artifactParserConfig.apis.parseFields.context(art), - version: artifactParserConfig.apis.parseFields.version(art), - rawVersion: artifactParserConfig.apis.parseFields.rawVersion(art), - xmlPath: artifactParserConfig.apis.parseFields.xmlPath(art), - operations: artifactParserConfig.apis.parseOperations(art), - })); + const { apis: parsedAPIs, sequences: parsedSeqs } = + await rpcClient.getMiDiagramRpcClient().getMcpServerProjectArtifacts({ projectUri }); setApis(parsedAPIs); - - // Parse sequences - const seqArtifacts: any[] = - projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts?.sequences || []; - const parsedSeqs: Sequence[] = seqArtifacts - .map((art: any) => ({ - id: art.name || art.id || art.fileName || '', - name: art.name || art.id || art.fileName || '', - xmlPath: art.path || '', - })) - .filter(s => s.id !== ''); setSequences(parsedSeqs); // Helper function to derive inbound endpoint path from local entry path @@ -301,59 +238,25 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) }; // Collect used ports from all inbound endpoints (exclude current server in edit mode) - const inboundEPs: Array<{ path: string }> = - projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts?.inboundEndpoints || []; const currentInboundPath = isEditMode && editData?.localEntryPath ? deriveInboundEndpointPath(editData.localEntryPath) : undefined; - const ports = await getUsedInboundPorts( - inboundEPs.map(ep => ep.path), - async (filePath) => { - const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ filePath }); - return resp.fileContent ?? null; - }, - currentInboundPath - ); - setUsedPorts(ports); - - // Load existing tools from XML when editing - if (isEditMode && editData?.localEntryPath) { - const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ - filePath: editData.localEntryPath, - }); - if (resp.fileContent) { - setTools(parseToolsFromXML(resp.fileContent)); - } + const { ports } = await rpcClient.getMiDiagramRpcClient().getMcpUsedInboundPorts({ + projectUri, + excludePath: currentInboundPath, + }); + setUsedPorts(new Set(ports)); - // Read port and CORS settings from inbound endpoint + // Load existing tools, port, and CORS from artifacts when editing + if (isEditMode && editData?.localEntryPath) { const inboundPath = deriveInboundEndpointPath(editData.localEntryPath); - try { - const inboundResp = await rpcClient.getMiDiagramRpcClient().readFileContent({ - filePath: inboundPath, - }); - if (inboundResp.fileContent) { - const port = parsePortFromInboundEndpoint(inboundResp.fileContent); - if (port !== null) setValue('port', port); - - // Load CORS settings from inbound endpoint - const parser = new DOMParser(); - const xmlDoc = parser.parseFromString(inboundResp.fileContent, 'text/xml'); - const inboundEP = xmlDoc.documentElement; - - const getParamValue = (paramName: string): string | null => { - const param = inboundEP.querySelector(`parameter[name="${paramName}"]`); - return param?.textContent?.trim() || null; - }; - - setCorsSettings({ - corsAllowOrigin: getParamValue('inbound.cors.allow.origin') || '*', - corsAllowMethods: getParamValue('inbound.cors.allow.methods') || 'GET, POST, OPTIONS', - corsAllowHeaders: getParamValue('inbound.cors.allow.headers') || 'Content-Type, Mcp-Session-Id', - corsExposeHeaders: getParamValue('inbound.cors.expose.headers') || 'Mcp-Session-Id', - keepAliveInterval: parseInt(getParamValue('inbound.sse.keepalive.interval') || '30000', 10), - }); - } - } catch {} + const editDataResp = await rpcClient.getMiDiagramRpcClient().getMcpServerEditData({ + localEntryPath: editData.localEntryPath, + inboundEndpointPath: inboundPath, + }); + setTools(editDataResp.tools); + if (editDataResp.port !== null) setValue('port', editDataResp.port); + setCorsSettings(editDataResp.corsSettings); } else if (isEditMode && editData?.tools) { setTools(editData.tools.map(t => ({ ...t, kind: 'api' as const }))); } @@ -369,35 +272,42 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) // Add API tools (From APIs path) - const confirmAddAPITools = ( + const confirmAddAPITools = async ( apiId: string, selectedOperations: Array<{ id: string; customName: string; description: string }> ) => { const api = apis.find(a => a.id === apiId); if (!api) return; - const newTools: APITool[] = selectedOperations + const matchedOps = selectedOperations .map(selectedOp => { const operation = api.operations.find(o => o.id === selectedOp.id); - if (!operation) return null; - const defaultName = `${operation.method}_${cleanPathForToolName(operation.path)}`; - return { - kind: 'api' as const, - id: crypto.randomUUID(), - name: selectedOp.customName.trim() || defaultName, - description: selectedOp.description.trim(), - apiId: api.id, - apiName: api.name, - apiVersion: api.version, - apiRawVersion: api.rawVersion, - apiXmlPath: api.xmlPath, - operationId: operation.id, - operationMethod: operation.method, - operationPath: operation.path, - operationSummary: operation.summary || '', - }; + return operation ? { selectedOp, operation } : null; }) - .filter((t): t is NonNullable => t !== null) as APITool[]; + .filter((p): p is { selectedOp: typeof selectedOperations[number]; operation: typeof api.operations[number] } => p !== null); + + const { names: cleanedPaths } = await rpcClient.getMiDiagramRpcClient().cleanMcpToolNames({ + paths: matchedOps.map(p => p.operation.path), + }); + + const newTools: APITool[] = matchedOps.map(({ selectedOp, operation }, idx) => { + const defaultName = `${operation.method}_${cleanedPaths[idx]}`; + return { + kind: 'api' as const, + id: crypto.randomUUID(), + name: selectedOp.customName.trim() || defaultName, + description: selectedOp.description.trim(), + apiId: api.id, + apiName: api.name, + apiVersion: api.version, + apiRawVersion: api.rawVersion, + apiXmlPath: api.xmlPath, + operationId: operation.id, + operationMethod: operation.method, + operationPath: operation.path, + operationSummary: operation.summary || '', + }; + }); const updatedTools = [...tools, ...newTools]; setTools(updatedTools); @@ -552,17 +462,13 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) const localEntriesDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'artifacts', 'local-entries').toString(); const inboundEndpointsDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'artifacts', 'inbound-endpoints').toString(); - const apiDefDir = pathModule.join(projectDir, 'src', 'main', 'wso2mi', 'resources', 'api-definitions').toString(); - - const apiTools = tools.filter((t): t is APITool => t.kind === 'api'); - const inputSchemas = await buildInputSchemasForAPITools( - apiTools, - apiDefDir, - async (filePath) => { - const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ filePath }); - return resp.fileContent ?? null; - } - ); + + const { xml } = await rpcClient.getMiDiagramRpcClient().buildMcpToolsXml({ + projectRoot: projectDir, + tools, + }); + const { className: inboundListenerClass } = + await rpcClient.getMiDiagramRpcClient().getMcpInboundListenerClass(); const localEntryName = `${data.serverName}-mcp-config`; @@ -570,7 +476,7 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) directory: localEntriesDir, name: localEntryName, type: 'In-Line XML Entry', - value: generateToolsXml(tools, inputSchemas), + value: xml, URL: '', getContentOnly: false, }); @@ -581,7 +487,7 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) name: `${data.serverName}-endpoint`, sequence: '', onError: '', - class: MCP_INBOUND_LISTENER_CLASS, + class: inboundListenerClass, }, parameters: { 'inbound.mcp.port': data.port, diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx index fbfab1b684a..bbdfb12e6d1 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/ToolsList.tsx @@ -20,7 +20,7 @@ import { useState } from 'react'; import styled from '@emotion/styled'; import { TextField, Button, Typography } from '@wso2/ui-toolkit'; import { UnifiedTool, SequenceTool } from '@wso2/mi-core'; -import { convertToJsonSchema } from './utils'; +import { useVisualizerContext } from '@wso2/mi-rpc-client'; const ToolItem = styled.div` display: flex; @@ -101,6 +101,7 @@ export function ToolsListComponent({ onSave, onGoToSource, }: ToolsListProps) { + const { rpcClient } = useVisualizerContext(); const [editingToolId, setEditingToolId] = useState(null); const [editToolName, setEditToolName] = useState(''); const [editToolDescription, setEditToolDescription] = useState(''); @@ -113,12 +114,14 @@ export function ToolsListComponent({ setEditToolInputSchema(tool.kind === 'sequence' ? tool.inputSchema : ''); }; - const saveEdit = () => { + const saveEdit = async () => { + const normalizedSchema = editToolInputSchema.trim() + ? (await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: editToolInputSchema })).schema + : null; const updatedTools = tools.map(t => { if (t.id !== editingToolId) return t; const base = { ...t, name: editToolName.trim() || t.name, description: editToolDescription }; if (t.kind === 'sequence') { - const normalizedSchema = editToolInputSchema.trim() ? convertToJsonSchema(editToolInputSchema) : null; return { ...base, inputSchema: normalizedSchema || t.inputSchema }; } return base; diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx index 1f1fcccce49..e0d8e83c99e 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/index.tsx @@ -25,7 +25,6 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { MACHINE_VIEW, EVENT_TYPE } from '@wso2/mi-core'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; import * as pathModule from 'path'; -import { getUsedInboundPorts, MCP_INBOUND_LISTENER_CLASS } from './utils'; const CORS_ALLOW_ORIGIN_VALUE = '*'; const CORS_ALLOW_METHODS_VALUE = 'GET, POST, OPTIONS'; @@ -127,30 +126,10 @@ export function MCPServerWizard({ path, editData }: MCPServerWizardProps) { setPortDiscoveryError(null); try { const projectRootResp = await rpcClient.getMiDiagramRpcClient().getProjectRoot({ path }); - const projectDir = projectRootResp.path; - const projectStructure = await rpcClient.getMiVisualizerRpcClient().getProjectStructure({ - documentUri: projectDir, + const { ports } = await rpcClient.getMiDiagramRpcClient().getMcpUsedInboundPorts({ + projectUri: projectRootResp.path, }); - const artifacts = projectStructure?.directoryMap?.src?.main?.wso2mi?.artifacts; - const inboundEndpoints: Array<{ path: string }> = - artifacts?.inboundEndpoints || []; - const mcpServers: Array<{ inboundEndpoint?: { path: string } }> = - (artifacts as any)?.mcpServers || []; - - // Collect all inbound endpoint paths from both regular endpoints and MCP servers - const allEndpointPaths = [ - ...inboundEndpoints.map(ep => ep.path), - ...mcpServers.filter(mcp => mcp.inboundEndpoint?.path).map(mcp => mcp.inboundEndpoint!.path) - ]; - - const ports = await getUsedInboundPorts( - allEndpointPaths, - async (filePath) => { - const resp = await rpcClient.getMiDiagramRpcClient().readFileContent({ filePath }); - return resp.fileContent ?? null; - } - ); - setUsedPorts(ports); + setUsedPorts(new Set(ports)); setPortDiscoveryLoading(false); } catch (err) { console.error('[MCPServerForm] Port discovery error:', err); @@ -190,6 +169,8 @@ export function MCPServerWizard({ path, editData }: MCPServerWizardProps) { const localEntryName = `${data.serverName}-mcp-config`; const emptyXml = `\n \n `; + const { className: inboundListenerClass } = + await rpcClient.getMiDiagramRpcClient().getMcpInboundListenerClass(); await rpcClient.getMiDiagramRpcClient().createLocalEntry({ directory: localEntriesDir, @@ -206,7 +187,7 @@ export function MCPServerWizard({ path, editData }: MCPServerWizardProps) { name: `${data.serverName}-endpoint`, sequence: '', onError: '', - class: MCP_INBOUND_LISTENER_CLASS, + class: inboundListenerClass, }, parameters: { 'inbound.mcp.port': data.port, diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts deleted file mode 100644 index 530fa8a6e38..00000000000 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/utils.ts +++ /dev/null @@ -1,280 +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 * as pathModule from 'path'; -import * as yaml from 'yaml'; -import { APIOperation, APITool, UnifiedTool } from '@wso2/mi-core'; - -export const MCP_INBOUND_LISTENER_CLASS = 'org.wso2.carbon.inbound.SSE.McpInboundListener'; - -export function cleanPathForToolName(path: string): string { - return path - .replace(/[{}]/g, '') - .replace(/[^a-zA-Z0-9]/g, '_') - .replace(/_{2,}/g, '_') - .replace(/^_+|_+$/g, ''); -} - -export function convertToJsonSchema(input: string): string | null { - if (!input.trim()) return null; - try { - const sanitized = input.replace(/:\s*(string|number|integer|boolean|array|object|null)\b/g, ': "$1"'); - const parsed = JSON.parse(sanitized); - if (parsed.type || parsed.properties) return JSON.stringify(parsed); - const properties: Record = {}; - for (const [k, v] of Object.entries(parsed)) properties[k] = { type: v as string }; - return JSON.stringify({ type: 'object', properties, additionalProperties: false }); - } catch { - return null; - } -} - -export function extractInputSchema(spec: any, method: string, operationPath: string): object { - const pathItem = spec?.paths?.[operationPath]; - if (!pathItem) return { type: 'object', properties: {}, additionalProperties: false }; - const operation = pathItem[method.toLowerCase()]; - if (!operation) return { type: 'object', properties: {}, additionalProperties: false }; - - const properties: Record = {}; - const required: string[] = []; - - if (Array.isArray(operation.parameters)) { - for (const param of operation.parameters) { - if ((param.in === 'path' || param.in === 'query') && param.name && param.schema) { - properties[param.name] = { ...param.schema, ...(param.description ? { description: param.description } : {}) }; - if (param.required) required.push(param.name); - } - } - } - - const bodySchema = operation.requestBody?.content?.['application/json']?.schema; - if (bodySchema?.properties) { - for (const [key, value] of Object.entries(bodySchema.properties)) { - properties[key] = value; - } - if (Array.isArray(bodySchema.required)) required.push(...bodySchema.required); - } - - const schema: any = { type: 'object', properties, additionalProperties: false }; - if (required.length > 0) schema.required = required; - return schema; -} - -export function parseToolsFromXML(xmlContent: string): UnifiedTool[] { - try { - const parser = new DOMParser(); - const doc = parser.parseFromString(xmlContent, 'text/xml'); - const toolElements = Array.from(doc.querySelectorAll('tool')); - - return toolElements.map(toolEl => { - const name = toolEl.getAttribute('name') || ''; - const description = toolEl.querySelector('description')?.textContent?.trim() || ''; - const seqEl = toolEl.querySelector('sequence'); - const apiEl = toolEl.querySelector('api'); - - if (seqEl) { - return { - kind: 'sequence' as const, - id: crypto.randomUUID(), - name, - description, - sequenceName: seqEl.textContent?.trim() || '', - sequenceXmlPath: '', - inputSchema: toolEl.querySelector('inputSchema')?.textContent?.trim() - || '{"type":"object","properties":{},"additionalProperties":false}', - }; - } else { - const method = toolEl.querySelector('method')?.textContent?.trim() || ''; - const resource = toolEl.querySelector('resource')?.textContent?.trim() || ''; - const apiName = apiEl?.textContent?.trim() || ''; - const existingSchema = toolEl.querySelector('inputSchema')?.textContent?.trim(); - return { - kind: 'api' as const, - id: crypto.randomUUID(), - name, - description, - apiId: apiName, - apiName, - apiVersion: '1.0.0', - apiRawVersion: '', - apiXmlPath: '', - operationId: `${method}_${resource}`.replace(/[^a-zA-Z0-9_]/g, '_'), - operationMethod: method, - operationPath: resource, - operationSummary: description, - inputSchema: existingSchema, - }; - } - }); - } catch { - return []; - } -} - -export function parsePortFromInboundEndpoint(xmlContent: string): number | null { - try { - const parser = new DOMParser(); - const doc = parser.parseFromString(xmlContent, 'text/xml'); - const params = Array.from(doc.querySelectorAll('parameter')); - for (const param of params) { - const pname = param.getAttribute('name') || ''; - if (pname === 'inbound.mcp.port' || pname === 'inbound.http.port') { - const val = parseInt(param.textContent?.trim() || '', 10); - if (!isNaN(val)) return val; - } - } - } catch {} - return null; -} - -export async function getUsedInboundPorts( - inboundEndpointPaths: string[], - readFile: (path: string) => Promise, - excludePath?: string -): Promise> { - const usedPorts = new Set(); - for (const epPath of inboundEndpointPaths) { - if (excludePath && epPath === excludePath) continue; - try { - const content = await readFile(epPath); - if (content) { - const port = parsePortFromInboundEndpoint(content); - if (port !== null) usedPorts.add(port); - } - } catch {} - } - return usedPorts; -} - -export function generateToolsXml(tools: UnifiedTool[], inputSchemas: Record): string { - let toolsXml = ''; - - tools.forEach(tool => { - if (tool.kind === 'api') { - const derived = inputSchemas[tool.id]; - const isEmpty = !derived || (Object.keys((derived as any).properties ?? {}).length === 0 && !(derived as any).required); - const inputSchema = (!isEmpty ? derived : null) - ?? (tool.inputSchema ? JSON.parse(tool.inputSchema) : null) - ?? { type: 'object', properties: {} }; - const description = tool.description || tool.operationSummary - || `${tool.operationMethod} ${tool.operationPath} - ${tool.apiName}`; - toolsXml += ` - - ${tool.apiName} - ${tool.operationPath} - ${tool.operationMethod} - ${description} - ${JSON.stringify(inputSchema)} - `; - } else { - toolsXml += ` - - ${tool.sequenceName} - ${tool.description || tool.sequenceName} - ${tool.inputSchema} - `; - } - }); - - return ` - ${toolsXml} - `; -} - -export async function buildInputSchemasForAPITools( - tools: APITool[], - apiDefDir: string, - readFile: (filePath: string) => Promise -): Promise> { - const inputSchemas: Record = {}; - - const readYaml = async (filePath: string): Promise => { - try { - const content = await readFile(filePath); - return content ? yaml.parse(content) : null; - } catch { - return null; - } - }; - - for (const tool of tools) { - const rawVersion = tool.apiRawVersion || ''; - const xmlBaseName = tool.apiXmlPath - ? pathModule.basename(tool.apiXmlPath, pathModule.extname(tool.apiXmlPath)) - : tool.apiName; - - // On Linux (case-sensitive), the YAML file is named after the API's `name` attribute - // (set at creation time) while the XML file may have a different case. Include both. - const baseNames = [...new Set([xmlBaseName, tool.apiName])]; - const candidates = baseNames - .flatMap(base => [ - ...(rawVersion ? [`${base}_v${rawVersion}.yaml`] : []), - `${base}.yaml`, - ]) - .map(f => pathModule.join(apiDefDir, f).toString()); - - let spec: any = null; - for (const candidate of candidates) { - spec = await readYaml(candidate); - if (spec !== null) break; - } - - inputSchemas[tool.id] = spec - ? extractInputSchema(spec, tool.operationMethod, tool.operationPath) - : { type: 'object', properties: {}, additionalProperties: false }; - } - - return inputSchemas; -} - -export const artifactParserConfig = { - apis: { - pathInStructure: (structure: any) => structure?.directoryMap?.src?.main?.wso2mi?.artifacts?.apis || [], - parseFields: { - id: (art: Record) => art.name || art.id || art.fileName || '', - name: (art: Record) => art.name || art.id || art.fileName || '', - context: (art: Record) => art.context || `/${art.name || art.id || ''}`, - version: (art: Record) => art.version || '1.0.0', - rawVersion: (art: Record) => art.version ?? '', - xmlPath: (art: Record) => art.path || '', - }, - parseOperations: (art: Record): APIOperation[] => { - const operations: APIOperation[] = []; - if (art.resources && Array.isArray(art.resources)) { - for (const res of art.resources) { - const methods = Array.isArray(res.methods) - ? res.methods - : typeof res.methods === 'string' - ? res.methods.split(',') - : []; - const uri = res.path || res.uri || res['uri-template'] || res.uriTemplate || ''; - for (const m of methods) { - const method = String(m).toUpperCase(); - operations.push({ - id: `${method}_${uri}`.replace(/[^a-zA-Z0-9_]/g, '_'), - method, - path: uri, - summary: res.summary || '' - }); - } - } - } - return operations; - } - } -}; From 4a8d2f830c5d904499f63f88a2506c459f1b6f4d Mon Sep 17 00:00:00 2001 From: dulavinya Date: Sun, 10 May 2026 12:34:23 +0530 Subject: [PATCH 062/114] Added review suggestions --- .../mi-core/src/rpc-types/mi-diagram/index.ts | 2 + .../src/rpc-types/mi-diagram/rpc-type.ts | 2 + .../mi-core/src/rpc-types/mi-diagram/types.ts | 4 ++ .../rpc-managers/mi-diagram/rpc-handler.ts | 2 + .../rpc-managers/mi-diagram/rpc-manager.ts | 11 +++++ .../src/rpc-clients/mi-diagram/rpc-client.ts | 6 +++ .../mi/mi-visualizer/src/constants/index.ts | 4 ++ .../MCPServerForm/AddSequenceToolDialog.tsx | 42 +++++++------------ .../MCPServerForm/CreateScratchToolDialog.tsx | 42 +++++++------------ .../MCPServerForm/MCPServerToolsForm.tsx | 8 +++- 10 files changed, 66 insertions(+), 57 deletions(-) diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts index 2b9353e1601..ef7f2cbe14f 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/index.ts @@ -281,6 +281,7 @@ import { CleanMcpToolNamesResponse, ConvertMcpJsonSchemaRequest, ConvertMcpJsonSchemaResponse, + PickMcpJsonFileResponse, GetMcpInboundListenerClassResponse, GenerateMappingsParamsRequest, ProjectCreationStatusResponse, @@ -498,6 +499,7 @@ export interface MiDiagramAPI { updateMcpInboundEndpointCors: (params: UpdateMcpInboundEndpointCorsRequest) => Promise; cleanMcpToolNames: (params: CleanMcpToolNamesRequest) => Promise; convertMcpJsonSchema: (params: ConvertMcpJsonSchemaRequest) => Promise; + pickMcpJsonFile: () => Promise; getMcpInboundListenerClass: () => Promise; } diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts index 9402b78fb61..bd88c775290 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/rpc-type.ts @@ -239,6 +239,7 @@ import { CleanMcpToolNamesResponse, ConvertMcpJsonSchemaRequest, ConvertMcpJsonSchemaResponse, + PickMcpJsonFileResponse, GetMcpInboundListenerClassResponse, UpdateMediatorRequest, ExpressionCompletionsRequest, @@ -508,4 +509,5 @@ export const buildMcpToolsXml: RequestType = { method: `${_preFix}/updateMcpInboundEndpointCors` }; export const cleanMcpToolNames: RequestType = { method: `${_preFix}/cleanMcpToolNames` }; export const convertMcpJsonSchema: RequestType = { method: `${_preFix}/convertMcpJsonSchema` }; +export const pickMcpJsonFile: RequestType = { method: `${_preFix}/pickMcpJsonFile` }; export const getMcpInboundListenerClass: RequestType = { method: `${_preFix}/getMcpInboundListenerClass` }; diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts index 999912ec139..336c3b6a88b 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts @@ -2558,6 +2558,10 @@ export interface ConvertMcpJsonSchemaResponse { schema: string | null; } +export interface PickMcpJsonFileResponse { + content: string | null; +} + export interface GetMcpInboundListenerClassResponse { className: string; } diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts index 7767eb8d765..59b1e813395 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-handler.ts @@ -362,6 +362,7 @@ import { CleanMcpToolNamesRequest, convertMcpJsonSchema, ConvertMcpJsonSchemaRequest, + pickMcpJsonFile, getMcpInboundListenerClass, // getBackendRootUrl - REMOVED: Backend URLs deprecated, all AI features use local LLM } from "@wso2/mi-core"; @@ -571,5 +572,6 @@ export function registerMiDiagramRpcHandlers(messenger: Messenger, projectUri: s messenger.onRequest(updateMcpInboundEndpointCors, (args: UpdateMcpInboundEndpointCorsRequest) => rpcManger.updateMcpInboundEndpointCors(args)); messenger.onRequest(cleanMcpToolNames, (args: CleanMcpToolNamesRequest) => rpcManger.cleanMcpToolNames(args)); messenger.onRequest(convertMcpJsonSchema, (args: ConvertMcpJsonSchemaRequest) => rpcManger.convertMcpJsonSchema(args)); + messenger.onRequest(pickMcpJsonFile, () => rpcManger.pickMcpJsonFile()); messenger.onRequest(getMcpInboundListenerClass, () => rpcManger.getMcpInboundListenerClass()); } diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts index e2e9d9a1b5f..199997437ca 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts @@ -152,6 +152,7 @@ import { CleanMcpToolNamesResponse, ConvertMcpJsonSchemaRequest, ConvertMcpJsonSchemaResponse, + PickMcpJsonFileResponse, GetMcpInboundListenerClassResponse, APITool, UnifiedTool, @@ -6761,6 +6762,16 @@ ${keyValuesXML}`; return { schema: convertToJsonSchema(params.input) }; } + async pickMcpJsonFile(): Promise { + const selection = await vscode.window.showOpenDialog({ + canSelectMany: false, + openLabel: 'Import', + filters: { 'JSON Schema': ['json'] }, + }); + if (!selection || selection.length === 0) return { content: null }; + return { content: fs.readFileSync(selection[0].fsPath, 'utf8') }; + } + async getMcpInboundListenerClass(): Promise { return { className: MCP_INBOUND_LISTENER_CLASS }; } diff --git a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts index 2165298cf38..df86d6147fa 100644 --- a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts +++ b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-diagram/rpc-client.ts @@ -503,6 +503,8 @@ import { convertMcpJsonSchema, ConvertMcpJsonSchemaRequest, ConvertMcpJsonSchemaResponse, + pickMcpJsonFile, + PickMcpJsonFileResponse, getMcpInboundListenerClass, GetMcpInboundListenerClassResponse, } from "@wso2/mi-core"; @@ -1322,6 +1324,10 @@ export class MiDiagramRpcClient implements MiDiagramAPI { return this._messenger.sendRequest(convertMcpJsonSchema, HOST_EXTENSION, params); } + async pickMcpJsonFile(): Promise { + return this._messenger.sendRequest(pickMcpJsonFile, HOST_EXTENSION, undefined); + } + async getMcpInboundListenerClass(): Promise { return this._messenger.sendRequest(getMcpInboundListenerClass, HOST_EXTENSION, undefined); } diff --git a/workspaces/mi/mi-visualizer/src/constants/index.ts b/workspaces/mi/mi-visualizer/src/constants/index.ts index e95073fd8ee..cef94d6d36f 100644 --- a/workspaces/mi/mi-visualizer/src/constants/index.ts +++ b/workspaces/mi/mi-visualizer/src/constants/index.ts @@ -28,6 +28,10 @@ export const COPILOT_ERROR_MESSAGES = { ERROR_422: "Something went wrong. Please clear the chat and try again.", }; +// MCP Tool Schema +export const EMPTY_MCP_SCHEMA = JSON.stringify({ type: 'object', properties: {}, additionalProperties: false }); +export const INVALID_MCP_SCHEMA_MESSAGE = 'Invalid JSON. Use shorthand like {"city": "string"} or full JSON Schema.'; + // MI Copilot maximum allowed file size export const MAX_FILE_SIZE = 5 * 1024 * 1024; // Default to 5MB diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx index 3d235c386ca..ce7f80c30a9 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx @@ -16,12 +16,13 @@ * under the License. */ -import { ChangeEvent, useRef, useState } from 'react'; +import { useState } from 'react'; import styled from '@emotion/styled'; import { Button, Typography } from '@wso2/ui-toolkit'; import { Sequence } from '@wso2/mi-core'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, CustomInput, SelectAllRow, FlexRow, FlexRowStart, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, SchemaTextarea, DialogTitle } from './dialogStyles'; +import { EMPTY_MCP_SCHEMA, INVALID_MCP_SCHEMA_MESSAGE } from '../../../constants'; // Styled Components @@ -50,7 +51,6 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } const [schemaErrors, setSchemaErrors] = useState>({}); const [aiDescLoadingIds, setAiDescLoadingIds] = useState>(new Set()); const [aiSchemaLoadingIds, setAiSchemaLoadingIds] = useState>(new Set()); - const fileInputRefs = useRef>({}); const handleFillDescription = async (seq: Sequence) => { setAiDescLoadingIds(prev => new Set(prev).add(seq.id)); @@ -106,7 +106,7 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } } const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: value }); if (schema === null) { - setSchemaErrors(prev => ({ ...prev, [id]: 'Invalid JSON. Use shorthand like {"amount": number, "name": string} or full JSON Schema.' })); + setSchemaErrors(prev => ({ ...prev, [id]: INVALID_MCP_SCHEMA_MESSAGE })); return false; } setSchemaErrors(prev => { const n = { ...prev }; delete n[id]; return n; }); @@ -118,19 +118,11 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } validateSchema(id, value); }; - const handleImportFile = (id: string) => { fileInputRefs.current[id]?.click(); }; - - const handleFileChange = (id: string, e: ChangeEvent) => { - const file = e.target.files?.[0]; - if (!file) return; - const reader = new FileReader(); - reader.onload = (event) => { - const content = event.target?.result as string; - setInputSchemas(prev => ({ ...prev, [id]: content })); - validateSchema(id, content); - }; - reader.readAsText(file); - e.target.value = ''; + const handleImportFile = async (id: string) => { + const { content } = await rpcClient.getMiDiagramRpcClient().pickMcpJsonFile(); + if (content === null) return; + setInputSchemas(prev => ({ ...prev, [id]: content })); + validateSchema(id, content); }; const handleConfirm = async () => { @@ -145,18 +137,19 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } setDescriptionErrors(missingDesc); return; } - const emptySchema = JSON.stringify({ type: 'object', properties: {}, additionalProperties: false }); const ids = Array.from(selectedIds); const selected = await Promise.all(ids.map(async id => { const raw = inputSchemas[id]?.trim() || ''; - const converted = raw - ? (await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: raw })).schema - : null; + let converted: string | null = null; + if (raw) { + const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: raw }); + converted = schema; + } return { sequenceId: id, customName: customNames[id]?.trim() || id, description: customDescriptions[id]!.trim(), - inputSchema: converted || emptySchema, + inputSchema: converted || EMPTY_MCP_SCHEMA, }; })); onConfirm(selected); @@ -265,13 +258,6 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } > Import JSON - { fileInputRefs.current[seq.id] = el; }} - type="file" - accept=".json" - style={{ display: 'none' }} - onChange={e => handleFileChange(seq.id, e)} - /> {schemaErrors[seq.id] && {schemaErrors[seq.id]}} diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx index ef25c23c354..cd41b2f9aa0 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx @@ -16,11 +16,12 @@ * under the License. */ -import { ChangeEvent, useRef, useState } from 'react'; +import { useState } from 'react'; import styled from '@emotion/styled'; import { Button, Typography } from '@wso2/ui-toolkit'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, StdInput, SchemaTextarea, FlexRowStart, DialogTitle } from './dialogStyles'; +import { EMPTY_MCP_SCHEMA, INVALID_MCP_SCHEMA_MESSAGE } from '../../../constants'; // Styled Components @@ -62,7 +63,6 @@ export function CreateScratchToolDialog({ const [schemaError, setSchemaError] = useState(''); const [aiDescLoading, setAiDescLoading] = useState(false); const [aiSchemaLoading, setAiSchemaLoading] = useState(false); - const fileInputRef = useRef(null); const validateName = (value: string): boolean => { if (!value.trim()) { @@ -130,7 +130,7 @@ export function CreateScratchToolDialog({ if (!value.trim()) { setSchemaError(''); return true; } const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: value }); if (schema === null) { - setSchemaError('Invalid JSON. Use shorthand like {"city": "string"} or full JSON Schema.'); + setSchemaError(INVALID_MCP_SCHEMA_MESSAGE); return false; } setSchemaError(''); @@ -142,17 +142,11 @@ export function CreateScratchToolDialog({ validateSchema(value); }; - const handleFileChange = (e: ChangeEvent) => { - const file = e.target.files?.[0]; - if (!file) return; - const reader = new FileReader(); - reader.onload = (event) => { - const content = event.target?.result as string; - setInputSchema(content); - validateSchema(content); - }; - reader.readAsText(file); - e.target.value = ''; + const handleImportFile = async () => { + const { content } = await rpcClient.getMiDiagramRpcClient().pickMcpJsonFile(); + if (content === null) return; + setInputSchema(content); + validateSchema(content); }; const handleConfirm = async () => { @@ -161,14 +155,15 @@ export function CreateScratchToolDialog({ setDescriptionError('Description is required.'); return; } - const emptySchema = JSON.stringify({ type: 'object', properties: {}, additionalProperties: false }); - const converted = inputSchema.trim() - ? (await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: inputSchema })).schema - : null; + let converted: string | null = null; + if (inputSchema.trim()) { + const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: inputSchema }); + converted = schema; + } onConfirm({ name: name.trim(), description: description.trim(), - inputSchema: converted || emptySchema, + inputSchema: converted || EMPTY_MCP_SCHEMA, }); setName(''); setNameError(''); @@ -228,16 +223,9 @@ export function CreateScratchToolDialog({ - - {schemaError && {schemaError}} diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index 9f4190e4c94..9d9b6473f80 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -147,6 +147,7 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const [usedPorts, setUsedPorts] = useState>(new Set()); + const [originalPort, setOriginalPort] = useState(null); const [showAddAPIDialog, setShowAddAPIDialog] = useState(false); const [showAddSeqDialog, setShowAddSeqDialog] = useState(false); const [showCreateScratchDialog, setShowCreateScratchDialog] = useState(false); @@ -255,7 +256,10 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) inboundEndpointPath: inboundPath, }); setTools(editDataResp.tools); - if (editDataResp.port !== null) setValue('port', editDataResp.port); + if (editDataResp.port !== null) { + setValue('port', editDataResp.port); + setOriginalPort(editDataResp.port); + } setCorsSettings(editDataResp.corsSettings); } else if (isEditMode && editData?.tools) { setTools(editData.tools.map(t => ({ ...t, kind: 'api' as const }))); @@ -450,7 +454,7 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) // Submit const onSubmit = async (data: any) => { - if (usedPorts.has(Number(data.port))) { + if (usedPorts.has(Number(data.port)) && Number(data.port) !== originalPort) { setFieldError('port', { message: `Port ${data.port} is already in use by another inbound endpoint in this project` }); return; } From 0e540284f462b5ef5923037f40382e6cb2784886 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Sun, 10 May 2026 13:32:25 +0530 Subject: [PATCH 063/114] Added review suggestions --- .../Forms/MCPServerForm/AddAPIToolDialog.tsx | 135 +++++++------ .../MCPServerForm/AddSequenceToolDialog.tsx | 177 +++++++++-------- .../MCPServerForm/CreateScratchToolDialog.tsx | 179 +++++++++--------- 3 files changed, 259 insertions(+), 232 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx index 230d17b5e37..e7fa4053444 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx @@ -16,9 +16,10 @@ * under the License. */ -import React, { useState } from 'react'; +import { useEffect, useState } from 'react'; import styled from '@emotion/styled'; import { Button, Typography } from '@wso2/ui-toolkit'; +import { useForm } from 'react-hook-form'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, CustomInput, SelectAllRow, FlexRow, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, DialogTitle } from './dialogStyles'; @@ -46,6 +47,15 @@ interface AddAPIToolDialogProps { onCancel: () => void; } +interface OperationFormItem { + customName: string; + description: string; +} + +interface FormValues { + items: Record; +} + function getDefaultName(operation: APIOperation): string { const cleanPath = operation.path .replace(/[{}]/g, '') @@ -95,28 +105,21 @@ export function AddAPIToolDialog({ }: AddAPIToolDialogProps) { const { rpcClient } = useVisualizerContext(); const [selectedOperationIds, setSelectedOperationIds] = useState>(new Set()); - const [customNames, setCustomNames] = useState>({}); - const [customDescriptions, setCustomDescriptions] = useState>({}); - const [descriptionErrors, setDescriptionErrors] = useState>({}); const [aiLoadingIds, setAiLoadingIds] = useState>(new Set()); - const handleFillWithAI = async (op: APIOperation) => { - setAiLoadingIds(prev => new Set(prev).add(op.id)); - try { - const result = await rpcClient.getMiVisualizerRpcClient().getMcpToolSuggestion({ - toolName: customNames[op.id] || getDefaultName(op), - operationMethod: op.method, - operationPath: op.path, - operationSummary: op.summary, - }); - if (result.description) { - setCustomDescriptions(prev => ({ ...prev, [op.id]: result.description })); - setDescriptionErrors(prev => { const n = { ...prev }; delete n[op.id]; return n; }); - } - } finally { - setAiLoadingIds(prev => { const n = new Set(prev); n.delete(op.id); return n; }); + const { register, handleSubmit, watch, getValues, setValue, setError, clearErrors, reset, formState: { errors } } = useForm({ + defaultValues: { items: {} }, + mode: 'onTouched', + }); + + const items = watch('items') || {}; + + useEffect(() => { + if (!isOpen) { + reset({ items: {} }); + setSelectedOperationIds(new Set()); } - }; + }, [isOpen, reset]); if (!isOpen) return null; @@ -126,28 +129,13 @@ export function AddAPIToolDialog({ const newSet = new Set(selectedOperationIds); if (newSet.has(operationId)) { newSet.delete(operationId); - setDescriptionErrors(prev => { const n = { ...prev }; delete n[operationId]; return n; }); + clearErrors(`items.${operationId}` as const); } else { newSet.add(operationId); } setSelectedOperationIds(newSet); }; - const handleCustomNameChange = (operationId: string, name: string) => { - setCustomNames(prev => ({ ...prev, [operationId]: name })); - }; - - const handleCustomDescriptionChange = (operationId: string, description: string) => { - setCustomDescriptions(prev => ({ ...prev, [operationId]: description })); - if (description.trim()) setDescriptionErrors(prev => { const n = { ...prev }; delete n[operationId]; return n; }); - }; - - const handleDescriptionBlur = (operationId: string) => { - if (!customDescriptions[operationId]?.trim()) { - setDescriptionErrors(prev => ({ ...prev, [operationId]: 'Description is required.' })); - } - }; - const handleSelectAll = () => { if (!selectedAPI) return; if (selectedOperationIds.size === selectedAPI.operations.length) { @@ -160,44 +148,62 @@ export function AddAPIToolDialog({ const handleAPIChange = (apiId: string) => { onAPIChange(apiId); setSelectedOperationIds(new Set()); - setCustomNames({}); - setCustomDescriptions({}); - setDescriptionErrors({}); + reset({ items: {} }); + }; + + const handleFillWithAI = async (op: APIOperation) => { + setAiLoadingIds(prev => new Set(prev).add(op.id)); + try { + const customName = getValues(`items.${op.id}.customName` as const); + const result = await rpcClient.getMiVisualizerRpcClient().getMcpToolSuggestion({ + toolName: customName || getDefaultName(op), + operationMethod: op.method, + operationPath: op.path, + operationSummary: op.summary, + }); + if (result.description) { + setValue(`items.${op.id}.description` as const, result.description); + clearErrors(`items.${op.id}.description` as const); + } + } finally { + setAiLoadingIds(prev => { const n = new Set(prev); n.delete(op.id); return n; }); + } }; - const handleConfirm = () => { + const onSubmit = (data: FormValues) => { if (!selectedAPIForTool || selectedOperationIds.size === 0) return; - const missingDesc: Record = {}; - Array.from(selectedOperationIds).forEach(opId => { - if (!customDescriptions[opId]?.trim()) missingDesc[opId] = 'Description is required.'; + + const opIds = Array.from(selectedOperationIds); + let hasMissingDesc = false; + opIds.forEach(opId => { + if (!data.items?.[opId]?.description?.trim()) { + setError(`items.${opId}.description` as const, { message: 'Description is required.' }); + hasMissingDesc = true; + } }); - if (Object.keys(missingDesc).length > 0) { - setDescriptionErrors(missingDesc); - return; - } + if (hasMissingDesc) return; - const selectedOperations = Array.from(selectedOperationIds).flatMap(opId => { + const selectedOperations = opIds.flatMap(opId => { const operation = selectedAPI?.operations.find((op: APIOperation) => op.id === opId); if (!operation) return []; + const item = data.items?.[opId]; return [{ id: opId, - customName: customNames[opId] || getDefaultName(operation), - description: customDescriptions[opId]!.trim(), + customName: item?.customName || getDefaultName(operation), + description: item!.description.trim(), }]; }); onConfirmBulk(selectedAPIForTool, selectedOperations); + reset({ items: {} }); setSelectedOperationIds(new Set()); - setCustomNames({}); - setCustomDescriptions({}); - setDescriptionErrors({}); }; const allSelected = !!selectedAPI && selectedAPI.operations.length > 0 && selectedOperationIds.size === selectedAPI.operations.length; const someSelected = selectedOperationIds.size > 0; - const hasMissingDescriptions = Array.from(selectedOperationIds).some(id => !customDescriptions[id]?.trim()); + const hasMissingDescriptions = Array.from(selectedOperationIds).some(id => !items[id]?.description?.trim()); return ( @@ -239,7 +245,9 @@ export function AddAPIToolDialog({ Select All Operations - {selectedAPI.operations.map((op: APIOperation) => ( + {selectedAPI.operations.map((op: APIOperation) => { + const itemErrors = errors.items?.[op.id]; + return ( handleOperationToggle(op.id)}> handleCustomNameChange(op.id, e.target.value)} + {...register(`items.${op.id}.customName` as const)} onClick={(e) => e.stopPropagation()} /> Description * @@ -276,9 +283,10 @@ export function AddAPIToolDialog({ id={`desc-${op.id}`} type="text" placeholder={op.summary || 'Describe what this tool does'} - value={customDescriptions[op.id] || ''} - onChange={(e) => handleCustomDescriptionChange(op.id, e.target.value)} - onBlur={() => handleDescriptionBlur(op.id)} + {...register(`items.${op.id}.description` as const, { + onChange: e => { if (e.target.value.trim()) clearErrors(`items.${op.id}.description` as const); }, + onBlur: e => { if (!e.target.value.trim()) setError(`items.${op.id}.description` as const, { message: 'Description is required.' }); }, + })} onClick={(e) => e.stopPropagation()} /> diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx index cd41b2f9aa0..90d72c5f2e5 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/CreateScratchToolDialog.tsx @@ -16,11 +16,14 @@ * under the License. */ -import { useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import styled from '@emotion/styled'; import { Button, Typography } from '@wso2/ui-toolkit'; +import { useForm } from 'react-hook-form'; +import * as yup from 'yup'; +import { yupResolver } from '@hookform/resolvers/yup'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; -import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, StdInput, SchemaTextarea, FlexRowStart, DialogTitle } from './dialogStyles'; +import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, StdInput, SchemaTextarea, DialogTitle } from './dialogStyles'; import { EMPTY_MCP_SCHEMA, INVALID_MCP_SCHEMA_MESSAGE } from '../../../constants'; // Styled Components @@ -31,7 +34,7 @@ const SchemaRow = styled.div` gap: 8px; `; -// Component +// Component export interface ScratchToolData { name: string; @@ -47,6 +50,18 @@ interface CreateScratchToolDialogProps { existingToolSequenceNames?: string[]; } +interface FormValues { + name: string; + description: string; + inputSchema: string; +} + +const sanitizeToolName = (raw: string): string => + raw.trim().toLowerCase() + .replace(/[^a-z0-9]/g, '_') + .replace(/_{2,}/g, '_') + .replace(/^_+|_+$/, ''); + export function CreateScratchToolDialog({ isOpen, onConfirm, @@ -55,64 +70,76 @@ export function CreateScratchToolDialog({ existingToolSequenceNames = [] }: CreateScratchToolDialogProps) { const { rpcClient } = useVisualizerContext(); - const [name, setName] = useState(''); - const [nameError, setNameError] = useState(''); - const [description, setDescription] = useState(''); - const [descriptionError, setDescriptionError] = useState(''); - const [inputSchema, setInputSchema] = useState(''); - const [schemaError, setSchemaError] = useState(''); const [aiDescLoading, setAiDescLoading] = useState(false); const [aiSchemaLoading, setAiSchemaLoading] = useState(false); - const validateName = (value: string): boolean => { - if (!value.trim()) { - setNameError(''); - return true; - } + const schema = useMemo(() => yup.object({ + name: yup.string() + .required('Tool name is required') + .test('valid-sanitized', 'Tool name must contain alphanumeric characters.', + v => !!sanitizeToolName(v || '')) + .test('no-collision', function (v) { + const sequenceName = sanitizeToolName(v || '') + '_tool'; + if (existingSequenceIds.includes(sequenceName) || existingToolSequenceNames.includes(sequenceName)) { + return this.createError({ message: `A sequence named "${sequenceName}" already exists.` }); + } + return true; + }), + description: yup.string().required('Description is required.'), + inputSchema: yup.string().default(''), + }), [existingSequenceIds, existingToolSequenceNames]); + + const { register, handleSubmit, watch, setValue, setError, clearErrors, reset, formState: { errors } } = useForm({ + resolver: yupResolver(schema) as any, + defaultValues: { name: '', description: '', inputSchema: '' }, + mode: 'onTouched', + }); + + const name = watch('name'); + const description = watch('description'); + + useEffect(() => { + if (!isOpen) reset(); + }, [isOpen, reset]); - const sanitized = value.trim().toLowerCase() - .replace(/[^a-z0-9]/g, '_') - .replace(/_{2,}/g, '_') - .replace(/^_+|_+$/, ''); + if (!isOpen) return null; - if (!sanitized) { - setNameError('Tool name must contain alphanumeric characters.'); - return false; - } + const derivedSequenceName = name?.trim() ? sanitizeToolName(name) + '_tool' : ''; - const sequenceName = sanitized + '_tool'; - if (existingSequenceIds.includes(sequenceName) || existingToolSequenceNames.includes(sequenceName)) { - setNameError(`A sequence named "${sequenceName}" already exists.`); + const validateSchema = async (value: string): Promise => { + if (!value.trim()) { + clearErrors('inputSchema'); + return true; + } + const { schema: converted } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: value }); + if (converted === null) { + setError('inputSchema', { message: INVALID_MCP_SCHEMA_MESSAGE }); return false; } - - setNameError(''); + clearErrors('inputSchema'); return true; }; - const handleNameChange = (value: string) => { - setName(value); - validateName(value); - }; - const handleFillDescription = async () => { - if (!name.trim()) return; + if (!name?.trim()) return; setAiDescLoading(true); try { const result = await rpcClient.getMiVisualizerRpcClient().getMcpToolSuggestion({ toolName: name.trim() }); - if (result.description) { setDescription(result.description); setDescriptionError(''); } + if (result.description) { + setValue('description', result.description, { shouldValidate: true }); + } } finally { setAiDescLoading(false); } }; const handleFillSchema = async () => { - if (!name.trim()) return; + if (!name?.trim()) return; setAiSchemaLoading(true); try { const result = await rpcClient.getMiVisualizerRpcClient().getMcpToolSuggestion({ toolName: name.trim() }); if (result.inputSchema) { - setInputSchema(result.inputSchema); + setValue('inputSchema', result.inputSchema); validateSchema(result.inputSchema); } } finally { @@ -120,59 +147,33 @@ export function CreateScratchToolDialog({ } }; - if (!isOpen) return null; - - const derivedSequenceName = name.trim() - ? name.trim().toLowerCase().replace(/[^a-z0-9]/g, '_').replace(/_{2,}/g, '_').replace(/^_+|_+$/, '') + '_tool' - : ''; - - const validateSchema = async (value: string): Promise => { - if (!value.trim()) { setSchemaError(''); return true; } - const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: value }); - if (schema === null) { - setSchemaError(INVALID_MCP_SCHEMA_MESSAGE); - return false; - } - setSchemaError(''); - return true; - }; - - const handleSchemaChange = (value: string) => { - setInputSchema(value); - validateSchema(value); - }; - const handleImportFile = async () => { const { content } = await rpcClient.getMiDiagramRpcClient().pickMcpJsonFile(); if (content === null) return; - setInputSchema(content); + setValue('inputSchema', content); validateSchema(content); }; - const handleConfirm = async () => { - if (!name.trim() || nameError || schemaError) return; - if (!description.trim()) { - setDescriptionError('Description is required.'); - return; - } + const onSubmit = async (data: FormValues) => { let converted: string | null = null; - if (inputSchema.trim()) { - const { schema } = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: inputSchema }); - converted = schema; + if (data.inputSchema.trim()) { + const result = await rpcClient.getMiDiagramRpcClient().convertMcpJsonSchema({ input: data.inputSchema }); + if (result.schema === null) { + setError('inputSchema', { message: INVALID_MCP_SCHEMA_MESSAGE }); + return; + } + converted = result.schema; } onConfirm({ - name: name.trim(), - description: description.trim(), + name: data.name.trim(), + description: data.description.trim(), inputSchema: converted || EMPTY_MCP_SCHEMA, }); - setName(''); - setNameError(''); - setDescription(''); - setDescriptionError(''); - setInputSchema(''); - setSchemaError(''); + reset(); }; + const submitDisabled = !name?.trim() || !description?.trim() || !!errors.name || !!errors.description || !!errors.inputSchema; + return ( e.stopPropagation()}> @@ -186,11 +187,10 @@ export function CreateScratchToolDialog({ handleNameChange(e.target.value)} + {...register('name')} /> - {nameError && {nameError}} - {derivedSequenceName && !nameError && ( + {errors.name && {String(errors.name.message)}} + {derivedSequenceName && !errors.name && ( A sequence named "{derivedSequenceName}" will be created. )} @@ -201,15 +201,13 @@ export function CreateScratchToolDialog({ { setDescription(e.target.value); if (e.target.value.trim()) setDescriptionError(''); }} - onBlur={() => { if (!description.trim()) setDescriptionError('Description is required.'); }} + {...register('description')} /> - - {descriptionError && {descriptionError}} + {errors.description && {String(errors.description.message)}} @@ -217,22 +215,23 @@ export function CreateScratchToolDialog({ handleSchemaChange(e.target.value)} + {...register('inputSchema', { + onChange: e => validateSchema(e.target.value), + })} /> - - {schemaError && {schemaError}} + {errors.inputSchema && {String(errors.inputSchema.message)}} - From 725fc2d61fdd6f934081a389071a69eb3be30d14 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 11 May 2026 00:03:49 +0530 Subject: [PATCH 064/114] Updated class name in inbound endpoint xml when creating mcp servers --- workspaces/mi/mi-extension/src/util/mcp-server-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts index efc57fdbb35..1a340a94c62 100644 --- a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts +++ b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts @@ -38,7 +38,7 @@ const xmlParserOptions = { trimValues: true, }; -export const MCP_INBOUND_LISTENER_CLASS = "org.wso2.carbon.inbound.SSE.McpInboundListener"; +export const MCP_INBOUND_LISTENER_CLASS = "org.wso2.carbon.inbound.sse.McpInboundListener"; export function cleanPathForToolName(pathStr: string): string { return pathStr From c428fe3b31fb74e37ae514c5805d11a709b217c7 Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 11 May 2026 04:15:26 +0530 Subject: [PATCH 065/114] Added review suggestions --- .../mi-extension/src/util/mcp-server-utils.ts | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts index 1a340a94c62..b2a916211a0 100644 --- a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts +++ b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts @@ -40,6 +40,15 @@ const xmlParserOptions = { export const MCP_INBOUND_LISTENER_CLASS = "org.wso2.carbon.inbound.sse.McpInboundListener"; +function escapeXml(str: string): string { + return str + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + export function cleanPathForToolName(pathStr: string): string { return pathStr .replace(/[{}]/g, "") @@ -282,19 +291,19 @@ export function generateToolsXml(tools: UnifiedTool[], inputSchemas: Record - ${tool.apiName} - ${tool.operationPath} - ${tool.operationMethod} - ${description} - ${JSON.stringify(inputSchema)} + + ${escapeXml(tool.apiName)} + ${escapeXml(tool.operationPath)} + ${escapeXml(tool.operationMethod)} + ${escapeXml(description)} + `; } else { toolsXml += ` - - ${tool.sequenceName} - ${tool.description || tool.sequenceName} - ${tool.inputSchema} + + ${escapeXml(tool.sequenceName)} + ${escapeXml(tool.description || tool.sequenceName)} + `; } }); From a0881ac96db3bf3c115ebf5e1c7fc4ab7c58cf8a Mon Sep 17 00:00:00 2001 From: dulavinya Date: Mon, 11 May 2026 05:27:09 +0530 Subject: [PATCH 066/114] Review suggestions added --- .../mi/mi-extension/src/util/mcp-server-utils.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts index b2a916211a0..be72869a216 100644 --- a/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts +++ b/workspaces/mi/mi-extension/src/util/mcp-server-utils.ts @@ -285,9 +285,16 @@ export function generateToolsXml(tools: UnifiedTool[], inputSchemas: Record Date: Mon, 11 May 2026 05:44:00 +0530 Subject: [PATCH 067/114] Added review suggestions --- .../views/Forms/MCPServerForm/MCPServerToolsForm.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx index 9d9b6473f80..d6197ec0df8 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/MCPServerToolsForm.tsx @@ -218,10 +218,15 @@ export function MCPServerToolsForm({ path, editData }: MCPServerToolsFormProps) setLoading(true); setError(null); try { - let projectUri = path; - const artifactsIndex = projectUri.indexOf('/artifacts'); + let projectUri = pathModule.normalize(path); + const artifactsSep = `${pathModule.sep}artifacts`; + const artifactsIndex = projectUri.indexOf(artifactsSep); if (artifactsIndex !== -1) { - projectUri = projectUri.substring(0, artifactsIndex).replace(/\/src\/main\/wso2mi$/, ''); + projectUri = projectUri.substring(0, artifactsIndex); + const suffixPattern = `${pathModule.sep}src${pathModule.sep}main${pathModule.sep}wso2mi`; + if (projectUri.endsWith(suffixPattern)) { + projectUri = projectUri.substring(0, projectUri.length - suffixPattern.length); + } } const { apis: parsedAPIs, sequences: parsedSeqs } = From 23c49d405f57024ea8503c5ad62d54898976a1f1 Mon Sep 17 00:00:00 2001 From: Arunan Sugunakumar Date: Fri, 15 May 2026 15:08:47 +0530 Subject: [PATCH 068/114] Remove unnecessary stylings and reuse common components --- .../src/views/AddArtifact/index.tsx | 16 +- .../Forms/MCPServerForm/AddAPIToolDialog.tsx | 235 +++++++++--------- .../MCPServerForm/AddSequenceToolDialog.tsx | 222 ++++++++--------- .../MCPServerForm/CreateScratchToolDialog.tsx | 126 +++++----- .../views/Forms/MCPServerForm/dialogStyles.ts | 75 +----- 5 files changed, 300 insertions(+), 374 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/AddArtifact/index.tsx b/workspaces/mi/mi-visualizer/src/views/AddArtifact/index.tsx index f5d6530cfc2..7eb2fb7deba 100644 --- a/workspaces/mi/mi-visualizer/src/views/AddArtifact/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/AddArtifact/index.tsx @@ -386,6 +386,14 @@ export function AddArtifactView() { description="Manage shared resources and configurations." onClick={() => handleClick("resources")} /> + handleClick("mcpServers")} + /> handleClick("dataSources")} /> - handleClick("mcpServers")} - /> diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx index e7fa4053444..7c6d6ba73e9 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddAPIToolDialog.tsx @@ -18,10 +18,10 @@ import { useEffect, useState } from 'react'; import styled from '@emotion/styled'; -import { Button, Typography } from '@wso2/ui-toolkit'; +import { Dialog, Button, Typography, TextField } from '@wso2/ui-toolkit'; import { useForm } from 'react-hook-form'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; -import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, CustomInput, SelectAllRow, FlexRow, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, DialogTitle } from './dialogStyles'; +import { DialogField, DialogButtonGroup, SelectAllRow, FlexRow, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, DialogTitle } from './dialogStyles'; interface APIOperation { id: string; @@ -121,8 +121,6 @@ export function AddAPIToolDialog({ } }, [isOpen, reset]); - if (!isOpen) return null; - const selectedAPI = apis.find(a => a.id === selectedAPIForTool); const handleOperationToggle = (operationId: string) => { @@ -206,128 +204,125 @@ export function AddAPIToolDialog({ const hasMissingDescriptions = Array.from(selectedOperationIds).some(id => !items[id]?.description?.trim()); return ( - - e.stopPropagation()}> - Add Tools from API Operations - + + Add Tools from API Operations + + + Select API + handleAPIChange(e.target.value)} + > + + {apis.map(api => ( + + ))} + + + + {selectedAPIForTool && selectedAPI && ( - Select API - handleAPIChange(e.target.value)} - > - - {apis.map(api => ( - - ))} - - - - {selectedAPIForTool && selectedAPI && ( - - - Select Operations & Custom Names ({selectedOperationIds.size} of {selectedAPI.operations.length}) - - {selectedAPI.operations.length > 0 ? ( - - - e.stopPropagation()} - id="select-all" - /> - - - {selectedAPI.operations.map((op: APIOperation) => { - const itemErrors = errors.items?.[op.id]; - return ( - - handleOperationToggle(op.id)}> - handleOperationToggle(op.id)} + + Select Operations & Custom Names ({selectedOperationIds.size} of {selectedAPI.operations.length}) + + {selectedAPI.operations.length > 0 ? ( + + + e.stopPropagation()} + id="select-all" + /> + + + {selectedAPI.operations.map((op: APIOperation) => { + const itemErrors = errors.items?.[op.id]; + return ( + + handleOperationToggle(op.id)}> + handleOperationToggle(op.id)} + onClick={(e) => e.stopPropagation()} + id={`op-${op.id}`} + /> + + + + {op.method} + + {op.path} + + {op.summary && {op.summary}} + + + {selectedOperationIds.has(op.id) && ( + + Tool name + e.stopPropagation()} - id={`op-${op.id}`} /> - - - - {op.method} - - {op.path} - - {op.summary && {op.summary}} - - - {selectedOperationIds.has(op.id) && ( - - Tool name - Description * + + { if (e.target.value.trim()) clearErrors(`items.${op.id}.description` as const); }, + onBlur: e => { if (!e.target.value.trim()) setError(`items.${op.id}.description` as const, { message: 'Description is required.' }); }, + })} onClick={(e) => e.stopPropagation()} + sx={{ flex: 1 }} /> - Description * - - { if (e.target.value.trim()) clearErrors(`items.${op.id}.description` as const); }, - onBlur: e => { if (!e.target.value.trim()) setError(`items.${op.id}.description` as const, { message: 'Description is required.' }); }, - })} - onClick={(e) => e.stopPropagation()} - /> - - - {itemErrors?.description && {String(itemErrors.description.message)}} - - )} - - ); - })} - - ) : ( - No operations available in this API - )} - - )} - - - - {someSelected && ( - - {selectedOperationIds.size} operation{selectedOperationIds.size !== 1 ? 's' : ''} selected - + + + {itemErrors?.description && {String(itemErrors.description.message)}} + + )} + + ); + })} + + ) : ( + No operations available in this API )} - - - - + + )} + + + + {someSelected && ( + + {selectedOperationIds.size} operation{selectedOperationIds.size !== 1 ? 's' : ''} selected + + )} + + + ); } diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx index 33cf004afc4..f82066e171c 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MCPServerForm/AddSequenceToolDialog.tsx @@ -18,11 +18,11 @@ import { useEffect, useState } from 'react'; import styled from '@emotion/styled'; -import { Button, Typography } from '@wso2/ui-toolkit'; +import { Dialog, Button, Typography, TextField, TextArea } from '@wso2/ui-toolkit'; import { useForm } from 'react-hook-form'; import { Sequence } from '@wso2/mi-core'; import { useVisualizerContext } from '@wso2/mi-rpc-client'; -import { DialogOverlay, DialogContent, DialogField, DialogButtonGroup, CustomInput, SelectAllRow, FlexRow, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, SchemaTextarea, DialogTitle } from './dialogStyles'; +import { DialogField, DialogButtonGroup, SelectAllRow, FlexRow, CustomInputsContainer, ItemsList, ListItem, ListItemHeader, ItemCheckbox, DialogTitle } from './dialogStyles'; import { EMPTY_MCP_SCHEMA, INVALID_MCP_SCHEMA_MESSAGE } from '../../../constants'; // Styled Components @@ -72,8 +72,6 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } } }, [isOpen, reset]); - if (!isOpen) return null; - const toggleSequence = (id: string) => { const next = new Set(selectedIds); if (next.has(id)) { @@ -185,118 +183,118 @@ export function AddSequenceToolDialog({ isOpen, sequences, onConfirm, onCancel } const hasMissingDescriptions = selectedIdList.some(id => !items[id]?.description?.trim()); return ( - - e.stopPropagation()}> - Add Tools from Sequences - - Select Sequences ({selectedIds.size} of {sequences.length}) - {sequences.length === 0 ? ( - No sequences found in the project - ) : ( - - - e.stopPropagation()} - id="select-all-sequences" - /> - - - {sequences.map(seq => { - const itemErrors = errors.items?.[seq.id]; - return ( - - toggleSequence(seq.id)}> - toggleSequence(seq.id)} + + Add Tools from Sequences + + Select Sequences ({selectedIds.size} of {sequences.length}) + {sequences.length === 0 ? ( + No sequences found in the project + ) : ( + + + e.stopPropagation()} + id="select-all-sequences" + /> + + + {sequences.map(seq => { + const itemErrors = errors.items?.[seq.id]; + return ( + + toggleSequence(seq.id)}> + toggleSequence(seq.id)} + onClick={e => e.stopPropagation()} + id={`seq-${seq.id}`} + /> + {seq.name} + + {selectedIds.has(seq.id) && ( + + Tool name + e.stopPropagation()} - id={`seq-${seq.id}`} /> - {seq.name} - - {selectedIds.has(seq.id) && ( - - Tool name - Description * + + { if (e.target.value.trim()) clearErrors(`items.${seq.id}.description` as const); }, + onBlur: e => { if (!e.target.value.trim()) setError(`items.${seq.id}.description` as const, { message: 'Description is required.' }); }, + })} + onClick={e => e.stopPropagation()} + sx={{ flex: 1 }} + /> + + + {itemErrors?.description && {String(itemErrors.description.message)}} + Input Schema (JSON) + +