From 2c081cb1beb7419fa5e910ecaed6ae9d315195bc Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 29 Jul 2025 17:51:25 +0530 Subject: [PATCH 001/730] Add librarySelector module for AI library selection and function filtering --- .../ai/service/libs/librarySelector.ts | 469 ++++++++++++++++++ 1 file changed, 469 insertions(+) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts new file mode 100644 index 00000000000..b899c94b650 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts @@ -0,0 +1,469 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { generateObject, CoreMessage, tool, generateText, Output } from "ai"; +import { z } from "zod"; +import { + MinifiedLibrary, + QueryIcon, + RelevantLibrariesAndFunctionsRequest, + RelevantLibrariesAndFunctionsResponse, +} from "@wso2/ballerina-core"; +import { Client, Library, RemoteFunction, ResourceFunction, TypeDefinition } from "./libs_types"; +import { getMaximizedSelectedLibs, selectRequiredFunctions } from "./funcs"; +import { getAnthropicClient, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; +import { AIPanelAbortController } from "../../../../rpc-managers/ai-panel/utils"; + +import { getAllLibraries } from "./libs"; + +export enum GenerationType { + CODE_GENERATION = "CODE_GENERATION", + HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", +} + +interface LibraryListResponse { + libraries: string[]; +} + +export const RelevantLibSubsetSchema = z.array( + z.object({ + name: z.string(), + clients: z.array(z.string()).optional(), + functions: z.array(z.string()).optional(), + }) +); + +export async function getRelevantLibrariesAndFunctionsFromTool( + params: RelevantLibrariesAndFunctionsRequest, + generationType: GenerationType +): Promise { + const relevantTrimmedFuncs: Library[] = await getRequiredFunctions(params.query, generationType); + console.log("Selected Trimmed Functions:", relevantTrimmedFuncs); + + return { + libraries: relevantTrimmedFuncs, + }; +} + +export async function getRequiredFunctions(prompt: string, generationType: GenerationType): Promise { + const allLibraries = await getAllLibraries(generationType); + + let selectedLibs: Library[] = []; + if (allLibraries.length === 0) { + return []; + } + + console.log("Available libraries:", allLibraries.map((lib) => lib.name).join(", ")); + + const systemPrompt = ` +You are an AI assistant that helps select and filter relevant Ballerina libraries, clients, and functions based on a user query. + +You will be given: +- A user query describing an application or task +- A list of available libraries (names + descriptions) in the tool description + +Your responsibilities: +1. **Step 1**: Identify which libraries are relevant to the query. +2. **Step 2**: Call the tool \`GetRequiredFunctions\` with those library names. It will return all clients and functions in those libraries. +3. **Step 3**: Analyze the returned data and **filter out any irrelevant clients and functions**, keeping only those directly related to the query. + +**Important Notes**: +- If the query is healthcare-related (mentions FHIR, HL7, patient data, clinical systems, etc.), always include all of the following libraries in the tool input: + - ballerinax/health.base + - ballerinax/health.fhir.r4 + - ballerinax/health.fhir.r4.parser + - ballerinax/health.fhir.r4.international401 + - ballerinax/health.hl7v2commons + - ballerinax/health.hl7v2 + +**Filtering Instructions**: +- Use the tool output as your working set. +- Then, apply reasoning to select only the relevant: + - Libraries + - Clients + - Functions (inside clients or top-level functions) +- Remove any unrelated items. +- Return only the final filtered data. + +**Final Output Format**: +Return a valid JSON array where each item has: +- "name": the library name +- "clients": (optional) relevant client names +- "functions": (optional) relevant function names + +Example: +[ + { + "name": "ballerina/http", + "clients": ["Client"], + "functions": ["get", "post"] + } +] + +- Do not include any markdown, code blocks, or explanations. +- Return only JSON — plain, valid, and parsable. +- Provide experimental output in the \`experimental_output\` according to the schema. + + +Think step-by-step. Use the tool to get full data, then prune it carefully based on the query. +`.trim(); + + const userPrompt = ` +# USER QUERY +${prompt} +`.trim(); + + const GetRequiredFunctions = tool({ + description: ` +This tool analyzes a user query and returns **all** clients and functions from the selected Ballerina libraries. + +Before calling this tool: +- **Review all library descriptions** below. +- Select only the libraries that might be needed to fulfill the user query. + +Available libraries: +${allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n")} + +### Input +- \`selectedLibs\` (string[]): An array of Ballerina library names (e.g., ["ballerinax/github", "ballerinax/slack"]) + +### Instruction +After calling this tool, you will receive **all clients and functions** in the selected libraries. +Then, you must **filter and return only** those clients/functions relevant to the user's query in your final output. + +Treat the tool output as raw input — **your final response must contain only filtered, relevant information**. + `.trim(), + + parameters: z.object({ + selectedLibNames: z.array(z.string()), + }), + + async execute({ selectedLibNames }) { + console.log("Selected libraries for function extraction:", selectedLibNames); + selectedLibs = await getMaximizedSelectedLibs(selectedLibNames, generationType); + console.log("Maximized selected libraries:", selectedLibs); + return selectedLibs; + }, + }); + + const messages: CoreMessage[] = [ + { + role: "system", + content: systemPrompt, + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + { + role: "user", + content: userPrompt, // Your user input or question + }, + ]; + console.log("Generating library selection prompt"); + const startTime = Date.now(); + + const results = await generateText({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxTokens: 4096, + temperature: 0, + maxSteps: 5, + tools: { GetRequiredFunctions }, + messages, + experimental_output: Output.object({ + schema: getFunctionsResponseSchema, + }), + abortSignal: AIPanelAbortController.getInstance().signal, + }); + + const endTime = Date.now(); + console.log(`Library selection took ${endTime - startTime}ms`); + console.log("Generated library selection:", results); + + console.log("Generated library selection raw text:\n", results.text); + + // Try experimental output first, with type guard and filter + let filteredOutput = undefined; + console.log("Using experimental output for library selection", results.experimental_output); + + if (results.experimental_output && Array.isArray(results.experimental_output.libraries)) { + console.log("Using experimental output for library selection", results.experimental_output); + filteredOutput = results.experimental_output.libraries.filter((item) => !!item.name); + } + + // If no valid experimental output, fallback to parsing raw text output + if (!filteredOutput || filteredOutput.length === 0) { + filteredOutput = extractJsonFromMarkdown(results.text); + + console.log("Extracted JSON from markdown:", filteredOutput); + console.log("Filtered output type:", typeof filteredOutput, Array.isArray(filteredOutput)); + // If extractJsonFromMarkdown returns something invalid or not an array, fallback to empty + if (!Array.isArray(filteredOutput)) { + filteredOutput = []; + } else { + // Filter again for safety + filteredOutput = filteredOutput.filter( + (item): item is { name: string; clients?: string[]; functions?: string[] } => !!item.name + ); + } + } + + // Now map the filtered subset to full libraries using your function + const mappedLibraries = mapSubsetToFullLibraries(filteredOutput, selectedLibs); + console.log("Mapped libraries:", mappedLibraries); + + return mappedLibraries; +} + +export function mapSubsetToFullLibraries( + subset: { + name: string; + clients?: { + name: string; + functions: { name: string; parameters: string[]; returnType: string }[]; + }[]; + functions?: { name: string; parameters: string[]; returnType: string }[]; + }[], + allLibraries: Library[] +): Library[] { + return subset + .map((subLib) => { + const fullLib = allLibraries.find((lib) => lib.name === subLib.name); + if (!fullLib) { + return null; + } + + const usedTypes = new Set(); + + // Extract function names + const selectedFunctionNames = subLib.functions?.map((f) => f.name) ?? []; + + // Collect top-level functions + const filteredFunctions = (fullLib.functions || []).filter((func) => { + const keep = selectedFunctionNames.includes(func.name) || func.name === "init"; + if (keep) { + func.parameters.forEach((p) => usedTypes.add(p.type.name)); + usedTypes.add(func.return.type.name); + } + return keep; + }); + + // Extract selected client names + const selectedClientNames = subLib.clients?.map((c) => c.name) ?? []; + + // Filter clients + const filteredClients = fullLib.clients.filter((client) => selectedClientNames.includes(client.name)); + + // Filter client functions + const mappedClients = filteredClients.map((client) => { + const selectedClient = subLib.clients?.find((c) => c.name === client.name); + const selectedFuncNames = selectedClient?.functions?.map((f) => f.name) ?? []; + + const filteredFuncs = client.functions.filter((func) => { + if ("accessor" in func) { + func.parameters.forEach((p) => usedTypes.add(p.type.name)); + usedTypes.add(func.return.type.name); + return true; // keep all resource functions + } else { + const keep = selectedFuncNames.includes(func.name) || func.name === "init"; + if (keep) { + func.parameters.forEach((p) => usedTypes.add(p.type.name)); + usedTypes.add(func.return.type.name); + } + return keep; + } + }); + + return { + ...client, + functions: filteredFuncs, + }; + }); + + // Normalize type names and match + const filteredTypeDefs = fullLib.typeDefs.filter((td) => { + const normTd = normalizeTypeName(td.name); + for (const used of usedTypes) { + if (normalizeTypeName(used) === normTd) { + return true; + } + } + return false; + }); + + return { + ...fullLib, + clients: mappedClients, + functions: filteredFunctions.length ? filteredFunctions : undefined, + typeDefs: filteredTypeDefs, + }; + }) + .filter((lib) => lib !== null) as Library[]; +} + +// export function mapSubsetToFullLibraries( +// subset: { name: string; clients?: string[]; functions?: string[] }[], +// allLibraries: Library[] +// ): Library[] { +// return subset +// .map((subLib) => { +// const fullLib = allLibraries.find((lib) => lib.name === subLib.name); +// if (!fullLib) return null; + +// const usedTypes = new Set(); + +// // Filter top-level functions +// const filteredFunctions: RemoteFunction[] = subLib.functions +// ? (fullLib.functions || []).filter((func) => { +// const keep = subLib.functions!.includes(func.name) || func.name === "init"; +// if (keep) { +// func.parameters.forEach((p) => usedTypes.add(p.type.name)); +// usedTypes.add(func.return.type.name); +// } +// return keep; +// }) +// : fullLib.functions; + +// // Filter clients and their functions +// const filteredClients = subLib.clients +// ? fullLib.clients.filter((client) => subLib.clients!.includes(client.name)) +// : fullLib.clients; + +// const mappedClients = filteredClients.map((client) => { +// const filteredFuncs = client.functions.filter((func) => { +// if ("accessor" in func) { +// // Resource function - keep only if all retained +// func.parameters.forEach((p) => usedTypes.add(p.type.name)); +// usedTypes.add(func.return.type.name); +// return true; +// } else { +// const keep = !subLib.functions || subLib.functions.includes(func.name) || func.name === "init"; +// if (keep) { +// func.parameters.forEach((p) => usedTypes.add(p.type.name)); +// usedTypes.add(func.return.type.name); +// } +// return keep; +// } +// }); + +// return { +// ...client, +// functions: filteredFuncs, +// }; +// }); + +// console.log("Used types:", usedTypes); +// // Include only used typedefs +// const filteredTypeDefs = fullLib.typeDefs.filter((td) => { +// const normalized = normalizeTypeName(td.name); +// for (const used of usedTypes) { +// if (normalizeTypeName(used) === normalized) { +// return true; +// } +// } +// return false; +// }); + +// return { +// ...fullLib, +// clients: mappedClients, +// functions: filteredFunctions?.length ? filteredFunctions : undefined, +// typeDefs: filteredTypeDefs, +// }; +// }) +// .filter((lib) => lib !== null) as Library[]; +// } + +function normalizeTypeName(name: string): string { + return name + .replace(/\?$/, "") // remove trailing ? + .replace(/^map<(.+)>$/, "$1") // unwrap map<> + .replace(/^\[(.+)\]$/, "$1") // unwrap [] + .replace(/\|.*$/, "") // remove unions like <>|error + .trim(); +} + +function extractJsonFromMarkdown(text: string): any { + let jsonStr = text.trim(); + + // Remove ```json blocks + if (jsonStr.startsWith("```json")) { + jsonStr = jsonStr.slice(7); // remove ```json + } + if (jsonStr.endsWith("```")) { + jsonStr = jsonStr.slice(0, -3); // remove ending ``` + } + + // Optional: basic fix for missing commas between top-level fields (e.g., between ] } or } { ) + jsonStr = jsonStr.replace(/}\s*{/g, "},\n{"); // patch object to array if accidentally concatenated + + try { + return JSON.parse(jsonStr); + } catch (err) { + console.error("Failed to parse extracted JSON:", err); + console.error("Broken JSON string:\n", jsonStr); + return null; + } +} + +const getFunctionsResponseSchema = z.object({ + libraries: z.array( + z.object({ + name: z.string(), + clients: z + .array( + z.object({ + name: z.string(), + description: z.string(), + functions: z.array( + z.union([ + z.object({ + name: z.string(), + parameters: z.array(z.string()), + returnType: z.string(), + }), + z.object({ + accessor: z.string(), + paths: z.array( + z.union([ + z.string(), + z.object({ + name: z.string(), + type: z.string(), + }), + ]) + ), + parameters: z.array(z.string()), + returnType: z.string(), + }), + ]) + ), + }) + ) + .optional(), // mark as optional if it's not always present + functions: z + .array( + z.object({ + name: z.string(), + parameters: z.array(z.string()), + returnType: z.string(), + }) + ) + .optional(), // mark as optional if not always present + }) + ), +}); From 38bcb4185b15d71cbc8189280e41adad95bfd411 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 30 Jul 2025 10:34:08 +0530 Subject: [PATCH 002/730] Refactors library selector to improve AI prompt clarity Removes unused imports and simplifies the system prompt for better AI assistant performance when filtering Ballerina libraries and functions. Eliminates fallback JSON parsing logic and unused schemas to streamline the code path and reduce complexity. Updates prompt instructions to be more explicit about expected output format and filtering requirements. --- .../ai/service/libs/librarySelector.ts | 229 +++++------------- 1 file changed, 63 insertions(+), 166 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts index b899c94b650..816017fe51e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts @@ -16,17 +16,12 @@ * under the License. */ -import { generateObject, CoreMessage, tool, generateText, Output } from "ai"; +import { CoreMessage, tool, generateText, Output } from "ai"; import { z } from "zod"; -import { - MinifiedLibrary, - QueryIcon, - RelevantLibrariesAndFunctionsRequest, - RelevantLibrariesAndFunctionsResponse, -} from "@wso2/ballerina-core"; -import { Client, Library, RemoteFunction, ResourceFunction, TypeDefinition } from "./libs_types"; -import { getMaximizedSelectedLibs, selectRequiredFunctions } from "./funcs"; -import { getAnthropicClient, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; +import { RelevantLibrariesAndFunctionsRequest, RelevantLibrariesAndFunctionsResponse } from "@wso2/ballerina-core"; +import { Library } from "./libs_types"; +import { getMaximizedSelectedLibs } from "./funcs"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { AIPanelAbortController } from "../../../../rpc-managers/ai-panel/utils"; import { getAllLibraries } from "./libs"; @@ -35,19 +30,6 @@ export enum GenerationType { CODE_GENERATION = "CODE_GENERATION", HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", } - -interface LibraryListResponse { - libraries: string[]; -} - -export const RelevantLibSubsetSchema = z.array( - z.object({ - name: z.string(), - clients: z.array(z.string()).optional(), - functions: z.array(z.string()).optional(), - }) -); - export async function getRelevantLibrariesAndFunctionsFromTool( params: RelevantLibrariesAndFunctionsRequest, generationType: GenerationType @@ -71,18 +53,23 @@ export async function getRequiredFunctions(prompt: string, generationType: Gener console.log("Available libraries:", allLibraries.map((lib) => lib.name).join(", ")); const systemPrompt = ` -You are an AI assistant that helps select and filter relevant Ballerina libraries, clients, and functions based on a user query. +You are an AI assistant that selects and filters relevant Ballerina libraries, clients, and functions based on a user query. You will be given: - A user query describing an application or task - A list of available libraries (names + descriptions) in the tool description Your responsibilities: -1. **Step 1**: Identify which libraries are relevant to the query. -2. **Step 2**: Call the tool \`GetRequiredFunctions\` with those library names. It will return all clients and functions in those libraries. -3. **Step 3**: Analyze the returned data and **filter out any irrelevant clients and functions**, keeping only those directly related to the query. +1. **Step 1**: Identify which libraries are relevant to the user query. +2. **Step 2**: Call the tool \`GetRequiredFunctions\` with those library names. It will return full definitions for all clients and functions in those libraries. +3. **Step 3**: Carefully filter the tool output: + - Retain only the clients and functions directly relevant to the query. + - Prune unrelated clients and functions. + - Preserve constructor functions (e.g., \`init\`) and necessary typedefs only if used. **Important Notes**: +- Do NOT generate any natural language explanations or summaries. +- Do NOT explain code or usage. - If the query is healthcare-related (mentions FHIR, HL7, patient data, clinical systems, etc.), always include all of the following libraries in the tool input: - ballerinax/health.base - ballerinax/health.fhir.r4 @@ -92,40 +79,63 @@ Your responsibilities: - ballerinax/health.hl7v2 **Filtering Instructions**: -- Use the tool output as your working set. -- Then, apply reasoning to select only the relevant: +- Work only with the tool output (\'GetRequiredFunctions\'). +- Retain only relevant: - Libraries - - Clients - - Functions (inside clients or top-level functions) -- Remove any unrelated items. -- Return only the final filtered data. + - Clients (with relevant functions only) + - Top-level functions +- Do not include unused typedefs or full libraries if no elements are relevant. **Final Output Format**: -Return a valid JSON array where each item has: -- "name": the library name -- "clients": (optional) relevant client names -- "functions": (optional) relevant function names - -Example: -[ - { - "name": "ballerina/http", - "clients": ["Client"], - "functions": ["get", "post"] - } -] - -- Do not include any markdown, code blocks, or explanations. -- Return only JSON — plain, valid, and parsable. -- Provide experimental output in the \`experimental_output\` according to the schema. - - -Think step-by-step. Use the tool to get full data, then prune it carefully based on the query. +Return JSON in the following structure: + +\`\`\`json +{ + "libraries": [ + { + "name": "ballerina/http", + "clients": [ + { + "name": "Client", + "description": "HTTP client for making requests.", + "functions": [ + { + "name": "get", + "parameters": ["string url"], + "returnType": "http:Response" + } + ] + } + ], + "functions": [ + { + "name": "respond", + "parameters": ["http:Caller caller", "string message"], + "returnType": "error?" + } + ] + } + ] +} +\`\`\` + +- Do NOT include markdown or code block markers in your response. +- Do NOT include any explanatory text before or after the JSON. +- Return only the JSON object under \`experimental_output\` matching the provided schema. + +Think step-by-step. Use the tool output to reason and select only what’s directly needed for the task described in the user query. `.trim(); const userPrompt = ` # USER QUERY + ${prompt} + +## Instructions: +- The assistant should return only relevant libraries, clients, and functions based on the query. +- Use the \`GetRequiredFunctions\` tool with selected library names. +- Do NOT return all functions—only the ones that are directly needed for this task. +- Return your filtered result in JSON format matching the expected schema. `.trim(); const GetRequiredFunctions = tool({ @@ -205,23 +215,6 @@ Treat the tool output as raw input — **your final response must contain only f filteredOutput = results.experimental_output.libraries.filter((item) => !!item.name); } - // If no valid experimental output, fallback to parsing raw text output - if (!filteredOutput || filteredOutput.length === 0) { - filteredOutput = extractJsonFromMarkdown(results.text); - - console.log("Extracted JSON from markdown:", filteredOutput); - console.log("Filtered output type:", typeof filteredOutput, Array.isArray(filteredOutput)); - // If extractJsonFromMarkdown returns something invalid or not an array, fallback to empty - if (!Array.isArray(filteredOutput)) { - filteredOutput = []; - } else { - // Filter again for safety - filteredOutput = filteredOutput.filter( - (item): item is { name: string; clients?: string[]; functions?: string[] } => !!item.name - ); - } - } - // Now map the filtered subset to full libraries using your function const mappedLibraries = mapSubsetToFullLibraries(filteredOutput, selectedLibs); console.log("Mapped libraries:", mappedLibraries); @@ -315,79 +308,6 @@ export function mapSubsetToFullLibraries( .filter((lib) => lib !== null) as Library[]; } -// export function mapSubsetToFullLibraries( -// subset: { name: string; clients?: string[]; functions?: string[] }[], -// allLibraries: Library[] -// ): Library[] { -// return subset -// .map((subLib) => { -// const fullLib = allLibraries.find((lib) => lib.name === subLib.name); -// if (!fullLib) return null; - -// const usedTypes = new Set(); - -// // Filter top-level functions -// const filteredFunctions: RemoteFunction[] = subLib.functions -// ? (fullLib.functions || []).filter((func) => { -// const keep = subLib.functions!.includes(func.name) || func.name === "init"; -// if (keep) { -// func.parameters.forEach((p) => usedTypes.add(p.type.name)); -// usedTypes.add(func.return.type.name); -// } -// return keep; -// }) -// : fullLib.functions; - -// // Filter clients and their functions -// const filteredClients = subLib.clients -// ? fullLib.clients.filter((client) => subLib.clients!.includes(client.name)) -// : fullLib.clients; - -// const mappedClients = filteredClients.map((client) => { -// const filteredFuncs = client.functions.filter((func) => { -// if ("accessor" in func) { -// // Resource function - keep only if all retained -// func.parameters.forEach((p) => usedTypes.add(p.type.name)); -// usedTypes.add(func.return.type.name); -// return true; -// } else { -// const keep = !subLib.functions || subLib.functions.includes(func.name) || func.name === "init"; -// if (keep) { -// func.parameters.forEach((p) => usedTypes.add(p.type.name)); -// usedTypes.add(func.return.type.name); -// } -// return keep; -// } -// }); - -// return { -// ...client, -// functions: filteredFuncs, -// }; -// }); - -// console.log("Used types:", usedTypes); -// // Include only used typedefs -// const filteredTypeDefs = fullLib.typeDefs.filter((td) => { -// const normalized = normalizeTypeName(td.name); -// for (const used of usedTypes) { -// if (normalizeTypeName(used) === normalized) { -// return true; -// } -// } -// return false; -// }); - -// return { -// ...fullLib, -// clients: mappedClients, -// functions: filteredFunctions?.length ? filteredFunctions : undefined, -// typeDefs: filteredTypeDefs, -// }; -// }) -// .filter((lib) => lib !== null) as Library[]; -// } - function normalizeTypeName(name: string): string { return name .replace(/\?$/, "") // remove trailing ? @@ -397,29 +317,6 @@ function normalizeTypeName(name: string): string { .trim(); } -function extractJsonFromMarkdown(text: string): any { - let jsonStr = text.trim(); - - // Remove ```json blocks - if (jsonStr.startsWith("```json")) { - jsonStr = jsonStr.slice(7); // remove ```json - } - if (jsonStr.endsWith("```")) { - jsonStr = jsonStr.slice(0, -3); // remove ending ``` - } - - // Optional: basic fix for missing commas between top-level fields (e.g., between ] } or } { ) - jsonStr = jsonStr.replace(/}\s*{/g, "},\n{"); // patch object to array if accidentally concatenated - - try { - return JSON.parse(jsonStr); - } catch (err) { - console.error("Failed to parse extracted JSON:", err); - console.error("Broken JSON string:\n", jsonStr); - return null; - } -} - const getFunctionsResponseSchema = z.object({ libraries: z.array( z.object({ From e13a359c9258dae2cf3a2eef0f5d70b3c5fc31f4 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Thu, 31 Jul 2025 12:11:01 +0530 Subject: [PATCH 003/730] Enhance LibraryProviderTool for improved library fetching and schema validation --- .../src/features/ai/service/code/code.ts | 218 +++++++++++------- 1 file changed, 135 insertions(+), 83 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 73d399641a0..a5ba2b62a2b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,23 +1,19 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { CoreMessage, generateText, streamText } from "ai"; +import { CoreMessage, generateText, streamText, tool } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; -import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; -import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage, extractResourceDocumentContent } from "../utils"; +import { + GenerationType, + getRelevantLibrariesAndFunctions, + LibraryProviderTool, + LibraryProviderToolSchema, + getAllLibraries, +} from "../libs/libs"; +import { + getRewrittenPrompt, + populateHistory, + transformProjectSource, + getErrorMessage, + extractResourceDocumentContent, +} from "../utils"; import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; import { GetFunctionResponse } from "./../libs/funcs_inter_types"; import { LANGLIBS } from "./../libs/langlibs"; @@ -35,7 +31,7 @@ import { RepairParams, RepairResponse, SourceFiles, - Command + Command, } from "@wso2/ballerina-core"; import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; @@ -48,38 +44,64 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const packageName = project.projectName; const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getRewrittenPrompt(params, sourceFiles); - const relevantTrimmedFuncs: Library[] = ( - await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) - ).libraries; - const historyMessages = populateHistory(params.chatHistory); + + // Fetch all libraries for tool description + const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); + const libraryDescriptions = + allLibraries.length > 0 + ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") + : "- No libraries available"; + const allMessages: CoreMessage[] = [ { role: "system", - content: getSystemPromptPrefix(relevantTrimmedFuncs, sourceFiles, params.operationType), - }, - { - role: "system", - content: getSystemPromptSuffix(LANGLIBS), - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, + content: `You are an expert assistant specializing in Ballerina code generation. Your goal is to generate accurate Ballerina code based on the user query. Use the LibraryProviderTool to fetch library details (name, description, clients, functions, types) when needed. Follow these steps: +1. Analyze the query to determine required libraries. +2. Call LibraryProviderTool with the identified library names. +3. Use the tool's output to select relevant functions and types. +4. Generate syntactically correct Ballerina code, adhering to the API documentation and Ballerina conventions. +5. Handle errors gracefully and provide diagnostics if needed.`, }, ...historyMessages, { role: "user", - content: getUserPrompt(prompt, sourceFiles, params.fileAttachmentContents, packageName, params.operationType), - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, + content: getUserPrompt( + prompt, + sourceFiles, + params.fileAttachmentContents, + packageName, + params.operationType + ), }, ]; + const tools = { + LibraryProviderTool: tool({ + description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. +This tool analyzes a user query and returns **all** clients and functions from the selected Ballerina libraries. + +Before calling this tool: +- **Review all library descriptions** below. +- Select only the libraries that might be needed to fulfill the user query. + +Available libraries: +${libraryDescriptions}`, + parameters: LibraryProviderToolSchema, + execute: async (input: { libraryNames: string[] }) => { + console.log(`[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")}`); + return await LibraryProviderTool(input, GenerationType.CODE_GENERATION); + }, + }), + }; + const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 4096*4, + maxTokens: 4096 * 4, temperature: 0, messages: allMessages, + maxSteps: 10, + tools, abortSignal: AIPanelAbortController.getInstance().signal, }); @@ -103,7 +125,6 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const finishReason = part.finishReason; console.log("Finish reason: ", finishReason); if (finishReason === "error") { - // Already handled in error case. break; } const postProcessedResp: PostProcessResponse = await postProcess({ @@ -114,22 +135,20 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const MAX_REPAIR_ATTEMPTS = 3; let repair_attempt = 0; - let diagnosticFixResp = assistantResponse; //TODO: Check if we need this variable + let diagnosticFixResp = assistantResponse; while ( hasCodeBlocks(diagnosticFixResp) && diagnostics.length > 0 && repair_attempt < MAX_REPAIR_ATTEMPTS ) { console.log("Repair iteration: ", repair_attempt); - console.log("Diagnotsics trynna fix: ", diagnostics); - - const repairedResponse: RepairResponse = await repairCode( - { - previousMessages: allMessages, - assistantResponse: diagnosticFixResp, - diagnostics: diagnostics, - } - ); + console.log("Diagnostics trying to fix: ", diagnostics); + + const repairedResponse: RepairResponse = await repairCode({ + previousMessages: allMessages, + assistantResponse: diagnosticFixResp, + diagnostics: diagnostics, + }); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; repair_attempt++; @@ -157,39 +176,36 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } function getSystemPromptPrefix(apidocs: Library[], sourceFiles: SourceFiles[], op: OperationType): string { - if (op === "CODE_FOR_USER_REQUIREMENT") { - return getRequirementAnalysisCodeGenPrefix(apidocs, extractResourceDocumentContent(sourceFiles)); + return ( + getRequirementAnalysisCodeGenPrefix([], extractResourceDocumentContent(sourceFiles)) + + `\nUse the LibraryProviderTool to fetch library details when needed. Do not assume library contents unless provided by the tool.` + ); } else if (op === "TESTS_FOR_USER_REQUIREMENT") { - return getRequirementAnalysisTestGenPrefix(apidocs, extractResourceDocumentContent(sourceFiles)); + return ( + getRequirementAnalysisTestGenPrefix([], extractResourceDocumentContent(sourceFiles)) + + `\nUse the LibraryProviderTool to fetch library details when needed. Do not assume library contents unless provided by the tool.` + ); } - return `You are an expert assistant who specializes in writing Ballerina code. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the given API documentation. - -You will be provided with following inputs: - -1. API_DOCS: A JSON string containing the API documentation for various Ballerina libraries and their functions, types, and clients. - -${JSON.stringify(apidocs)} - -`; + return `You are an expert assistant specializing in Ballerina code generation. Use the LibraryProviderTool to fetch library details (name, description, clients, functions, types) when needed. Generate accurate Ballerina code based on the query and tool output, adhering to Ballerina conventions.`; } function getSystemPromptSuffix(langlibs: Library[]) { return `2. Langlibs ${JSON.stringify(langlibs)} - + -If the query doesn't require code examples, answer the code by utilzing the api documentation. +If the query doesn't require code examples, answer the code by utilizing the api documentation. If the query requires code, Follow these steps to generate the Ballerina code: 1. Carefully analyze the provided API documentation: - - Identify the available libraries, clients, their functions and their relavant types. + - Identify the available libraries, clients, their functions and their relevant types. 2. Thoroughly read and understand the given query: - Identify the main requirements and objectives of the integration. - - Determine which libraries, functions and their relavant records and types from the API documentation which are needed to achieve the query and forget about unused API docs. - - Note the libraries needed to achieve the query and plan the control flow of the applicaiton based input and output parameters of each function of the connector according to the API documentation. + - Determine which libraries, functions and their relevant records and types from the API documentation which are needed to achieve the query and forget about unused API docs. + - Note the libraries needed to achieve the query and plan the control flow of the application based input and output parameters of each function of the connector according to the API documentation. 3. Plan your code structure: - Decide which libraries need to be imported (Avoid importing lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map langlibs as they are already imported by default). @@ -202,13 +218,13 @@ If the query requires code, Follow these steps to generate the Ballerina code: 4. Generate the Ballerina code: - Start with the required import statements. - Define required configurables for the query. Use only string, int, boolean types in configurable variables. - - Initialize any necessary clients with the correct configuration at the module level(before any function or service declarations). + - Initialize any necessary clients with the correct configuration at the module level(before any function or service declarations). - Implement the main function OR service to address the query requirements. - Use defined connectors based on the query by following the API documentation. - Use only the functions, types, and clients specified in the API documentation. - - Use dot donation to access a normal function. Use -> to access a remote function or resource function. + - Use dot notation to access a normal function. Use -> to access a remote function or resource function. - Ensure proper error handling and type checking. - - Do not invoke methods on json access expressions. Always Use seperate statements. + - Do not invoke methods on json access expressions. Always use separate statements. - Use langlibs ONLY IF REQUIRED. 5. Review and refine your code: @@ -216,7 +232,7 @@ If the query requires code, Follow these steps to generate the Ballerina code: - Verify that you're only using elements from the provided API documentation. - Ensure the code follows Ballerina best practices and conventions. -Provide a brief explanation of how your code addresses the query and then output your generated ballerina code. +Provide a brief explanation of how your code addresses the query and then output your generated Ballerina code. Important reminders: - Only use the libraries, functions, types, services and clients specified in the provided API documentation. @@ -225,14 +241,14 @@ Important reminders: - Only use specified fields in records according to the api docs. this applies to array types of that record as well. - Ensure your code is syntactically correct and follows Ballerina conventions. - Do not use dynamic listener registrations. -- Do not write code in a way that requires updating/assigning values of function parameters. +- Do not write code in a way that requires updating/assigning values of function parameters. - ALWAYS Use two words camel case identifiers (variable, function parameter, resource function parameter and field names). - If the library name contains a . Always use an alias in the import statement. (import org/package.one as one;) -- Treat generated connectors/clients inside the generated folder as submodules. -- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder strucutre generated/fooApi the import should be \`import my_pkg.fooApi;\` -- If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. -- Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. -- When invoking resource function from a client, use the correct paths with accessor and paramters. (eg: exampleClient->/path1/["param"]/path2.get(key="value")) +- Treat generated connectors/clients inside the generated folder as submodules. +- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder structure generated/fooApi the import should be \`import my_pkg.fooApi;\` +- If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. +- Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. +- When invoking resource function from a client, use the correct paths with accessor and parameters. (eg: exampleClient->/path1/["param"]/path2.get(key="value")) - When you are accessing a field of a record, always assign it into new variable and use that variable in the next statement. - Avoid long comments in the code. Use // for single line comments. - Always use named arguments when providing values to any parameter. (eg: .get(key="value")) @@ -240,18 +256,18 @@ Important reminders: - Do not modify the README.md file unless asked to be modified explicitly in the query. - Do not add/modify toml files(Config.toml/Ballerina.toml) unless asked. - In the library API documentation if the service type is specified as generic, adhere to the instructions specified there on writing the service. -- For GraphQL service related queries, If the user haven't specified their own GraphQL Scehma, Write the proposed GraphQL schema for the user query right after explanation before generating the ballerina code. Use same names as the GraphQL Schema when defining record types. +- For GraphQL service related queries, If the user haven't specified their own GraphQL Schema, Write the proposed GraphQL schema for the user query right after explanation before generating the Ballerina code. Use same names as the GraphQL Schema when defining record types. -Begin your response with the explanation, once the entire explanation is finished only, include codeblock segments(if any) in the end of the response. +Begin your response with the explanation, once the entire explanation is finished only, include codeblock segments(if any) in the end of the response. The explanation should explain the control flow decided in step 2, along with the selected libraries and their functions. -Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. +Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. The codeblock segments should only have .bal contents and it should not generate or modify any other file types. Politely decline if the query requests for such cases. Example Codeblock segment: \`\`\`ballerina -//code goes here +//code goes here \`\`\` `; @@ -266,7 +282,7 @@ function getUserPrompt( ): string { let fileInstructions = ""; if (fileUploadContents.length > 0) { - fileInstructions = `4. File Upload Contents. : Contents of the file which the user uploaded as addtional information for the query. + fileInstructions = `4. File Upload Contents. : Contents of the file which the user uploaded as additional information for the query. ${fileUploadContents .map( @@ -276,7 +292,7 @@ Content: ${file.content}` .join("\n")}`; } - return `QUERY: The query you need to answer using the provided api documentation. + return `QUERY: The query you need to answer using the provided api documentation. ${usecase} @@ -316,7 +332,24 @@ export async function repairCodeCore(params: RepairParams, eventHandler: Copilot } export async function repairCode(params: RepairParams): Promise { + const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); + const libraryDescriptions = + allLibraries.length > 0 + ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") + : "- No libraries available"; + const allMessages: CoreMessage[] = [ + { + role: "system", + content: `You are an expert assistant specializing in Ballerina code repair. Your goal is to fix compiler errors in the provided Ballerina code based on diagnostics and API documentation. Use the LibraryProviderTool to fetch library details (name, description, clients, functions, types) when needed. Follow these steps: +1. Analyze the diagnostics to identify errors in the code. +2. Review the provided API documentation via LibraryProviderTool to ensure correct usage of libraries, functions, and types. +3. Fix the code to resolve all diagnostics, ensuring syntactic correctness and adherence to Ballerina conventions. +4. Provide a brief explanation of the fixes applied. + +Available libraries for LibraryProviderTool: +${libraryDescriptions}`, + }, ...params.previousMessages, { role: "assistant", @@ -330,13 +363,32 @@ export async function repairCode(params: RepairParams): Promise }, ]; + const tools = { + LibraryProviderTool: tool({ + description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. +This tool analyzes a user query and returns **all** clients and functions from the selected Ballerina libraries. + +Before calling this tool: +- **Review all library descriptions** below. +- Select only the libraries that might be needed to fulfill the user query. + +Available libraries: +${libraryDescriptions}`, + parameters: LibraryProviderToolSchema, + execute: async (input: { libraryNames: string[] }) => { + console.log(`[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")}`); + return await LibraryProviderTool(input, GenerationType.CODE_GENERATION); + }, + }), + }; + const { text, usage, providerMetadata } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, messages: allMessages, - abortSignal: AIPanelAbortController.getInstance().signal - + tools, + abortSignal: AIPanelAbortController.getInstance().signal, }); // replace original response with new code blocks From be8f49345cf3b62f900fc3c1d59b41087c8c41c3 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Thu, 31 Jul 2025 12:18:40 +0530 Subject: [PATCH 004/730] Refactor system prompt generation in code generation and repair functions for improved clarity and maintainability --- .../src/features/ai/service/code/code.ts | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index a5ba2b62a2b..06250a90572 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -2,7 +2,6 @@ import { CoreMessage, generateText, streamText, tool } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, - getRelevantLibrariesAndFunctions, LibraryProviderTool, LibraryProviderToolSchema, getAllLibraries, @@ -14,19 +13,14 @@ import { getErrorMessage, extractResourceDocumentContent, } from "../utils"; -import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; -import { GetFunctionResponse } from "./../libs/funcs_inter_types"; import { LANGLIBS } from "./../libs/langlibs"; import { Library } from "./../libs/libs_types"; import { - ChatNotify, DiagnosticEntry, FileAttatchment, GenerateCodeRequest, - onChatNotify, OperationType, PostProcessResponse, - ProjectDiagnostics, ProjectSource, RepairParams, RepairResponse, @@ -56,12 +50,8 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const allMessages: CoreMessage[] = [ { role: "system", - content: `You are an expert assistant specializing in Ballerina code generation. Your goal is to generate accurate Ballerina code based on the user query. Use the LibraryProviderTool to fetch library details (name, description, clients, functions, types) when needed. Follow these steps: -1. Analyze the query to determine required libraries. -2. Call LibraryProviderTool with the identified library names. -3. Use the tool's output to select relevant functions and types. -4. Generate syntactically correct Ballerina code, adhering to the API documentation and Ballerina conventions. -5. Handle errors gracefully and provide diagnostics if needed.`, + content: `${getSystemPromptPrefix([], sourceFiles, params.operationType)} +${getSystemPromptSuffix(LANGLIBS)}`, }, ...historyMessages, { @@ -341,14 +331,8 @@ export async function repairCode(params: RepairParams): Promise const allMessages: CoreMessage[] = [ { role: "system", - content: `You are an expert assistant specializing in Ballerina code repair. Your goal is to fix compiler errors in the provided Ballerina code based on diagnostics and API documentation. Use the LibraryProviderTool to fetch library details (name, description, clients, functions, types) when needed. Follow these steps: -1. Analyze the diagnostics to identify errors in the code. -2. Review the provided API documentation via LibraryProviderTool to ensure correct usage of libraries, functions, and types. -3. Fix the code to resolve all diagnostics, ensuring syntactic correctness and adherence to Ballerina conventions. -4. Provide a brief explanation of the fixes applied. - -Available libraries for LibraryProviderTool: -${libraryDescriptions}`, + content: `${getSystemPromptPrefix([], [], "CODE_GENERATION")} +${getSystemPromptSuffix(LANGLIBS)}`, }, ...params.previousMessages, { From 476631a7dbf5ee9f8a0b69b721b17c3a6e9f845b Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Thu, 31 Jul 2025 12:24:15 +0530 Subject: [PATCH 005/730] Refactor library imports and add LibraryProviderTool for enhanced library fetching and schema validation --- .../src/features/ai/service/code/code.ts | 8 +-- .../ai/service/libs/libraryProviderTool.ts | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 06250a90572..751972e08b6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,11 +1,7 @@ import { CoreMessage, generateText, streamText, tool } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; -import { - GenerationType, - LibraryProviderTool, - LibraryProviderToolSchema, - getAllLibraries, -} from "../libs/libs"; +import { GenerationType, getAllLibraries } from "../libs/libs"; +import { LibraryProviderTool, LibraryProviderToolSchema } from "../libs/libraryProviderTool"; import { getRewrittenPrompt, populateHistory, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts new file mode 100644 index 00000000000..f37ee7ff678 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -0,0 +1,61 @@ +import { GenerationType } from "./libs"; +import { jsonSchema } from "ai"; +import { langClient } from "../../activator"; +import { getGenerationMode } from "../utils"; +import { Library } from "./libs_types"; + +export const LibraryProviderToolSchema = jsonSchema<{ + libraryNames: string[]; + libraries: Library[]; +}>({ + type: "object", + properties: { + libraryNames: { + type: "array", + items: { type: "string" }, + description: "List of Ballerina library names to fetch details for", + }, + libraries: { + type: "array", + items: { + type: "object", + properties: { + name: { type: "string" }, + description: { type: "string" }, + typeDefs: { type: "array", items: { type: "object" } }, + clients: { type: "array", items: { type: "object" } }, + functions: { type: "array", items: { type: "object" } }, + services: { type: "array", items: { type: "object" } }, + }, + required: ["name", "description", "typeDefs", "clients"], + }, + description: "Retrieved library details", + }, + }, + required: ["libraryNames"], +}); + +export async function LibraryProviderTool( + params: { libraryNames: string[] }, + generationType: GenerationType +): Promise { + try { + const startTime = Date.now(); + const libraries = (await langClient.getCopilotFilteredLibraries({ + libNames: params.libraryNames, + mode: getGenerationMode(generationType), + })) as { libraries: Library[] }; + console.log( + `[LibraryProviderTool] Fetched ${libraries.libraries.length} libraries: ${params.libraryNames.join(", ")}` + ); + console.log( + `[LibraryProviderTool] Called with ${params.libraryNames.length} libraries, took ${ + (Date.now() - startTime) / 1000 + }s` + ); + return libraries.libraries; + } catch (error) { + console.error(`[LibraryProviderTool] Error fetching libraries: ${error}`); + return []; + } +} From 859c526ab69c93e165f3f7aa201424e7c81cbd02 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 5 Aug 2025 14:02:53 +0530 Subject: [PATCH 006/730] Refactors library provider tool to reduce duplication Extracts duplicated tool definition into a reusable factory function and enhances functionality to accept user prompts for more targeted library filtering. Removes redundant tool creation code from two locations and centralizes the logic in a single factory function that accepts library descriptions and generation type parameters. Adds user prompt parameter to the tool schema to enable more intelligent filtering of library functions based on user intent rather than returning all available functions. --- .../src/features/ai/service/code/code.ts | 39 +++------------- .../ai/service/libs/libraryProviderTool.ts | 45 +++++++++++++------ 2 files changed, 37 insertions(+), 47 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 751972e08b6..05de8c716d0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,7 +1,7 @@ -import { CoreMessage, generateText, streamText, tool } from "ai"; +import { CoreMessage, generateText, streamText } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getAllLibraries } from "../libs/libs"; -import { LibraryProviderTool, LibraryProviderToolSchema } from "../libs/libraryProviderTool"; +import { getLibraryProviderTool } from "../libs/libraryProviderTool"; import { getRewrittenPrompt, populateHistory, @@ -63,24 +63,10 @@ ${getSystemPromptSuffix(LANGLIBS)}`, ]; const tools = { - LibraryProviderTool: tool({ - description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. -This tool analyzes a user query and returns **all** clients and functions from the selected Ballerina libraries. - -Before calling this tool: -- **Review all library descriptions** below. -- Select only the libraries that might be needed to fulfill the user query. - -Available libraries: -${libraryDescriptions}`, - parameters: LibraryProviderToolSchema, - execute: async (input: { libraryNames: string[] }) => { - console.log(`[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")}`); - return await LibraryProviderTool(input, GenerationType.CODE_GENERATION); - }, - }), + LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), }; + const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, @@ -344,22 +330,7 @@ ${getSystemPromptSuffix(LANGLIBS)}`, ]; const tools = { - LibraryProviderTool: tool({ - description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. -This tool analyzes a user query and returns **all** clients and functions from the selected Ballerina libraries. - -Before calling this tool: -- **Review all library descriptions** below. -- Select only the libraries that might be needed to fulfill the user query. - -Available libraries: -${libraryDescriptions}`, - parameters: LibraryProviderToolSchema, - execute: async (input: { libraryNames: string[] }) => { - console.log(`[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")}`); - return await LibraryProviderTool(input, GenerationType.CODE_GENERATION); - }, - }), + LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), }; const { text, usage, providerMetadata } = await generateText({ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index f37ee7ff678..5057f30ec70 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -1,11 +1,12 @@ +import { tool } from "ai"; import { GenerationType } from "./libs"; import { jsonSchema } from "ai"; -import { langClient } from "../../activator"; -import { getGenerationMode } from "../utils"; import { Library } from "./libs_types"; +import { selectRequiredFunctions } from "./funcs"; -export const LibraryProviderToolSchema = jsonSchema<{ +const LibraryProviderToolSchema = jsonSchema<{ libraryNames: string[]; + userPrompt: string; libraries: Library[]; }>({ type: "object", @@ -15,6 +16,10 @@ export const LibraryProviderToolSchema = jsonSchema<{ items: { type: "string" }, description: "List of Ballerina library names to fetch details for", }, + userPrompt: { + type: "string", + description: "User query to determine relevant functions and types", + }, libraries: { type: "array", items: { @@ -32,30 +37,44 @@ export const LibraryProviderToolSchema = jsonSchema<{ description: "Retrieved library details", }, }, - required: ["libraryNames"], + required: ["libraryNames", "userPrompt"], }); export async function LibraryProviderTool( - params: { libraryNames: string[] }, + params: { libraryNames: string[]; userPrompt: string }, generationType: GenerationType ): Promise { try { const startTime = Date.now(); - const libraries = (await langClient.getCopilotFilteredLibraries({ - libNames: params.libraryNames, - mode: getGenerationMode(generationType), - })) as { libraries: Library[] }; - console.log( - `[LibraryProviderTool] Fetched ${libraries.libraries.length} libraries: ${params.libraryNames.join(", ")}` - ); + const libraries = await selectRequiredFunctions(params.userPrompt, params.libraryNames, generationType); + console.log(`[LibraryProviderTool] Fetched ${libraries.length} libraries: ${params.libraryNames.join(", ")}`); console.log( `[LibraryProviderTool] Called with ${params.libraryNames.length} libraries, took ${ (Date.now() - startTime) / 1000 }s` ); - return libraries.libraries; + return libraries; } catch (error) { console.error(`[LibraryProviderTool] Error fetching libraries: ${error}`); return []; } } + +export function getLibraryProviderTool(libraryDescriptions: string, generationType: GenerationType) { + return tool({ + description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. +This tool analyzes a user query and returns **only the relevant** clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. + +Before calling this tool: +- **Review all library descriptions** below. +- Select only the libraries that might be needed to fulfill the user query. + +Available libraries: +${libraryDescriptions}`, + parameters: LibraryProviderToolSchema, + execute: async (input: { libraryNames: string[]; userPrompt: string }) => { + console.log(`[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")}`); + return await LibraryProviderTool(input, generationType); + }, + }); +} From 583be822b0181698f80834eaf9401477b91a7356 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 5 Aug 2025 14:24:08 +0530 Subject: [PATCH 007/730] Adds copyright header and minor code cleanup Adds WSO2 Apache License copyright header to maintain legal compliance. Removes extra blank line and adds clarifying comment for error handling case. Marks diagnostic fix response variable for potential refactoring review. --- .../src/features/ai/service/code/code.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 05de8c716d0..1aee49f593f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,3 +1,19 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + import { CoreMessage, generateText, streamText } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getAllLibraries } from "../libs/libs"; @@ -66,7 +82,6 @@ ${getSystemPromptSuffix(LANGLIBS)}`, LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), }; - const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, @@ -97,6 +112,7 @@ ${getSystemPromptSuffix(LANGLIBS)}`, const finishReason = part.finishReason; console.log("Finish reason: ", finishReason); if (finishReason === "error") { + // Already handled in error case. break; } const postProcessedResp: PostProcessResponse = await postProcess({ @@ -107,7 +123,7 @@ ${getSystemPromptSuffix(LANGLIBS)}`, const MAX_REPAIR_ATTEMPTS = 3; let repair_attempt = 0; - let diagnosticFixResp = assistantResponse; + let diagnosticFixResp = assistantResponse; //TODO: Check if we need this variable while ( hasCodeBlocks(diagnosticFixResp) && diagnostics.length > 0 && From b4072ad6e37571a4f82c8e64d0547c396313abcf Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 11 Aug 2025 16:55:25 +0530 Subject: [PATCH 008/730] Adds async library fetching for missing external records Converts external record handling to async to enable fetching missing libraries from the language client when they are not found in the original context. Improves robustness by dynamically retrieving library details instead of skipping missing dependencies, ensuring external type references can be properly resolved. --- .../src/features/ai/service/libs/funcs.ts | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 6302ca4195e..c713e1bf7ae 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -35,7 +35,7 @@ export async function selectRequiredFunctions(prompt: string, selectedLibNames: const resp: GetTypeResponse[] = await getRequiredTypesFromLibJson(selectedLibNames, prompt, selectedLibs); typeLibraries = toTypesToLibraries(resp, selectedLibs); } - const maximizedLibraries: Library[] = toMaximizedLibrariesFromLibJson(functionsResponse, selectedLibs); + const maximizedLibraries: Library[] = await toMaximizedLibrariesFromLibJson(functionsResponse, selectedLibs); // Merge typeLibraries and maximizedLibraries without duplicates const mergedLibraries = mergeLibrariesWithoutDuplicates(maximizedLibraries, typeLibraries); @@ -293,7 +293,7 @@ export async function getMaximizedSelectedLibs(libNames:string[], generationType return result.libraries as Library[]; } -export function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionResponse[], originalLibraries: Library[]): Library[] { +export async function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionResponse[], originalLibraries: Library[]): Promise { const minifiedLibrariesWithoutRecords: Library[] = []; for (const funcResponse of functionResponses) { @@ -321,7 +321,7 @@ export function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionRe // Handle external type references const externalRecordsRefs = getExternalTypeDefsRefs(minifiedLibrariesWithoutRecords); - getExternalRecords(minifiedLibrariesWithoutRecords, externalRecordsRefs, originalLibraries); + await getExternalRecords(minifiedLibrariesWithoutRecords, externalRecordsRefs, originalLibraries); return minifiedLibrariesWithoutRecords; } @@ -629,27 +629,36 @@ function addLibraryRecords(externalRecords: Map, libraryName: } } -function getExternalRecords( +async function getExternalRecords( newLibraries: Library[], libRefs: Map, originalLibraries: Library[] -): void { +): Promise { for (const [libName, recordNames] of libRefs.entries()) { if (libName.startsWith("ballerina/lang.int")) { // TODO: find a proper solution continue; } - - const library = originalLibraries.find(lib => lib.name === libName); + + let library = originalLibraries.find(lib => lib.name === libName); if (!library) { - console.warn(`Library ${libName} is not found in the context. Skipping the library.`); - continue; + console.warn(`Library ${libName} is not found in the context. Fetching library details.`); + const result = (await langClient.getCopilotFilteredLibraries({ + libNames: [libName], + mode: getGenerationMode(GenerationType.CODE_GENERATION), + })) as { libraries: Library[] }; + library = result.libraries[0]; + if (!library) { + console.warn(`Library ${libName} could not be fetched. Skipping the library.`); + continue; + } + console.log(`[getExternalRecords] Fetched library ${libName}:`, library); } - + for (const recordName of recordNames) { const typeDef = getTypeDefByName(recordName, library.typeDefs); if (!typeDef) { - console.warn(`Record ${recordName} is not found in the context. Skipping the record.`); + console.warn(`Record ${recordName} is not found in library ${libName}. Skipping the record.`); continue; } From 58290ddf46a3c24248bd36bd9090623f215eac6c Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 11 Aug 2025 16:55:42 +0530 Subject: [PATCH 009/730] Enhances logging to include user prompt information Improves debugging capabilities by adding the user prompt to the console log output alongside the library names, providing more complete context for troubleshooting library provider tool executions. --- .../src/features/ai/service/libs/libraryProviderTool.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index 5057f30ec70..ba14e05d2bb 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -73,7 +73,11 @@ Available libraries: ${libraryDescriptions}`, parameters: LibraryProviderToolSchema, execute: async (input: { libraryNames: string[]; userPrompt: string }) => { - console.log(`[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")}`); + console.log( + `[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")} and prompt: ${ + input.userPrompt + }` + ); return await LibraryProviderTool(input, generationType); }, }); From 6e9810b33e6f6ac1b4505abd1f9d7656bcb65cd3 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 11 Aug 2025 17:08:06 +0530 Subject: [PATCH 010/730] Refactors system prompt generation for better modularity Consolidates system prompt logic into a single base prompt structure that includes detailed instructions for library selection and tool usage. Adds healthcare-specific library requirements and implements Anthropic cache control for improved performance. Simplifies code repair functionality by removing redundant system prompt setup and library tool initialization. --- .../src/features/ai/service/code/code.ts | 91 +++++++++++++------ 1 file changed, 65 insertions(+), 26 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 1aee49f593f..a4869a01644 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -62,8 +62,14 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const allMessages: CoreMessage[] = [ { role: "system", - content: `${getSystemPromptPrefix([], sourceFiles, params.operationType)} -${getSystemPromptSuffix(LANGLIBS)}`, + content: getSystemPromptPrefix(sourceFiles, params.operationType, GenerationType.CODE_GENERATION), + }, + { + role: "system", + content: getSystemPromptSuffix(LANGLIBS), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, }, ...historyMessages, { @@ -75,6 +81,9 @@ ${getSystemPromptSuffix(LANGLIBS)}`, packageName, params.operationType ), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, }, ]; @@ -163,23 +172,65 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } } -function getSystemPromptPrefix(apidocs: Library[], sourceFiles: SourceFiles[], op: OperationType): string { +function getSystemPromptPrefix( + sourceFiles: SourceFiles[], + op: OperationType, + generationType: GenerationType +): string { + const basePrompt = `# QUESTION +Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. Use the LibraryProviderTool to fetch details (name, description, clients, functions, types) for only the selected libraries. The tool description contains all available libraries and their descriptions. Do not assume library contents unless provided by the tool. + +# Example +**Context**: +${JSON.stringify( + [ + { + name: "ballerinax/azure.openai.chat", + description: "Provides a Ballerina client for the Azure OpenAI Chat API.", + }, + { + name: "ballerinax/github", + description: "Provides a Ballerina client for the GitHub API.", + }, + { + name: "ballerinax/slack", + description: "Provides a Ballerina client for the Slack API.", + }, + { + name: "ballerinax/http", + description: "Allows to interact with HTTP services.", + }, + ], + null, + 2 +)} +**Query**: Write an application to read GitHub issues, summarize them, and post the summary to a Slack channel. +**LibraryProviderTool Call**: Call LibraryProviderTool with libraryNames: ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] + +# Instructions +1. Analyze the user query to determine the required functionality. +2. Select the minimal set of libraries that can fulfill the query based on their descriptions. +3. Call the LibraryProviderTool with the selected libraryNames and the user query to fetch detailed information (clients, functions, types). +4. Use the tool's output to generate accurate Ballerina code. +5. Do not include libraries unless they are explicitly needed for the query. +${ + generationType === GenerationType.HEALTHCARE_GENERATION + ? "6. For healthcare-related queries, ALWAYS include the following libraries in the LibraryProviderTool call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." + : "" +} +You are an expert assistant specializing in Ballerina code generation.`; + if (op === "CODE_FOR_USER_REQUIREMENT") { - return ( - getRequirementAnalysisCodeGenPrefix([], extractResourceDocumentContent(sourceFiles)) + - `\nUse the LibraryProviderTool to fetch library details when needed. Do not assume library contents unless provided by the tool.` - ); + return getRequirementAnalysisCodeGenPrefix([], extractResourceDocumentContent(sourceFiles)) + `\n${basePrompt}`; } else if (op === "TESTS_FOR_USER_REQUIREMENT") { - return ( - getRequirementAnalysisTestGenPrefix([], extractResourceDocumentContent(sourceFiles)) + - `\nUse the LibraryProviderTool to fetch library details when needed. Do not assume library contents unless provided by the tool.` - ); + return getRequirementAnalysisTestGenPrefix([], extractResourceDocumentContent(sourceFiles)) + `\n${basePrompt}`; } - return `You are an expert assistant specializing in Ballerina code generation. Use the LibraryProviderTool to fetch library details (name, description, clients, functions, types) when needed. Generate accurate Ballerina code based on the query and tool output, adhering to Ballerina conventions.`; + return basePrompt; } function getSystemPromptSuffix(langlibs: Library[]) { - return `2. Langlibs + return `You will be provided with default langlibs which are already imported in the Ballerina code. + Langlibs ${JSON.stringify(langlibs)} @@ -320,18 +371,9 @@ export async function repairCodeCore(params: RepairParams, eventHandler: Copilot } export async function repairCode(params: RepairParams): Promise { - const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); - const libraryDescriptions = - allLibraries.length > 0 - ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") - : "- No libraries available"; + console.log("Repairing code with params", params); const allMessages: CoreMessage[] = [ - { - role: "system", - content: `${getSystemPromptPrefix([], [], "CODE_GENERATION")} -${getSystemPromptSuffix(LANGLIBS)}`, - }, ...params.previousMessages, { role: "assistant", @@ -345,9 +387,6 @@ ${getSystemPromptSuffix(LANGLIBS)}`, }, ]; - const tools = { - LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - }; const { text, usage, providerMetadata } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), From f3aa2473b15538f17ccbb382c3742b4adbbee1f8 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 12 Aug 2025 10:23:47 +0530 Subject: [PATCH 011/730] Cleans up code formatting and removes unused tools parameter Improves code readability by reformatting function signature to single line and removes whitespace inconsistencies. Removes unused tools parameter from generateText call in repair code functionality, eliminating dead code and reducing potential confusion. --- .../src/features/ai/service/code/code.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index a4869a01644..ebebe1eef8b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -172,11 +172,7 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } } -function getSystemPromptPrefix( - sourceFiles: SourceFiles[], - op: OperationType, - generationType: GenerationType -): string { +function getSystemPromptPrefix(sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): string { const basePrompt = `# QUESTION Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. Use the LibraryProviderTool to fetch details (name, description, clients, functions, types) for only the selected libraries. The tool description contains all available libraries and their descriptions. Do not assume library contents unless provided by the tool. @@ -387,13 +383,11 @@ export async function repairCode(params: RepairParams): Promise }, ]; - const { text, usage, providerMetadata } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, messages: allMessages, - tools, abortSignal: AIPanelAbortController.getInstance().signal, }); From 8cb8ca398a217fb56becaeac46bc870f4b40e84d Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 12 Aug 2025 13:38:03 +0530 Subject: [PATCH 012/730] Enhances code repair with library details Improves code repair accuracy by providing library details to the repair code function. This ensures that the code repair process is aware of the libraries used in the original code generation, enabling more accurate fixes of compiler errors related to function calls, types, and record field access. --- .../src/features/ai/service/code/code.ts | 37 ++++++++++++++----- .../ai/service/libs/libraryProviderTool.ts | 13 +++---- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index ebebe1eef8b..8f2aac78541 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -103,7 +103,15 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; + let libraryDetails: Library[] | null = null; for await (const part of fullStream) { + if (part.type === "tool-result") { + libraryDetails = part.result as Library[]; + console.log( + "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", + libraryDetails + ); + } switch (part.type) { case "text-delta": { const textPart = part.textDelta; @@ -141,11 +149,14 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler console.log("Repair iteration: ", repair_attempt); console.log("Diagnostics trying to fix: ", diagnostics); - const repairedResponse: RepairResponse = await repairCode({ - previousMessages: allMessages, - assistantResponse: diagnosticFixResp, - diagnostics: diagnostics, - }); + const repairedResponse: RepairResponse = await repairCode( + { + previousMessages: allMessages, + assistantResponse: diagnosticFixResp, + diagnostics: diagnostics, + }, + libraryDetails || [] + ); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; repair_attempt++; @@ -366,10 +377,18 @@ export async function repairCodeCore(params: RepairParams, eventHandler: Copilot return resp; } -export async function repairCode(params: RepairParams): Promise { - console.log("Repairing code with params", params); - +export async function repairCode(params: RepairParams, libraryDetails: Library[] = []): Promise { const allMessages: CoreMessage[] = [ + { + role: "system", + content: `Library details used in the original code generation: + +${JSON.stringify(libraryDetails)} +`, + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, ...params.previousMessages, { role: "assistant", @@ -378,7 +397,7 @@ export async function repairCode(params: RepairParams): Promise { role: "user", content: - "Generated code returns following errors. Double-check all functions, types, record field access against the API documentation again. Fix the compiler errors and return the new response. \n Errors: \n " + + "Generated code returns following errors. Double-check all functions, types, record field access against the provided library details. Fix the compiler errors and return the new response. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), }, ]; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index ba14e05d2bb..ea546dc508a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -47,11 +47,10 @@ export async function LibraryProviderTool( try { const startTime = Date.now(); const libraries = await selectRequiredFunctions(params.userPrompt, params.libraryNames, generationType); - console.log(`[LibraryProviderTool] Fetched ${libraries.length} libraries: ${params.libraryNames.join(", ")}`); console.log( - `[LibraryProviderTool] Called with ${params.libraryNames.length} libraries, took ${ - (Date.now() - startTime) / 1000 - }s` + `[LibraryProviderTool] Fetched ${libraries.length} libraries: ${libraries + .map((lib) => lib.name) + .join(", ")}, took ${(Date.now() - startTime) / 1000}s` ); return libraries; } catch (error) { @@ -74,9 +73,9 @@ ${libraryDescriptions}`, parameters: LibraryProviderToolSchema, execute: async (input: { libraryNames: string[]; userPrompt: string }) => { console.log( - `[LibraryProviderTool] Called with libraries: ${input.libraryNames.join(", ")} and prompt: ${ - input.userPrompt - }` + `[LibraryProviderTool] Called with ${input.libraryNames.length} libraries: ${input.libraryNames.join( + ", " + )} and prompt: ${input.userPrompt}` ); return await LibraryProviderTool(input, generationType); }, From 91f7e874186bec1df67614a6aa791f36d6fb02f7 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Fri, 15 Aug 2025 12:05:34 +0530 Subject: [PATCH 013/730] Removes unused librarySelector.ts file to streamline codebase --- .../ai/service/libs/librarySelector.ts | 366 ------------------ 1 file changed, 366 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts deleted file mode 100644 index 816017fe51e..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/librarySelector.ts +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { CoreMessage, tool, generateText, Output } from "ai"; -import { z } from "zod"; -import { RelevantLibrariesAndFunctionsRequest, RelevantLibrariesAndFunctionsResponse } from "@wso2/ballerina-core"; -import { Library } from "./libs_types"; -import { getMaximizedSelectedLibs } from "./funcs"; -import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; -import { AIPanelAbortController } from "../../../../rpc-managers/ai-panel/utils"; - -import { getAllLibraries } from "./libs"; - -export enum GenerationType { - CODE_GENERATION = "CODE_GENERATION", - HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", -} -export async function getRelevantLibrariesAndFunctionsFromTool( - params: RelevantLibrariesAndFunctionsRequest, - generationType: GenerationType -): Promise { - const relevantTrimmedFuncs: Library[] = await getRequiredFunctions(params.query, generationType); - console.log("Selected Trimmed Functions:", relevantTrimmedFuncs); - - return { - libraries: relevantTrimmedFuncs, - }; -} - -export async function getRequiredFunctions(prompt: string, generationType: GenerationType): Promise { - const allLibraries = await getAllLibraries(generationType); - - let selectedLibs: Library[] = []; - if (allLibraries.length === 0) { - return []; - } - - console.log("Available libraries:", allLibraries.map((lib) => lib.name).join(", ")); - - const systemPrompt = ` -You are an AI assistant that selects and filters relevant Ballerina libraries, clients, and functions based on a user query. - -You will be given: -- A user query describing an application or task -- A list of available libraries (names + descriptions) in the tool description - -Your responsibilities: -1. **Step 1**: Identify which libraries are relevant to the user query. -2. **Step 2**: Call the tool \`GetRequiredFunctions\` with those library names. It will return full definitions for all clients and functions in those libraries. -3. **Step 3**: Carefully filter the tool output: - - Retain only the clients and functions directly relevant to the query. - - Prune unrelated clients and functions. - - Preserve constructor functions (e.g., \`init\`) and necessary typedefs only if used. - -**Important Notes**: -- Do NOT generate any natural language explanations or summaries. -- Do NOT explain code or usage. -- If the query is healthcare-related (mentions FHIR, HL7, patient data, clinical systems, etc.), always include all of the following libraries in the tool input: - - ballerinax/health.base - - ballerinax/health.fhir.r4 - - ballerinax/health.fhir.r4.parser - - ballerinax/health.fhir.r4.international401 - - ballerinax/health.hl7v2commons - - ballerinax/health.hl7v2 - -**Filtering Instructions**: -- Work only with the tool output (\'GetRequiredFunctions\'). -- Retain only relevant: - - Libraries - - Clients (with relevant functions only) - - Top-level functions -- Do not include unused typedefs or full libraries if no elements are relevant. - -**Final Output Format**: -Return JSON in the following structure: - -\`\`\`json -{ - "libraries": [ - { - "name": "ballerina/http", - "clients": [ - { - "name": "Client", - "description": "HTTP client for making requests.", - "functions": [ - { - "name": "get", - "parameters": ["string url"], - "returnType": "http:Response" - } - ] - } - ], - "functions": [ - { - "name": "respond", - "parameters": ["http:Caller caller", "string message"], - "returnType": "error?" - } - ] - } - ] -} -\`\`\` - -- Do NOT include markdown or code block markers in your response. -- Do NOT include any explanatory text before or after the JSON. -- Return only the JSON object under \`experimental_output\` matching the provided schema. - -Think step-by-step. Use the tool output to reason and select only what’s directly needed for the task described in the user query. -`.trim(); - - const userPrompt = ` -# USER QUERY - -${prompt} - -## Instructions: -- The assistant should return only relevant libraries, clients, and functions based on the query. -- Use the \`GetRequiredFunctions\` tool with selected library names. -- Do NOT return all functions—only the ones that are directly needed for this task. -- Return your filtered result in JSON format matching the expected schema. -`.trim(); - - const GetRequiredFunctions = tool({ - description: ` -This tool analyzes a user query and returns **all** clients and functions from the selected Ballerina libraries. - -Before calling this tool: -- **Review all library descriptions** below. -- Select only the libraries that might be needed to fulfill the user query. - -Available libraries: -${allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n")} - -### Input -- \`selectedLibs\` (string[]): An array of Ballerina library names (e.g., ["ballerinax/github", "ballerinax/slack"]) - -### Instruction -After calling this tool, you will receive **all clients and functions** in the selected libraries. -Then, you must **filter and return only** those clients/functions relevant to the user's query in your final output. - -Treat the tool output as raw input — **your final response must contain only filtered, relevant information**. - `.trim(), - - parameters: z.object({ - selectedLibNames: z.array(z.string()), - }), - - async execute({ selectedLibNames }) { - console.log("Selected libraries for function extraction:", selectedLibNames); - selectedLibs = await getMaximizedSelectedLibs(selectedLibNames, generationType); - console.log("Maximized selected libraries:", selectedLibs); - return selectedLibs; - }, - }); - - const messages: CoreMessage[] = [ - { - role: "system", - content: systemPrompt, - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, - }, - { - role: "user", - content: userPrompt, // Your user input or question - }, - ]; - console.log("Generating library selection prompt"); - const startTime = Date.now(); - - const results = await generateText({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 4096, - temperature: 0, - maxSteps: 5, - tools: { GetRequiredFunctions }, - messages, - experimental_output: Output.object({ - schema: getFunctionsResponseSchema, - }), - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - const endTime = Date.now(); - console.log(`Library selection took ${endTime - startTime}ms`); - console.log("Generated library selection:", results); - - console.log("Generated library selection raw text:\n", results.text); - - // Try experimental output first, with type guard and filter - let filteredOutput = undefined; - console.log("Using experimental output for library selection", results.experimental_output); - - if (results.experimental_output && Array.isArray(results.experimental_output.libraries)) { - console.log("Using experimental output for library selection", results.experimental_output); - filteredOutput = results.experimental_output.libraries.filter((item) => !!item.name); - } - - // Now map the filtered subset to full libraries using your function - const mappedLibraries = mapSubsetToFullLibraries(filteredOutput, selectedLibs); - console.log("Mapped libraries:", mappedLibraries); - - return mappedLibraries; -} - -export function mapSubsetToFullLibraries( - subset: { - name: string; - clients?: { - name: string; - functions: { name: string; parameters: string[]; returnType: string }[]; - }[]; - functions?: { name: string; parameters: string[]; returnType: string }[]; - }[], - allLibraries: Library[] -): Library[] { - return subset - .map((subLib) => { - const fullLib = allLibraries.find((lib) => lib.name === subLib.name); - if (!fullLib) { - return null; - } - - const usedTypes = new Set(); - - // Extract function names - const selectedFunctionNames = subLib.functions?.map((f) => f.name) ?? []; - - // Collect top-level functions - const filteredFunctions = (fullLib.functions || []).filter((func) => { - const keep = selectedFunctionNames.includes(func.name) || func.name === "init"; - if (keep) { - func.parameters.forEach((p) => usedTypes.add(p.type.name)); - usedTypes.add(func.return.type.name); - } - return keep; - }); - - // Extract selected client names - const selectedClientNames = subLib.clients?.map((c) => c.name) ?? []; - - // Filter clients - const filteredClients = fullLib.clients.filter((client) => selectedClientNames.includes(client.name)); - - // Filter client functions - const mappedClients = filteredClients.map((client) => { - const selectedClient = subLib.clients?.find((c) => c.name === client.name); - const selectedFuncNames = selectedClient?.functions?.map((f) => f.name) ?? []; - - const filteredFuncs = client.functions.filter((func) => { - if ("accessor" in func) { - func.parameters.forEach((p) => usedTypes.add(p.type.name)); - usedTypes.add(func.return.type.name); - return true; // keep all resource functions - } else { - const keep = selectedFuncNames.includes(func.name) || func.name === "init"; - if (keep) { - func.parameters.forEach((p) => usedTypes.add(p.type.name)); - usedTypes.add(func.return.type.name); - } - return keep; - } - }); - - return { - ...client, - functions: filteredFuncs, - }; - }); - - // Normalize type names and match - const filteredTypeDefs = fullLib.typeDefs.filter((td) => { - const normTd = normalizeTypeName(td.name); - for (const used of usedTypes) { - if (normalizeTypeName(used) === normTd) { - return true; - } - } - return false; - }); - - return { - ...fullLib, - clients: mappedClients, - functions: filteredFunctions.length ? filteredFunctions : undefined, - typeDefs: filteredTypeDefs, - }; - }) - .filter((lib) => lib !== null) as Library[]; -} - -function normalizeTypeName(name: string): string { - return name - .replace(/\?$/, "") // remove trailing ? - .replace(/^map<(.+)>$/, "$1") // unwrap map<> - .replace(/^\[(.+)\]$/, "$1") // unwrap [] - .replace(/\|.*$/, "") // remove unions like <>|error - .trim(); -} - -const getFunctionsResponseSchema = z.object({ - libraries: z.array( - z.object({ - name: z.string(), - clients: z - .array( - z.object({ - name: z.string(), - description: z.string(), - functions: z.array( - z.union([ - z.object({ - name: z.string(), - parameters: z.array(z.string()), - returnType: z.string(), - }), - z.object({ - accessor: z.string(), - paths: z.array( - z.union([ - z.string(), - z.object({ - name: z.string(), - type: z.string(), - }), - ]) - ), - parameters: z.array(z.string()), - returnType: z.string(), - }), - ]) - ), - }) - ) - .optional(), // mark as optional if it's not always present - functions: z - .array( - z.object({ - name: z.string(), - parameters: z.array(z.string()), - returnType: z.string(), - }) - ) - .optional(), // mark as optional if not always present - }) - ), -}); From d259430c69e3981bbf06022fee3b2de402f83d03 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 18 Aug 2025 15:24:29 +0530 Subject: [PATCH 014/730] Refines library function filtering in AI service Improves the AI assistant's library function filtering by enforcing stricter rules against hallucination and ensuring it only returns relevant libraries and functions from the provided context. This change also updates the code to accumulate library details in an array for better handling of multiple tool results. --- .../src/features/ai/service/code/code.ts | 4 ++-- .../src/features/ai/service/libs/funcs.ts | 23 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 8f2aac78541..38eea1016c5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -103,10 +103,10 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; - let libraryDetails: Library[] | null = null; + let libraryDetails: Library[] = []; for await (const part of fullStream) { if (part.type === "tool-result") { - libraryDetails = part.result as Library[]; + libraryDetails.push(...(part.result as Library[])); console.log( "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", libraryDetails diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index c713e1bf7ae..5175f44c026 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -168,11 +168,13 @@ async function getSuggestedFunctions(prompt: string, libraryList: GetFunctionsRe console.log(`[AI Request Start] Libraries: [${libraryNames}], Function Count: ${functionCount}`); - const getLibSystemPrompt = "You are an AI assistant tasked with filtering and removing unwanted functions and clients from a given set of libraries and clients based on a user query. Your goal is to return only the relevant libraries, clients, and functions that match the user's needs."; + const getLibSystemPrompt = `You are an AI assistant tasked with filtering and removing unwanted functions and clients from a provided set of libraries and clients based on a user query. Your goal is to return ONLY the relevant libraries, clients, and functions from the provided context that match the user's needs. Do NOT include any libraries or functions not explicitly listed in the provided Library_Context_JSON. - // TODO: Improve prompt to strictly avoid hallucinations, e.g., "Return ONLY libraries from the provided context; do not add new ones." - const getLibUserPrompt = ` -You will be provided with a list of libraries, clients, and their functions and user query. +Rules: +1. Use ONLY the libraries listed in Library_Context_JSON (e.g., ${libraryNames}). +2. Do NOT create or infer new libraries or functions. +`; +const getLibUserPrompt = `You will be provided with a list of libraries, clients, and their functions, and a user query. ${prompt} @@ -184,13 +186,12 @@ ${JSON.stringify(libraryList)} To process the user query and filter the libraries, clients, and functions, follow these steps: -1. Analyze the user query to understand the specific requirements or needs. -2. Review the list of libraries, clients, and their functions. -3. Identify which libraries, clients, and functions are relevant to the user query. -4. Remove any libraries, clients, and functions that are not directly related to the user's needs. -5. Organize the remaining relevant information. - -Ensure that you only include libraries, clients, and functions that are directly relevant to the user query. If no relevant results are found, return an empty array for the libraries. +1. Analyze the user query to understand the specific requirements or needs +2. Review the provided libraries, clients, and functions in Library_Context_JSON. +3. Select only the libraries, clients, and functions that directly match the query's needs. +4. Exclude any irrelevant libraries, clients, or functions. +5. If no relevant functions are found, return an empty array for the library's functions or clients. +6. Organize the remaining relevant information. Now, based on the provided libraries, clients, and functions, and the user query, please filter and return the relevant information. `; From a6291aa594f5547c7433f70b3459b9017e12f356 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Tue, 26 Aug 2025 09:34:16 +0530 Subject: [PATCH 015/730] Add service class tests --- .../service-class.spec.ts | 62 ++++++ .../serviceEditorUtils.ts | 192 ++++++++++++++++++ .../test/e2e-playwright-tests/test.list.ts | 2 + 3 files changed, 256 insertions(+) create mode 100644 workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts create mode 100644 workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts new file mode 100644 index 00000000000..e9b2bb6bfdd --- /dev/null +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { test } from '@playwright/test'; +import { addArtifact, getWebview, initTest, page } from '../utils'; +import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; +import { ProjectExplorer } from '../ProjectExplorer'; +import { ServiceClassEditorUtils } from './serviceEditorUtils'; + +export default function createTests() { + test.describe('AI Chat Agent Tests', { + tag: '@group1', + }, async () => { + initTest(); + test('Create Service Class', async ({ }, testInfo) => { + const testAttempt = testInfo.retry + 1; + + console.log('Creating a new Service Class in test attempt: ', testAttempt); + + // Creating a Service Class + await addArtifact('Type', 'type'); + + // Wait for page to be stable before accessing iframe + await page.page.waitForLoadState('networkidle'); + + // Get webview directly from utils + const artifactWebView = await getWebview('WSO2 Integrator: BI', page); + const serviceClassUtils = new ServiceClassEditorUtils(page.page, artifactWebView); + + // Wait for type editor to be ready + await serviceClassUtils.waitForTypeEditor(); + + const sampleName = `MyService${testAttempt}`; + // Create service class + const serviceForm = await serviceClassUtils.createServiceClass(sampleName, [ + { name: 'name', returnType: 'string', type: 'Resource' }, + { name: 'age', returnType: 'int', type: 'Remote'} + ], [ + { name: 'firstName', type: 'string' }, + {name: 'lastName', type: 'string' } + ]); + + await serviceClassUtils.renameServiceClass(`Service${testAttempt}`); + await serviceClassUtils.editMethod('name', 'fullName'); + await serviceClassUtils.deleteVariable('lastName'); + }) + }); +} \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts new file mode 100644 index 00000000000..7da712472fc --- /dev/null +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts @@ -0,0 +1,192 @@ +import { Frame, FrameLocator, Page } from '@playwright/test'; +import { Form } from '@wso2/playwright-vscode-tester'; + +export interface ServiceMethod { + name: string; + returnType: string; + type: 'Resource' | 'Remote'; +} + +export interface ServiceVariable { + name: string; + type: string; +} + +// Centralized wait configuration +const WAIT_CONFIG = { + SHORT: 1000, + MEDIUM: 3000, + LONG: 10000, + DEFAULT_VISIBLE_TIMEOUT: 10000 +} as const; + + +export class ServiceClassEditorUtils { + constructor(private page: Page, private artifactWebView: Frame) { } + + // Centralized wait utilities + private async waitForElement(selector: string, timeout = WAIT_CONFIG.DEFAULT_VISIBLE_TIMEOUT) { + const element = this.artifactWebView.locator(selector); + await element.waitFor({ state: 'visible', timeout}); + return element; + } + + private async waitForElementByTestId(testId: string, timeout = WAIT_CONFIG.DEFAULT_VISIBLE_TIMEOUT) { + const element = this.artifactWebView.getByTestId(testId); + await element.waitFor({ state: 'visible', timeout }); + return element; + } + + private async waitForButton(name: string, timeout = WAIT_CONFIG.DEFAULT_VISIBLE_TIMEOUT) { + const button = this.artifactWebView.getByRole('button', { name }); + await button.waitFor({ state: 'visible', timeout }); + return button; + } + + private async waitForTextbox(name: string, timeout = WAIT_CONFIG.DEFAULT_VISIBLE_TIMEOUT) { + const textbox = this.artifactWebView.getByRole('textbox', { name }); + await textbox.waitFor({ state: 'visible', timeout }); + return textbox; + } + + // Handle type completion consistently + private async handleTypeCompletion(inputElement: any) { + await this.page.waitForTimeout(WAIT_CONFIG.MEDIUM); + const completion = this.artifactWebView.getByTestId('add-type-completion'); + + if (await completion.isVisible()) { + await inputElement.press('Escape'); + } + } + + async waitForTypeEditor(): Promise { + await this.page.waitForTimeout(WAIT_CONFIG.MEDIUM); + await this.page.waitForLoadState('domcontentloaded'); + await this.waitForElementByTestId('type-editor-container', WAIT_CONFIG.LONG); + } + + async createServiceClass(name: string, methods: ServiceMethod[] = [], variables: ServiceVariable[] = []) { + const form = new Form(this.page, 'WSO2 Integrator: BI', this.artifactWebView); + await form.switchToFormView(false, this.artifactWebView); + + await form.fill({ + values: { + 'Name': { + type: 'input', + value: name, + }, + 'Kind': { + type: 'dropdown', + value: 'Service Class', + } + } + }); + + await form.submit('Save'); + + // Wait for the service class node to appear + await this.waitForElementByTestId(`type-node-${name}-menu`, WAIT_CONFIG.LONG); + + // Edit the service class + const serviceNode = this.artifactWebView.getByTestId(`type-node-${name}-menu`); + await serviceNode.getByRole('img').click(); + await this.artifactWebView.getByText('Edit', { exact: true }).click(); + + // Add methods and variables + for (const method of methods) { + await this.addMethod(method.name, method.returnType, method.type); + } + + for (const variable of variables) { + await this.addVariable(variable.name, variable.type); + } + + return form; + } + + async deleteVariable(variableName: string): Promise { + const deleteButton = this.artifactWebView.getByTestId(`delete-variable-button-${variableName}`).locator('i'); + await deleteButton.click({ force: true }); + + const okayButton = await this.waitForButton('Okay'); + await okayButton.click({ force: true }); + } + + async editMethod(methodName: string, newName: string): Promise { + const editButton = this.artifactWebView.getByTestId(`edit-method-button-${methodName}`).locator('i'); + await editButton.click(); + + const resourcePathField = await this.waitForTextbox('Resource Path*The resource'); + await resourcePathField.fill(newName); + + const saveButton = await this.waitForButton('Save'); + await saveButton.click(); + await this.artifactWebView.waitForTimeout(WAIT_CONFIG.MEDIUM); + } + + async renameServiceClass(newName: string): Promise { + const editButton = await this.waitForButton(' Edit'); + await editButton.click(); + await this.page.waitForTimeout(WAIT_CONFIG.SHORT); + + const renameButton = this.artifactWebView.getByTitle('Rename').locator('i'); + await renameButton.click(); + await this.page.waitForTimeout(WAIT_CONFIG.SHORT); + + const classNameField = await this.waitForTextbox('Class Name*The name of the'); + await classNameField.click(); + await classNameField.fill(newName); + + // Save changes with proper waits + const firstSaveButton = this.artifactWebView.getByRole('button', { name: 'Save' }).first(); + await firstSaveButton.click(); + await this.page.waitForTimeout(WAIT_CONFIG.SHORT); + + const secondSaveButton = this.artifactWebView.getByRole('button', { name: 'Save' }); + await secondSaveButton.click(); + await this.page.waitForTimeout(WAIT_CONFIG.SHORT); + } + + async addMethod(name: string, returnType: string, type: 'Resource' | 'Remote'): Promise { + const methodButton = await this.waitForButton(' Method'); + await methodButton.click(); + + await this.artifactWebView.getByText(type).click(); + + // Handle different input fields based on method type + const inputFieldName = type === 'Remote' + ? 'Function Name*The name of the' + : 'Resource Path*The resource'; + + const nameField = await this.waitForTextbox(inputFieldName); + await nameField.fill(name); + + // Handle return type + const returnBox = await this.waitForTextbox('Return Type'); + await returnBox.click(); + await this.artifactWebView.getByTitle(returnType, { exact: true }).click(); + + await this.handleTypeCompletion(returnBox); + + const saveButton = await this.waitForButton('Save'); + await saveButton.click(); + } + + async addVariable(name: string, type: string): Promise { + const variableButton = await this.waitForButton(' Variable'); + await variableButton.click(); + + const nameField = await this.waitForTextbox('Variable Name*The name of the'); + await nameField.fill(name); + + const typeField = await this.waitForTextbox('Variable Type'); + await typeField.fill(type); + await typeField.click(); + await this.artifactWebView.getByTitle(type, { exact: true }).click(); + + await this.handleTypeCompletion(typeField); + + const saveButton = await this.waitForButton('Save'); + await saveButton.click(); + } +} \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts index d4d64a2b899..61072d36c2e 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -48,6 +48,7 @@ import connectionArtifact from './other-artifacts/connection.spec'; import configuration from './configuration/configuration.spec'; import typeTest from './type/type.spec'; +import serviceTest from './service-class-designer/service-class.spec'; test.describe.configure({ mode: 'default' }); @@ -92,6 +93,7 @@ test.describe(configuration); // TODO: Fix this test test.describe(configuration); test.describe(typeTest); +test.describe(serviceTest); test.afterAll(async () => { console.log(`>>> Finished test suite`); From c6cb65980b162991362f81e6595be585a951469d Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 26 Aug 2025 16:37:39 +0530 Subject: [PATCH 016/730] Refines AI function suggestion prompt Improves the system prompt for AI function suggestions to clarify its role in filtering libraries and functions based on user queries. Specifically, it emphasizes that the provided libraries are a subset of the full requirements and updates the instructions to return an empty array for the libraries instead of library's functions or clients when no relevant functions are found. --- .../src/features/ai/service/libs/funcs.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 5175f44c026..1fd9c877d49 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -168,12 +168,12 @@ async function getSuggestedFunctions(prompt: string, libraryList: GetFunctionsRe console.log(`[AI Request Start] Libraries: [${libraryNames}], Function Count: ${functionCount}`); - const getLibSystemPrompt = `You are an AI assistant tasked with filtering and removing unwanted functions and clients from a provided set of libraries and clients based on a user query. Your goal is to return ONLY the relevant libraries, clients, and functions from the provided context that match the user's needs. Do NOT include any libraries or functions not explicitly listed in the provided Library_Context_JSON. + const getLibSystemPrompt = `You are an AI assistant tasked with filtering and removing unwanted functions and clients from a provided set of libraries and clients based on a user query. The provided libraries are a subset of the full requirements for the query. Your goal is to return ONLY the relevant libraries, clients, and functions from the provided context that match the user's needs. Rules: -1. Use ONLY the libraries listed in Library_Context_JSON (e.g., ${libraryNames}). -2. Do NOT create or infer new libraries or functions. -`; +1. Use ONLY the libraries listed in Library_Context_JSON. +2. Do NOT create or infer new libraries or functions.`; + const getLibUserPrompt = `You will be provided with a list of libraries, clients, and their functions, and a user query. @@ -186,11 +186,11 @@ ${JSON.stringify(libraryList)} To process the user query and filter the libraries, clients, and functions, follow these steps: -1. Analyze the user query to understand the specific requirements or needs +1. Analyze the user query to understand the specific requirements or needs. 2. Review the provided libraries, clients, and functions in Library_Context_JSON. 3. Select only the libraries, clients, and functions that directly match the query's needs. 4. Exclude any irrelevant libraries, clients, or functions. -5. If no relevant functions are found, return an empty array for the library's functions or clients. +5. If no relevant functions are found, return an empty array for the libraries. 6. Organize the remaining relevant information. Now, based on the provided libraries, clients, and functions, and the user query, please filter and return the relevant information. From 9cd815acee6cae7ed8d1abc29944af05f9c3803b Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 26 Aug 2025 16:39:30 +0530 Subject: [PATCH 017/730] Refactors library details handling Removes library details accumulation during code generation and adjusts logging for library provider tool results. The change simplifies the code generation process by removing the accumulation of library details. The library details are now directly logged when they are received. --- .../src/features/ai/service/code/code.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 38eea1016c5..4475257d226 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -103,13 +103,12 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; - let libraryDetails: Library[] = []; + for await (const part of fullStream) { if (part.type === "tool-result") { - libraryDetails.push(...(part.result as Library[])); console.log( "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", - libraryDetails + part.result as Library[] ); } switch (part.type) { @@ -155,7 +154,6 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler assistantResponse: diagnosticFixResp, diagnostics: diagnostics, }, - libraryDetails || [] ); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; From 7abe1e5de3b63894cffbadfd62d247ddfeb68e80 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 26 Aug 2025 16:54:00 +0530 Subject: [PATCH 018/730] Introduces ephemeral cache control for Anthropic messages to manage token usage. Improves Anthropic token management Introduces ephemeral cache control for Anthropic messages. This helps to manage token usage by preventing unnecessary caching of messages, especially in scenarios with large conversation histories. Additionally, the repair code is updated to better utilize context from previous messages, including tool calls and results, to identify relevant library details for fixing compiler errors. --- .../src/features/ai/service/code/code.ts | 83 +++++++++++++------ 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 4475257d226..906a453346c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -44,6 +44,30 @@ import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; +const ANTHROPIC_CACHE_BLOCK_LIMIT = 20; +const knownIds = new Set(); + +function appendFinalMessages(history: CoreMessage[], finalMessages: CoreMessage[]): void { + for (let i = 0; i < finalMessages.length - 1; i++) { + const message = finalMessages[i]; + const messageId = (message as any).id; + + if ((message.role === "assistant" || message.role === "tool") && messageId && !knownIds.has(messageId)) { + knownIds.add(messageId); + + if (i === finalMessages.length - 2) { + message.providerOptions = { + anthropic: { cacheControl: { type: "ephemeral" } }, + }; + } + + history.push(message); + } + } +} + +let libraryDescriptions = ""; + // Core code generation function that emits events export async function generateCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { const project: ProjectSource = await getProjectSource(params.operationType); @@ -54,7 +78,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler // Fetch all libraries for tool description const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); - const libraryDescriptions = + libraryDescriptions = allLibraries.length > 0 ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") : "- No libraries available"; @@ -67,9 +91,12 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler { role: "system", content: getSystemPromptSuffix(LANGLIBS), - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, + providerOptions: + historyMessages.length >= ANTHROPIC_CACHE_BLOCK_LIMIT - 2 + ? { + anthropic: { cacheControl: { type: "ephemeral" } }, + } + : undefined, }, ...historyMessages, { @@ -84,6 +111,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, }, + // Note: This cache control block can be removed if needed, as we use 3 out of 4 allowed cache blocks. }, ]; @@ -91,7 +119,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), }; - const { fullStream } = streamText({ + const { fullStream, response } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, @@ -114,7 +142,6 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler switch (part.type) { case "text-delta": { const textPart = part.textDelta; - assistantResponse += textPart; eventHandler({ type: "content_block", content: textPart }); break; } @@ -131,6 +158,18 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler // Already handled in error case. break; } + + const { messages: finalMessages } = await response; + appendFinalMessages(allMessages, finalMessages); + + const lastAssistantMessage = finalMessages + .slice() + .reverse() + .find((msg) => msg.role === "assistant"); + assistantResponse = lastAssistantMessage + ? (lastAssistantMessage.content as any[]).find((c) => c.type === "text")?.text || assistantResponse + : assistantResponse; + const postProcessedResp: PostProcessResponse = await postProcess({ assistant_response: assistantResponse, }); @@ -148,13 +187,11 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler console.log("Repair iteration: ", repair_attempt); console.log("Diagnostics trying to fix: ", diagnostics); - const repairedResponse: RepairResponse = await repairCode( - { - previousMessages: allMessages, - assistantResponse: diagnosticFixResp, - diagnostics: diagnostics, - }, - ); + const repairedResponse: RepairResponse = await repairCode({ + previousMessages: allMessages, + assistantResponse: diagnosticFixResp, + diagnostics: diagnostics, + }); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; repair_attempt++; @@ -375,18 +412,8 @@ export async function repairCodeCore(params: RepairParams, eventHandler: Copilot return resp; } -export async function repairCode(params: RepairParams, libraryDetails: Library[] = []): Promise { +export async function repairCode(params: RepairParams): Promise { const allMessages: CoreMessage[] = [ - { - role: "system", - content: `Library details used in the original code generation: - -${JSON.stringify(libraryDetails)} -`, - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, - }, ...params.previousMessages, { role: "assistant", @@ -395,15 +422,21 @@ ${JSON.stringify(libraryDetails)} { role: "user", content: - "Generated code returns following errors. Double-check all functions, types, record field access against the provided library details. Fix the compiler errors and return the new response. \n Errors: \n " + + "Generated code returns the following errors. Use the context from previous messages, including tool calls and tool results, to identify relevant library details (functions, types, clients). Double-check all functions, types, and record field access against these details to fix the compiler errors and return the corrected response. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), }, ]; + const tools = { + LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), + }; + const { text, usage, providerMetadata } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, + tools, + toolChoice: "none", messages: allMessages, abortSignal: AIPanelAbortController.getInstance().signal, }); From 0efab965c5866ebc7a123a50f654e57538bc2eba Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Fri, 29 Aug 2025 09:29:02 +0530 Subject: [PATCH 019/730] Adds missing copyright and license information to libraryProviderTool.ts --- .../ai/service/libs/libraryProviderTool.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index ea546dc508a..ef3486e0600 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -1,3 +1,19 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + import { tool } from "ai"; import { GenerationType } from "./libs"; import { jsonSchema } from "ai"; From 50a14a7c4a63106993d82ea60878502208c133d7 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Fri, 29 Aug 2025 10:37:26 +0530 Subject: [PATCH 020/730] Captures assistant's thinking process Captures and stores the assistant's thought process during code generation. This allows for better tracking and understanding of the AI's reasoning. --- .../src/features/ai/service/code/code.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 906a453346c..cd82ce36d30 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -131,6 +131,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; + let assistantThinking: string = ""; for await (const part of fullStream) { if (part.type === "tool-result") { @@ -170,6 +171,12 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ? (lastAssistantMessage.content as any[]).find((c) => c.type === "text")?.text || assistantResponse : assistantResponse; + const assistantMessages = finalMessages + .filter((msg) => msg.role === "assistant" && msg !== lastAssistantMessage) + .map((msg) => (msg.content as any[]).find((c) => c.type === "text")?.text || "") + .filter((text) => text !== ""); + assistantThinking = assistantMessages.join("\n"); + const postProcessedResp: PostProcessResponse = await postProcess({ assistant_response: assistantResponse, }); @@ -197,7 +204,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler repair_attempt++; } console.log("Final Diagnostics ", diagnostics); - eventHandler({ type: "content_replace", content: diagnosticFixResp }); + eventHandler({ type: "content_replace", content: assistantThinking + diagnosticFixResp }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); eventHandler({ type: "stop", command: Command.Code }); From 7d39251a0226231156a24ceac51ac5b0196e555b Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 1 Sep 2025 09:24:37 +0530 Subject: [PATCH 021/730] Refactors `knownIds` variable scope Moves the `knownIds` variable inside the `appendFinalMessages` function to limit its scope and avoid potential naming conflicts. Additionally, moves the `ANTHROPIC_CACHE_BLOCK_LIMIT` variable inside the `generateCodeCore` function to better encapsulate its usage. --- .../ballerina-extension/src/features/ai/service/code/code.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index cd82ce36d30..9393e1eedee 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -44,10 +44,9 @@ import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; -const ANTHROPIC_CACHE_BLOCK_LIMIT = 20; -const knownIds = new Set(); function appendFinalMessages(history: CoreMessage[], finalMessages: CoreMessage[]): void { + const knownIds = new Set(); for (let i = 0; i < finalMessages.length - 1; i++) { const message = finalMessages[i]; const messageId = (message as any).id; @@ -75,6 +74,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getRewrittenPrompt(params, sourceFiles); const historyMessages = populateHistory(params.chatHistory); + const ANTHROPIC_CACHE_BLOCK_LIMIT = 20; // Fetch all libraries for tool description const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); From f2126413c14f6aea82e52aca198abecdd585d389 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Mon, 1 Sep 2025 09:25:14 +0530 Subject: [PATCH 022/730] Handles missing library results gracefully Addresses a potential issue where a requested library is not found. Instead of directly assuming that the first library in the result is valid, now it checks if the libraries array exists and has at least one element before proceeding. If the library cannot be fetched, it logs a warning and continues to the next library. --- .../ballerina-extension/src/features/ai/service/libs/funcs.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 1fd9c877d49..52b06190947 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -648,8 +648,9 @@ async function getExternalRecords( libNames: [libName], mode: getGenerationMode(GenerationType.CODE_GENERATION), })) as { libraries: Library[] }; + if (result.libraries && result.libraries.length > 0) { library = result.libraries[0]; - if (!library) { + } else { console.warn(`Library ${libName} could not be fetched. Skipping the library.`); continue; } From b3566f8b020976725c101b4522caa1e1d56a894e Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Thu, 4 Sep 2025 14:44:37 +0530 Subject: [PATCH 023/730] Removes unused constant for Anthropics cache block limit and simplifies provider options logic --- .../src/features/ai/service/code/code.ts | 6 +----- .../src/features/ai/service/libs/funcs.ts | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 9393e1eedee..ada5ec1d9af 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -74,7 +74,6 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getRewrittenPrompt(params, sourceFiles); const historyMessages = populateHistory(params.chatHistory); - const ANTHROPIC_CACHE_BLOCK_LIMIT = 20; // Fetch all libraries for tool description const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); @@ -91,12 +90,9 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler { role: "system", content: getSystemPromptSuffix(LANGLIBS), - providerOptions: - historyMessages.length >= ANTHROPIC_CACHE_BLOCK_LIMIT - 2 - ? { + providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, } - : undefined, }, ...historyMessages, { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 52b06190947..c8d377e3070 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -649,7 +649,7 @@ async function getExternalRecords( mode: getGenerationMode(GenerationType.CODE_GENERATION), })) as { libraries: Library[] }; if (result.libraries && result.libraries.length > 0) { - library = result.libraries[0]; + library = result.libraries[0]; } else { console.warn(`Library ${libName} could not be fetched. Skipping the library.`); continue; From 671ba8585045e93e178434f1272d74063904c621 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Mon, 8 Sep 2025 15:29:31 +0530 Subject: [PATCH 024/730] Add new rpc type for service init model --- .../src/interfaces/extended-lang-client.ts | 21 ++++++++++++++++++- .../src/rpc-types/service-designer/index.ts | 3 ++- .../rpc-types/service-designer/rpc-type.ts | 3 ++- .../src/core/extended-language-client.ts | 8 ++++++- .../ballerina-extension/src/extension.ts | 2 +- .../service-designer/rpc-handler.ts | 5 ++++- .../service-designer/rpc-manager.ts | 19 ++++++++++++++++- .../service-designer/rpc-client.ts | 8 ++++++- 8 files changed, 61 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index a4dc5841246..52131c9dbb7 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -26,7 +26,7 @@ import { CodeActionParams, DefinitionParams, DocumentSymbolParams, ExecuteComman import { Category, Flow, FlowNode, CodeData, ConfigVariable, FunctionNode, Property, PropertyTypeMemberInfo, DIRECTORY_MAP, Imports } from "./bi"; import { ConnectorRequest, ConnectorResponse } from "../rpc-types/connector-wizard/interfaces"; import { SqFlow } from "../rpc-types/sequence-diagram/interfaces"; -import { FieldType, FunctionModel, ListenerModel, ServiceClassModel, ServiceModel } from "./service"; +import { FieldType, FunctionModel, ListenerModel, PropertyModel, ServiceClassModel, ServiceModel } from "./service"; import { CDModel } from "./component-diagram"; import { DMModel, ExpandedDMModel, IntermediateClause, Mapping, VisualizableField, FnMetadata, ResultClauseType, IOType } from "./data-mapper"; import { DataMapperMetadata, SCOPE } from "../state-machine-types"; @@ -1342,6 +1342,24 @@ export interface ServiceClassModelResponse { stacktrace?: string; } +export interface ServiceModelInitResponse { + serviceInitModel?: ServiceInitModel; + errorMsg?: string; + stacktrace?: string; +} + +export interface ServiceInitModel { + id: string; + displayName: string; + description: string; + orgName: string; + packageName: string; + moduleName: string; + version: string; + type: string; + icon: string; + properties: { [key: string]: PropertyModel }; +} // <-------- Type Related -------> export interface Type { @@ -1889,6 +1907,7 @@ export interface BIInterface extends BaseLangClientInterface { addResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; addFunctionSourceCode: (params: FunctionSourceCodeRequest) => Promise; getResourceReturnTypes: (params: ResourceReturnTypesRequest) => Promise; + getServiceInitModel: (params: ServiceModelRequest) => Promise; // Function APIs getFunctionNode: (params: FunctionNodeRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts index 1b0d5d6a99f..a85f8dcdc4c 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts @@ -17,7 +17,7 @@ */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -42,4 +42,5 @@ export interface ServiceDesignerAPI { addResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; addFunctionSourceCode: (params: FunctionSourceCodeRequest) => Promise; updateResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; + getServiceInitModel: (params: ServiceModelRequest) => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts index dc1b7c7ebbc..2ab7387a0a6 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts @@ -18,7 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -44,3 +44,4 @@ export const getResourceReturnTypes: RequestType = { method: `${_preFix}/addResourceSourceCode` }; export const addFunctionSourceCode: RequestType = { method: `${_preFix}/addFunctionSourceCode` }; export const updateResourceSourceCode: RequestType = { method: `${_preFix}/updateResourceSourceCode` }; +export const getServiceInitModel: RequestType = { method: `${_preFix}/getServiceInitModel` }; diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index d6661add2e3..9658b08ea9a 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -257,7 +257,8 @@ import { ImportIntegrationResponse, onMigrationToolStateChanged, onMigrationToolLogs, - GetMigrationToolsResponse + GetMigrationToolsResponse, + ServiceModelInitResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -391,6 +392,7 @@ enum EXTENDED_APIS { BI_SERVICE_UPDATE_LISTENER = 'serviceDesign/updateListener', BI_SERVICE_GET_LISTENER_SOURCE = 'serviceDesign/getListenerFromSource', BI_SERVICE_GET_SERVICE = 'serviceDesign/getServiceModel', + BI_SERVICE_GET_SERVICE_INIT = 'serviceDesign/getServiceInitModel', BI_SERVICE_GET_FUNCTION = 'serviceDesign/getFunctionModel', BI_SERVICE_ADD_SERVICE = 'serviceDesign/addService', BI_SERVICE_UPDATE_SERVICE = 'serviceDesign/updateService', @@ -1152,6 +1154,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_SERVICE, params); } + async getServiceInitModel(params: ServiceModelRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_SERVICE_INIT, params); + } + async getFunctionModel(params: FunctionModelRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_FUNCTION, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/extension.ts b/workspaces/ballerina/ballerina-extension/src/extension.ts index f172e4cc194..d86b93b39d8 100644 --- a/workspaces/ballerina/ballerina-extension/src/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/extension.ts @@ -255,7 +255,7 @@ async function updateCodeServerConfig() { if (!('CLOUD_STS_TOKEN' in process.env)) { return; } - log("Code server environment detected") + log("Code server environment detected"); const config = workspace.getConfiguration('ballerina'); await config.update('enableRunFast', true); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts index 2dabb631e0f..4388b864f22 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts @@ -49,7 +49,9 @@ import { TriggerModelsRequest, updateListenerSourceCode, updateResourceSourceCode, - updateServiceSourceCode + updateServiceSourceCode, + getServiceInitModel, + ServiceModelInitResponse } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { ServiceDesignerRpcManager } from "./rpc-manager"; @@ -74,4 +76,5 @@ export function registerServiceDesignerRpcHandlers(messenger: Messenger) { messenger.onRequest(addResourceSourceCode, (args: FunctionSourceCodeRequest) => rpcManger.addResourceSourceCode(args)); messenger.onRequest(addFunctionSourceCode, (args: FunctionSourceCodeRequest) => rpcManger.addFunctionSourceCode(args)); messenger.onRequest(updateResourceSourceCode, (args: FunctionSourceCodeRequest) => rpcManger.updateResourceSourceCode(args)); + messenger.onRequest(getServiceInitModel, (args: ServiceModelRequest) => rpcManger.getServiceInitModel(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts index f5f9b94de7b..177701a6622 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts @@ -48,7 +48,8 @@ import { ServiceSourceCodeRequest, TriggerModelsRequest, TriggerModelsResponse, - UpdatedArtifactsResponse + UpdatedArtifactsResponse, + ServiceModelInitResponse } from "@wso2/ballerina-core"; import * as fs from 'fs'; import * as yaml from 'js-yaml'; @@ -413,4 +414,20 @@ export class ServiceDesignerRpcManager implements ServiceDesignerAPI { } }); } + + async getServiceInitModel(params: ServiceModelRequest): Promise { + return new Promise(async (resolve) => { + const context = StateMachine.context(); + try { + const projectDir = path.join(StateMachine.context().projectUri); + const targetFile = path.join(projectDir, `main.bal`); + this.ensureFileExists(targetFile); + params.filePath = targetFile; + const res: ServiceModelInitResponse = await context.langClient.getServiceInitModel(params); + resolve(res); + } catch (error) { + console.log(error); + } + }); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts index 0f4d33beae2..50246fc65c2 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts @@ -62,7 +62,9 @@ import { getTriggerModels, updateListenerSourceCode, updateResourceSourceCode, - updateServiceSourceCode + updateServiceSourceCode, + ServiceModelInitResponse, + getServiceInitModel } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -145,4 +147,8 @@ export class ServiceDesignerRpcClient implements ServiceDesignerAPI { updateResourceSourceCode(params: FunctionSourceCodeRequest): Promise { return this._messenger.sendRequest(updateResourceSourceCode, HOST_EXTENSION, params); } + + getServiceInitModel(params: ServiceModelRequest): Promise { + return this._messenger.sendRequest(getServiceInitModel, HOST_EXTENSION, params); + } } From 1ceda526fa418e4c25605c9be640f622cbce932f Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Mon, 8 Sep 2025 17:40:03 +0530 Subject: [PATCH 025/730] Add Service Creation Component --- .../ballerina-visualizer/src/MainPanel.tsx | 6 +- .../ServiceDesigner/ServiceCreationView.tsx | 190 ++++++++++++++++++ 2 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index e419fb926d1..581dcdb31fb 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -76,6 +76,7 @@ import { BallerinaUpdateView } from "./views/BI/BallerinaUpdateView"; import { VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react"; import { DataMapper } from "./views/DataMapper"; import { ImportIntegration } from "./views/BI/ImportIntegration"; +import { ServiceCreationView } from "./views/BI/ServiceDesigner/ServiceCreationView"; const globalStyles = css` *, @@ -428,8 +429,11 @@ const MainPanel = () => { case MACHINE_VIEW.AIChatAgentWizard: setViewComponent(); break; + // case MACHINE_VIEW.BIServiceWizard: + // setViewComponent(); + // break; case MACHINE_VIEW.BIServiceWizard: - setViewComponent(); + setViewComponent(); break; case MACHINE_VIEW.BIServiceClassDesigner: setViewComponent( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx new file mode 100644 index 00000000000..d158f0fda67 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -0,0 +1,190 @@ +/** + * 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 { View, ViewContent } from "@wso2/ui-toolkit"; +import { TopNavigationBar } from "../../../components/TopNavigationBar"; +import { useEffect, useState } from "react"; +import { TitleBar } from "../../../components/TitleBar"; +import { isBetaModule } from "../ComponentListView/componentListUtils"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { FormField, FormImports, FormValues } from "@wso2/ballerina-side-panel"; +import { LineRange, ServiceInitModel } from "@wso2/ballerina-core"; +import { FormHeader } from "../../../components/FormHeader"; +import FormGeneratorNew from "../Forms/FormGeneratorNew"; +import styled from "@emotion/styled"; + +const Container = styled.div` + display: "flex"; + flex-direction: "column"; + gap: 10; + margin: 20px; + /* padding: 0 20px 20px; */ + max-width: 600px; + height: 100%; + > div:last-child { + /* padding: 20px 0; */ + > div:last-child { + justify-content: flex-start; + } + } +`; + +const FormContainer = styled.div` + /* padding-top: 15px; */ + padding-bottom: 15px; +`; + +export interface ServiceCreationViewProps { + type: string; +} + +interface HeaderInfo { + title: string; + moduleName: string; +} + +export function ServiceCreationView(props: ServiceCreationViewProps) { + + const { type } = props; + const { rpcClient } = useRpcContext(); + + const [headerInfo, setHeaderInfo] = useState(undefined); + const [serviceInitModel, setServiceInitModel] = useState(undefined); + const [formFields, setFormFields] = useState(undefined); + + const [filePath, setFilePath] = useState(""); + const [targetLineRange, setTargetLineRange] = useState(); + const [isSaving, setIsSaving] = useState(false); + + const MAIN_BALLERINA_FILE = "main.bal"; + + useEffect(() => { + rpcClient + .getServiceDesignerRpcClient() + .getServiceInitModel({ filePath: "", moduleName: type, listenerName: "" }) + .then((res) => { + setHeaderInfo({ + title: res?.serviceInitModel.displayName, + moduleName: res?.serviceInitModel.moduleName + }); + setServiceInitModel(res?.serviceInitModel); + setFormFields(mapServiceInitModelToFormFields(res?.serviceInitModel)); + }); + + // TODO: Need to handle record config + + rpcClient + .getVisualizerRpcClient() + .joinProjectPath(MAIN_BALLERINA_FILE) + .then((filePath) => { + setFilePath(filePath); + }); + }, []); + + useEffect(() => { + if (filePath && rpcClient) { + rpcClient + .getBIDiagramRpcClient() + .getEndOfFile({ filePath }) + .then((res) => { + setTargetLineRange({ + startLine: res, + endLine: res, + }); + }); + } + }, [filePath, rpcClient]); + + const handleOnSubmit = async (data: FormValues, fromImports: FormImports) => { + + } + + return ( + + + { + headerInfo && + + } + + + <> + {formFields && formFields.length > 0 && + + + {filePath && targetLineRange && + + } + + } + + + + + ); +} + + +function mapServiceInitModelToFormFields(model: ServiceInitModel): FormField[] { + if (!model || !model.properties) return []; + + return Object.entries(model.properties).map(([key, property]) => { + + // Determine value for MULTIPLE_SELECT + let value: any = property.value; + if (property.valueType === "MULTIPLE_SELECT") { + if (property.values && property.values.length > 0) { + value = property.values; + } else if (property.value) { + value = [property.value]; + } else if (property.items && property.items.length > 0) { + value = [property.items[0]]; + } else { + value = []; + } + } + + return { + key, + label: property?.metadata?.label, + type: property.valueType, + documentation: property?.metadata?.description || "", + valueType: property.valueTypeConstraint, + editable: true, + enabled: property.enabled ?? true, + optional: property.optional, + value, + valueTypeConstraint: property.valueTypeConstraint, + advanced: property.advanced, + diagnostics: [], + items: property.items, + choices: property.choices, + placeholder: property.placeholder, + addNewButton: property.addNewButton, + lineRange: property?.codedata?.lineRange + } as FormField; + }); +} From 34c6fce4a128bf98efd23ff69e547cce07341a9d Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Mon, 8 Sep 2025 18:19:25 +0530 Subject: [PATCH 026/730] Add service source generation rpc type --- .../src/interfaces/extended-lang-client.ts | 18 +++---- .../ballerina-core/src/interfaces/service.ts | 14 ++++++ .../src/rpc-types/service-designer/index.ts | 3 +- .../rpc-types/service-designer/rpc-type.ts | 3 +- .../src/core/extended-language-client.ts | 8 +++- .../service-designer/rpc-handler.ts | 4 +- .../service-designer/rpc-manager.ts | 47 ++++++++++++++++++- .../service-designer/rpc-client.ts | 9 +++- 8 files changed, 88 insertions(+), 18 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index 52131c9dbb7..b0ff9c0b6d4 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -26,7 +26,7 @@ import { CodeActionParams, DefinitionParams, DocumentSymbolParams, ExecuteComman import { Category, Flow, FlowNode, CodeData, ConfigVariable, FunctionNode, Property, PropertyTypeMemberInfo, DIRECTORY_MAP, Imports } from "./bi"; import { ConnectorRequest, ConnectorResponse } from "../rpc-types/connector-wizard/interfaces"; import { SqFlow } from "../rpc-types/sequence-diagram/interfaces"; -import { FieldType, FunctionModel, ListenerModel, PropertyModel, ServiceClassModel, ServiceModel } from "./service"; +import { FieldType, FunctionModel, ListenerModel, ServiceClassModel, ServiceInitModel, ServiceModel } from "./service"; import { CDModel } from "./component-diagram"; import { DMModel, ExpandedDMModel, IntermediateClause, Mapping, VisualizableField, FnMetadata, ResultClauseType, IOType } from "./data-mapper"; import { DataMapperMetadata, SCOPE } from "../state-machine-types"; @@ -1348,18 +1348,11 @@ export interface ServiceModelInitResponse { stacktrace?: string; } -export interface ServiceInitModel { - id: string; - displayName: string; - description: string; - orgName: string; - packageName: string; - moduleName: string; - version: string; - type: string; - icon: string; - properties: { [key: string]: PropertyModel }; +export interface ServiceInitSourceRequest { + filePath: string; + serviceInitModel: ServiceInitModel; } + // <-------- Type Related -------> export interface Type { @@ -1908,6 +1901,7 @@ export interface BIInterface extends BaseLangClientInterface { addFunctionSourceCode: (params: FunctionSourceCodeRequest) => Promise; getResourceReturnTypes: (params: ResourceReturnTypesRequest) => Promise; getServiceInitModel: (params: ServiceModelRequest) => Promise; + createServiceAndListener: (params: ServiceInitSourceRequest) => Promise; // Function APIs getFunctionNode: (params: FunctionNodeRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/service.ts b/workspaces/ballerina/ballerina-core/src/interfaces/service.ts index 68ab6d3d887..b3206edb0fa 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/service.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/service.ts @@ -158,3 +158,17 @@ export interface ParameterModel extends PropertyModel { export interface ConfigProperties { [key: string]: PropertyModel | ParameterModel; } + +export interface ServiceInitModel { + id: string; + displayName: string; + description: string; + orgName: string; + packageName: string; + moduleName: string; + version: string; + type: string; + icon: string; + properties: { [key: string]: PropertyModel }; +} + diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts index a85f8dcdc4c..b65025ec94b 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts @@ -17,7 +17,7 @@ */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse, ServiceInitSourceRequest, SourceEditResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -43,4 +43,5 @@ export interface ServiceDesignerAPI { addFunctionSourceCode: (params: FunctionSourceCodeRequest) => Promise; updateResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; getServiceInitModel: (params: ServiceModelRequest) => Promise; + createServiceAndListener: (params: ServiceInitSourceRequest) => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts index 2ab7387a0a6..d1687ed5f81 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts @@ -18,7 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse, ServiceInitSourceRequest, SourceEditResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -45,3 +45,4 @@ export const addResourceSourceCode: RequestType = { method: `${_preFix}/addFunctionSourceCode` }; export const updateResourceSourceCode: RequestType = { method: `${_preFix}/updateResourceSourceCode` }; export const getServiceInitModel: RequestType = { method: `${_preFix}/getServiceInitModel` }; +export const createServiceAndListener: RequestType = { method: `${_preFix}/createServiceAndListener` }; diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index 9658b08ea9a..7feba155ef5 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -258,7 +258,8 @@ import { onMigrationToolStateChanged, onMigrationToolLogs, GetMigrationToolsResponse, - ServiceModelInitResponse + ServiceModelInitResponse, + ServiceInitSourceRequest } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -393,6 +394,7 @@ enum EXTENDED_APIS { BI_SERVICE_GET_LISTENER_SOURCE = 'serviceDesign/getListenerFromSource', BI_SERVICE_GET_SERVICE = 'serviceDesign/getServiceModel', BI_SERVICE_GET_SERVICE_INIT = 'serviceDesign/getServiceInitModel', + BI_SERVICE_CREATE_SERVICE_AND_LISTENER = 'serviceDesign/createServiceAndListener', BI_SERVICE_GET_FUNCTION = 'serviceDesign/getFunctionModel', BI_SERVICE_ADD_SERVICE = 'serviceDesign/addService', BI_SERVICE_UPDATE_SERVICE = 'serviceDesign/updateService', @@ -1158,6 +1160,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_SERVICE_INIT, params); } + async createServiceAndListener(params: ServiceInitSourceRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_SERVICE_CREATE_SERVICE_AND_LISTENER, params); + } + async getFunctionModel(params: FunctionModelRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_FUNCTION, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts index 4388b864f22..d6f603ed4e5 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts @@ -51,7 +51,8 @@ import { updateResourceSourceCode, updateServiceSourceCode, getServiceInitModel, - ServiceModelInitResponse + createServiceAndListener, + ServiceInitSourceRequest } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { ServiceDesignerRpcManager } from "./rpc-manager"; @@ -77,4 +78,5 @@ export function registerServiceDesignerRpcHandlers(messenger: Messenger) { messenger.onRequest(addFunctionSourceCode, (args: FunctionSourceCodeRequest) => rpcManger.addFunctionSourceCode(args)); messenger.onRequest(updateResourceSourceCode, (args: FunctionSourceCodeRequest) => rpcManger.updateResourceSourceCode(args)); messenger.onRequest(getServiceInitModel, (args: ServiceModelRequest) => rpcManger.getServiceInitModel(args)); + messenger.onRequest(createServiceAndListener, (args: ServiceInitSourceRequest) => rpcManger.createServiceAndListener(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts index 177701a6622..1c8635b6493 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts @@ -49,7 +49,9 @@ import { TriggerModelsRequest, TriggerModelsResponse, UpdatedArtifactsResponse, - ServiceModelInitResponse + ServiceModelInitResponse, + ServiceInitSourceRequest, + SourceEditResponse } from "@wso2/ballerina-core"; import * as fs from 'fs'; import * as yaml from 'js-yaml'; @@ -430,4 +432,47 @@ export class ServiceDesignerRpcManager implements ServiceDesignerAPI { } }); } + + async createServiceAndListener(params: ServiceInitSourceRequest): Promise { + return new Promise(async (resolve) => { + const context = StateMachine.context(); + try { + const projectDir = path.join(StateMachine.context().projectUri); + const targetFile = path.join(projectDir, `main.bal`); + this.ensureFileExists(targetFile); + params.filePath = targetFile; + const identifiers = []; + for (let property in params.serviceInitModel.properties) { + const value = params.serviceInitModel.properties[property].value + || params.serviceInitModel.properties[property].values?.at(0); + if (value) { + identifiers.push(value); + } + if (params.serviceInitModel.properties[property].choices) { + params.serviceInitModel.properties[property].choices.forEach(choice => { + if (choice.properties) { + Object.keys(choice.properties).forEach(subProperty => { + const subPropertyValue = choice.properties[subProperty].value; + if (subPropertyValue) { + identifiers.push(subPropertyValue); + } + }); + } + }); + } + } + const res: SourceEditResponse = await context.langClient.createServiceAndListener(params); + + const edits = { textEdits: res.textEdits, resolveMissingDependencies: false }; + + const artifacts = await updateSourceCode(edits, { artifactType: DIRECTORY_MAP.SERVICE }); + let result: UpdatedArtifactsResponse = { + artifacts: artifacts + }; + resolve(result); + } catch (error) { + console.log(error); + } + }); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts index 50246fc65c2..2c0cf231666 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts @@ -64,7 +64,10 @@ import { updateResourceSourceCode, updateServiceSourceCode, ServiceModelInitResponse, - getServiceInitModel + getServiceInitModel, + ServiceInitSourceRequest, + createServiceAndListener, + SourceEditResponse } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -151,4 +154,8 @@ export class ServiceDesignerRpcClient implements ServiceDesignerAPI { getServiceInitModel(params: ServiceModelRequest): Promise { return this._messenger.sendRequest(getServiceInitModel, HOST_EXTENSION, params); } + + createServiceAndListener(params: ServiceInitSourceRequest): Promise { + return this._messenger.sendRequest(createServiceAndListener, HOST_EXTENSION, params); + } } From 10e94b53e90617e1bdaecfb43652cd090bbbc7e1 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Mon, 8 Sep 2025 18:49:25 +0530 Subject: [PATCH 027/730] Impl onSubmit functionality --- .../ServiceDesigner/ServiceCreationView.tsx | 86 +++++++++++++++++-- 1 file changed, 77 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index d158f0fda67..df747cd51b6 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -23,14 +23,15 @@ import { TitleBar } from "../../../components/TitleBar"; import { isBetaModule } from "../ComponentListView/componentListUtils"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { FormField, FormImports, FormValues } from "@wso2/ballerina-side-panel"; -import { LineRange, ServiceInitModel } from "@wso2/ballerina-core"; +import { EVENT_TYPE, LineRange, ServiceInitModel } from "@wso2/ballerina-core"; import { FormHeader } from "../../../components/FormHeader"; import FormGeneratorNew from "../Forms/FormGeneratorNew"; import styled from "@emotion/styled"; +import { getImportsForProperty } from "../../../utils/bi"; const Container = styled.div` - display: "flex"; - flex-direction: "column"; + display: flex; + flex-direction: column; gap: 10; margin: 20px; /* padding: 0 20px 20px; */ @@ -63,9 +64,9 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { const { type } = props; const { rpcClient } = useRpcContext(); - const [headerInfo, setHeaderInfo] = useState(undefined); - const [serviceInitModel, setServiceInitModel] = useState(undefined); - const [formFields, setFormFields] = useState(undefined); + const [headerInfo, setHeaderInfo] = useState(null); + const [model, setServiceInitModel] = useState(null); + const [formFields, setFormFields] = useState([]); const [filePath, setFilePath] = useState(""); const [targetLineRange, setTargetLineRange] = useState(); @@ -110,8 +111,37 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { } }, [filePath, rpcClient]); - const handleOnSubmit = async (data: FormValues, fromImports: FormImports) => { + const handleOnSubmit = async (data: FormValues, formImports: FormImports) => { + setIsSaving(true); + formFields.forEach(val => { + if (val.type === "CHOICE") { + val.choices.forEach((choice, index) => { + choice.enabled = false; + if (data[val.key] === index) { + choice.enabled = true; + for (const key in choice.properties) { + choice.properties[key].value = data[key]; + } + } + }) + } else if (data[val.key] !== undefined) { + val.value = data[val.key]; + } + val.imports = getImportsForProperty(val.key, formImports); + }) + const updatedModel = populateServiceInitModelFromFormFields(formFields, model); + + const res = await rpcClient + .getServiceDesignerRpcClient() + .createServiceAndListener({ filePath: "", serviceInitModel: updatedModel }); + + const newArtifact = res.artifacts.find(res => res.isNew && model.moduleName === res.moduleName); + if (newArtifact) { + rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: newArtifact.path, position: newArtifact.position } }); + setIsSaving(false); + return; + } } return ( @@ -126,7 +156,7 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { <> {formFields && formFields.length > 0 && - + {filePath && targetLineRange && { + const property = model.properties[field.key]; + if (!property) return; + + const value = field.value; + + // Handle MULTIPLE_SELECT and EXPRESSION_SET types + if (field.type === "MULTIPLE_SELECT" || field.type === "EXPRESSION_SET") { + property.values = Array.isArray(value) ? value : value ? [value] : []; + } else { + property.value = value as string; + } + + // Enable property if it has a non-empty value + if (value !== undefined && value !== null && ((Array.isArray(value) && value.length > 0) || (!Array.isArray(value) && value !== ""))) { + property.enabled = true; + } else { + property.enabled = false; + } + }); + return model; +} From f4c94e780b03ca867183e6bb0c6150aedf70bd27 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 9 Sep 2025 11:01:01 +0530 Subject: [PATCH 028/730] Fix issue with rendering expression editor --- .../ServiceDesigner/ServiceCreationView.tsx | 79 +++++++++++++++++-- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index df747cd51b6..714c5ea9177 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -23,7 +23,7 @@ import { TitleBar } from "../../../components/TitleBar"; import { isBetaModule } from "../ComponentListView/componentListUtils"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { FormField, FormImports, FormValues } from "@wso2/ballerina-side-panel"; -import { EVENT_TYPE, LineRange, ServiceInitModel } from "@wso2/ballerina-core"; +import { EVENT_TYPE, LineRange, Property, RecordTypeField, ServiceInitModel } from "@wso2/ballerina-core"; import { FormHeader } from "../../../components/FormHeader"; import FormGeneratorNew from "../Forms/FormGeneratorNew"; import styled from "@emotion/styled"; @@ -71,6 +71,7 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { const [filePath, setFilePath] = useState(""); const [targetLineRange, setTargetLineRange] = useState(); const [isSaving, setIsSaving] = useState(false); + const [recordTypeFields, setRecordTypeFields] = useState([]); const MAIN_BALLERINA_FILE = "main.bal"; @@ -87,8 +88,6 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { setFormFields(mapServiceInitModelToFormFields(res?.serviceInitModel)); }); - // TODO: Need to handle record config - rpcClient .getVisualizerRpcClient() .joinProjectPath(MAIN_BALLERINA_FILE) @@ -111,6 +110,71 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { } }, [filePath, rpcClient]); + useEffect(() => { + if (model) { + const hasPropertiesWithChoices = model?.moduleName === "http" && + Object.values(model.properties).some(property => property.choices); + + if (hasPropertiesWithChoices) { + const choiceRecordTypeFields = Object.entries(model.properties) + .filter(([_, property]) => property.choices) + .flatMap(([parentKey, property]) => + Object.entries(property.choices).flatMap(([choiceKey, choice]) => + Object.entries(choice.properties || {}) + .filter(([_, choiceProperty]) => + choiceProperty.typeMembers && + choiceProperty.typeMembers.some(member => member.kind === "RECORD_TYPE") + ) + .map(([choicePropertyKey, choiceProperty]) => ({ + key: choicePropertyKey, + property: { + ...choiceProperty, + metadata: { + label: choiceProperty.metadata?.label || choicePropertyKey, + description: choiceProperty.metadata?.description || '' + }, + valueType: choiceProperty?.valueType || 'string', + diagnostics: { + hasDiagnostics: choiceProperty.diagnostics && choiceProperty.diagnostics.length > 0, + diagnostics: choiceProperty.diagnostics + } + } as Property, + recordTypeMembers: choiceProperty.typeMembers.filter(member => member.kind === "RECORD_TYPE") + })) + ) + ); + console.log(">>> recordTypeFields of http serviceModel", choiceRecordTypeFields); + + setRecordTypeFields(choiceRecordTypeFields); + } else { + const recordTypeFields: RecordTypeField[] = Object.entries(model.properties) + .filter(([_, property]) => + property.typeMembers && + property.typeMembers.some(member => member.kind === "RECORD_TYPE") + ) + .map(([key, property]) => ({ + key, + property: { + ...property, + metadata: { + label: property.metadata?.label || key, + description: property.metadata?.description || '' + }, + valueType: property?.valueType || 'string', + diagnostics: { + hasDiagnostics: property.diagnostics && property.diagnostics.length > 0, + diagnostics: property.diagnostics + } + } as Property, + recordTypeMembers: property.typeMembers.filter(member => member.kind === "RECORD_TYPE") + })); + console.log(">>> recordTypeFields of serviceModel", recordTypeFields); + + setRecordTypeFields(recordTypeFields); + } + } + }, [model]); + const handleOnSubmit = async (data: FormValues, formImports: FormImports) => { setIsSaving(true); formFields.forEach(val => { @@ -165,7 +229,7 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { isSaving={isSaving} onSubmit={handleOnSubmit} preserveFieldOrder={true} - recordTypeFields={[]} + recordTypeFields={recordTypeFields} /> } @@ -202,6 +266,11 @@ function mapServiceInitModelToFormFields(model: ServiceInitModel): FormField[] { } } + let items = undefined; + if (property.valueType === "MULTIPLE_SELECT" || property.valueType === "SINGLE_SELECT") { + items = property.items; + } + return { key, label: property?.metadata?.label, @@ -215,7 +284,7 @@ function mapServiceInitModelToFormFields(model: ServiceInitModel): FormField[] { valueTypeConstraint: property.valueTypeConstraint, advanced: property.advanced, diagnostics: [], - items: property.items, + items, choices: property.choices, placeholder: property.placeholder, addNewButton: property.addNewButton, From aef6cbb27587036375d1001775950d0ed063bfa1 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 9 Sep 2025 20:20:22 +0530 Subject: [PATCH 029/730] Changes --- .../src/views/BI/ServiceDesigner/ServiceCreationView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index 714c5ea9177..cce7897403c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -270,7 +270,7 @@ function mapServiceInitModelToFormFields(model: ServiceInitModel): FormField[] { if (property.valueType === "MULTIPLE_SELECT" || property.valueType === "SINGLE_SELECT") { items = property.items; } - + return { key, label: property?.metadata?.label, From 12b1b631ff9d8ef741e2da8ee39c8d46e3038a45 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 10 Sep 2025 08:26:25 +0530 Subject: [PATCH 030/730] Fix issue with conditional check box --- .../editors/CheckBoxConditionalEditor.tsx | 121 ++++++++++++++++++ .../src/components/editors/EditorFactory.tsx | 8 ++ .../ServiceDesigner/ServiceCreationView.tsx | 17 +-- 3 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx new file mode 100644 index 00000000000..22fa58795d6 --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx @@ -0,0 +1,121 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useState } from "react"; +import { FormField } from "../Form/types"; +import { CheckBoxGroup, FormCheckBox } from "@wso2/ui-toolkit"; +import styled from "@emotion/styled"; +import { EditorFactory } from "./EditorFactory"; +import { useFormContext } from "../../context"; +import { ContextAwareExpressionEditor } from "./ExpressionEditor"; + +const Form = styled.div` + display: grid; + gap: 20px; + width: 100%; +`; + +const FormSection = styled.div` + display: grid; + gap: 20px; + width: 100%; +`; + +const Label = styled.div` + font-family: var(--font-family); + color: var(--vscode-editor-foreground); + text-align: left; + text-transform: capitalize; +`; +const Description = styled.div` + font-family: var(--font-family); + color: var(--vscode-list-deemphasizedForeground); + text-align: left; +`; +const LabelGroup = styled.div` + display: flex; + flex-direction: column; + gap: 2px; +`; +const BoxGroup = styled.div` + display: flex; + flex-direction: row; + width: 100%; + align-items: flex-start; + gap: 10px; +`; + +interface CheckBoxConditionalEditorProps { + field: FormField; +} + +export function CheckBoxConditionalEditor(props: CheckBoxConditionalEditorProps) { + const { field } = props; + const { form } = useFormContext(); + const { register, control, watch } = form; + const [conditionalFields, setConditionalFields] = useState([]); + + const checked = watch(field.key, true); + + console.log("Conditional Fields: ", field.advanceProps); + + useEffect(() => { + console.log("Conditional Fields: ", field.advanceProps); + setConditionalFields(field.advanceProps); + }, []); + + return ( +
+ + + + + + {field.documentation} + + + + + {!checked && conditionalFields.length > 0 && ( + <> + {conditionalFields.map((dfield) => ( + + ))} + + )} + +
+ + ); + +} + +function getBooleanValue(field: FormField, value: any) { + if (field.type === "FLAG") { + return value === "true" || value === true; + } + return value; +} + diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index c5f30bb04d0..e194c78e747 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -44,6 +44,7 @@ import { HeaderSetEditor } from "./HeaderSetEditor"; import { CompletionItem } from "@wso2/ui-toolkit"; import { CustomDropdownEditor } from "./CustomDropdownEditor"; import { ActionExpressionEditor } from "./ActionExpressionEditor"; +import { CheckBoxConditionalEditor } from "./CheckBoxConditionalEditor"; interface FormFieldEditorProps { field: FormField; @@ -189,6 +190,13 @@ export const EditorFactory = (props: FormFieldEditorProps) => { recordTypeField={recordTypeFields?.find(recordField => recordField.key === field.key)} /> ); + } else if (field.type === "CONDITIONAL_FIELDS" && field.editable) { + // Conditional fields is a group of fields which are conditionally shown based on a checkbox field + return ( + + ); } else { // Default to text editor // Readonly fields are also treated as text editor diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index cce7897403c..5c73715e583 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -23,7 +23,7 @@ import { TitleBar } from "../../../components/TitleBar"; import { isBetaModule } from "../ComponentListView/componentListUtils"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { FormField, FormImports, FormValues } from "@wso2/ballerina-side-panel"; -import { EVENT_TYPE, LineRange, Property, RecordTypeField, ServiceInitModel } from "@wso2/ballerina-core"; +import { EVENT_TYPE, LineRange, Property, PropertyModel, RecordTypeField, ServiceInitModel } from "@wso2/ballerina-core"; import { FormHeader } from "../../../components/FormHeader"; import FormGeneratorNew from "../Forms/FormGeneratorNew"; import styled from "@emotion/styled"; @@ -85,7 +85,7 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { moduleName: res?.serviceInitModel.moduleName }); setServiceInitModel(res?.serviceInitModel); - setFormFields(mapServiceInitModelToFormFields(res?.serviceInitModel)); + setFormFields(mapPropertiesToFormFields(res?.serviceInitModel.properties)); }); rpcClient @@ -242,15 +242,15 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { } /** - * Maps a ServiceInitModel to an array of FormField objects. + * Maps the properties to an array of FormField objects. * - * @param model The ServiceInitModel to map. + * @param properties The properties to map. * @returns An array of FormField objects. */ -function mapServiceInitModelToFormFields(model: ServiceInitModel): FormField[] { - if (!model || !model.properties) return []; +function mapPropertiesToFormFields(properties: {[key: string]: PropertyModel;}): FormField[] { + if (!properties) return []; - return Object.entries(model.properties).map(([key, property]) => { + return Object.entries(properties).map(([key, property]) => { // Determine value for MULTIPLE_SELECT let value: any = property.value; @@ -288,7 +288,8 @@ function mapServiceInitModelToFormFields(model: ServiceInitModel): FormField[] { choices: property.choices, placeholder: property.placeholder, addNewButton: property.addNewButton, - lineRange: property?.codedata?.lineRange + lineRange: property?.codedata?.lineRange, + advanceProps: mapPropertiesToFormFields(property.properties) } as FormField; }); } From be8e99a09b53332b48957b7a5a6bb50039b3b83b Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 10 Sep 2025 14:37:07 +0530 Subject: [PATCH 031/730] Changes --- .../editors/CheckBoxConditionalEditor.tsx | 14 +++++++++++++- .../BI/ServiceDesigner/ServiceCreationView.tsx | 18 ++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx index 22fa58795d6..87440606754 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx @@ -70,15 +70,27 @@ export function CheckBoxConditionalEditor(props: CheckBoxConditionalEditorProps) const { register, control, watch } = form; const [conditionalFields, setConditionalFields] = useState([]); + const { setValue } = form; + const checked = watch(field.key, true); console.log("Conditional Fields: ", field.advanceProps); useEffect(() => { - console.log("Conditional Fields: ", field.advanceProps); setConditionalFields(field.advanceProps); }, []); + // Add useEffect to set initial values + useEffect(() => { + if (conditionalFields.length > 0) { + Object.entries(conditionalFields).forEach(([_, propValue]) => { + if (propValue.value !== undefined) { + setValue(propValue.key, propValue.value); + } + }); + } + }, [conditionalFields]); + return (
diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index 5c73715e583..3cf68727e34 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -191,6 +191,15 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { } else if (data[val.key] !== undefined) { val.value = data[val.key]; } + if (val.type === "CONDITIONAL_FIELDS") { + val.advanceProps.forEach(subField => { + const subProperty = model.properties[val.key]?.properties?.[subField.key]; + if (subProperty) { + subProperty.value = data[subField.key]; + } + }); + } + val.imports = getImportsForProperty(val.key, formImports); }) const updatedModel = populateServiceInitModelFromFormFields(formFields, model); @@ -247,7 +256,7 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { * @param properties The properties to map. * @returns An array of FormField objects. */ -function mapPropertiesToFormFields(properties: {[key: string]: PropertyModel;}): FormField[] { +function mapPropertiesToFormFields(properties: { [key: string]: PropertyModel; }): FormField[] { if (!properties) return []; return Object.entries(properties).map(([key, property]) => { @@ -316,13 +325,6 @@ function populateServiceInitModelFromFormFields(formFields: FormField[], model: } else { property.value = value as string; } - - // Enable property if it has a non-empty value - if (value !== undefined && value !== null && ((Array.isArray(value) && value.length > 0) || (!Array.isArray(value) && value !== ""))) { - property.enabled = true; - } else { - property.enabled = false; - } }); return model; } From 7ed465ef64d0da4904e954bcb6bb8e397b6924e4 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 10 Sep 2025 16:15:09 +0530 Subject: [PATCH 032/730] Refactors AI code generation prompts Improves the clarity and effectiveness of AI code generation prompts by: - Restructuring the system prompt for better instruction delivery and context. - Refining instructions for library selection, API documentation usage, and code generation steps. - Emphasizing the importance of API documentation adherence and type safety. - Adding reminders for best practices, such as using two-word camel case identifiers and named arguments. - Clarifying the handling of submodules and return parameter types. - Enforcing explicit type declarations and avoiding JSON manipulation. - Improves error handling in code repair by focusing the model on the provided LibraryProviderTool results. --- .../src/features/ai/service/code/code.ts | 106 +++++++----------- .../ai/service/libs/libraryProviderTool.ts | 32 ++++++ 2 files changed, 70 insertions(+), 68 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index ada5ec1d9af..e2972daae3b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -222,74 +222,45 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } function getSystemPromptPrefix(sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): string { - const basePrompt = `# QUESTION -Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. Use the LibraryProviderTool to fetch details (name, description, clients, functions, types) for only the selected libraries. The tool description contains all available libraries and their descriptions. Do not assume library contents unless provided by the tool. - -# Example -**Context**: -${JSON.stringify( - [ - { - name: "ballerinax/azure.openai.chat", - description: "Provides a Ballerina client for the Azure OpenAI Chat API.", - }, - { - name: "ballerinax/github", - description: "Provides a Ballerina client for the GitHub API.", - }, - { - name: "ballerinax/slack", - description: "Provides a Ballerina client for the Slack API.", - }, - { - name: "ballerinax/http", - description: "Allows to interact with HTTP services.", - }, - ], - null, - 2 -)} -**Query**: Write an application to read GitHub issues, summarize them, and post the summary to a Slack channel. -**LibraryProviderTool Call**: Call LibraryProviderTool with libraryNames: ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] + const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the API documentation provided by the LibraryProviderTool. # Instructions 1. Analyze the user query to determine the required functionality. -2. Select the minimal set of libraries that can fulfill the query based on their descriptions. -3. Call the LibraryProviderTool with the selected libraryNames and the user query to fetch detailed information (clients, functions, types). -4. Use the tool's output to generate accurate Ballerina code. -5. Do not include libraries unless they are explicitly needed for the query. -${ - generationType === GenerationType.HEALTHCARE_GENERATION - ? "6. For healthcare-related queries, ALWAYS include the following libraries in the LibraryProviderTool call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." +2. Use the LibraryProviderTool to fetch detailed information (clients, functions, types) for only the relevant Ballerina libraries based on the user query. +3. Use the tool's output as API documentation in the context of the query to generate accurate Ballerina code. +4. Do not include libraries unless they are explicitly needed for the query. +${generationType === GenerationType.HEALTHCARE_GENERATION + ? "5. For healthcare-related queries, ALWAYS include the following libraries in the LibraryProviderTool call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." : "" -} -You are an expert assistant specializing in Ballerina code generation.`; + }`; if (op === "CODE_FOR_USER_REQUIREMENT") { - return getRequirementAnalysisCodeGenPrefix([], extractResourceDocumentContent(sourceFiles)) + `\n${basePrompt}`; + return getRequirementAnalysisCodeGenPrefix(extractResourceDocumentContent(sourceFiles)); } else if (op === "TESTS_FOR_USER_REQUIREMENT") { - return getRequirementAnalysisTestGenPrefix([], extractResourceDocumentContent(sourceFiles)) + `\n${basePrompt}`; + return getRequirementAnalysisTestGenPrefix(extractResourceDocumentContent(sourceFiles)); } return basePrompt; } function getSystemPromptSuffix(langlibs: Library[]) { return `You will be provided with default langlibs which are already imported in the Ballerina code. - Langlibs + +Langlibs ${JSON.stringify(langlibs)} -If the query doesn't require code examples, answer the code by utilizing the api documentation. +If the query doesn't require code examples, answer the code by utilizing the API documentation (Tool Output). + If the query requires code, Follow these steps to generate the Ballerina code: -1. Carefully analyze the provided API documentation: - - Identify the available libraries, clients, their functions and their relevant types. +1. Carefully analyze the provided API documentation (Tool Output): + - Identify the available libraries, clients, their functions, and their relevant types. 2. Thoroughly read and understand the given query: - Identify the main requirements and objectives of the integration. - - Determine which libraries, functions and their relevant records and types from the API documentation which are needed to achieve the query and forget about unused API docs. - - Note the libraries needed to achieve the query and plan the control flow of the application based input and output parameters of each function of the connector according to the API documentation. + - Determine which libraries, functions, and their relevant records and types from the API documentation which are needed to achieve the query and ignore unused API docs. + - Note the libraries needed to achieve the query and plan the control flow of the application based on input and output parameters of each function of the connector according to the API documentation. 3. Plan your code structure: - Decide which libraries need to be imported (Avoid importing lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map langlibs as they are already imported by default). @@ -300,9 +271,10 @@ If the query requires code, Follow these steps to generate the Ballerina code: - Based on the types of identified functions, plan the data flow. Transform data as necessary. 4. Generate the Ballerina code: - - Start with the required import statements. + - Start with the required import statements IN EACH FILE that uses external libraries or types. + - Each .bal file MUST include its own import statements for any external libraries, types, or clients it references. - Define required configurables for the query. Use only string, int, boolean types in configurable variables. - - Initialize any necessary clients with the correct configuration at the module level(before any function or service declarations). + - Initialize any necessary clients with the correct configuration at the module level (before any function or service declarations), resolving unions explicitly. - Implement the main function OR service to address the query requirements. - Use defined connectors based on the query by following the API documentation. - Use only the functions, types, and clients specified in the API documentation. @@ -313,40 +285,39 @@ If the query requires code, Follow these steps to generate the Ballerina code: 5. Review and refine your code: - Check that all query requirements are met. - - Verify that you're only using elements from the provided API documentation. - - Ensure the code follows Ballerina best practices and conventions. + - Verify that you're only using elements from the provided API documentation, with unions resolved to avoid compiler errors. + - Ensure the code follows Ballerina best practices and conventions, including type-safe handling of all return types and configurations. Provide a brief explanation of how your code addresses the query and then output your generated Ballerina code. Important reminders: -- Only use the libraries, functions, types, services and clients specified in the provided API documentation. +- Only use the libraries, functions, types, services, and clients specified in the provided API documentation. - Always strictly respect the types given in the API Docs. - Do not introduce any additional libraries or functions not mentioned in the API docs. -- Only use specified fields in records according to the api docs. this applies to array types of that record as well. +- Only use specified fields in records according to the API docs; this applies to array types of that record as well. - Ensure your code is syntactically correct and follows Ballerina conventions. - Do not use dynamic listener registrations. - Do not write code in a way that requires updating/assigning values of function parameters. -- ALWAYS Use two words camel case identifiers (variable, function parameter, resource function parameter and field names). -- If the library name contains a . Always use an alias in the import statement. (import org/package.one as one;) +- ALWAYS use two-word camel case identifiers (variable, function parameter, resource function parameter, and field names). +- If the library name contains a dot, always use an alias in the import statement (e.g., import org/package.one as one;). - Treat generated connectors/clients inside the generated folder as submodules. -- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder structure generated/fooApi the import should be \`import my_pkg.fooApi;\` +- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder structure generated/fooApi, the import should be \`import my_pkg.fooApi;\`. - If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. - Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. -- When invoking resource function from a client, use the correct paths with accessor and parameters. (eg: exampleClient->/path1/["param"]/path2.get(key="value")) -- When you are accessing a field of a record, always assign it into new variable and use that variable in the next statement. +- When invoking resource functions from a client, use the correct paths with accessor and parameters (e.g., exampleClient->/path1/["param"]/path2.get(key="value")). +- When accessing a field of a record, always assign it to a new variable and use that variable in the next statement. - Avoid long comments in the code. Use // for single line comments. -- Always use named arguments when providing values to any parameter. (eg: .get(key="value")) +- Always use named arguments when providing values to any parameter (e.g., .get(key="value")). - Mention types EXPLICITLY in variable declarations and foreach statements. -- Do not modify the README.md file unless asked to be modified explicitly in the query. -- Do not add/modify toml files(Config.toml/Ballerina.toml) unless asked. -- In the library API documentation if the service type is specified as generic, adhere to the instructions specified there on writing the service. -- For GraphQL service related queries, If the user haven't specified their own GraphQL Schema, Write the proposed GraphQL schema for the user query right after explanation before generating the Ballerina code. Use same names as the GraphQL Schema when defining record types. +- Do not modify the README.md file unless explicitly asked to be modified in the query. +- Do not add/modify toml files (Config.toml/Ballerina.toml) unless asked. +- In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. +- For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. -Begin your response with the explanation, once the entire explanation is finished only, include codeblock segments(if any) in the end of the response. +Begin your response with the explanation, once the entire explanation is finished only, include codeblock segments (if any) at the end of the response. The explanation should explain the control flow decided in step 2, along with the selected libraries and their functions. -Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. -The codeblock segments should only have .bal contents and it should not generate or modify any other file types. Politely decline if the query requests for such cases. +Each file that needs modifications should have a codeblock segment, and it MUST contain the complete file content with the proposed change. The codeblock segments should only contain .bal contents and should not generate or modify any other file types. Politely decline if the query requests such cases. Example Codeblock segment: @@ -376,7 +347,7 @@ Content: ${file.content}` .join("\n")}`; } - return `QUERY: The query you need to answer using the provided api documentation. + return `QUERY: The query you need to answer. ${usecase} @@ -425,7 +396,7 @@ export async function repairCode(params: RepairParams): Promise { role: "user", content: - "Generated code returns the following errors. Use the context from previous messages, including tool calls and tool results, to identify relevant library details (functions, types, clients). Double-check all functions, types, and record field access against these details to fix the compiler errors and return the corrected response. \n Errors: \n " + + "Generated code returns the following compiler errors. Using the library details from the LibraryProviderTool results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the LibraryProviderTool if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy. Fix the compiler errors and return the corrected response. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), }, ]; @@ -439,7 +410,6 @@ export async function repairCode(params: RepairParams): Promise maxTokens: 4096 * 4, temperature: 0, tools, - toolChoice: "none", messages: allMessages, abortSignal: AIPanelAbortController.getInstance().signal, }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index ef3486e0600..65ec0bc18ff 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -80,6 +80,38 @@ export function getLibraryProviderTool(libraryDescriptions: string, generationTy description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. This tool analyzes a user query and returns **only the relevant** clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. +To use this tool: +- Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. +- Select the minimal set of libraries that can fulfill the query based on their descriptions. Do not assume library contents unless provided by the tool. +- Call this tool with the selected libraryNames and the user query. + +# Example +**Context** (library descriptions): +${JSON.stringify( + [ + { + name: "ballerinax/azure.openai.chat", + description: "Provides a Ballerina client for the Azure OpenAI Chat API.", + }, + { + name: "ballerinax/github", + description: "Provides a Ballerina client for the GitHub API.", + }, + { + name: "ballerinax/slack", + description: "Provides a Ballerina client for the Slack API.", + }, + { + name: "ballerinax/http", + description: "Allows to interact with HTTP services.", + }, + ], + null, + 2 +)} +**Query**: Write an application to read GitHub issues, summarize them, and post the summary to a Slack channel. +**Tool Call**: Call with libraryNames: ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] + Before calling this tool: - **Review all library descriptions** below. - Select only the libraries that might be needed to fulfill the user query. From fbf79c0b82b9e0153f3f00edcf6f866c009c65c6 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 10 Sep 2025 16:34:05 +0530 Subject: [PATCH 033/730] Temprory workaround for natural programming Refactors prompt processing for code generation Modifies the prompt processing in code generation to leverage relevant libraries and functions based on the user query. This change temporarily addresses the need for natural programming capabilities. It replaces the direct usage of source files with a dynamic library retrieval mechanism based on the prompt provided. This ensures more relevant and context-aware code generation. --- .../src/features/ai/service/code/code.ts | 8 ++++---- .../src/features/ai/service/code/np_prompts.ts | 10 ++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index e2972daae3b..7edc8936062 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -85,7 +85,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const allMessages: CoreMessage[] = [ { role: "system", - content: getSystemPromptPrefix(sourceFiles, params.operationType, GenerationType.CODE_GENERATION), + content: await getSystemPromptPrefix(prompt, sourceFiles, params.operationType, GenerationType.CODE_GENERATION), }, { role: "system", @@ -221,7 +221,7 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } } -function getSystemPromptPrefix(sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): string { +async function getSystemPromptPrefix(prompt: string, sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): Promise { const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the API documentation provided by the LibraryProviderTool. # Instructions @@ -235,9 +235,9 @@ ${generationType === GenerationType.HEALTHCARE_GENERATION }`; if (op === "CODE_FOR_USER_REQUIREMENT") { - return getRequirementAnalysisCodeGenPrefix(extractResourceDocumentContent(sourceFiles)); + return await getRequirementAnalysisCodeGenPrefix(prompt, extractResourceDocumentContent(sourceFiles)); } else if (op === "TESTS_FOR_USER_REQUIREMENT") { - return getRequirementAnalysisTestGenPrefix(extractResourceDocumentContent(sourceFiles)); + return await getRequirementAnalysisTestGenPrefix(prompt, extractResourceDocumentContent(sourceFiles)); } return basePrompt; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts index edd5c9a7bbe..1b0ef82bd77 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts @@ -14,11 +14,14 @@ // specific language governing permissions and limitations // under the License. +import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { Library } from "../libs/libs_types"; export const REQUIREMENTS_DOCUMENT_KEY: string = "user_requirements_file"; -export function getRequirementAnalysisCodeGenPrefix(apidocs: Library[], requirementAnalysisDocument: string) { +export async function getRequirementAnalysisCodeGenPrefix(prompt: string, requirementAnalysisDocument: string) { + const apidocs: Library[] = ( await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) + ).libraries; return `You are an expert assistant specializing in the Ballerina programming language. Your goal is to provide accurate and functional Ballerina code in response to queries while adhering to the constraints outlined in the given API documentation. You are tasked with generating Ballerina code based on a requirement analysis document for a system. The document contains an overview of the system and its use cases. Your objective is to create a Ballerina implementation that reflects the requirements described in the document. @@ -112,7 +115,10 @@ public function main() { -export function getRequirementAnalysisTestGenPrefix(apidocs: Library[], requirementAnalysisDocument: string) { +export async function getRequirementAnalysisTestGenPrefix(prompt: string, requirementAnalysisDocument: string) { + const apidocs: Library[] = ( await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) + ).libraries; + return `**Objective**: You are an expert test automation engineer specializing in generating test artifacts for Ballerina entities. Your task is to create comprehensive test implementations based on the provided requirement specification, service interfaces, and a test plan written in the console. From aac01b320aa5ba85855664d249042aeab46c5afc Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 10 Sep 2025 17:47:09 +0530 Subject: [PATCH 034/730] Refactors prompt generation for natural programming Refactors prompt generation for natural programming by removing the prompt parameter from the `getSystemPromptPrefix` function and related methods. This change simplifies the function signature and improves code maintainability. It also updates the `getRequirementAnalysisCodeGenPrefix` and `getRequirementAnalysisTestGenPrefix` functions to align with the new prompt generation approach, including removing the need to pass API documentation. --- .../src/features/ai/service/code/code.ts | 9 ++-- .../features/ai/service/code/np_prompts.ts | 46 ++++++------------- 2 files changed, 19 insertions(+), 36 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 4dc9d2dbea9..1a7dd122869 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -86,8 +86,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const allMessages: CoreMessage[] = [ { role: "system", - content: await getSystemPromptPrefix( - prompt, + content: getSystemPromptPrefix( sourceFiles, params.operationType, GenerationType.CODE_GENERATION @@ -223,7 +222,7 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } } -async function getSystemPromptPrefix(prompt: string, sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): Promise { +function getSystemPromptPrefix(sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): string { const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the API documentation provided by the LibraryProviderTool. # Instructions @@ -237,9 +236,9 @@ ${generationType === GenerationType.HEALTHCARE_GENERATION }`; if (op === "CODE_FOR_USER_REQUIREMENT") { - return await getRequirementAnalysisCodeGenPrefix(prompt, extractResourceDocumentContent(sourceFiles)); + return getRequirementAnalysisCodeGenPrefix(extractResourceDocumentContent(sourceFiles)); } else if (op === "TESTS_FOR_USER_REQUIREMENT") { - return await getRequirementAnalysisTestGenPrefix(prompt, extractResourceDocumentContent(sourceFiles)); + return getRequirementAnalysisTestGenPrefix(extractResourceDocumentContent(sourceFiles)); } return basePrompt; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts index 1b0ef82bd77..2b55228fe1d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts @@ -14,14 +14,9 @@ // specific language governing permissions and limitations // under the License. -import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; -import { Library } from "../libs/libs_types"; - export const REQUIREMENTS_DOCUMENT_KEY: string = "user_requirements_file"; -export async function getRequirementAnalysisCodeGenPrefix(prompt: string, requirementAnalysisDocument: string) { - const apidocs: Library[] = ( await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) - ).libraries; +export function getRequirementAnalysisCodeGenPrefix(requirementAnalysisDocument: string) { return `You are an expert assistant specializing in the Ballerina programming language. Your goal is to provide accurate and functional Ballerina code in response to queries while adhering to the constraints outlined in the given API documentation. You are tasked with generating Ballerina code based on a requirement analysis document for a system. The document contains an overview of the system and its use cases. Your objective is to create a Ballerina implementation that reflects the requirements described in the document. @@ -32,21 +27,14 @@ First, carefully read and analyze the following requirement analysis document an ${requirementAnalysisDocument} -You will be provided with the following inputs: - -1. **API_DOCS**: A JSON string containing the API documentation for various Ballerina libraries, including their functions, types, and clients. - -${JSON.stringify(apidocs)} - - ### **Instructions for Handling Missing or Empty Requirement Specification:** 1. If the requirement specification is **missing** (i.e., the \`\` tag is not present in the input) or its content is **empty** (i.e., the content inside the tag is blank), respond with the following message: \`"No requirement specification file found in the natural-programming directory. First, place your requirement specification file there to generate code based on the requirements."\` Do not proceed with code generation in this case. -2. If the requirement specification is present and contains valid content, proceed to analyze the document and generate Ballerina code based on the requirements described in it. Use the provided \`API_DOCS\` to ensure the generated code adheres to the correct API usage. +2. If the requirement specification is present and contains valid content, proceed to analyze the document and generate Ballerina code based on the requirements described in it. Use the LibraryProviderTool to fetch detailed API documentation (clients, functions, types) for only the relevant Ballerina libraries based on the requirements in the document. Use the tool's output as API documentation to ensure the generated code adheres to the correct API usage. -Please add the proper API documentation for each function, service, resource, varaible declarations, type definitions and classes in the generated Ballerina code. +Please add the proper API documentation for each function, service, resource, variable declarations, type definitions, and classes in the generated Ballerina code. ### **Output Format:** - If the requirement specification is missing or empty, return the message as specified above. @@ -61,8 +49,10 @@ Please add the proper API documentation for each function, service, resource, va \`\`\`xml +\`\`\` - +##### **LibraryProviderTool Output:** +\`\`\`json { "ballerina/io": { "functions": { @@ -73,7 +63,6 @@ Please add the proper API documentation for each function, service, resource, va } } } - \`\`\` ##### **Expected Output:** @@ -87,8 +76,10 @@ No requirement specification file found in the natural-programming directory. Fi The system should print "Hello, World!" to the console when executed. +\`\`\` - +##### **LibraryProviderTool Output:** +\`\`\`json { "ballerina/io": { "functions": { @@ -99,7 +90,6 @@ The system should print "Hello, World!" to the console when executed. } } } - \`\`\` ##### **Expected Output:** @@ -115,19 +105,12 @@ public function main() { -export async function getRequirementAnalysisTestGenPrefix(prompt: string, requirementAnalysisDocument: string) { - const apidocs: Library[] = ( await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) - ).libraries; - +export function getRequirementAnalysisTestGenPrefix(requirementAnalysisDocument: string) { return `**Objective**: You are an expert test automation engineer specializing in generating test artifacts for Ballerina entities. Your task is to create comprehensive test implementations based on the provided requirement specification, service interfaces, and a test plan written in the console. **Inputs**: 1. **Requirement Document**: ${requirementAnalysisDocument} -3. **API_DOCS**: A JSON string that includes API documentation for different Ballerina libraries, covering their functions, types, and clients. -\`\`\`json -${JSON.stringify(apidocs)} -\`\`\` **Output Requirements**: 1. **Executable Test Suite** (Ballerina test code) @@ -155,7 +138,8 @@ ${JSON.stringify(apidocs)} - Return types and response structures - Documented error types - Configurable variables -3. Write test plan that containing: +3. Use the LibraryProviderTool to fetch detailed API documentation (clients, functions, types) for only the relevant Ballerina libraries based on the requirements and interfaces. Use the tool's output as API documentation. +4. Write test plan that containing: - Test objectives mapping to functional requirements - Test objectives mapping to non functional requirements - For each and every interface extracted in step 2, generate: @@ -164,10 +148,10 @@ ${JSON.stringify(apidocs)} - Boundary/edge cases - Data requirements - Success metrics - - error handling scenarios + - Error handling scenarios [PHASE 2: TEST IMPLEMENTATION] -1. Identify the imports required for the test module. +1. Identify the imports required for the test module based on the API documentation from the LibraryProviderTool. 2. Create Ballerina test module with: - Network client configurations (if required, e.g., HTTP, GraphQL, WebSocket, etc.) @@ -273,7 +257,7 @@ function testCreateResource() returns error? { ### **Output: Test Implementation** \`\`\`toml -# tsts/Config.toml +# tests/Config.toml host = "http://localhost:9090" \`\`\` From d0592aee4cec736817b85eb079582ec1ca20dcad Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 10 Sep 2025 18:19:22 +0530 Subject: [PATCH 035/730] Show enums using display labels --- .../src/components/editors/DropdownEditor.tsx | 18 +++++++++++++++++- .../BI/ServiceDesigner/ServiceCreationView.tsx | 5 +++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 53141e52b04..f0d82ea0705 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -47,13 +47,29 @@ export function DropdownEditor(props: DropdownEditorProps) { field.items = ["Global", "Local"]; } + // Handle items: string[] or { label, value }[] + let dropdownItems; + if (field.itemOptions) { + dropdownItems = field.itemOptions; + } else if (Array.isArray(field.items) && field.items.length > 0) { + if (typeof field.items[0] === "string") { + dropdownItems = field.items.map((item) => ({ id: item, content: item, value: item })); + } else if (typeof field.items[0] === "object" && field.items[0] !== null && "label" in field.items[0] && "value" in field.items[0]) { + dropdownItems = field.items.map((item: any) => ({ id: item.value, content: item.label, value: item.value })); + } else { + dropdownItems = []; + } + } else { + dropdownItems = []; + } + return ( ({ id: item, content: item, value: item }))} + items={dropdownItems} required={!field.optional} disabled={!field.editable} onChange={(e) => { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index 3cf68727e34..e2e9c2c3534 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -222,14 +222,15 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { { headerInfo && - + } <> {formFields && formFields.length > 0 && - + {filePath && targetLineRange && Date: Sun, 31 Aug 2025 06:14:38 +0530 Subject: [PATCH 036/730] Update Copilot Evals --- .gitignore | 2 + .vscode/launch.json | 16 +++ .../ballerina-extension/package.json | 10 +- .../ballerina-extension/scripts/test-ai.js | 117 ++++++++++++++++++ .../ballerina-extension/src/extension.ts | 2 + .../src/features/ai/activator.ts | 3 + .../test/ai/datamapper/datamapper.test.ts | 2 +- .../test/ai/evals/code/code.test.ts | 75 ++++++++--- 8 files changed, 202 insertions(+), 25 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/scripts/test-ai.js diff --git a/.gitignore b/.gitignore index 9a8738831b6..a0b754beff3 100644 --- a/.gitignore +++ b/.gitignore @@ -77,6 +77,8 @@ playwright-report/ extensions.json !sample-mi-project.zip +package.json.backup + .claude/ pnpm-lock.yaml diff --git a/.vscode/launch.json b/.vscode/launch.json index 15b09d18dc9..4c8b9ea1e16 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -234,6 +234,22 @@ ], "preLaunchTask": "watch-mi-tests" }, + { + "name": "Ballerina Extension AI Tests", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/scripts/test-ai.js", + "args": [], + "env": { + "LS_EXTENSIONS_PATH": "", + "LSDEBUG": "false", + "WEB_VIEW_WATCH_MODE": "false" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "cwd": "${workspaceFolder}/workspaces/ballerina/ballerina-extension", + "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" + }, { "name": "APK Extension", "type": "extensionHost", diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 304a328967c..fd18767764d 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -24,16 +24,14 @@ "Snippets" ], "activationEvents": [ + "onStartupFinished", "onLanguage:ballerina", "onCommand:ballerina.showExamples", "workspaceContains:**/Ballerina.toml", "onNotebook:ballerina-notebook", "onUri" ], - "extensionDependencies": [ - "anweber.httpbook", - "WSO2.wso2-platform" - ], + "extensionDependencies": [], "contributes": { "languages": [ { @@ -1125,6 +1123,7 @@ "watch-ballerina": "webpack --mode none --watch", "test-compile": "tsc -p ./", "test": "pnpm run test-compile && node ./out/test/runTest.js", + "test:ai": "node scripts/test-ai.js", "e2e-test-setup": "npx extest get-vscode -c 1.83.1 && npx extest get-chromedriver -c 1.83.1 && npx extest install-vsix -f $(ls vsix/*.vsix)", "preui-test": "node -e \"const fs = require('fs'); if (fs.existsSync('test-resou')) { fs.unlinkSync('test-resou'); }\"", "e2e-test": "pnpm run test-compile && npx extest run-tests 'out/ui-test/*.test.js' --mocha_config ui-test/.mocharc.js -o ui-test/settings.json", @@ -1225,5 +1224,6 @@ "repository": { "type": "git", "url": "git+https://github.com/wso2/ballerina-plugin-vscode.git" - } + }, + "_originalExtensionDependencies": [] } diff --git a/workspaces/ballerina/ballerina-extension/scripts/test-ai.js b/workspaces/ballerina/ballerina-extension/scripts/test-ai.js new file mode 100644 index 00000000000..7039be82786 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/scripts/test-ai.js @@ -0,0 +1,117 @@ +#!/usr/bin/env node + +/** + * AI Test Runner + * Temporarily removes extension dependencies, runs AI tests, then restores them + */ + +const fs = require('fs'); +const { spawn } = require('child_process'); +const path = require('path'); + +const PACKAGE_JSON_PATH = path.join(__dirname, '../package.json'); +const BACKUP_PATH = path.join(__dirname, '../package.json.backup'); + +let originalPackageJson = null; + +function log(message) { + console.log(`[AI Test] ${message}`); +} + +function backupPackageJson() { + log('Backing up package.json...'); + originalPackageJson = fs.readFileSync(PACKAGE_JSON_PATH, 'utf8'); + fs.writeFileSync(BACKUP_PATH, originalPackageJson); +} + +function removeExtensionDependencies() { + log('Temporarily removing extension dependencies...'); + const pkg = JSON.parse(originalPackageJson); + + // Store original dependencies for reference + pkg._originalExtensionDependencies = pkg.extensionDependencies || []; + pkg.extensionDependencies = []; + + fs.writeFileSync(PACKAGE_JSON_PATH, JSON.stringify(pkg, null, 2)); + log(`Removed ${pkg._originalExtensionDependencies.length} extension dependencies`); +} + +function restorePackageJson() { + if (originalPackageJson) { + log('Restoring original package.json...'); + fs.writeFileSync(PACKAGE_JSON_PATH, originalPackageJson); + + // Clean up backup + if (fs.existsSync(BACKUP_PATH)) { + fs.unlinkSync(BACKUP_PATH); + } + log('Package.json restored successfully'); + } +} + +function runCommand(command, args, env = {}) { + return new Promise((resolve, reject) => { + log(`Running: ${command} ${args.join(' ')}`); + + const child = spawn(command, args, { + stdio: 'inherit', + env: { ...process.env, ...env }, + shell: true + }); + + child.on('close', (code) => { + if (code === 0) { + resolve(code); + } else { + reject(new Error(`Command failed with exit code ${code}`)); + } + }); + + child.on('error', reject); + }); +} + +async function runAITests() { + try { + // Step 1: Backup and modify package.json + backupPackageJson(); + removeExtensionDependencies(); + + // Step 2: Build the extension + log('Building extension...'); + await runCommand('pnpm', ['run', 'compile'], { AI_TEST_ENV: 'true' }); + + // Step 3: Compile tests + log('Compiling tests...'); + await runCommand('pnpm', ['run', 'test-compile'], { AI_TEST_ENV: 'true' }); + + // Step 4: Run AI tests + log('Running AI tests...'); + await runCommand('node', ['./out/test/runTest.js', '--grep', '^AI Code Generator Tests Suite'], { AI_TEST_ENV: 'true' }); + + log('✅ AI tests completed successfully!'); + + } catch (error) { + log(`❌ AI tests failed: ${error.message}`); + process.exit(1); + } finally { + // Always restore package.json + restorePackageJson(); + } +} + +// Handle cleanup on process termination +process.on('SIGINT', () => { + log('Received SIGINT, cleaning up...'); + restorePackageJson(); + process.exit(1); +}); + +process.on('SIGTERM', () => { + log('Received SIGTERM, cleaning up...'); + restorePackageJson(); + process.exit(1); +}); + +// Run the tests +runAITests(); \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/extension.ts b/workspaces/ballerina/ballerina-extension/src/extension.ts index d86b93b39d8..07b88da3ce0 100644 --- a/workspaces/ballerina/ballerina-extension/src/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/extension.ts @@ -109,8 +109,10 @@ export async function activate(context: ExtensionContext) { extension.context = context; // Init RPC Layer methods RPCLayer.init(); + // Wait for the ballerina extension to be ready await StateMachine.initialize(); + // Then return the ballerina extension context return { ballerinaExtInstance: extension.ballerinaExtInstance, projectPath: StateMachine.context().projectUri }; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 49f20d0cf09..5d1311cf401 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -32,9 +32,11 @@ import { AIMachineEventType } from '@wso2/ballerina-core'; export let langClient: ExtendedLangClient; export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension) { + langClient = ballerinaExternalInstance.langClient; activateCopilotLoginCommand(); resetBIAuth(); + // Register a command in test environment to test the AI features if (process.env.AI_TEST_ENV) { commands.registerCommand('ballerina.test.ai.generateCodeCore', async (params: GenerateCodeRequest, testEventHandler: CopilotEventHandler) => { @@ -65,4 +67,5 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension } } }); + } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts index 1a192bfd8f3..10a6e7a6d44 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts @@ -28,7 +28,7 @@ function getTestFolders(dirPath: string): string[] { .filter((file) => fs.lstatSync(path.join(dirPath, file)).isDirectory()); } -suite.only("AI Datamapper Tests Suite", () => { +suite("AI Datamapper Tests Suite", () => { setup(done => { done(); }); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index f8c54a3dcf1..3f4279303cb 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -21,6 +21,7 @@ import * as fs from "fs"; import { ChatNotify, GenerateCodeRequest } from "@wso2/ballerina-core"; import { CopilotEventHandler } from "../../../../src/features/ai/service/event"; import { commands, Uri, workspace } from "vscode"; +import * as vscode from "vscode"; const RESOURCES_PATH = path.resolve(__dirname, "../../../../../test/ai/evals/code/resources"); @@ -104,26 +105,66 @@ function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () return { handler, getResult }; } -suite.skip("AI Code Generator Tests Suite", () => { +suite("AI Code Generator Tests Suite", () => { // Close all the open workspace folders before running the test suiteSetup(async function () { + this.timeout(60000); // 60 second timeout for extension initialization + + // Wait for VSCode startup to complete (onStartupFinished activation event) + await new Promise(resolve => setTimeout(resolve, 10000)); + await commands.executeCommand("workbench.action.closeAllEditors"); - }); - - test("basic workspace test", async function () { - const PROJECT_ROOT = "/Users/anjanash/Desktop/Office/OpenSource/vscode-extensions/workspaces/ballerina/ballerina-extension/test/data/aiTest"; - - const success = workspace.updateWorkspaceFolders(0, 0, { + + // Add the Ballerina workspace to trigger workspaceContains activation event + const PROJECT_ROOT = "/Users/wso2/ai-playground/code/foo"; + const currentFolderCount = workspace.workspaceFolders?.length || 0; + workspace.updateWorkspaceFolders(currentFolderCount, 0, { uri: Uri.file(PROJECT_ROOT), }); + + // Give VSCode time to detect the workspace and trigger activation + await new Promise(resolve => setTimeout(resolve, 3000)); + + // Force extension activation by opening a Ballerina file + try { + const testBalFile = Uri.file("/Users/wso2/ai-playground/code/foo/main.bal"); + await commands.executeCommand("vscode.open", testBalFile); + await new Promise(resolve => setTimeout(resolve, 5000)); + } catch (error) { + // Fallback: try to execute a ballerina command to force activation + try { + await commands.executeCommand("ballerina.showExamples"); + } catch (cmdError) { + // Extension might still be loading + } + } + + // Poll for AI test command availability + let attempts = 0; + const maxAttempts = 30; + + while (attempts < maxAttempts) { + const commands = await vscode.commands.getCommands(); + if (commands.includes('ballerina.test.ai.generateCodeCore')) { + break; + } + await new Promise(resolve => setTimeout(resolve, 2000)); + attempts++; + } + + if (attempts >= maxAttempts) { + throw new Error("AI test command never registered - extension failed to activate"); + } + }); - await wait(2000); - - console.log("Workspace folders after update:", workspace.workspaceFolders?.length || 0); + test("basic workspace test", async function () { + this.timeout(120000); // 2 minute timeout for test execution + const { handler: testEventHandler, getResult } = createTestEventHandler(); - await wait(15000); + await wait(15000); // Wait for workspace to settle + const params: GenerateCodeRequest = { usecase: "write a hello world", chatHistory: [], @@ -141,18 +182,14 @@ suite.skip("AI Code Generator Tests Suite", () => { assert.strictEqual(result.errorOccurred, null, "No errors should have occurred"); assert.ok(result.events.length > 0, "Should have received events"); - console.log(`Test completed for folder: ${PROJECT_ROOT}`); - console.log(`Generated content length: ${result.fullContent.length}`); - console.log(`Total events: ${result.events.length}`); - //TODO: Take the response. Add to files, then compile the project. Get diagnostics - // } catch (error) { - console.error(`Test failed for folder ${PROJECT_ROOT}:`, error); + // Add debug info for failed authentication + if ((error as Error).message?.includes("login method")) { + console.log("Expected authentication error in test environment"); + } throw error; } - - console.log("Test completed successfully"); }); }); From 1af07ef3fb98a61607f45ef88cd3cef0b0d9d75c Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Tue, 9 Sep 2025 19:43:54 +0530 Subject: [PATCH 037/730] Add eval pipeline changes --- .gitignore | 3 + .../ballerina-extension/src/utils/ai/auth.ts | 26 + .../test/ai/evals/code/code.test.ts | 968 +++++++++++++++--- 3 files changed, 877 insertions(+), 120 deletions(-) diff --git a/.gitignore b/.gitignore index a0b754beff3..f2518547c7b 100644 --- a/.gitignore +++ b/.gitignore @@ -82,3 +82,6 @@ package.json.backup .claude/ pnpm-lock.yaml + +# AI evaluation results +**/results diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 3b258df7b44..380920dd7f5 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -122,11 +122,21 @@ async function copilotTokenExists() { // Structured Auth Credentials Utils // ================================== export const storeAuthCredentials = async (credentials: AuthCredentials): Promise => { + // Safely handle missing extension context + if (!extension.context?.secrets) { + console.warn('Extension context or secrets not available - skipping credential storage'); + return; + } const credentialsJson = JSON.stringify(credentials); await extension.context.secrets.store(AUTH_CREDENTIALS_SECRET_KEY, credentialsJson); }; export const getAuthCredentials = async (): Promise => { + // Safely handle missing extension context + if (!extension.context?.secrets) { + return undefined; + } + const credentialsJson = await extension.context.secrets.get(AUTH_CREDENTIALS_SECRET_KEY); if (!credentialsJson) { return undefined; @@ -141,6 +151,11 @@ export const getAuthCredentials = async (): Promise }; export const clearAuthCredentials = async (): Promise => { + // Safely handle missing extension context + if (!extension.context?.secrets) { + console.warn('Extension context or secrets not available - skipping credential cleanup'); + return; + } await extension.context.secrets.delete(AUTH_CREDENTIALS_SECRET_KEY); }; @@ -148,6 +163,11 @@ export const clearAuthCredentials = async (): Promise => { // BI Copilot Auth Utils // ================================== export const getLoginMethod = async (): Promise => { + // Test environment fallback - check for ANTHROPIC_API_KEY + if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { + return LoginMethod.ANTHROPIC_KEY; + } + const credentials = await getAuthCredentials(); if (credentials) { return credentials.loginMethod; @@ -158,6 +178,12 @@ export const getLoginMethod = async (): Promise => { export const getAccessToken = async (): Promise => { return new Promise(async (resolve, reject) => { try { + // Test environment fallback - check for ANTHROPIC_API_KEY first + if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { + resolve(process.env.ANTHROPIC_API_KEY.trim()); + return; + } + const credentials = await getAuthCredentials(); if (credentials) { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index 3f4279303cb..6d981715316 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -22,6 +22,7 @@ import { ChatNotify, GenerateCodeRequest } from "@wso2/ballerina-core"; import { CopilotEventHandler } from "../../../../src/features/ai/service/event"; import { commands, Uri, workspace } from "vscode"; import * as vscode from "vscode"; +import * as dotenv from "dotenv"; const RESOURCES_PATH = path.resolve(__dirname, "../../../../../test/ai/evals/code/resources"); @@ -29,6 +30,108 @@ function getTestFolders(dirPath: string): string[] { return fs.readdirSync(dirPath).filter((file) => fs.lstatSync(path.join(dirPath, file)).isDirectory()); } +// Enhanced result management interfaces matching Ballerina pipeline +interface SourceFile { + fileName: string; + content: string; +} + +interface DiagnosticMessage { + message: string; + severity?: string; + code?: string; + source?: string; + range?: { + start: { line: number; character: number }; + end: { line: number; character: number }; + }; +} + +interface UsecaseResult { + usecase: string; + diagnostics: DiagnosticMessage[]; + attempts: number; + files: SourceFile[]; + compiled: boolean; + duration?: number; + timestamp?: number; + errorEvents?: string[]; +} + +interface Summary { + results: UsecaseResult[]; + totalUsecases: number; + totalCompiled: number; + totalFailed: number; + accuracy: number; + totalDuration: number; + averageDuration: number; + timestamp: number; +} + +interface SummaryCompact { + totalUsecases: number; + totalCompiled: number; + totalFailed: number; + accuracy: number; +} + +interface UsecaseCompact { + usecase: string; + attempts: number; + compiled: boolean; + duration?: number; +} + +// Test use case definition +interface TestUseCase { + id: string; + description: string; + usecase: string; + operationType: "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; + timeout: number; + fileAttachments?: { fileName: string; content: string; }[]; +} + +// Predefined test use cases +const TEST_USE_CASES: TestUseCase[] = [ + { + id: "basic_hello_world", + description: "Basic Hello World Generation", + usecase: "write a hello world program", + operationType: "CODE_GENERATION", + timeout: 60000 + }, + { + id: "http_service", + description: "HTTP Service Creation", + usecase: "create a simple HTTP service that responds with JSON", + operationType: "CODE_GENERATION", + timeout: 90000 + }, + { + id: "data_processing", + description: "Data Processing Function", + usecase: "create a function that processes a list of integers and returns the sum", + operationType: "CODE_GENERATION", + timeout: 75000 + }, + { + id: "error_handling", + description: "Error Handling Implementation", + usecase: "create a function that handles database connection errors gracefully", + operationType: "CODE_GENERATION", + timeout: 90000 + }, + { + id: "test_generation", + description: "Test Case Generation", + usecase: "generate test cases for a calculator function", + operationType: "TESTS_FOR_USER_REQUIREMENT", + timeout: 75000 + } +]; + // Test event handler that captures events for testing interface TestEventResult { events: ChatNotify[]; @@ -38,9 +141,35 @@ interface TestEventResult { errorOccurred: string | null; diagnostics: any[]; messages: any[]; + useCase?: TestUseCase; + startTime?: number; + endTime?: number; + duration?: number; +} + +// Aggregate results for multiple test cases +interface AggregateTestResult { + totalTests: number; + passedTests: number; + failedTests: number; + results: TestCaseResult[]; + totalDuration: number; + averageDuration: number; } -function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () => TestEventResult } { +// Individual test case result +interface TestCaseResult { + useCase: TestUseCase; + result: TestEventResult; + passed: boolean; + failureReason?: string; + validationDetails?: { + noErrorCheck: boolean; + noDiagnosticsCheck: boolean; + }; +} + +function createTestEventHandler(useCase?: TestUseCase): { handler: CopilotEventHandler; getResult: () => TestEventResult } { const events: ChatNotify[] = []; let fullContent = ""; let hasStarted = false; @@ -48,6 +177,8 @@ function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () let errorOccurred: string | null = null; const diagnostics: any[] = []; const messages: any[] = []; + let startTime: number | undefined; + let endTime: number | undefined; const handler: CopilotEventHandler = (event: ChatNotify) => { events.push(event); @@ -55,39 +186,44 @@ function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () switch (event.type) { case "start": hasStarted = true; - console.log("Code generation started"); + startTime = Date.now(); + console.log(`[${useCase?.id || 'unknown'}] Code generation started`); break; case "content_block": fullContent += event.content; - console.log("Content block received:", event.content.substring(0, 100) + "..."); + // console.log(`[${useCase?.id || 'unknown'}] Content block received:`, event.content.substring(0, 50) + "..."); break; case "content_replace": fullContent = event.content; - console.log("Content replaced, new length:", event.content.length); + console.log(`[${useCase?.id || 'unknown'}] Content replaced, new length:`, event.content.length); break; case "error": errorOccurred = event.content; - console.error("Error occurred during code generation:", event.content); + console.error(`[${useCase?.id || 'unknown'}] Error occurred during code generation:`, event.content); break; case "stop": hasCompleted = true; - console.log("Code generation completed"); - console.log("Final content length:", fullContent.length); - console.log("Total events received:", events.length); + endTime = Date.now(); + console.log(`[${useCase?.id || 'unknown'}] Code generation completed`); + console.log(`[${useCase?.id || 'unknown'}] Final content length:`, fullContent.length); + console.log(`[${useCase?.id || 'unknown'}] Total events received:`, events.length); + if (startTime) { + console.log(`[${useCase?.id || 'unknown'}] Duration:`, endTime - startTime, "ms"); + } break; case "intermediary_state": - console.log("Intermediary state:", event.state); + console.log(`[${useCase?.id || 'unknown'}] Intermediary state:`, event.state); break; case "messages": - console.log("Messages received:", event.messages?.length || 0); + console.log(`[${useCase?.id || 'unknown'}] Messages received:`, event.messages?.length || 0); messages.push(...(event.messages || [])); break; case "diagnostics": - console.log("Diagnostics received:", event.diagnostics?.length || 0); + console.log(`[${useCase?.id || 'unknown'}] Diagnostics received:`, event.diagnostics?.length || 0); diagnostics.push(...(event.diagnostics || [])); break; default: - console.warn(`Unhandled event type: ${(event as any).type}`); + console.warn(`[${useCase?.id || 'unknown'}] Unhandled event type: ${(event as any).type}`); break; } }; @@ -100,17 +236,485 @@ function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () errorOccurred, diagnostics, messages, + useCase, + startTime, + endTime, + duration: startTime && endTime ? endTime - startTime : undefined, }); return { handler, getResult }; } -suite("AI Code Generator Tests Suite", () => { +// Validation function for test results +function validateTestResult(result: TestEventResult, useCase: TestUseCase): TestCaseResult { + const validationDetails = { + noErrorCheck: true, + noDiagnosticsCheck: true + }; + + let passed = true; + let failureReason = ""; + + // Check if no error event was received + if (result.errorOccurred) { + validationDetails.noErrorCheck = false; + passed = false; + failureReason = `Error event received: ${result.errorOccurred}`; + } + + // Check if no diagnostics were received + if (result.diagnostics && result.diagnostics.length > 0) { + validationDetails.noDiagnosticsCheck = false; + passed = false; + failureReason += `${failureReason ? '; ' : ''}Diagnostics received: ${result.diagnostics.length} diagnostic(s)`; + } + + return { + useCase, + result, + passed, + failureReason: failureReason || undefined, + validationDetails + }; +} + +// Execute single test case +async function executeSingleTestCase(useCase: TestUseCase, hasAnthropicKey: boolean): Promise { + console.log(`\n🚀 Starting test case: ${useCase.id} - ${useCase.description}`); + + const { handler: testEventHandler, getResult } = createTestEventHandler(useCase); + + const params: GenerateCodeRequest = { + usecase: useCase.usecase, + chatHistory: [], + operationType: useCase.operationType, + fileAttachmentContents: useCase.fileAttachments || [], + }; + + try { + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => reject(new Error(`Test case ${useCase.id} timed out after ${useCase.timeout}ms`)), useCase.timeout); + }); + + const testPromise = commands.executeCommand('ballerina.test.ai.generateCodeCore', params, testEventHandler); + + await Promise.race([testPromise, timeoutPromise]); + + const result = getResult(); + return validateTestResult(result, useCase); + + } catch (error) { + const result = getResult(); + + if (hasAnthropicKey) { + console.error(`❌ Test case ${useCase.id} failed with error:`, (error as Error).message); + return { + useCase, + result, + passed: false, + failureReason: `Execution error: ${(error as Error).message}` + }; + } else { + // Handle expected authentication errors when no API key + if ((error as Error).message?.includes("login method") || + (error as Error).message?.includes("Unsupported login method") || + (error as Error).message?.includes("auth")) { + console.log(`⚠️ Test case ${useCase.id} - Expected authentication error (no API key)`); + return { + useCase, + result, + passed: true, // Consider this a pass since it's expected behavior + failureReason: undefined + }; + } else { + console.error(`❌ Test case ${useCase.id} failed with unexpected error:`, (error as Error).message); + return { + useCase, + result, + passed: false, + failureReason: `Unexpected error: ${(error as Error).message}` + }; + } + } + } +} + +// Helper function to process a single batch of test cases +async function processSingleBatch( + batch: TestUseCase[], + hasAnthropicKey: boolean, + batchNumber: number, + startIndex: number +): Promise { + console.log(`\n📋 Processing batch ${batchNumber}: ${batch.map(uc => uc.id).join(', ')}`); + + const batchPromises = batch.map(useCase => + executeSingleTestCase(useCase, hasAnthropicKey) + ); + + const batchResults = await Promise.allSettled(batchPromises); + const usecaseResults: UsecaseResult[] = []; + + for (let j = 0; j < batchResults.length; j++) { + const settledResult = batchResults[j]; + const useCase = batch[j]; + + let usecaseResult: UsecaseResult; + + if (settledResult.status === 'fulfilled') { + usecaseResult = convertTestResultToUsecaseResult(settledResult.value); + } else { + console.error(`❌ Test case ${useCase.id} failed:`, settledResult.reason); + usecaseResult = createFailedUsecaseResult(useCase, settledResult.reason); + } + + usecaseResults.push(usecaseResult); + } + + return usecaseResults; +} + +// Helper function to create a failed UseCase result +function createFailedUsecaseResult(useCase: TestUseCase, reason: any): UsecaseResult { + return { + usecase: useCase.usecase, + diagnostics: [{ message: reason?.message || 'Unknown error' }], + attempts: 0, + files: [{ fileName: "error.txt", content: reason?.message || 'Unknown error' }], + compiled: false, + duration: undefined, + timestamp: Date.now() + }; +} + +// Helper function to persist batch results +async function persistBatchResults( + usecaseResults: UsecaseResult[], + resultManager: ResultManager, + startIndex: number +): Promise { + for (let i = 0; i < usecaseResults.length; i++) { + const resultIndex = startIndex + i; + await resultManager.persistUsecaseResult(usecaseResults[i], resultIndex); + } +} + +// Helper function to handle inter-batch delays and monitoring +async function handleBatchDelay( + currentIndex: number, + totalUseCases: number, + maxConcurrency: number +): Promise { + if (currentIndex + maxConcurrency < totalUseCases) { + monitorResourceUsage(); + + const memUsage = process.memoryUsage().heapUsed / 1024 / 1024; + const delay = 2000; + console.log(`⏳ Waiting ${delay}ms before next batch (memory: ${Math.round(memUsage)}MB)...`); + await new Promise(resolve => setTimeout(resolve, delay)); + } +} + +// Execute multiple test cases in parallel with comprehensive result management +async function executeParallelTestsWithResults( + useCases: TestUseCase[], + hasAnthropicKey: boolean, + config: TestConfiguration = DEFAULT_TEST_CONFIG +): Promise { + const resultManager = new ResultManager(); + await resultManager.initializeResultsDirectory(); + + const startTime = Date.now(); + logExecutionStart(useCases.length, config.maxConcurrency, resultManager.getResultsDirectory()); + + const allUsecaseResults: UsecaseResult[] = []; + let batchCount = 0; + + // Process tests in batches to limit concurrency + for (let i = 0; i < useCases.length; i += config.maxConcurrency) { + batchCount++; + const batch = useCases.slice(i, i + config.maxConcurrency); + + // Execute batch and get results + const batchResults = await processSingleBatch(batch, hasAnthropicKey, batchCount, i); + + // Persist batch results + await persistBatchResults(batchResults, resultManager, i); + + // Add to overall results + allUsecaseResults.push(...batchResults); + + // Handle inter-batch delay and monitoring + await handleBatchDelay(i, useCases.length, config.maxConcurrency); + } + console.log(`\n✅ All batches processed. Total use cases: ${allUsecaseResults.length}`); + + // Generate and persist comprehensive summary + const summary = await generateAndPersistSummary(allUsecaseResults, resultManager); + console.log(`\n📄 Summary report generated: ` + summary); + // Log completion summary + logExecutionCompletion(startTime, allUsecaseResults, resultManager.getResultsDirectory()); + + return summary; +} + +// Helper function to log execution start +function logExecutionStart(totalCases: number, maxConcurrency: number, resultsDir: string): void { + console.log(`\n🔥 Starting parallel execution of ${totalCases} test cases:`); + console.log(` Max Concurrency: ${maxConcurrency}`); + console.log(` Results Directory: ${resultsDir}`); +} + +// Helper function to generate and persist summary +async function generateAndPersistSummary(usecaseResults: UsecaseResult[], resultManager: ResultManager): Promise { + const summary = generateComprehensiveSummary(usecaseResults); + + await resultManager.persistSummary(summary); + + return summary; +} + +// Helper function to log execution completion +function logExecutionCompletion(startTime: number, usecaseResults: UsecaseResult[], resultsDir: string): void { + const endTime = Date.now(); + const totalDuration = endTime - startTime; + const passedTests = usecaseResults.filter(r => r.compiled).length; + + console.log(`\n🏁 Parallel execution completed:`); + console.log(` Total Time: ${totalDuration}ms (${Math.round(totalDuration / 1000)}s)`); + console.log(` Success Rate: ${Math.round(passedTests / usecaseResults.length * 100)}%`); + console.log(` Results saved to: ${resultsDir}`); +} + +// Generate enhanced detailed report for comprehensive results (Ballerina-style) +function generateComprehensiveReport(summary: Summary): void { + console.log('\n' + '='.repeat(80)); + console.log('📊 COMPREHENSIVE TEST EXECUTION REPORT (Ballerina-Style)'); + console.log('='.repeat(80)); + + console.log(`\n📈 SUMMARY:`); + console.log(` Total Use Cases: ${summary.totalUsecases}`); + console.log(` Compiled Successfully: ${summary.totalCompiled} (${Math.round(summary.accuracy)}%)`); + console.log(` Failed: ${summary.totalFailed} (${Math.round((summary.totalFailed / summary.totalUsecases) * 100)}%)`); + console.log(` Overall Accuracy: ${summary.accuracy}%`); + console.log(` Total Execution Time: ${summary.totalDuration}ms (${Math.round(summary.totalDuration / 1000)}s)`); + console.log(` Average Duration per Test: ${summary.averageDuration}ms`); + console.log(` Report Generated: ${new Date(summary.timestamp).toISOString()}`); + + console.log('\n🏆 SUCCESSFUL COMPILATIONS:'); + const successful = summary.results.filter(r => r.compiled); + successful.forEach((result, index) => { + console.log(` ${index + 1}. ${result.usecase}`); + console.log(` Duration: ${result.duration || 'N/A'}ms`); + console.log(` Files Generated: ${result.files.length}`); + console.log(` Diagnostics: ${result.diagnostics.length} (${result.diagnostics.length === 0 ? '✅ Clean' : '⚠️ Has Issues'})`); + console.log(` Attempts: ${result.attempts}`); + if (result.files.length > 0) { + console.log(` Files: ${result.files.map(f => f.fileName).join(', ')}`); + } + }); + + if (summary.totalFailed > 0) { + console.log('\n❌ FAILED COMPILATIONS:'); + const failed = summary.results.filter(r => !r.compiled); + failed.forEach((result, index) => { + console.log(` ${index + 1}. ${result.usecase}`); + console.log(` Duration: ${result.duration || 'N/A'}ms`); + console.log(` Diagnostic Issues: ${result.diagnostics.length}`); + console.log(` Error Events: ${result.errorEvents ? result.errorEvents.length : 0}`); + console.log(` Attempts: ${result.attempts}`); + if (result.errorEvents && result.errorEvents.length > 0) { + console.log(` Key Errors:`); + result.errorEvents.slice(0, 2).forEach((error, errorIndex) => { + console.log(` ${errorIndex + 1}. ${error.substring(0, 100)}${error.length > 100 ? '...' : ''}`); + }); + if (result.errorEvents.length > 2) { + console.log(` ... and ${result.errorEvents.length - 2} more errors`); + } + } + if (result.diagnostics.length > 0) { + console.log(` Key Diagnostics:`); + result.diagnostics.slice(0, 3).forEach((diag, diagIndex) => { + console.log(` ${diagIndex + 1}. ${diag.message.substring(0, 100)}${diag.message.length > 100 ? '...' : ''}`); + }); + if (result.diagnostics.length > 3) { + console.log(` ... and ${result.diagnostics.length - 3} more`); + } + } + }); + } + + console.log('\n⚡ PERFORMANCE ANALYSIS:'); + const durations = summary.results + .filter(r => r.duration) + .map(r => r.duration!) + .sort((a, b) => a - b); + + if (durations.length > 0) { + console.log(` Fastest Test: ${durations[0]}ms`); + console.log(` Slowest Test: ${durations[durations.length - 1]}ms`); + console.log(` Median Duration: ${durations[Math.floor(durations.length / 2)]}ms`); + + // Performance distribution + const fast = durations.filter(d => d < 30000).length; + const medium = durations.filter(d => d >= 30000 && d < 60000).length; + const slow = durations.filter(d => d >= 60000).length; + + console.log(` Performance Distribution:`); + console.log(` Fast (<30s): ${fast} tests`); + console.log(` Medium (30-60s): ${medium} tests`); + console.log(` Slow (>60s): ${slow} tests`); + } + + console.log('\n📁 FILE GENERATION ANALYSIS:'); + const totalFiles = summary.results.reduce((sum, r) => sum + r.files.length, 0); + const avgFilesPerTest = totalFiles / summary.results.length; + const fileTypes = new Map(); + + summary.results.forEach(r => { + r.files.forEach(f => { + const ext = path.extname(f.fileName) || 'no-extension'; + fileTypes.set(ext, (fileTypes.get(ext) || 0) + 1); + }); + }); + + console.log(` Total Files Generated: ${totalFiles}`); + console.log(` Average Files per Test: ${Math.round(avgFilesPerTest * 10) / 10}`); + console.log(` File Type Distribution:`); + Array.from(fileTypes.entries()) + .sort((a, b) => b[1] - a[1]) + .forEach(([ext, count]) => { + console.log(` ${ext}: ${count} files`); + }); + + console.log('\n🔧 DIAGNOSTIC & ERROR ANALYSIS:'); + const totalDiagnostics = summary.results.reduce((sum, r) => sum + r.diagnostics.length, 0); + const testsWithDiagnostics = summary.results.filter(r => r.diagnostics.length > 0).length; + const totalErrorEvents = summary.results.reduce((sum, r) => sum + (r.errorEvents?.length || 0), 0); + const testsWithErrors = summary.results.filter(r => r.errorEvents && r.errorEvents.length > 0).length; + + console.log(` Total Diagnostics: ${totalDiagnostics}`); + console.log(` Tests with Diagnostics: ${testsWithDiagnostics}/${summary.totalUsecases}`); + console.log(` Total Error Events: ${totalErrorEvents}`); + console.log(` Tests with Errors: ${testsWithErrors}/${summary.totalUsecases}`); + if (totalDiagnostics > 0) { + console.log(` Average Diagnostics per Failed Test: ${Math.round((totalDiagnostics / Math.max(testsWithDiagnostics, 1)) * 10) / 10}`); + } + if (totalErrorEvents > 0) { + console.log(` Average Errors per Failed Test: ${Math.round((totalErrorEvents / Math.max(testsWithErrors, 1)) * 10) / 10}`); + } + + console.log('\n' + '='.repeat(80)); + console.log('🎯 CONCLUSION:'); + if (summary.accuracy >= 80) { + console.log(' Status: ✅ EXCELLENT - High success rate achieved'); + } else if (summary.accuracy >= 60) { + console.log(' Status: ⚠️ MODERATE - Room for improvement'); + } else { + console.log(' Status: ❌ NEEDS ATTENTION - Low success rate'); + } + console.log(` Quality Score: ${Math.round(summary.accuracy)}%`); + console.log('='.repeat(80)); +} + +// Generate detailed report +function generateDetailedReport(aggregateResult: AggregateTestResult): void { + console.log('\n' + '='.repeat(80)); + console.log('📊 DETAILED TEST EXECUTION REPORT'); + console.log('='.repeat(80)); + + console.log(`\n📈 SUMMARY:`); + console.log(` Total Tests: ${aggregateResult.totalTests}`); + console.log(` Passed: ${aggregateResult.passedTests} (${Math.round(aggregateResult.passedTests / aggregateResult.totalTests * 100)}%)`); + console.log(` Failed: ${aggregateResult.failedTests} (${Math.round(aggregateResult.failedTests / aggregateResult.totalTests * 100)}%)`); + console.log(` Total Duration: ${aggregateResult.totalDuration}ms (${Math.round(aggregateResult.totalDuration / 1000)}s)`); + console.log(` Average Duration: ${Math.round(aggregateResult.averageDuration)}ms`); + + console.log('\n🏆 PASSED TESTS:'); + aggregateResult.results.filter(r => r.passed).forEach((testResult, index) => { + console.log(` ${index + 1}. ${testResult.useCase.id} - ${testResult.useCase.description}`); + console.log(` Duration: ${testResult.result.duration || 'N/A'}ms`); + console.log(` Content Length: ${testResult.result.fullContent.length} chars`); + if (testResult.validationDetails) { + const checks = []; + if (testResult.validationDetails.noErrorCheck) checks.push('✅ No Errors'); + if (testResult.validationDetails.noDiagnosticsCheck) checks.push('✅ No Diagnostics'); + console.log(` Validations: ${checks.join(', ')}`); + } + }); + + if (aggregateResult.failedTests > 0) { + console.log('\n❌ FAILED TESTS:'); + aggregateResult.results.filter(r => !r.passed).forEach((testResult, index) => { + console.log(` ${index + 1}. ${testResult.useCase.id} - ${testResult.useCase.description}`); + console.log(` Duration: ${testResult.result.duration || 'N/A'}ms`); + console.log(` Content Length: ${testResult.result.fullContent.length} chars`); + console.log(` Failure Reason: ${testResult.failureReason || 'Unknown'}`); + if (testResult.validationDetails) { + const checks = []; + checks.push(testResult.validationDetails.noErrorCheck ? '✅ No Errors' : '❌ Has Errors'); + checks.push(testResult.validationDetails.noDiagnosticsCheck ? '✅ No Diagnostics' : '❌ Has Diagnostics'); + console.log(` Validations: ${checks.join(', ')}`); + } + if (testResult.result.errorOccurred) { + console.log(` Error: ${testResult.result.errorOccurred.substring(0, 200)}...`); + } + }); + } + + console.log('\n⚡ PERFORMANCE METRICS:'); + const durations = aggregateResult.results + .filter(r => r.result.duration) + .map(r => r.result.duration!) + .sort((a, b) => a - b); + + if (durations.length > 0) { + console.log(` Fastest: ${durations[0]}ms`); + console.log(` Slowest: ${durations[durations.length - 1]}ms`); + console.log(` Median: ${durations[Math.floor(durations.length / 2)]}ms`); + } + + console.log('\n' + '='.repeat(80)); + console.log('END OF REPORT'); + console.log('='.repeat(80)); +} + +// Performance monitoring utilities +function monitorResourceUsage() { + const memUsage = process.memoryUsage(); + const uptime = process.uptime(); + console.log(`\n💻 Resource Usage:`); + console.log(` Memory - RSS: ${Math.round(memUsage.rss / 1024 / 1024)}MB`); + console.log(` Memory - Heap Used: ${Math.round(memUsage.heapUsed / 1024 / 1024)}MB`); + console.log(` Memory - Heap Total: ${Math.round(memUsage.heapTotal / 1024 / 1024)}MB`); + console.log(` Memory - External: ${Math.round(memUsage.external / 1024 / 1024)}MB`); + console.log(` Process Uptime: ${Math.round(uptime)}s`); +} + + +// Configuration management +interface TestConfiguration { + maxConcurrency: number; +} + +const DEFAULT_TEST_CONFIG: TestConfiguration = { + maxConcurrency: 5 +}; + + +suite.only("AI Code Generator Tests Suite", () => { // Close all the open workspace folders before running the test suiteSetup(async function () { this.timeout(60000); // 60 second timeout for extension initialization + // Load environment variables from .env file if it exists + const envPath = path.resolve(__dirname, "../../../../.env"); + if (fs.existsSync(envPath)) { + dotenv.config({ path: envPath }); + console.log("Loaded .env file for AI tests"); + } + // Wait for VSCode startup to complete (onStartupFinished activation event) await new Promise(resolve => setTimeout(resolve, 10000)); @@ -156,123 +760,247 @@ suite("AI Code Generator Tests Suite", () => { if (attempts >= maxAttempts) { throw new Error("AI test command never registered - extension failed to activate"); } + + // Log API key availability for test visibility + const anthropicApiKey = process.env.ANTHROPIC_API_KEY; + if (anthropicApiKey && anthropicApiKey.trim() !== "") { + console.log("ANTHROPIC_API_KEY found - tests will attempt BYOK authentication"); + console.log("Using environment variable directly for authentication"); + } else { + console.log("No ANTHROPIC_API_KEY found - tests will expect authentication errors"); + } }); - test("basic workspace test", async function () { - this.timeout(120000); // 2 minute timeout for test execution - - const { handler: testEventHandler, getResult } = createTestEventHandler(); + // Clean up authentication after all tests + suiteTeardown(async function () { + console.log("Test suite completed - using environment-based auth, no credentials to clean up"); + monitorResourceUsage(); // Final resource check + }); - await wait(15000); // Wait for workspace to settle + suite("Parallel Multi-UseCase Testing", () => { + // Check API key before running any tests in this suite + const anthropicApiKey = process.env.ANTHROPIC_API_KEY; + const hasAnthropicKey = anthropicApiKey && anthropicApiKey.trim() !== ""; - const params: GenerateCodeRequest = { - usecase: "write a hello world", - chatHistory: [], - operationType: "CODE_GENERATION", - fileAttachmentContents: [], + if (!hasAnthropicKey) { + console.log(`\n⚠️ Skipping entire test suite: ANTHROPIC_API_KEY not set`); + return; // Skip the entire suite + } + + test("Execute all use cases in parallel with comprehensive result management", async function () { + this.timeout(600000); // 10 minute timeout for parallel execution + + console.log(`\n🔧 Test Configuration (Comprehensive Results):`); + console.log(` API Key Available: Yes`); + console.log(` Total Use Cases: ${TEST_USE_CASES.length}`); + console.log(` Result Management: Ballerina-style comprehensive`); + + monitorResourceUsage(); // Initial resource check + + await wait(15000); // Wait for workspace to settle + + // Execute all test cases with comprehensive result management + const testConfig: TestConfiguration = DEFAULT_TEST_CONFIG; + + const summary = await executeParallelTestsWithResults(TEST_USE_CASES, true, testConfig); + + // Generate comprehensive report (Ballerina-style) + generateComprehensiveReport(summary); + monitorResourceUsage(); // Final resource check for this test + + // Assert overall test success + const successRate = summary.accuracy / 100; + console.log(`\n✅ Comprehensive test execution completed:`); + console.log(` Success Rate: ${Math.round(summary.accuracy)}%`); + console.log(` Total Files Generated: ${summary.results.reduce((sum, r) => sum + r.files.length, 0)}`); + + assert.ok(true); + }); + + }); +}); + +function wait(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// Comprehensive Result Persistence System +class ResultManager { + private resultsDir: string; + + constructor(baseDir: string = "./test/ai/evals/code/results") { + this.resultsDir = path.resolve(baseDir); + } + + async initializeResultsDirectory(): Promise { + // Remove existing results directory + if (fs.existsSync(this.resultsDir)) { + await fs.promises.rm(this.resultsDir, { recursive: true, force: true }); + console.log("Existing results directory removed"); + } + + // Create new results directory + await fs.promises.mkdir(this.resultsDir, { recursive: true }); + console.log("Results directory initialized"); + } + + async persistUsecaseResult(usecaseResult: UsecaseResult, index: number): Promise { + const resultDir = path.join(this.resultsDir, index.toString()); + await fs.promises.mkdir(resultDir, { recursive: true }); + + // Create compact result + const compactResult: UsecaseCompact = { + usecase: usecaseResult.usecase, + attempts: usecaseResult.attempts, + compiled: usecaseResult.compiled, + duration: usecaseResult.duration }; - try { - await commands.executeCommand('ballerina.test.ai.generateCodeCore', params, testEventHandler); + // Save compact result + await fs.promises.writeFile( + path.join(resultDir, "result.json"), + JSON.stringify(compactResult, null, 2) + ); + + // Save diagnostics + await fs.promises.writeFile( + path.join(resultDir, "diagnostics.json"), + JSON.stringify(usecaseResult.diagnostics, null, 2) + ); + + // Save error events for debugging + if (usecaseResult.errorEvents && usecaseResult.errorEvents.length > 0) { + await fs.promises.writeFile( + path.join(resultDir, "errors.json"), + JSON.stringify(usecaseResult.errorEvents, null, 2) + ); + } - const result = getResult(); + // Create code directory and save source files + const codeDir = path.join(resultDir, "code"); + await fs.promises.mkdir(codeDir, { recursive: true }); - // Basic assertions - assert.strictEqual(result.hasStarted, true, "Code generation should have started"); - assert.strictEqual(result.errorOccurred, null, "No errors should have occurred"); - assert.ok(result.events.length > 0, "Should have received events"); + // Create Ballerina.toml file + const ballerinaToml = `[package] +name = "test_usecase_${index}" +version = "0.1.0" +distribution = "2201.10.0" - //TODO: Take the response. Add to files, then compile the project. Get diagnostics - } catch (error) { - // Add debug info for failed authentication - if ((error as Error).message?.includes("login method")) { - console.log("Expected authentication error in test environment"); - } - throw error; +[build-options] +observabilityIncluded = true +`; + await fs.promises.writeFile(path.join(codeDir, "Ballerina.toml"), ballerinaToml); + + for (const file of usecaseResult.files) { + const filePath = path.join(codeDir, file.fileName); + await fs.promises.writeFile(filePath, file.content); } - }); -}); -// suite("AI Code Generator Tests Suite", () => { -// // let langClient: ExtendedLangClient; - -// // suiteSetup(async (done): Promise => { -// // langClient = new ExtendedLangClient( -// // 'ballerina-vscode', -// // 'Ballerina LS Client', -// // getServerOptions(ballerinaExtInstance), -// // { documentSelector: [{ scheme: 'file', language: 'ballerina' }] }, -// // undefined, -// // false -// // ); -// // await langClient.start(); -// // await langClient.registerExtendedAPICapabilities(); -// // done(); -// // }); - -// function runTests(basePath: string) { -// const testFolders = getTestFolders(basePath); - -// testFolders.forEach((folder) => { -// const folderPath = path.join(basePath, folder); - -// suite(`Group: ${folder}`, () => { -// const subFolders = getTestFolders(folderPath); - -// test("should generate code successfully", async () => { -// const { handler: testEventHandler, getResult } = createTestEventHandler(); -// const PROJECT_ROOT = "/Users/wso2/repos/ballerina-copilot/evals/project_samples/fresh_bi_package"; - -// // Add workspace folder programmatically -// const success = workspace.updateWorkspaceFolders( -// workspace.workspaceFolders ? workspace.workspaceFolders.length : 0, -// 0, -// { uri: Uri.file(PROJECT_ROOT) } -// ); - -// if (!success) { -// throw new Error("Failed to add workspace folder"); -// } - -// // Wait for workspace to be updated -// await wait(2000); - -// const uri = Uri.file(path.join(PROJECT_ROOT, "main.bal").toString()); -// await commands.executeCommand("vscode.open", uri); -// await workspace.openTextDocument(uri); - -// await wait(15000); -// const params: GenerateCodeRequest = { -// usecase: "write a hello world", -// chatHistory: [], -// operationType: "CODE_GENERATION", -// fileAttachmentContents: [], -// }; - -// try { -// await generateCodeCore(params, testEventHandler); - -// const result = getResult(); - -// // Basic assertions -// assert.strictEqual(result.hasStarted, true, "Code generation should have started"); -// assert.strictEqual(result.errorOccurred, null, "No errors should have occurred"); -// assert.ok(result.events.length > 0, "Should have received events"); - -// console.log(`Test completed for folder: ${folder}`); -// console.log(`Generated content length: ${result.fullContent.length}`); -// console.log(`Total events: ${result.events.length}`); -// } catch (error) { -// console.error(`Test failed for folder ${folder}:`, error); -// throw error; -// } -// }); -// }); -// }); -// } -// runTests(RESOURCES_PATH); -// }); + console.log(`Result persisted for index ${index}: ${usecaseResult.usecase}${usecaseResult.errorEvents ? ` (${usecaseResult.errorEvents.length} error events)` : ''}`); + } -function wait(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); + async persistSummary(summary: Summary): Promise { + // Create compact summary + const compactSummary: SummaryCompact = { + totalUsecases: summary.totalUsecases, + totalCompiled: summary.totalCompiled, + totalFailed: summary.totalFailed, + accuracy: summary.accuracy + }; + + // Save compact summary + await fs.promises.writeFile( + path.join(this.resultsDir, "summary.json"), + JSON.stringify(compactSummary, null, 2) + ); + + // Save full summary + await fs.promises.writeFile( + path.join(this.resultsDir, "summary_detailed.json"), + JSON.stringify(summary, null, 2) + ); + + console.log("Summary files saved"); + } + + getResultsDirectory(): string { + return this.resultsDir; + } +} + +// Enhanced result conversion functions +function convertTestResultToUsecaseResult(testResult: TestCaseResult): UsecaseResult { + // Extract source files from fullContent using regex similar to Ballerina approach + const files = extractSourceFilesFromContent(testResult.result.fullContent); + + // Convert diagnostics to DiagnosticMessage format + const diagnostics: DiagnosticMessage[] = testResult.result.diagnostics.map(diag => ({ + message: typeof diag === 'string' ? diag : diag.message || diag.toString(), + severity: diag.severity || 'error', + code: diag.code, + source: diag.source + })); + + // Extract error events for debugging + const errorEvents = testResult.result.events + .filter(event => event.type === 'error') + .map(event => event.content); + + return { + usecase: testResult.useCase.usecase, + diagnostics: diagnostics, + attempts: 1, // TODO: Track actual attempts from repair iterations + files: files, + compiled: testResult.passed && diagnostics.length === 0, + duration: testResult.result.duration, + timestamp: testResult.result.startTime, + errorEvents: errorEvents.length > 0 ? errorEvents : undefined + }; +} + +function extractSourceFilesFromContent(content: string): SourceFile[] { + const files: SourceFile[] = []; + + // Regex to match code blocks with filename - matching Ballerina pattern + const codeBlockRegex = /\s*```ballerina\s*([\s\S]*?)```\s*<\/code>/g; + let match: RegExpExecArray | null; + + while ((match = codeBlockRegex.exec(content)) !== null) { + files.push({ + fileName: match[1], + content: match[2].trim() + }); + } + + // Fallback: if no structured code blocks, create a generic main.bal file + if (files.length === 0 && content.trim()) { + files.push({ + fileName: "main.bal", + content: content + }); + } + + return files; +} + +function generateComprehensiveSummary(results: UsecaseResult[]): Summary { + const totalUsecases = results.length; + const totalCompiled = results.filter(r => r.compiled).length; + const totalFailed = totalUsecases - totalCompiled; + const accuracy = totalUsecases > 0 ? (totalCompiled * 100) / totalUsecases : 0; + + const durations = results.filter(r => r.duration).map(r => r.duration!); + const totalDuration = durations.reduce((sum, d) => sum + d, 0); + const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + + return { + results: results, + totalUsecases, + totalCompiled, + totalFailed, + accuracy: Math.round(accuracy * 100) / 100, // Round to 2 decimal places + totalDuration, + averageDuration: Math.round(averageDuration), + timestamp: Date.now() + }; } From e6e367b731294e42862d0f4b10bcf5f3d8ae4dba Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Fri, 12 Sep 2025 14:28:24 +0530 Subject: [PATCH 038/730] Improve eval test suite --- .../test/ai/evals/code/code.test.ts | 1019 ++--------------- .../ai/evals/code/result-management/index.ts | 20 + .../result-management/report-generator.ts | 112 ++ .../result-management/result-conversion.ts | 88 ++ .../code/result-management/result-manager.ts | 66 ++ .../result-management/result-persistence.ts | 92 ++ .../test/ai/evals/code/test-cases.ts | 82 ++ .../test/ai/evals/code/types/config-types.ts | 22 + .../test/ai/evals/code/types/index.ts | 19 + .../test/ai/evals/code/types/result-types.ts | 83 ++ .../test/ai/evals/code/types/test-types.ts | 59 + .../ai/evals/code/utils/batch-processing.ts | 76 ++ .../test/ai/evals/code/utils/constants.ts | 78 ++ .../ai/evals/code/utils/content-parser.ts | 46 + .../test/ai/evals/code/utils/index.ts | 22 + .../ai/evals/code/utils/test-event-handler.ts | 98 ++ .../ai/evals/code/utils/test-execution.ts | 55 + .../ai/evals/code/utils/test-validation.ts | 50 + .../ballerina-extension/test/data/bi_empty | 1 + .../ballerina-extension/test/index.ts | 2 +- 20 files changed, 1186 insertions(+), 904 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts create mode 160000 workspaces/ballerina/ballerina-extension/test/data/bi_empty diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index 6d981715316..97b99f1170c 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -1,4 +1,4 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. +// 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 @@ -15,428 +15,62 @@ // under the License. import * as path from "path"; -import { generateCodeCore } from "../../../../src/features/ai/service/code/code"; import * as assert from "assert"; import * as fs from "fs"; -import { ChatNotify, GenerateCodeRequest } from "@wso2/ballerina-core"; -import { CopilotEventHandler } from "../../../../src/features/ai/service/event"; import { commands, Uri, workspace } from "vscode"; import * as vscode from "vscode"; import * as dotenv from "dotenv"; -const RESOURCES_PATH = path.resolve(__dirname, "../../../../../test/ai/evals/code/resources"); - -function getTestFolders(dirPath: string): string[] { - return fs.readdirSync(dirPath).filter((file) => fs.lstatSync(path.join(dirPath, file)).isDirectory()); -} - -// Enhanced result management interfaces matching Ballerina pipeline -interface SourceFile { - fileName: string; - content: string; -} - -interface DiagnosticMessage { - message: string; - severity?: string; - code?: string; - source?: string; - range?: { - start: { line: number; character: number }; - end: { line: number; character: number }; - }; -} - -interface UsecaseResult { - usecase: string; - diagnostics: DiagnosticMessage[]; - attempts: number; - files: SourceFile[]; - compiled: boolean; - duration?: number; - timestamp?: number; - errorEvents?: string[]; -} - -interface Summary { - results: UsecaseResult[]; - totalUsecases: number; - totalCompiled: number; - totalFailed: number; - accuracy: number; - totalDuration: number; - averageDuration: number; - timestamp: number; -} - -interface SummaryCompact { - totalUsecases: number; - totalCompiled: number; - totalFailed: number; - accuracy: number; -} - -interface UsecaseCompact { - usecase: string; - attempts: number; - compiled: boolean; - duration?: number; -} - -// Test use case definition -interface TestUseCase { - id: string; - description: string; - usecase: string; - operationType: "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; - timeout: number; - fileAttachments?: { fileName: string; content: string; }[]; -} - -// Predefined test use cases -const TEST_USE_CASES: TestUseCase[] = [ - { - id: "basic_hello_world", - description: "Basic Hello World Generation", - usecase: "write a hello world program", - operationType: "CODE_GENERATION", - timeout: 60000 - }, - { - id: "http_service", - description: "HTTP Service Creation", - usecase: "create a simple HTTP service that responds with JSON", - operationType: "CODE_GENERATION", - timeout: 90000 - }, - { - id: "data_processing", - description: "Data Processing Function", - usecase: "create a function that processes a list of integers and returns the sum", - operationType: "CODE_GENERATION", - timeout: 75000 - }, - { - id: "error_handling", - description: "Error Handling Implementation", - usecase: "create a function that handles database connection errors gracefully", - operationType: "CODE_GENERATION", - timeout: 90000 - }, - { - id: "test_generation", - description: "Test Case Generation", - usecase: "generate test cases for a calculator function", - operationType: "TESTS_FOR_USER_REQUIREMENT", - timeout: 75000 - } -]; - -// Test event handler that captures events for testing -interface TestEventResult { - events: ChatNotify[]; - fullContent: string; - hasStarted: boolean; - hasCompleted: boolean; - errorOccurred: string | null; - diagnostics: any[]; - messages: any[]; - useCase?: TestUseCase; - startTime?: number; - endTime?: number; - duration?: number; -} - -// Aggregate results for multiple test cases -interface AggregateTestResult { - totalTests: number; - passedTests: number; - failedTests: number; - results: TestCaseResult[]; - totalDuration: number; - averageDuration: number; -} - -// Individual test case result -interface TestCaseResult { - useCase: TestUseCase; - result: TestEventResult; - passed: boolean; - failureReason?: string; - validationDetails?: { - noErrorCheck: boolean; - noDiagnosticsCheck: boolean; - }; -} - -function createTestEventHandler(useCase?: TestUseCase): { handler: CopilotEventHandler; getResult: () => TestEventResult } { - const events: ChatNotify[] = []; - let fullContent = ""; - let hasStarted = false; - let hasCompleted = false; - let errorOccurred: string | null = null; - const diagnostics: any[] = []; - const messages: any[] = []; - let startTime: number | undefined; - let endTime: number | undefined; - - const handler: CopilotEventHandler = (event: ChatNotify) => { - events.push(event); - - switch (event.type) { - case "start": - hasStarted = true; - startTime = Date.now(); - console.log(`[${useCase?.id || 'unknown'}] Code generation started`); - break; - case "content_block": - fullContent += event.content; - // console.log(`[${useCase?.id || 'unknown'}] Content block received:`, event.content.substring(0, 50) + "..."); - break; - case "content_replace": - fullContent = event.content; - console.log(`[${useCase?.id || 'unknown'}] Content replaced, new length:`, event.content.length); - break; - case "error": - errorOccurred = event.content; - console.error(`[${useCase?.id || 'unknown'}] Error occurred during code generation:`, event.content); - break; - case "stop": - hasCompleted = true; - endTime = Date.now(); - console.log(`[${useCase?.id || 'unknown'}] Code generation completed`); - console.log(`[${useCase?.id || 'unknown'}] Final content length:`, fullContent.length); - console.log(`[${useCase?.id || 'unknown'}] Total events received:`, events.length); - if (startTime) { - console.log(`[${useCase?.id || 'unknown'}] Duration:`, endTime - startTime, "ms"); - } - break; - case "intermediary_state": - console.log(`[${useCase?.id || 'unknown'}] Intermediary state:`, event.state); - break; - case "messages": - console.log(`[${useCase?.id || 'unknown'}] Messages received:`, event.messages?.length || 0); - messages.push(...(event.messages || [])); - break; - case "diagnostics": - console.log(`[${useCase?.id || 'unknown'}] Diagnostics received:`, event.diagnostics?.length || 0); - diagnostics.push(...(event.diagnostics || [])); - break; - default: - console.warn(`[${useCase?.id || 'unknown'}] Unhandled event type: ${(event as any).type}`); - break; - } - }; - - const getResult = (): TestEventResult => ({ - events, - fullContent, - hasStarted, - hasCompleted, - errorOccurred, - diagnostics, - messages, - useCase, - startTime, - endTime, - duration: startTime && endTime ? endTime - startTime : undefined, - }); - - return { handler, getResult }; -} - -// Validation function for test results -function validateTestResult(result: TestEventResult, useCase: TestUseCase): TestCaseResult { - const validationDetails = { - noErrorCheck: true, - noDiagnosticsCheck: true - }; - - let passed = true; - let failureReason = ""; - - // Check if no error event was received - if (result.errorOccurred) { - validationDetails.noErrorCheck = false; - passed = false; - failureReason = `Error event received: ${result.errorOccurred}`; - } - - // Check if no diagnostics were received - if (result.diagnostics && result.diagnostics.length > 0) { - validationDetails.noDiagnosticsCheck = false; - passed = false; - failureReason += `${failureReason ? '; ' : ''}Diagnostics received: ${result.diagnostics.length} diagnostic(s)`; - } - - return { - useCase, - result, - passed, - failureReason: failureReason || undefined, - validationDetails - }; -} - -// Execute single test case -async function executeSingleTestCase(useCase: TestUseCase, hasAnthropicKey: boolean): Promise { - console.log(`\n🚀 Starting test case: ${useCase.id} - ${useCase.description}`); - - const { handler: testEventHandler, getResult } = createTestEventHandler(useCase); - - const params: GenerateCodeRequest = { - usecase: useCase.usecase, - chatHistory: [], - operationType: useCase.operationType, - fileAttachmentContents: useCase.fileAttachments || [], - }; - - try { - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error(`Test case ${useCase.id} timed out after ${useCase.timeout}ms`)), useCase.timeout); - }); - - const testPromise = commands.executeCommand('ballerina.test.ai.generateCodeCore', params, testEventHandler); - - await Promise.race([testPromise, timeoutPromise]); - - const result = getResult(); - return validateTestResult(result, useCase); - - } catch (error) { - const result = getResult(); - - if (hasAnthropicKey) { - console.error(`❌ Test case ${useCase.id} failed with error:`, (error as Error).message); - return { - useCase, - result, - passed: false, - failureReason: `Execution error: ${(error as Error).message}` - }; - } else { - // Handle expected authentication errors when no API key - if ((error as Error).message?.includes("login method") || - (error as Error).message?.includes("Unsupported login method") || - (error as Error).message?.includes("auth")) { - console.log(`⚠️ Test case ${useCase.id} - Expected authentication error (no API key)`); - return { - useCase, - result, - passed: true, // Consider this a pass since it's expected behavior - failureReason: undefined - }; - } else { - console.error(`❌ Test case ${useCase.id} failed with unexpected error:`, (error as Error).message); - return { - useCase, - result, - passed: false, - failureReason: `Unexpected error: ${(error as Error).message}` - }; - } - } - } -} - -// Helper function to process a single batch of test cases -async function processSingleBatch( - batch: TestUseCase[], - hasAnthropicKey: boolean, - batchNumber: number, - startIndex: number -): Promise { - console.log(`\n📋 Processing batch ${batchNumber}: ${batch.map(uc => uc.id).join(', ')}`); - - const batchPromises = batch.map(useCase => - executeSingleTestCase(useCase, hasAnthropicKey) - ); - - const batchResults = await Promise.allSettled(batchPromises); - const usecaseResults: UsecaseResult[] = []; - - for (let j = 0; j < batchResults.length; j++) { - const settledResult = batchResults[j]; - const useCase = batch[j]; - - let usecaseResult: UsecaseResult; - - if (settledResult.status === 'fulfilled') { - usecaseResult = convertTestResultToUsecaseResult(settledResult.value); - } else { - console.error(`❌ Test case ${useCase.id} failed:`, settledResult.reason); - usecaseResult = createFailedUsecaseResult(useCase, settledResult.reason); - } - - usecaseResults.push(usecaseResult); - } - - return usecaseResults; -} - -// Helper function to create a failed UseCase result -function createFailedUsecaseResult(useCase: TestUseCase, reason: any): UsecaseResult { - return { - usecase: useCase.usecase, - diagnostics: [{ message: reason?.message || 'Unknown error' }], - attempts: 0, - files: [{ fileName: "error.txt", content: reason?.message || 'Unknown error' }], - compiled: false, - duration: undefined, - timestamp: Date.now() - }; -} - -// Helper function to persist batch results -async function persistBatchResults( - usecaseResults: UsecaseResult[], - resultManager: ResultManager, - startIndex: number -): Promise { - for (let i = 0; i < usecaseResults.length; i++) { - const resultIndex = startIndex + i; - await resultManager.persistUsecaseResult(usecaseResults[i], resultIndex); - } -} - -// Helper function to handle inter-batch delays and monitoring -async function handleBatchDelay( - currentIndex: number, - totalUseCases: number, - maxConcurrency: number -): Promise { - if (currentIndex + maxConcurrency < totalUseCases) { - monitorResourceUsage(); - - const memUsage = process.memoryUsage().heapUsed / 1024 / 1024; - const delay = 2000; - console.log(`⏳ Waiting ${delay}ms before next batch (memory: ${Math.round(memUsage)}MB)...`); - await new Promise(resolve => setTimeout(resolve, delay)); - } -} - -// Execute multiple test cases in parallel with comprehensive result management +import { testCases } from "./test-cases"; +import { TestUseCase, Summary, TestConfiguration } from "./types"; +import { + DEFAULT_TEST_CONFIG, + TIMING, + PATHS, + FILES, + VSCODE_COMMANDS, + processSingleBatch, + handleBatchDelay, + wait +} from "./utils"; +import { + ResultManager, + generateComprehensiveSummary, + generateComprehensiveReport, + logExecutionStart, + logExecutionCompletion +} from "./result-management"; + +// Convert imported test cases to TestUseCase format +const TEST_USE_CASES: readonly TestUseCase[] = testCases.map((testCase, index) => ({ + id: `usecase_${index + 1}`, + description: testCase.prompt.substring(0, 50) + "...", + usecase: testCase.prompt, + operationType: "CODE_GENERATION" as const +})); + +/** + * Execute multiple test cases in parallel with comprehensive result management + */ async function executeParallelTestsWithResults( - useCases: TestUseCase[], - hasAnthropicKey: boolean, - config: TestConfiguration = DEFAULT_TEST_CONFIG + useCases: readonly TestUseCase[] ): Promise { const resultManager = new ResultManager(); await resultManager.initializeResultsDirectory(); const startTime = Date.now(); - logExecutionStart(useCases.length, config.maxConcurrency, resultManager.getResultsDirectory()); + logExecutionStart(useCases.length, DEFAULT_TEST_CONFIG.maxConcurrency, resultManager.getResultsDirectory()); - const allUsecaseResults: UsecaseResult[] = []; + const allUsecaseResults: import("./types").UsecaseResult[] = []; let batchCount = 0; // Process tests in batches to limit concurrency - for (let i = 0; i < useCases.length; i += config.maxConcurrency) { + for (let i = 0; i < useCases.length; i += DEFAULT_TEST_CONFIG.maxConcurrency) { batchCount++; - const batch = useCases.slice(i, i + config.maxConcurrency); + const batch = useCases.slice(i, i + DEFAULT_TEST_CONFIG.maxConcurrency); // Execute batch and get results - const batchResults = await processSingleBatch(batch, hasAnthropicKey, batchCount, i); + const batchResults = await processSingleBatch(batch, batchCount); // Persist batch results await persistBatchResults(batchResults, resultManager, i); @@ -445,336 +79,109 @@ async function executeParallelTestsWithResults( allUsecaseResults.push(...batchResults); // Handle inter-batch delay and monitoring - await handleBatchDelay(i, useCases.length, config.maxConcurrency); + await handleBatchDelay(i, useCases.length, DEFAULT_TEST_CONFIG.maxConcurrency); } console.log(`\n✅ All batches processed. Total use cases: ${allUsecaseResults.length}`); // Generate and persist comprehensive summary - const summary = await generateAndPersistSummary(allUsecaseResults, resultManager); - console.log(`\n📄 Summary report generated: ` + summary); + const summary = generateComprehensiveSummary(allUsecaseResults); + await resultManager.persistSummary(summary); + // Log completion summary logExecutionCompletion(startTime, allUsecaseResults, resultManager.getResultsDirectory()); return summary; } -// Helper function to log execution start -function logExecutionStart(totalCases: number, maxConcurrency: number, resultsDir: string): void { - console.log(`\n🔥 Starting parallel execution of ${totalCases} test cases:`); - console.log(` Max Concurrency: ${maxConcurrency}`); - console.log(` Results Directory: ${resultsDir}`); +/** + * Helper function to persist batch results + */ +async function persistBatchResults( + usecaseResults: readonly import("./types").UsecaseResult[], + resultManager: ResultManager, + startIndex: number +): Promise { + for (let i = 0; i < usecaseResults.length; i++) { + const resultIndex = startIndex + i; + await resultManager.persistUsecaseResult(usecaseResults[i], resultIndex); + } } -// Helper function to generate and persist summary -async function generateAndPersistSummary(usecaseResults: UsecaseResult[], resultManager: ResultManager): Promise { - const summary = generateComprehensiveSummary(usecaseResults); +/** + * Sets up the test environment by loading environment variables, + * initializing workspace, and ensuring extension activation + */ +async function setupTestEnvironment(): Promise { + // Load environment variables from .env file if it exists + const envPath = path.resolve(__dirname, PATHS.ENV_FILE_RELATIVE); + if (fs.existsSync(envPath)) { + dotenv.config({ path: envPath }); + console.log("Loaded .env file for AI tests"); + } - await resultManager.persistSummary(summary); + // Wait for VSCode startup to complete + await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETUP_DELAY)); - return summary; -} - -// Helper function to log execution completion -function logExecutionCompletion(startTime: number, usecaseResults: UsecaseResult[], resultsDir: string): void { - const endTime = Date.now(); - const totalDuration = endTime - startTime; - const passedTests = usecaseResults.filter(r => r.compiled).length; - - console.log(`\n🏁 Parallel execution completed:`); - console.log(` Total Time: ${totalDuration}ms (${Math.round(totalDuration / 1000)}s)`); - console.log(` Success Rate: ${Math.round(passedTests / usecaseResults.length * 100)}%`); - console.log(` Results saved to: ${resultsDir}`); -} - -// Generate enhanced detailed report for comprehensive results (Ballerina-style) -function generateComprehensiveReport(summary: Summary): void { - console.log('\n' + '='.repeat(80)); - console.log('📊 COMPREHENSIVE TEST EXECUTION REPORT (Ballerina-Style)'); - console.log('='.repeat(80)); + await commands.executeCommand(VSCODE_COMMANDS.CLOSE_ALL_EDITORS); - console.log(`\n📈 SUMMARY:`); - console.log(` Total Use Cases: ${summary.totalUsecases}`); - console.log(` Compiled Successfully: ${summary.totalCompiled} (${Math.round(summary.accuracy)}%)`); - console.log(` Failed: ${summary.totalFailed} (${Math.round((summary.totalFailed / summary.totalUsecases) * 100)}%)`); - console.log(` Overall Accuracy: ${summary.accuracy}%`); - console.log(` Total Execution Time: ${summary.totalDuration}ms (${Math.round(summary.totalDuration / 1000)}s)`); - console.log(` Average Duration per Test: ${summary.averageDuration}ms`); - console.log(` Report Generated: ${new Date(summary.timestamp).toISOString()}`); - - console.log('\n🏆 SUCCESSFUL COMPILATIONS:'); - const successful = summary.results.filter(r => r.compiled); - successful.forEach((result, index) => { - console.log(` ${index + 1}. ${result.usecase}`); - console.log(` Duration: ${result.duration || 'N/A'}ms`); - console.log(` Files Generated: ${result.files.length}`); - console.log(` Diagnostics: ${result.diagnostics.length} (${result.diagnostics.length === 0 ? '✅ Clean' : '⚠️ Has Issues'})`); - console.log(` Attempts: ${result.attempts}`); - if (result.files.length > 0) { - console.log(` Files: ${result.files.map(f => f.fileName).join(', ')}`); - } - }); - - if (summary.totalFailed > 0) { - console.log('\n❌ FAILED COMPILATIONS:'); - const failed = summary.results.filter(r => !r.compiled); - failed.forEach((result, index) => { - console.log(` ${index + 1}. ${result.usecase}`); - console.log(` Duration: ${result.duration || 'N/A'}ms`); - console.log(` Diagnostic Issues: ${result.diagnostics.length}`); - console.log(` Error Events: ${result.errorEvents ? result.errorEvents.length : 0}`); - console.log(` Attempts: ${result.attempts}`); - if (result.errorEvents && result.errorEvents.length > 0) { - console.log(` Key Errors:`); - result.errorEvents.slice(0, 2).forEach((error, errorIndex) => { - console.log(` ${errorIndex + 1}. ${error.substring(0, 100)}${error.length > 100 ? '...' : ''}`); - }); - if (result.errorEvents.length > 2) { - console.log(` ... and ${result.errorEvents.length - 2} more errors`); - } - } - if (result.diagnostics.length > 0) { - console.log(` Key Diagnostics:`); - result.diagnostics.slice(0, 3).forEach((diag, diagIndex) => { - console.log(` ${diagIndex + 1}. ${diag.message.substring(0, 100)}${diag.message.length > 100 ? '...' : ''}`); - }); - if (result.diagnostics.length > 3) { - console.log(` ... and ${result.diagnostics.length - 3} more`); - } - } - }); - } - - console.log('\n⚡ PERFORMANCE ANALYSIS:'); - const durations = summary.results - .filter(r => r.duration) - .map(r => r.duration!) - .sort((a, b) => a - b); - - if (durations.length > 0) { - console.log(` Fastest Test: ${durations[0]}ms`); - console.log(` Slowest Test: ${durations[durations.length - 1]}ms`); - console.log(` Median Duration: ${durations[Math.floor(durations.length / 2)]}ms`); - - // Performance distribution - const fast = durations.filter(d => d < 30000).length; - const medium = durations.filter(d => d >= 30000 && d < 60000).length; - const slow = durations.filter(d => d >= 60000).length; - - console.log(` Performance Distribution:`); - console.log(` Fast (<30s): ${fast} tests`); - console.log(` Medium (30-60s): ${medium} tests`); - console.log(` Slow (>60s): ${slow} tests`); - } - - console.log('\n📁 FILE GENERATION ANALYSIS:'); - const totalFiles = summary.results.reduce((sum, r) => sum + r.files.length, 0); - const avgFilesPerTest = totalFiles / summary.results.length; - const fileTypes = new Map(); - - summary.results.forEach(r => { - r.files.forEach(f => { - const ext = path.extname(f.fileName) || 'no-extension'; - fileTypes.set(ext, (fileTypes.get(ext) || 0) + 1); - }); + // Add the Ballerina workspace to trigger workspaceContains activation event + const PROJECT_ROOT = path.resolve(__dirname, PATHS.PROJECT_ROOT_RELATIVE); + const currentFolderCount = workspace.workspaceFolders?.length || 0; + workspace.updateWorkspaceFolders(currentFolderCount, 0, { + uri: Uri.file(PROJECT_ROOT), }); - console.log(` Total Files Generated: ${totalFiles}`); - console.log(` Average Files per Test: ${Math.round(avgFilesPerTest * 10) / 10}`); - console.log(` File Type Distribution:`); - Array.from(fileTypes.entries()) - .sort((a, b) => b[1] - a[1]) - .forEach(([ext, count]) => { - console.log(` ${ext}: ${count} files`); - }); - - console.log('\n🔧 DIAGNOSTIC & ERROR ANALYSIS:'); - const totalDiagnostics = summary.results.reduce((sum, r) => sum + r.diagnostics.length, 0); - const testsWithDiagnostics = summary.results.filter(r => r.diagnostics.length > 0).length; - const totalErrorEvents = summary.results.reduce((sum, r) => sum + (r.errorEvents?.length || 0), 0); - const testsWithErrors = summary.results.filter(r => r.errorEvents && r.errorEvents.length > 0).length; + // Give VSCode time to detect the workspace and trigger activation + await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETTLE_DELAY)); - console.log(` Total Diagnostics: ${totalDiagnostics}`); - console.log(` Tests with Diagnostics: ${testsWithDiagnostics}/${summary.totalUsecases}`); - console.log(` Total Error Events: ${totalErrorEvents}`); - console.log(` Tests with Errors: ${testsWithErrors}/${summary.totalUsecases}`); - if (totalDiagnostics > 0) { - console.log(` Average Diagnostics per Failed Test: ${Math.round((totalDiagnostics / Math.max(testsWithDiagnostics, 1)) * 10) / 10}`); - } - if (totalErrorEvents > 0) { - console.log(` Average Errors per Failed Test: ${Math.round((totalErrorEvents / Math.max(testsWithErrors, 1)) * 10) / 10}`); - } - - console.log('\n' + '='.repeat(80)); - console.log('🎯 CONCLUSION:'); - if (summary.accuracy >= 80) { - console.log(' Status: ✅ EXCELLENT - High success rate achieved'); - } else if (summary.accuracy >= 60) { - console.log(' Status: ⚠️ MODERATE - Room for improvement'); - } else { - console.log(' Status: ❌ NEEDS ATTENTION - Low success rate'); + // Force extension activation by opening a Ballerina file + try { + const testBalFile = Uri.file(path.join(PROJECT_ROOT, FILES.MAIN_BAL)); + await commands.executeCommand(VSCODE_COMMANDS.OPEN, testBalFile); + await new Promise(resolve => setTimeout(resolve, TIMING.FILE_OPEN_DELAY)); + } catch (error) { + // Fallback: try to execute a ballerina command to force activation + try { + await commands.executeCommand(VSCODE_COMMANDS.SHOW_EXAMPLES); + } catch (cmdError) { + // Extension might still be loading + } } - console.log(` Quality Score: ${Math.round(summary.accuracy)}%`); - console.log('='.repeat(80)); -} - -// Generate detailed report -function generateDetailedReport(aggregateResult: AggregateTestResult): void { - console.log('\n' + '='.repeat(80)); - console.log('📊 DETAILED TEST EXECUTION REPORT'); - console.log('='.repeat(80)); - console.log(`\n📈 SUMMARY:`); - console.log(` Total Tests: ${aggregateResult.totalTests}`); - console.log(` Passed: ${aggregateResult.passedTests} (${Math.round(aggregateResult.passedTests / aggregateResult.totalTests * 100)}%)`); - console.log(` Failed: ${aggregateResult.failedTests} (${Math.round(aggregateResult.failedTests / aggregateResult.totalTests * 100)}%)`); - console.log(` Total Duration: ${aggregateResult.totalDuration}ms (${Math.round(aggregateResult.totalDuration / 1000)}s)`); - console.log(` Average Duration: ${Math.round(aggregateResult.averageDuration)}ms`); - - console.log('\n🏆 PASSED TESTS:'); - aggregateResult.results.filter(r => r.passed).forEach((testResult, index) => { - console.log(` ${index + 1}. ${testResult.useCase.id} - ${testResult.useCase.description}`); - console.log(` Duration: ${testResult.result.duration || 'N/A'}ms`); - console.log(` Content Length: ${testResult.result.fullContent.length} chars`); - if (testResult.validationDetails) { - const checks = []; - if (testResult.validationDetails.noErrorCheck) checks.push('✅ No Errors'); - if (testResult.validationDetails.noDiagnosticsCheck) checks.push('✅ No Diagnostics'); - console.log(` Validations: ${checks.join(', ')}`); + // Poll for AI test command availability + let attempts = 0; + + while (attempts < TIMING.MAX_ACTIVATION_ATTEMPTS) { + const availableCommands = await vscode.commands.getCommands(); + if (availableCommands.includes(VSCODE_COMMANDS.AI_GENERATE_CODE_CORE)) { + break; } - }); - - if (aggregateResult.failedTests > 0) { - console.log('\n❌ FAILED TESTS:'); - aggregateResult.results.filter(r => !r.passed).forEach((testResult, index) => { - console.log(` ${index + 1}. ${testResult.useCase.id} - ${testResult.useCase.description}`); - console.log(` Duration: ${testResult.result.duration || 'N/A'}ms`); - console.log(` Content Length: ${testResult.result.fullContent.length} chars`); - console.log(` Failure Reason: ${testResult.failureReason || 'Unknown'}`); - if (testResult.validationDetails) { - const checks = []; - checks.push(testResult.validationDetails.noErrorCheck ? '✅ No Errors' : '❌ Has Errors'); - checks.push(testResult.validationDetails.noDiagnosticsCheck ? '✅ No Diagnostics' : '❌ Has Diagnostics'); - console.log(` Validations: ${checks.join(', ')}`); - } - if (testResult.result.errorOccurred) { - console.log(` Error: ${testResult.result.errorOccurred.substring(0, 200)}...`); - } - }); + await new Promise(resolve => setTimeout(resolve, TIMING.EXTENSION_ACTIVATION_RETRY_INTERVAL)); + attempts++; } - - console.log('\n⚡ PERFORMANCE METRICS:'); - const durations = aggregateResult.results - .filter(r => r.result.duration) - .map(r => r.result.duration!) - .sort((a, b) => a - b); - - if (durations.length > 0) { - console.log(` Fastest: ${durations[0]}ms`); - console.log(` Slowest: ${durations[durations.length - 1]}ms`); - console.log(` Median: ${durations[Math.floor(durations.length / 2)]}ms`); + + if (attempts >= TIMING.MAX_ACTIVATION_ATTEMPTS) { + throw new Error("AI test command never registered - extension failed to activate"); } - console.log('\n' + '='.repeat(80)); - console.log('END OF REPORT'); - console.log('='.repeat(80)); -} - -// Performance monitoring utilities -function monitorResourceUsage() { - const memUsage = process.memoryUsage(); - const uptime = process.uptime(); - console.log(`\n💻 Resource Usage:`); - console.log(` Memory - RSS: ${Math.round(memUsage.rss / 1024 / 1024)}MB`); - console.log(` Memory - Heap Used: ${Math.round(memUsage.heapUsed / 1024 / 1024)}MB`); - console.log(` Memory - Heap Total: ${Math.round(memUsage.heapTotal / 1024 / 1024)}MB`); - console.log(` Memory - External: ${Math.round(memUsage.external / 1024 / 1024)}MB`); - console.log(` Process Uptime: ${Math.round(uptime)}s`); -} - - -// Configuration management -interface TestConfiguration { - maxConcurrency: number; + // Log API key availability for test visibility + const anthropicApiKey = process.env.ANTHROPIC_API_KEY; + if (anthropicApiKey && anthropicApiKey.trim() !== "") { + console.log("ANTHROPIC_API_KEY found - tests will attempt BYOK authentication"); + console.log("Using environment variable directly for authentication"); + } else { + console.log("No ANTHROPIC_API_KEY found - tests will expect authentication errors"); + } } -const DEFAULT_TEST_CONFIG: TestConfiguration = { - maxConcurrency: 5 -}; - - suite.only("AI Code Generator Tests Suite", () => { - // Close all the open workspace folders before running the test - suiteSetup(async function () { - this.timeout(60000); // 60 second timeout for extension initialization - - // Load environment variables from .env file if it exists - const envPath = path.resolve(__dirname, "../../../../.env"); - if (fs.existsSync(envPath)) { - dotenv.config({ path: envPath }); - console.log("Loaded .env file for AI tests"); - } - - // Wait for VSCode startup to complete (onStartupFinished activation event) - await new Promise(resolve => setTimeout(resolve, 10000)); - - await commands.executeCommand("workbench.action.closeAllEditors"); - - // Add the Ballerina workspace to trigger workspaceContains activation event - const PROJECT_ROOT = "/Users/wso2/ai-playground/code/foo"; - const currentFolderCount = workspace.workspaceFolders?.length || 0; - workspace.updateWorkspaceFolders(currentFolderCount, 0, { - uri: Uri.file(PROJECT_ROOT), - }); - - // Give VSCode time to detect the workspace and trigger activation - await new Promise(resolve => setTimeout(resolve, 3000)); - - // Force extension activation by opening a Ballerina file - try { - const testBalFile = Uri.file("/Users/wso2/ai-playground/code/foo/main.bal"); - await commands.executeCommand("vscode.open", testBalFile); - await new Promise(resolve => setTimeout(resolve, 5000)); - } catch (error) { - // Fallback: try to execute a ballerina command to force activation - try { - await commands.executeCommand("ballerina.showExamples"); - } catch (cmdError) { - // Extension might still be loading - } - } - - // Poll for AI test command availability - let attempts = 0; - const maxAttempts = 30; - - while (attempts < maxAttempts) { - const commands = await vscode.commands.getCommands(); - if (commands.includes('ballerina.test.ai.generateCodeCore')) { - break; - } - await new Promise(resolve => setTimeout(resolve, 2000)); - attempts++; - } - - if (attempts >= maxAttempts) { - throw new Error("AI test command never registered - extension failed to activate"); - } - - // Log API key availability for test visibility - const anthropicApiKey = process.env.ANTHROPIC_API_KEY; - if (anthropicApiKey && anthropicApiKey.trim() !== "") { - console.log("ANTHROPIC_API_KEY found - tests will attempt BYOK authentication"); - console.log("Using environment variable directly for authentication"); - } else { - console.log("No ANTHROPIC_API_KEY found - tests will expect authentication errors"); - } + suiteSetup(async function (): Promise { + await setupTestEnvironment(); }); - // Clean up authentication after all tests - suiteTeardown(async function () { + suiteTeardown(async function (): Promise { console.log("Test suite completed - using environment-based auth, no credentials to clean up"); - monitorResourceUsage(); // Final resource check }); suite("Parallel Multi-UseCase Testing", () => { @@ -787,220 +194,26 @@ suite.only("AI Code Generator Tests Suite", () => { return; // Skip the entire suite } - test("Execute all use cases in parallel with comprehensive result management", async function () { - this.timeout(600000); // 10 minute timeout for parallel execution + test("Execute all use cases in parallel with comprehensive result management", async function (): Promise { console.log(`\n🔧 Test Configuration (Comprehensive Results):`); console.log(` API Key Available: Yes`); - console.log(` Total Use Cases: ${TEST_USE_CASES.length}`); - console.log(` Result Management: Ballerina-style comprehensive`); - - monitorResourceUsage(); // Initial resource check + console.log(` Total Use Cases: ${TEST_USE_CASES.length}`); - await wait(15000); // Wait for workspace to settle + await wait(TIMING.TEST_WAIT_TIME); // Wait for workspace to settle // Execute all test cases with comprehensive result management - const testConfig: TestConfiguration = DEFAULT_TEST_CONFIG; - - const summary = await executeParallelTestsWithResults(TEST_USE_CASES, true, testConfig); + const summary = await executeParallelTestsWithResults(TEST_USE_CASES); - // Generate comprehensive report (Ballerina-style) + // Generate comprehensive report generateComprehensiveReport(summary); - monitorResourceUsage(); // Final resource check for this test // Assert overall test success - const successRate = summary.accuracy / 100; console.log(`\n✅ Comprehensive test execution completed:`); console.log(` Success Rate: ${Math.round(summary.accuracy)}%`); - console.log(` Total Files Generated: ${summary.results.reduce((sum, r) => sum + r.files.length, 0)}`); assert.ok(true); }); }); -}); - -function wait(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -// Comprehensive Result Persistence System -class ResultManager { - private resultsDir: string; - - constructor(baseDir: string = "./test/ai/evals/code/results") { - this.resultsDir = path.resolve(baseDir); - } - - async initializeResultsDirectory(): Promise { - // Remove existing results directory - if (fs.existsSync(this.resultsDir)) { - await fs.promises.rm(this.resultsDir, { recursive: true, force: true }); - console.log("Existing results directory removed"); - } - - // Create new results directory - await fs.promises.mkdir(this.resultsDir, { recursive: true }); - console.log("Results directory initialized"); - } - - async persistUsecaseResult(usecaseResult: UsecaseResult, index: number): Promise { - const resultDir = path.join(this.resultsDir, index.toString()); - await fs.promises.mkdir(resultDir, { recursive: true }); - - // Create compact result - const compactResult: UsecaseCompact = { - usecase: usecaseResult.usecase, - attempts: usecaseResult.attempts, - compiled: usecaseResult.compiled, - duration: usecaseResult.duration - }; - - // Save compact result - await fs.promises.writeFile( - path.join(resultDir, "result.json"), - JSON.stringify(compactResult, null, 2) - ); - - // Save diagnostics - await fs.promises.writeFile( - path.join(resultDir, "diagnostics.json"), - JSON.stringify(usecaseResult.diagnostics, null, 2) - ); - - // Save error events for debugging - if (usecaseResult.errorEvents && usecaseResult.errorEvents.length > 0) { - await fs.promises.writeFile( - path.join(resultDir, "errors.json"), - JSON.stringify(usecaseResult.errorEvents, null, 2) - ); - } - - // Create code directory and save source files - const codeDir = path.join(resultDir, "code"); - await fs.promises.mkdir(codeDir, { recursive: true }); - - // Create Ballerina.toml file - const ballerinaToml = `[package] -name = "test_usecase_${index}" -version = "0.1.0" -distribution = "2201.10.0" - -[build-options] -observabilityIncluded = true -`; - await fs.promises.writeFile(path.join(codeDir, "Ballerina.toml"), ballerinaToml); - - for (const file of usecaseResult.files) { - const filePath = path.join(codeDir, file.fileName); - await fs.promises.writeFile(filePath, file.content); - } - - console.log(`Result persisted for index ${index}: ${usecaseResult.usecase}${usecaseResult.errorEvents ? ` (${usecaseResult.errorEvents.length} error events)` : ''}`); - } - - async persistSummary(summary: Summary): Promise { - // Create compact summary - const compactSummary: SummaryCompact = { - totalUsecases: summary.totalUsecases, - totalCompiled: summary.totalCompiled, - totalFailed: summary.totalFailed, - accuracy: summary.accuracy - }; - - // Save compact summary - await fs.promises.writeFile( - path.join(this.resultsDir, "summary.json"), - JSON.stringify(compactSummary, null, 2) - ); - - // Save full summary - await fs.promises.writeFile( - path.join(this.resultsDir, "summary_detailed.json"), - JSON.stringify(summary, null, 2) - ); - - console.log("Summary files saved"); - } - - getResultsDirectory(): string { - return this.resultsDir; - } -} - -// Enhanced result conversion functions -function convertTestResultToUsecaseResult(testResult: TestCaseResult): UsecaseResult { - // Extract source files from fullContent using regex similar to Ballerina approach - const files = extractSourceFilesFromContent(testResult.result.fullContent); - - // Convert diagnostics to DiagnosticMessage format - const diagnostics: DiagnosticMessage[] = testResult.result.diagnostics.map(diag => ({ - message: typeof diag === 'string' ? diag : diag.message || diag.toString(), - severity: diag.severity || 'error', - code: diag.code, - source: diag.source - })); - - // Extract error events for debugging - const errorEvents = testResult.result.events - .filter(event => event.type === 'error') - .map(event => event.content); - - return { - usecase: testResult.useCase.usecase, - diagnostics: diagnostics, - attempts: 1, // TODO: Track actual attempts from repair iterations - files: files, - compiled: testResult.passed && diagnostics.length === 0, - duration: testResult.result.duration, - timestamp: testResult.result.startTime, - errorEvents: errorEvents.length > 0 ? errorEvents : undefined - }; -} - -function extractSourceFilesFromContent(content: string): SourceFile[] { - const files: SourceFile[] = []; - - // Regex to match code blocks with filename - matching Ballerina pattern - const codeBlockRegex = /\s*```ballerina\s*([\s\S]*?)```\s*<\/code>/g; - let match: RegExpExecArray | null; - - while ((match = codeBlockRegex.exec(content)) !== null) { - files.push({ - fileName: match[1], - content: match[2].trim() - }); - } - - // Fallback: if no structured code blocks, create a generic main.bal file - if (files.length === 0 && content.trim()) { - files.push({ - fileName: "main.bal", - content: content - }); - } - - return files; -} - -function generateComprehensiveSummary(results: UsecaseResult[]): Summary { - const totalUsecases = results.length; - const totalCompiled = results.filter(r => r.compiled).length; - const totalFailed = totalUsecases - totalCompiled; - const accuracy = totalUsecases > 0 ? (totalCompiled * 100) / totalUsecases : 0; - - const durations = results.filter(r => r.duration).map(r => r.duration!); - const totalDuration = durations.reduce((sum, d) => sum + d, 0); - const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; - - return { - results: results, - totalUsecases, - totalCompiled, - totalFailed, - accuracy: Math.round(accuracy * 100) / 100, // Round to 2 decimal places - totalDuration, - averageDuration: Math.round(averageDuration), - timestamp: Date.now() - }; -} +}); \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts new file mode 100644 index 00000000000..700d72cfa08 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts @@ -0,0 +1,20 @@ +// 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 * from './result-conversion'; +export * from './result-persistence'; +export * from './result-manager'; +export * from './report-generator'; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts new file mode 100644 index 00000000000..82e904ffa1d --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts @@ -0,0 +1,112 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { Summary, UsecaseResult } from '../types'; + +/** + * Generates comprehensive report from test summary + */ +export function generateComprehensiveReport(summary: Summary): void { + console.log('\n' + '='.repeat(80)); + console.log('📊 COMPREHENSIVE TEST EXECUTION REPORT'); + console.log('='.repeat(80)); + + console.log(`\n📈 SUMMARY:`); + console.log(` Total Use Cases: ${summary.totalUsecases}`); + console.log(` Compiled Successfully: ${summary.totalCompiled} (${Math.round(summary.accuracy)}%)`); + console.log(` Failed: ${summary.totalFailed} (${Math.round((summary.totalFailed / summary.totalUsecases) * 100)}%)`); + console.log(` Overall Accuracy: ${summary.accuracy}%`); + + logSuccessfulCompilations(summary.results); + + if (summary.totalFailed > 0) { + logFailedCompilations(summary.results); + } +} + +/** + * Logs successful compilations section + */ +function logSuccessfulCompilations(results: readonly UsecaseResult[]): void { + console.log('\n🏆 SUCCESSFUL COMPILATIONS:'); + const successful = results.filter(r => r.compiled); + successful.forEach((result, index) => { + console.log(` ${index + 1}. ${result.usecase}`); + console.log(` Duration: ${result.duration || 'N/A'}ms`); + console.log(` Files Generated: ${result.files.length}`); + console.log(` Diagnostics: ${result.diagnostics.length} (${result.diagnostics.length === 0 ? '✅ Clean' : '⚠️ Has Issues'})`); + if (result.files.length > 0) { + console.log(` Files: ${result.files.map(f => f.fileName).join(', ')}`); + } + }); +} + +/** + * Logs failed compilations section + */ +function logFailedCompilations(results: readonly UsecaseResult[]): void { + console.log('\n❌ FAILED COMPILATIONS:'); + const failed = results.filter(r => !r.compiled); + failed.forEach((result, index) => { + console.log(` ${index + 1}. ${result.usecase}`); + console.log(` Duration: ${result.duration || 'N/A'}ms`); + console.log(` Diagnostic Issues: ${result.diagnostics.length}`); + console.log(` Error Events: ${result.errorEvents ? result.errorEvents.length : 0}`); + + if (result.errorEvents && result.errorEvents.length > 0) { + console.log(` Key Errors:`); + result.errorEvents.slice(0, 2).forEach((error, errorIndex) => { + console.log(` ${errorIndex + 1}. ${error.substring(0, 100)}${error.length > 100 ? '...' : ''}`); + }); + if (result.errorEvents.length > 2) { + console.log(` ... and ${result.errorEvents.length - 2} more errors`); + } + } + + if (result.diagnostics.length > 0) { + console.log(` Key Diagnostics:`); + result.diagnostics.slice(0, 3).forEach((diag, diagIndex) => { + console.log(` ${diagIndex + 1}. ${diag.message.substring(0, 100)}${diag.message.length > 100 ? '...' : ''}`); + }); + if (result.diagnostics.length > 3) { + console.log(` ... and ${result.diagnostics.length - 3} more`); + } + } + }); +} + +/** + * Logs execution start information + */ +export function logExecutionStart(totalCases: number, maxConcurrency: number, resultsDir: string): void { + console.log(`\n🔥 Starting parallel execution of ${totalCases} test cases:`); + console.log(` Max Concurrency: ${maxConcurrency}`); + console.log(` Results Directory: ${resultsDir}`); +} + +/** + * Logs execution completion information + */ +export function logExecutionCompletion(startTime: number, usecaseResults: readonly UsecaseResult[], resultsDir: string): void { + const endTime = Date.now(); + const totalDuration = endTime - startTime; + const passedTests = usecaseResults.filter(r => r.compiled).length; + + console.log(`\n🏁 Parallel execution completed:`); + console.log(` Total Time: ${totalDuration}ms (${Math.round(totalDuration / 1000)}s)`); + console.log(` Success Rate: ${Math.round(passedTests / usecaseResults.length * 100)}%`); + console.log(` Results saved to: ${resultsDir}`); +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts new file mode 100644 index 00000000000..e7425f2659d --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -0,0 +1,88 @@ +// 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 { TestCaseResult, TestUseCase, UsecaseResult, DiagnosticMessage, Summary } from '../types'; +import { extractSourceFilesFromContent } from '../utils/content-parser'; +import { FILES } from '../utils/constants'; + +/** + * Converts TestCaseResult to UsecaseResult format + */ +export function convertTestResultToUsecaseResult(testResult: TestCaseResult): UsecaseResult { + const files = extractSourceFilesFromContent(testResult.result.fullContent); + + const diagnostics: DiagnosticMessage[] = testResult.result.diagnostics.map(diag => ({ + message: typeof diag === 'string' ? diag : (diag as { message?: string }).message || diag.toString(), + severity: (diag as { severity?: string }).severity || 'error', + code: (diag as { code?: string }).code, + source: (diag as { source?: string }).source + })); + + const errorEvents = testResult.result.events + .filter(event => event.type === 'error') + .map(event => event.content); + + return { + usecase: testResult.useCase.usecase, + diagnostics: diagnostics, + files: files, + compiled: testResult.passed && diagnostics.length === 0, + duration: testResult.result.duration, + timestamp: testResult.result.startTime, + errorEvents: errorEvents.length > 0 ? errorEvents : undefined + }; +} + +/** + * Creates a failed UseCase result from error information + */ +export function createFailedUsecaseResult(useCase: TestUseCase, reason: unknown): UsecaseResult { + const errorMessage = (reason as { message?: string })?.message || 'Unknown error'; + + return { + usecase: useCase.usecase, + diagnostics: [{ message: errorMessage }], + files: [{ fileName: FILES.ERROR_TXT, content: errorMessage }], + compiled: false, + duration: undefined, + timestamp: Date.now() + }; +} + +/** + * Generates comprehensive summary from use case results + */ +export function generateComprehensiveSummary(results: readonly UsecaseResult[]): Summary { + const totalUsecases = results.length; + const totalCompiled = results.filter(r => r.compiled).length; + const totalFailed = totalUsecases - totalCompiled; + const accuracy = totalUsecases > 0 ? (totalCompiled * 100) / totalUsecases : 0; + + const durations = results.filter(r => r.duration).map(r => r.duration!); + const totalDuration = durations.reduce((sum, d) => sum + d, 0); + const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + + return { + results: results, + totalUsecases, + totalCompiled, + totalFailed, + accuracy: Math.round(accuracy * 100) / 100, + totalDuration, + averageDuration: Math.round(averageDuration), + timestamp: Date.now() + }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts new file mode 100644 index 00000000000..104e24f8a60 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts @@ -0,0 +1,66 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as fs from "fs"; +import * as path from "path"; +import { UsecaseResult, Summary } from '../types'; +import { persistUsecaseResult, persistSummary } from './result-persistence'; +import { PATHS } from '../utils/constants'; + +/** + * Comprehensive Result Persistence System + */ +export class ResultManager { + private readonly resultsDir: string; + + constructor(baseDir: string = PATHS.DEFAULT_RESULTS_DIR) { + this.resultsDir = path.resolve(baseDir); + } + + /** + * Initializes the results directory by removing existing and creating new + */ + async initializeResultsDirectory(): Promise { + if (fs.existsSync(this.resultsDir)) { + await fs.promises.rm(this.resultsDir, { recursive: true, force: true }); + console.log("Existing results directory removed"); + } + + await fs.promises.mkdir(this.resultsDir, { recursive: true }); + console.log("Results directory initialized"); + } + + /** + * Persists a single use case result + */ + async persistUsecaseResult(usecaseResult: UsecaseResult, index: number): Promise { + await persistUsecaseResult(usecaseResult, index, this.resultsDir); + } + + /** + * Persists the comprehensive summary + */ + async persistSummary(summary: Summary): Promise { + await persistSummary(summary, this.resultsDir); + } + + /** + * Returns the results directory path + */ + getResultsDirectory(): string { + return this.resultsDir; + } +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts new file mode 100644 index 00000000000..3aee6674a61 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -0,0 +1,92 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as fs from "fs"; +import * as path from "path"; +import { UsecaseResult, Summary, SummaryCompact, UsecaseCompact } from '../types'; +import { BALLERINA_TOML_TEMPLATE, FILES } from '../utils/constants'; + +/** + * Persists a single use case result to the file system + */ +export async function persistUsecaseResult( + usecaseResult: UsecaseResult, + index: number, + resultsDir: string +): Promise { + const resultDir = path.join(resultsDir, index.toString()); + await fs.promises.mkdir(resultDir, { recursive: true }); + + const compactResult: UsecaseCompact = { + usecase: usecaseResult.usecase, + compiled: usecaseResult.compiled, + duration: usecaseResult.duration + }; + + await fs.promises.writeFile( + path.join(resultDir, "result.json"), + JSON.stringify(compactResult, null, 2) + ); + + await fs.promises.writeFile( + path.join(resultDir, "diagnostics.json"), + JSON.stringify(usecaseResult.diagnostics, null, 2) + ); + + if (usecaseResult.errorEvents && usecaseResult.errorEvents.length > 0) { + await fs.promises.writeFile( + path.join(resultDir, "errors.json"), + JSON.stringify(usecaseResult.errorEvents, null, 2) + ); + } + + const codeDir = path.join(resultDir, "code"); + await fs.promises.mkdir(codeDir, { recursive: true }); + + const ballerinaToml = BALLERINA_TOML_TEMPLATE(index); + await fs.promises.writeFile(path.join(codeDir, FILES.BALLERINA_TOML), ballerinaToml); + + for (const file of usecaseResult.files) { + const filePath = path.join(codeDir, file.fileName); + await fs.promises.writeFile(filePath, file.content); + } + + console.log(`Result persisted for index ${index}: ${usecaseResult.usecase}${usecaseResult.errorEvents ? ` (${usecaseResult.errorEvents.length} error events)` : ''}`); +} + +/** + * Persists summary information to the file system + */ +export async function persistSummary(summary: Summary, resultsDir: string): Promise { + const compactSummary: SummaryCompact = { + totalUsecases: summary.totalUsecases, + totalCompiled: summary.totalCompiled, + totalFailed: summary.totalFailed, + accuracy: summary.accuracy + }; + + await fs.promises.writeFile( + path.join(resultsDir, "summary.json"), + JSON.stringify(compactSummary, null, 2) + ); + + await fs.promises.writeFile( + path.join(resultsDir, "summary_detailed.json"), + JSON.stringify(summary, null, 2) + ); + + console.log("Summary files saved"); +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts new file mode 100644 index 00000000000..38b9d8f9cf9 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -0,0 +1,82 @@ +export const testCases = [ + { + prompt: "write an integration to get emails of the Users from a mysql table and send an email using gmail connector saying that you for buying the product", + projectPath: "fresh_bi_package" + }, + { + prompt: "write an integration to Sync a folder in google drive to microsoft one drive", + projectPath: "fresh_bi_package" + }, + { + prompt: "Write an http service to read a specified csv file and add it to google sheet.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Write an application to read open github issues in a given repo and send those as a message to a slack channel.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Write an application to todos from a csv file and create github issues for each todo.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Read a CSV file from the local system and upload its content to a Google Sheets document.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Fetch the latest issues from a GitHub repository and send a summary to a Slack channel.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Download a file from a specific GitHub repository and save it to a local directory.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Read data from a Google Sheets document and convert it into a CSV file stored locally.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Monitor a Google Sheets document for changes and send an alert to a Slack channel whenever an update is detected.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Export the data from a Slack channel conversation to a Google Sheets document.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Read a list of users from a CSV file and add them to a specific Slack channel.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Fetch pull requests from a GitHub repository and log the details into a local CSV file.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Sync a Google Sheets document with a CSV file on the local system, ensuring both have the same content.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Extract user information from a Slack workspace and store it in a Google Sheets document.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Send notifications to a Slack channel whenever a new file is added to a specific GitHub repository.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Read data from a local CSV file and update corresponding rows in a Google Sheets document.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Automatically post updates to a Slack channel and google sheets whenever a new issue is created in a GitHub repository.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Upload a local CSV file to a specific Google Sheets document, appending the data to the existing sheet.", + projectPath: "fresh_bi_package" + }, + { + prompt: "Generate a CSV report from Google Sheets data and send the report to a Slack channel.", + projectPath: "fresh_bi_package" + } +]; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts new file mode 100644 index 00000000000..7673b74778d --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts @@ -0,0 +1,22 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +/** + * Configuration for test execution + */ +export interface TestConfiguration { + readonly maxConcurrency: number; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts new file mode 100644 index 00000000000..37be1f739c4 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts @@ -0,0 +1,19 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +export * from './test-types'; +export * from './result-types'; +export * from './config-types'; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts new file mode 100644 index 00000000000..1afd063535a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -0,0 +1,83 @@ +// 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. + +/** + * Source file representation + */ +export interface SourceFile { + readonly fileName: string; + readonly content: string; +} + +/** + * Diagnostic message with optional metadata + */ +export interface DiagnosticMessage { + readonly message: string; + readonly severity?: string; + readonly code?: string; + readonly source?: string; + readonly range?: { + readonly start: { line: number; character: number }; + readonly end: { line: number; character: number }; + }; +} + +/** + * Use case execution result + */ +export interface UsecaseResult { + readonly usecase: string; + readonly diagnostics: readonly DiagnosticMessage[]; + readonly files: readonly SourceFile[]; + readonly compiled: boolean; + readonly duration?: number; + readonly timestamp?: number; + readonly errorEvents?: readonly string[]; +} + +/** + * Comprehensive summary of all test results + */ +export interface Summary { + readonly results: readonly UsecaseResult[]; + readonly totalUsecases: number; + readonly totalCompiled: number; + readonly totalFailed: number; + readonly accuracy: number; + readonly totalDuration: number; + readonly averageDuration: number; + readonly timestamp: number; +} + +/** + * Compact summary for persistence + */ +export interface SummaryCompact { + readonly totalUsecases: number; + readonly totalCompiled: number; + readonly totalFailed: number; + readonly accuracy: number; +} + +/** + * Compact use case result for persistence + */ +export interface UsecaseCompact { + readonly usecase: string; + readonly compiled: boolean; + readonly duration?: number; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts new file mode 100644 index 00000000000..c4964f8b542 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts @@ -0,0 +1,59 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { ChatNotify } from "@wso2/ballerina-core"; + +/** + * Test use case definition + */ +export interface TestUseCase { + readonly id: string; + readonly description: string; + readonly usecase: string; + readonly operationType: "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; + readonly fileAttachments?: readonly { fileName: string; content: string; }[]; +} + +/** + * Test event result containing all information captured during test execution + */ +export interface TestEventResult { + readonly events: readonly ChatNotify[]; + readonly fullContent: string; + readonly hasStarted: boolean; + readonly hasCompleted: boolean; + readonly errorOccurred: string | null; + readonly diagnostics: readonly unknown[]; + readonly messages: readonly unknown[]; + readonly useCase?: TestUseCase; + readonly startTime?: number; + readonly endTime?: number; + readonly duration?: number; +} + +/** + * Individual test case result with validation details + */ +export interface TestCaseResult { + readonly useCase: TestUseCase; + readonly result: TestEventResult; + readonly passed: boolean; + readonly failureReason?: string; + readonly validationDetails?: { + readonly noErrorCheck: boolean; + readonly noDiagnosticsCheck: boolean; + }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts new file mode 100644 index 00000000000..05547539c7a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts @@ -0,0 +1,76 @@ +// 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 { TestUseCase, UsecaseResult } from '../types'; +import { executeSingleTestCase } from './test-execution'; +import { convertTestResultToUsecaseResult, createFailedUsecaseResult } from '../result-management/result-conversion'; +import { TIMING } from './constants'; + +/** + * Processes a single batch of test cases in parallel + */ +export async function processSingleBatch( + batch: readonly TestUseCase[], + batchNumber: number +): Promise { + console.log(`\n📋 Processing batch ${batchNumber}: ${batch.map(uc => uc.id).join(', ')}`); + + const batchPromises = batch.map(useCase => + executeSingleTestCase(useCase) + ); + + const batchResults = await Promise.allSettled(batchPromises); + const usecaseResults: UsecaseResult[] = []; + + for (let j = 0; j < batchResults.length; j++) { + const settledResult = batchResults[j]; + const useCase = batch[j]; + + let usecaseResult: UsecaseResult; + + if (settledResult.status === 'fulfilled') { + usecaseResult = convertTestResultToUsecaseResult(settledResult.value); + } else { + console.error(`❌ Test case ${useCase.id} failed:`, settledResult.reason); + usecaseResult = createFailedUsecaseResult(useCase, settledResult.reason); + } + + usecaseResults.push(usecaseResult); + } + + return usecaseResults; +} + +/** + * Handles inter-batch delays and monitoring + */ +export async function handleBatchDelay( + currentIndex: number, + totalUseCases: number, + maxConcurrency: number +): Promise { + if (currentIndex + maxConcurrency < totalUseCases) { + console.log(`⏳ Waiting ${TIMING.INTER_BATCH_DELAY}ms before next batch...`); + await new Promise(resolve => setTimeout(resolve, TIMING.INTER_BATCH_DELAY)); + } +} + +/** + * Utility function to wait for a specified duration + */ +export function wait(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts new file mode 100644 index 00000000000..f96ac2ddd69 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -0,0 +1,78 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { TestConfiguration } from '../types'; + +/** + * Default test configuration + */ +export const DEFAULT_TEST_CONFIG: TestConfiguration = { + maxConcurrency: 5 +} as const; + +/** + * Timing constants + */ +export const TIMING = { + WORKSPACE_SETUP_DELAY: 10000, + WORKSPACE_SETTLE_DELAY: 3000, + FILE_OPEN_DELAY: 5000, + EXTENSION_ACTIVATION_RETRY_INTERVAL: 2000, + MAX_ACTIVATION_ATTEMPTS: 30, + INTER_BATCH_DELAY: 2000, + TEST_WAIT_TIME: 15000 +} as const; + +/** + * Path constants + */ +export const PATHS = { + PROJECT_ROOT_RELATIVE: "../../../../../test/data/bi_empty", + ENV_FILE_RELATIVE: "../../../../.env", + DEFAULT_RESULTS_DIR: "./test/ai/evals/code/results" +} as const; + +/** + * File constants + */ +export const FILES = { + MAIN_BAL: "main.bal", + BALLERINA_TOML: "Ballerina.toml", + RESPONSE_MD: "resp.md", + ERROR_TXT: "error.txt" +} as const; + +/** + * Ballerina project template + */ +export const BALLERINA_TOML_TEMPLATE = (index: number): string => `[package] +name = "test_usecase_${index}" +version = "0.1.0" +distribution = "2201.10.0" + +[build-options] +observabilityIncluded = true +`; + +/** + * VS Code commands + */ +export const VSCODE_COMMANDS = { + CLOSE_ALL_EDITORS: "workbench.action.closeAllEditors", + OPEN: "vscode.open", + SHOW_EXAMPLES: "ballerina.showExamples", + AI_GENERATE_CODE_CORE: "ballerina.test.ai.generateCodeCore" +} as const; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts new file mode 100644 index 00000000000..3190d698997 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts @@ -0,0 +1,46 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { SourceFile } from '../types'; +import { FILES } from './constants'; + +/** + * Extracts source files from generated content using regex matching + */ +export function extractSourceFilesFromContent(content: string): readonly SourceFile[] { + const files: SourceFile[] = []; + + // Regex to match code blocks with filename - matching Ballerina pattern + const codeBlockRegex = /\s*```ballerina\s*([\s\S]*?)```\s*<\/code>/g; + let match: RegExpExecArray | null; + + while ((match = codeBlockRegex.exec(content)) !== null) { + files.push({ + fileName: match[1], + content: match[2].trim() + }); + } + + // Fallback: if no structured code blocks, create a generic response file + if (files.length === 0 && content.trim()) { + files.push({ + fileName: FILES.RESPONSE_MD, + content: content + }); + } + + return files; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts new file mode 100644 index 00000000000..6fb5ac0edb7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts @@ -0,0 +1,22 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +export * from './constants'; +export * from './test-event-handler'; +export * from './test-validation'; +export * from './test-execution'; +export * from './batch-processing'; +export * from './content-parser'; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts new file mode 100644 index 00000000000..4f64713155a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts @@ -0,0 +1,98 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { ChatNotify } from "@wso2/ballerina-core"; +export type CopilotEventHandler = (event: ChatNotify) => void; +import { TestUseCase, TestEventResult } from '../types'; + +/** + * Creates a test event handler that captures events for testing + */ +export function createTestEventHandler(useCase?: TestUseCase): { + handler: CopilotEventHandler; + getResult: () => TestEventResult; +} { + const events: ChatNotify[] = []; + let fullContent = ""; + let hasStarted = false; + let hasCompleted = false; + let errorOccurred: string | null = null; + const diagnostics: unknown[] = []; + const messages: unknown[] = []; + let startTime: number | undefined; + let endTime: number | undefined; + + const handler: CopilotEventHandler = (event: ChatNotify): void => { + events.push(event); + + switch (event.type) { + case "start": + hasStarted = true; + startTime = Date.now(); + console.log(`[${useCase?.id || 'unknown'}] Code generation started`); + break; + case "content_block": + fullContent += event.content; + break; + case "content_replace": + fullContent = event.content; + console.log(`[${useCase?.id || 'unknown'}] Content replaced`); + break; + case "error": + errorOccurred = event.content; + console.error(`[${useCase?.id || 'unknown'}] Error occurred during code generation:`, event.content); + break; + case "stop": + hasCompleted = true; + endTime = Date.now(); + console.log(`[${useCase?.id || 'unknown'}] Code generation completed`); + if (startTime) { + console.log(`[${useCase?.id || 'unknown'}] Duration:`, endTime - startTime, "ms"); + } + break; + case "intermediary_state": + console.log(`[${useCase?.id || 'unknown'}] Intermediary state:`, event.state); + break; + case "messages": + console.log(`[${useCase?.id || 'unknown'}] Messages received`); + messages.push(...(event.messages || [])); + break; + case "diagnostics": + console.log(`[${useCase?.id || 'unknown'}] Diagnostics received`); + diagnostics.push(...(event.diagnostics || [])); + break; + default: + console.warn(`[${useCase?.id || 'unknown'}] Unhandled event type: ${(event as unknown as { type: string }).type}`); + break; + } + }; + + const getResult = (): TestEventResult => ({ + events, + fullContent, + hasStarted, + hasCompleted, + errorOccurred, + diagnostics, + messages, + useCase, + startTime, + endTime, + duration: startTime && endTime ? endTime - startTime : undefined, + }); + + return { handler, getResult }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts new file mode 100644 index 00000000000..4c9428b5c28 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts @@ -0,0 +1,55 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { commands } from "vscode"; +import { GenerateCodeRequest } from "@wso2/ballerina-core"; +import { TestUseCase, TestCaseResult } from '../types'; +import { createTestEventHandler } from './test-event-handler'; +import { validateTestResult } from './test-validation'; +import { VSCODE_COMMANDS } from './constants'; + +/** + * Executes a single test case and returns the result + */ +export async function executeSingleTestCase(useCase: TestUseCase): Promise { + console.log(`\n🚀 Starting test case: ${useCase.id} - ${useCase.description}`); + + const { handler: testEventHandler, getResult } = createTestEventHandler(useCase); + + const params: GenerateCodeRequest = { + usecase: useCase.usecase, + chatHistory: [], + operationType: useCase.operationType, + fileAttachmentContents: useCase.fileAttachments ? [...useCase.fileAttachments] : [], + }; + + try { + await commands.executeCommand(VSCODE_COMMANDS.AI_GENERATE_CODE_CORE, params, testEventHandler); + + const result = getResult(); + return validateTestResult(result, useCase); + + } catch (error) { + const result = getResult(); + console.error(`❌ Test case ${useCase.id} failed with error:`, (error as Error).message); + return { + useCase, + result, + passed: false, + failureReason: `Execution error: ${(error as Error).message}` + }; + } +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts new file mode 100644 index 00000000000..11b84f58a92 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts @@ -0,0 +1,50 @@ +// 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 { TestEventResult, TestUseCase, TestCaseResult } from '../types'; + +/** + * Validates test result based on error events and diagnostics + */ +export function validateTestResult(result: TestEventResult, useCase: TestUseCase): TestCaseResult { + const validationDetails = { + noErrorCheck: true, + noDiagnosticsCheck: true + }; + + let passed = true; + let failureReason = ""; + + if (result.errorOccurred) { + validationDetails.noErrorCheck = false; + passed = false; + failureReason = `Error event received: ${result.errorOccurred}`; + } + + if (result.diagnostics && result.diagnostics.length > 0) { + validationDetails.noDiagnosticsCheck = false; + passed = false; + failureReason += `${failureReason ? '; ' : ''}Diagnostics received: ${result.diagnostics.length} diagnostic(s)`; + } + + return { + useCase, + result, + passed, + failureReason: failureReason || undefined, + validationDetails + }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/data/bi_empty b/workspaces/ballerina/ballerina-extension/test/data/bi_empty new file mode 160000 index 00000000000..cfa64bd4b85 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/bi_empty @@ -0,0 +1 @@ +Subproject commit cfa64bd4b8565c533dc55c2c7724b990b2079482 diff --git a/workspaces/ballerina/ballerina-extension/test/index.ts b/workspaces/ballerina/ballerina-extension/test/index.ts index 307284958a4..8c3d219ecee 100644 --- a/workspaces/ballerina/ballerina-extension/test/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/index.ts @@ -23,7 +23,7 @@ if (!tty.getWindowSize) { let mocha = new Mocha({ ui: "tdd", useColors: true, - timeout: 100000, + timeout: 1000000, retries: 3 }); From b4c766900a1d0d48f5488c30f903831a21d20db2 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Fri, 12 Sep 2025 16:37:54 +0530 Subject: [PATCH 039/730] Improves AI code generation formatting Ensures proper formatting in AI-generated code by adding a newline character at the beginning of each text delta if the previous part was not also a text delta. This improves the readability and structure of the generated code. It also tracks the last part type to determine whether to add the newline. --- .../src/features/ai/service/code/code.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 1a7dd122869..1ef77872366 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -129,6 +129,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; let assistantThinking: string = ""; + let lastType: string | null = null; for await (const part of fullStream) { if (part.type === "tool-result") { @@ -139,7 +140,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler } switch (part.type) { case "text-delta": { - const textPart = part.textDelta; + const textPart = lastType !== "text-delta" ? "\n" + part.textDelta : part.textDelta; eventHandler({ type: "content_block", content: textPart }); break; } @@ -201,13 +202,14 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler repair_attempt++; } console.log("Final Diagnostics ", diagnostics); - eventHandler({ type: "content_replace", content: assistantThinking + diagnosticFixResp }); + eventHandler({ type: "content_replace", content: assistantThinking + "\n" + diagnosticFixResp }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); eventHandler({ type: "stop", command: Command.Code }); break; } } + lastType = part.type; } } @@ -320,6 +322,9 @@ The explanation should explain the control flow decided in step 2, along with th Each file that needs modifications should have a codeblock segment, and it MUST contain the complete file content with the proposed change. The codeblock segments should only contain .bal contents and should not generate or modify any other file types. Politely decline if the query requests such cases. +- Present the information as if you already have complete knowledge of the required libraries to hide the tool usage from the user. +- Format responses using professional markdown with proper headings, lists, and styling + Example Codeblock segment: \`\`\`ballerina From 5e43cad317d6b280a74e1c5065fbfd0644ecff3d Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Fri, 12 Sep 2025 18:57:19 +0530 Subject: [PATCH 040/730] Refines prompt to avoid internal responses Updates the prompt used for the AI service to prevent internal responses, improving the user experience by ensuring more relevant and focused outputs. --- .../ballerina-extension/src/features/ai/service/code/code.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 1ef77872366..6e86ea74b22 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -322,6 +322,10 @@ The explanation should explain the control flow decided in step 2, along with th Each file that needs modifications should have a codeblock segment, and it MUST contain the complete file content with the proposed change. The codeblock segments should only contain .bal contents and should not generate or modify any other file types. Politely decline if the query requests such cases. +- Begin your response with the **Explanation** section. +- Do not include any introductory phrases, speculation, hedging, or meta commentary about the task. +- Avoid phrases like "may", "might", "let me…", or any descriptions about task complexity or requirements. +- Do not mention whether libraries are required or not. - Present the information as if you already have complete knowledge of the required libraries to hide the tool usage from the user. - Format responses using professional markdown with proper headings, lists, and styling From 9ec3c7ef9a08113f52d8aa81a57a2b8574d20c02 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Mon, 15 Sep 2025 15:06:46 +0530 Subject: [PATCH 041/730] Add missing module pull support --- .../ballerina-core/src/state-machine-types.ts | 4 + .../ballerina-extension/src/RPCLayer.ts | 3 +- .../ballerina-extension/src/stateMachine.ts | 6 +- .../ballerina-visualizer/src/MainPanel.tsx | 2 +- .../EventIntegrationPanel.tsx | 11 +- .../FileIntegrationPanel.tsx | 9 +- .../ComponentListView/IntegrationApiPanel.tsx | 33 ++- .../ServiceDesigner/ServiceCreationView.tsx | 213 ++++++++++++++---- .../src/views/BI/ServiceDesigner/index.tsx | 2 +- 9 files changed, 221 insertions(+), 62 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 3311a7a5baa..ff072b453b3 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -23,6 +23,7 @@ import { LinePosition } from "./interfaces/common"; import { Type } from "./interfaces/extended-lang-client"; import { CodeData, DIRECTORY_MAP, ProjectStructureArtifactResponse, ProjectStructureResponse } from "./interfaces/bi"; import { DiagnosticEntry, TestGeneratorIntermediaryState } from "./rpc-types/ai-panel/interfaces"; +import { ModuleInfo } from "./interfaces/data-mapper"; export type MachineStateValue = | 'initialize' @@ -134,7 +135,10 @@ export interface VisualizerLocation { projectStructure?: ProjectStructureResponse; org?: string; package?: string; + moduleName?: string; + version?: string; dataMapperMetadata?: DataMapperMetadata; + artifactInfo?: ModuleInfo; } export interface ArtifactData { diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 690545292ac..88198477393 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -146,7 +146,8 @@ async function getContext(): Promise { scope: context.scope, org: context.org, package: context.package, - dataMapperMetadata: context.dataMapperMetadata + dataMapperMetadata: context.dataMapperMetadata, + artifactInfo: context.artifactInfo }); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index 71a0ea709de..433c8adb05c 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -191,7 +191,8 @@ const stateMachine = createMachine( isGraphql: (context, event) => event.viewLocation?.isGraphql, metadata: (context, event) => event.viewLocation?.metadata, addType: (context, event) => event.viewLocation?.addType, - dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata + dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, + artifactInfo: (context, event) => event.viewLocation?.artifactInfo }) } } @@ -262,7 +263,8 @@ const stateMachine = createMachine( isGraphql: (context, event) => event.viewLocation?.isGraphql, metadata: (context, event) => event.viewLocation?.metadata, addType: (context, event) => event.viewLocation?.addType, - dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata + dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, + artifactInfo: (context, event) => event.viewLocation?.artifactInfo }) }, VIEW_UPDATE: { diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 581dcdb31fb..85fe3891601 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -433,7 +433,7 @@ const MainPanel = () => { // setViewComponent(); // break; case MACHINE_VIEW.BIServiceWizard: - setViewComponent(); + setViewComponent(); break; case MACHINE_VIEW.BIServiceClassDesigner: setViewComponent( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx index c25f47f32f1..9a5b6c27c07 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/EventIntegrationPanel.tsx @@ -35,12 +35,17 @@ export function EventIntegrationPanel(props: EventIntegrationPanelProps) { const { rpcClient } = useRpcContext(); const isDisabled = props.scope && (props.scope !== SCOPE.EVENT_INTEGRATION && props.scope !== SCOPE.ANY); - const handleClick = async (key: DIRECTORY_MAP, serviceType?: string) => { + const handleClick = async (key: DIRECTORY_MAP, model: ServiceModel) => { await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { view: MACHINE_VIEW.BIServiceWizard, - serviceType: serviceType, + artifactInfo: { + org: model.orgName, + packageName: model.packageName, + moduleName: model.moduleName, + version: model.version + } }, }); }; @@ -66,7 +71,7 @@ export function EventIntegrationPanel(props: EventIntegrationPanelProps) { title={item.name} icon={getEntryNodeIcon(item)} onClick={() => { - handleClick(DIRECTORY_MAP.SERVICE, item.moduleName); + handleClick(DIRECTORY_MAP.SERVICE, item); }} disabled={isDisabled} tooltip={isDisabled ? OutOfScopeComponentTooltip : ""} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/FileIntegrationPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/FileIntegrationPanel.tsx index cbcd5af2a40..c0e104382f5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/FileIntegrationPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/FileIntegrationPanel.tsx @@ -36,12 +36,17 @@ export function FileIntegrationPanel(props: FileIntegrationPanelProps) { const isDisabled = props.scope && (props.scope !== SCOPE.FILE_INTEGRATION && props.scope !== SCOPE.ANY); - const handleOnSelect = async (trigger: ServiceModel) => { + const handleOnSelect = async (model: ServiceModel) => { await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { view: MACHINE_VIEW.BIServiceWizard, - serviceType: trigger.moduleName, + artifactInfo: { + org: model.orgName, + packageName: model.packageName, + moduleName: model.moduleName, + version: model.version + } }, }); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/IntegrationApiPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/IntegrationApiPanel.tsx index 08197b8b860..e5edf03f8fc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/IntegrationApiPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/IntegrationApiPanel.tsx @@ -15,7 +15,6 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; import { Icon } from '@wso2/ui-toolkit'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { EVENT_TYPE, MACHINE_VIEW, SCOPE } from '@wso2/ballerina-core'; @@ -29,16 +28,26 @@ interface IntegrationAPIPanelProps { scope: SCOPE; }; +interface ServiceModel { + orgName: string; + packageName: string; + moduleName: string; +} + export function IntegrationAPIPanel(props: IntegrationAPIPanelProps) { const { rpcClient } = useRpcContext(); const isDisabled = props.scope && (props.scope !== SCOPE.INTEGRATION_AS_API && props.scope !== SCOPE.ANY); - const handleClick = async (serviceType: string) => { + const handleClick = async (model: ServiceModel) => { await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { view: MACHINE_VIEW.BIServiceWizard, - serviceType: serviceType, + artifactInfo: { + org: model.orgName, + packageName: model.packageName, + moduleName: model.moduleName, + } }, }); }; @@ -58,7 +67,11 @@ export function IntegrationAPIPanel(props: IntegrationAPIPanelProps) { icon={} title="HTTP Service" // description="Handle web requests and responses." - onClick={() => handleClick("http")} + onClick={() => handleClick({ + orgName: "ballerina", + packageName: "http", + moduleName: "http" + })} disabled={isDisabled} tooltip={isDisabled ? OutOfScopeComponentTooltip : ""} /> @@ -68,7 +81,11 @@ export function IntegrationAPIPanel(props: IntegrationAPIPanelProps) { icon={} title="GraphQL Service" // description="Flexible and efficient data queries." - onClick={() => handleClick("graphql")} + onClick={() => handleClick({ + orgName: "ballerina", + packageName: "graphql", + moduleName: "graphql" + })} disabled={isDisabled} tooltip={isDisabled ? OutOfScopeComponentTooltip : ""} isBeta @@ -79,7 +96,11 @@ export function IntegrationAPIPanel(props: IntegrationAPIPanelProps) { icon={} title="TCP Service" // description="Process connection oriented messages." - onClick={() => handleClick("tcp")} + onClick={() => handleClick({ + orgName: "ballerina", + packageName: "tcp", + moduleName: "tcp" + })} disabled={isDisabled} tooltip={isDisabled ? OutOfScopeComponentTooltip : ""} isBeta diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index e2e9c2c3534..f1ad66c22da 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { View, ViewContent } from "@wso2/ui-toolkit"; +import { Icon, ThemeColors, Typography, View, ViewContent } from "@wso2/ui-toolkit"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { useEffect, useState } from "react"; import { TitleBar } from "../../../components/TitleBar"; @@ -28,6 +28,8 @@ import { FormHeader } from "../../../components/FormHeader"; import FormGeneratorNew from "../Forms/FormGeneratorNew"; import styled from "@emotion/styled"; import { getImportsForProperty } from "../../../utils/bi"; +import { DownloadIcon } from "../../../components/DownloadIcon"; +import { RelativeLoader } from "../../../components/RelativeLoader"; const Container = styled.div` display: flex; @@ -50,8 +52,38 @@ const FormContainer = styled.div` padding-bottom: 15px; `; +const StatusContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100%; +`; + +const StatusCard = styled.div` + margin: 16px 16px 0 16px; + padding: 16px; + border-radius: 8px; + display: flex; + flex-direction: row; + align-items: center; + gap: 16px; + + & > svg { + font-size: 24px; + color: ${ThemeColors.ON_SURFACE}; + } +`; + +const StatusText = styled(Typography)` + color: ${ThemeColors.ON_SURFACE}; +`; + + export interface ServiceCreationViewProps { - type: string; + orgName: string; + packageName: string; + moduleName: string; + version?: string; } interface HeaderInfo { @@ -59,15 +91,23 @@ interface HeaderInfo { moduleName: string; } +enum PullingStatus { + FETCHING = "fetching", + PULLING = "pulling", + SUCCESS = "success", + ERROR = "error", +} + export function ServiceCreationView(props: ServiceCreationViewProps) { - const { type } = props; + const { orgName, packageName, moduleName, version } = props; const { rpcClient } = useRpcContext(); const [headerInfo, setHeaderInfo] = useState(null); const [model, setServiceInitModel] = useState(null); const [formFields, setFormFields] = useState([]); + const [pullingStatus, setPullingStatus] = useState(PullingStatus.FETCHING); const [filePath, setFilePath] = useState(""); const [targetLineRange, setTargetLineRange] = useState(); const [isSaving, setIsSaving] = useState(false); @@ -76,24 +116,69 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { const MAIN_BALLERINA_FILE = "main.bal"; useEffect(() => { - rpcClient - .getServiceDesignerRpcClient() - .getServiceInitModel({ filePath: "", moduleName: type, listenerName: "" }) - .then((res) => { - setHeaderInfo({ - title: res?.serviceInitModel.displayName, - moduleName: res?.serviceInitModel.moduleName + const fetchData = async () => { + setPullingStatus(PullingStatus.FETCHING); + + const promise = rpcClient + .getServiceDesignerRpcClient() + .getServiceInitModel({ + filePath: "", orgName: orgName, pkgName: packageName, moduleName: moduleName, listenerName: "" }); - setServiceInitModel(res?.serviceInitModel); - setFormFields(mapPropertiesToFormFields(res?.serviceInitModel.properties)); - }); - rpcClient - .getVisualizerRpcClient() - .joinProjectPath(MAIN_BALLERINA_FILE) - .then((filePath) => { - setFilePath(filePath); + let timer: ReturnType | null = null; + let didTimeout = false; + let res; + + // Wait for up to 3 seconds for a fast response + const timeoutPromise = new Promise((resolve) => { + timer = setTimeout(() => { + didTimeout = true; + setPullingStatus(PullingStatus.PULLING); + resolve(); + }, 3000); }); + + res = await Promise.race([ + promise.then((result) => { + if (timer) { + clearTimeout(timer); + timer = null; + } + return result; + }), + timeoutPromise.then(() => promise) + ]); + + // If the response arrived before the timer, package is present, load form immediately + if (!didTimeout && res?.serviceInitModel) { + setHeaderInfo({ + title: res.serviceInitModel.displayName, + moduleName: res.serviceInitModel.moduleName + }); + setServiceInitModel(res.serviceInitModel); + setFormFields(mapPropertiesToFormFields(res.serviceInitModel.properties)); + setPullingStatus(undefined); + } else if (didTimeout && res?.serviceInitModel) { + // If timer expired, show pulling status then load form + setPullingStatus(PullingStatus.SUCCESS); + setHeaderInfo({ + title: res.serviceInitModel.displayName, + moduleName: res.serviceInitModel.moduleName + }); + setServiceInitModel(res.serviceInitModel); + setFormFields(mapPropertiesToFormFields(res.serviceInitModel.properties)); + setPullingStatus(undefined); + } + + rpcClient + .getVisualizerRpcClient() + .joinProjectPath(MAIN_BALLERINA_FILE) + .then((filePath) => { + setFilePath(filePath); + }); + }; + + fetchData(); }, []); useEffect(() => { @@ -219,34 +304,70 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { return ( - - { - headerInfo && - - } - - - <> - {formFields && formFields.length > 0 && - - - {filePath && targetLineRange && - - } - - } - - - + {pullingStatus && ( + + {pullingStatus === PullingStatus.FETCHING && ( + + )} + {pullingStatus === PullingStatus.PULLING && ( + + + + Please wait while the {packageName} package is being pulled... + + + )} + {pullingStatus === PullingStatus.SUCCESS && ( + + + Package pulled successfully. + + )} + {pullingStatus === PullingStatus.ERROR && ( + + + + Failed to pull the package. Please try again. + + + )} + + )} + + {!pullingStatus && ( + <> + + {headerInfo && ( + + )} + + + <> + {formFields && formFields.length > 0 && ( + + + {filePath && targetLineRange && ( + + )} + + )} + + + + + )} ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 4a1a1d83179..d84b4bd15ca 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -387,7 +387,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { )} {serviceModel && serviceModel.moduleName !== "http" && - serviceModel.functions.some((func) => !func.enabled) && ( + serviceModel.x.some((func) => !func.enabled) && ( From 6bc35cb839214f9d022d3c2a7f74eb79cb099a9d Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 16 Sep 2025 15:21:40 +0530 Subject: [PATCH 042/730] Changes --- .../ballerina-side-panel/src/components/Form/index.tsx | 9 ++++++++- .../src/views/BI/Forms/FormGeneratorNew/index.tsx | 3 +++ .../src/views/BI/ServiceDesigner/ServiceCreationView.tsx | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx index 237aff78c76..fd85ee93008 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -354,6 +354,7 @@ export interface FormProps { }[]; hideSaveButton?: boolean; // Option to hide the save button onValidityChange?: (isValid: boolean) => void; // Callback for form validity status + changeOptionalFieldTitle?: string; // Option to change the title of optional fields } export const Form = forwardRef((props: FormProps, ref) => { @@ -395,6 +396,7 @@ export const Form = forwardRef((props: FormProps, ref) => { injectedComponents, hideSaveButton = false, onValidityChange, + changeOptionalFieldTitle = undefined } = props; const { @@ -417,6 +419,7 @@ export const Form = forwardRef((props: FormProps, ref) => { const [isMarkdownExpanded, setIsMarkdownExpanded] = useState(false); const [isIdentifierEditing, setIsIdentifierEditing] = useState(false); const [isSubComponentEnabled, setIsSubComponentEnabled] = useState(false); + const [optionalFieldsTitle, setOptionalFieldsTitle] = useState("Optional Configurations"); const markdownRef = useRef(null); @@ -485,6 +488,10 @@ export const Form = forwardRef((props: FormProps, ref) => { }); setDiagnosticsInfo(diagnosticsMap); reset(defaultValues); + + if (changeOptionalFieldTitle) { + setOptionalFieldsTitle("Optional Listener Configurations"); + } } }, [formFields, reset]); @@ -787,7 +794,7 @@ export const Form = forwardRef((props: FormProps, ref) => { })()} {hasAdvanceFields && ( - Optional Configurations + {optionalFieldsTitle} {!showAdvancedOptions && ( )} { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index f1ad66c22da..b77423dcc8f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -359,6 +359,7 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { onSubmit={handleOnSubmit} preserveFieldOrder={true} recordTypeFields={recordTypeFields} + changeOptionalFieldTitle={"Optional Listener Configurations"} /> )} From d3aa04a5685f556f5a5b097abcd782ecadf810a3 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 16 Sep 2025 15:22:07 +0530 Subject: [PATCH 043/730] Changes --- .../editors/CheckBoxConditionalEditor.tsx | 110 ++++++++++++++++-- 1 file changed, 101 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx index 87440606754..8fdfd9db215 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx @@ -23,6 +23,7 @@ import styled from "@emotion/styled"; import { EditorFactory } from "./EditorFactory"; import { useFormContext } from "../../context"; import { ContextAwareExpressionEditor } from "./ExpressionEditor"; +import { PropertyModel } from "@wso2/ballerina-core"; const Form = styled.div` display: grid; @@ -69,27 +70,55 @@ export function CheckBoxConditionalEditor(props: CheckBoxConditionalEditorProps) const { form } = useFormContext(); const { register, control, watch } = form; const [conditionalFields, setConditionalFields] = useState([]); + const [checkedStateFields, setCheckedStateFields] = useState([]); + const [uncheckedStateFields, setUncheckedStateFields] = useState([]); const { setValue } = form; const checked = watch(field.key, true); - console.log("Conditional Fields: ", field.advanceProps); - useEffect(() => { - setConditionalFields(field.advanceProps); - }, []); + if (field.choices && field.choices.length > 1) { + // first choice is for checked state, second is for unchecked state + const mappedCheckedStateFields = mapPropertiesToFormFields(field.choices[0].properties || {}); + setCheckedStateFields(mappedCheckedStateFields); + + const mappedUncheckedStateFields = mapPropertiesToFormFields(field.choices[1].properties || {}); + setUncheckedStateFields(mappedUncheckedStateFields); + } + }, [field]); + + + // useEffect(() => { + // if (checked) { + // setConditionalFields(checkedStateFields); + // } else { + // setConditionalFields(uncheckedStateFields); + // } + // }, [checked, checkedStateFields, uncheckedStateFields]); // Add useEffect to set initial values useEffect(() => { - if (conditionalFields.length > 0) { - Object.entries(conditionalFields).forEach(([_, propValue]) => { + if (checkedStateFields.length > 0) { + Object.entries(checkedStateFields).forEach(([_, propValue]) => { if (propValue.value !== undefined) { setValue(propValue.key, propValue.value); } }); } - }, [conditionalFields]); + }, [checkedStateFields]); + + // Add useEffect to set initial values + useEffect(() => { + if (uncheckedStateFields.length > 0) { + Object.entries(uncheckedStateFields).forEach(([_, propValue]) => { + if (propValue.value !== undefined) { + setValue(propValue.key, propValue.value); + } + } + ); + } + }, [uncheckedStateFields]); return ( @@ -107,9 +136,19 @@ export function CheckBoxConditionalEditor(props: CheckBoxConditionalEditorProps) - {!checked && conditionalFields.length > 0 && ( + {checked && checkedStateFields.length > 0 && ( + <> + {checkedStateFields.map((dfield) => ( + + ))} + + )} + {!checked && uncheckedStateFields.length > 0 && ( <> - {conditionalFields.map((dfield) => ( + {uncheckedStateFields.map((dfield) => ( { + + // Determine value for MULTIPLE_SELECT + let value: any = property.value; + if (property.valueType === "MULTIPLE_SELECT") { + if (property.values && property.values.length > 0) { + value = property.values; + } else if (property.value) { + value = [property.value]; + } else if (property.items && property.items.length > 0) { + value = [property.items[0]]; + } else { + value = []; + } + } + + let items = undefined; + if (property.valueType === "MULTIPLE_SELECT" || property.valueType === "SINGLE_SELECT") { + items = property.items; + } + + return { + key, + label: property?.metadata?.label, + type: property.valueType, + documentation: property?.metadata?.description || "", + valueType: property.valueTypeConstraint, + editable: true, + enabled: property.enabled ?? true, + optional: property.optional, + value, + valueTypeConstraint: property.valueTypeConstraint, + advanced: property.advanced, + diagnostics: [], + items, + choices: property.choices, + placeholder: property.placeholder, + addNewButton: property.addNewButton, + lineRange: property?.codedata?.lineRange, + advanceProps: mapPropertiesToFormFields(property.properties) + } as FormField; + }); +} From 83ce78ee7fdc833b446f103100c5d49ff024cf3c Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 17 Sep 2025 10:00:39 +0530 Subject: [PATCH 044/730] Fix service class tests --- .../service-class-designer/service-class.spec.ts | 4 ++-- .../service-class-designer/serviceEditorUtils.ts | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts index e9b2bb6bfdd..76b68dffba4 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts @@ -51,12 +51,12 @@ export default function createTests() { { name: 'age', returnType: 'int', type: 'Remote'} ], [ { name: 'firstName', type: 'string' }, - {name: 'lastName', type: 'string' } + {name: 'id', type: 'int' } ]); await serviceClassUtils.renameServiceClass(`Service${testAttempt}`); await serviceClassUtils.editMethod('name', 'fullName'); - await serviceClassUtils.deleteVariable('lastName'); + await serviceClassUtils.deleteVariable('id'); }) }); } \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts index 7da712472fc..8e86c76a0a2 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts @@ -164,7 +164,7 @@ export class ServiceClassEditorUtils { // Handle return type const returnBox = await this.waitForTextbox('Return Type'); await returnBox.click(); - await this.artifactWebView.getByTitle(returnType, { exact: true }).click(); + await this.artifactWebView.getByText(returnType, { exact: true }).click(); await this.handleTypeCompletion(returnBox); @@ -182,7 +182,8 @@ export class ServiceClassEditorUtils { const typeField = await this.waitForTextbox('Variable Type'); await typeField.fill(type); await typeField.click(); - await this.artifactWebView.getByTitle(type, { exact: true }).click(); + await this.page.waitForTimeout(WAIT_CONFIG.SHORT); + await this.artifactWebView.getByText(type, { exact: true }).click(); await this.handleTypeCompletion(typeField); From 4ca37783fb13dfd8730994838c8967fa0252b498 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Tue, 16 Sep 2025 11:57:55 +0530 Subject: [PATCH 045/730] Adds tool call status to AI chat Adds support for displaying tool call and result statuses in the AI chat component. This enhances the user experience by providing real-time feedback on the AI's progress when using external tools. It includes: - New `ToolCall` and `ToolResult` types to represent tool call events. - Updates to the UI to display the status of tool calls, including loading and completion states. --- .../ballerina-core/src/state-machine-types.ts | 13 ++- .../src/features/ai/service/code/code.ts | 90 +++++++++++-------- .../src/features/ai/service/event.ts | 8 +- .../src/features/ai/service/utils.ts | 19 ++++ .../views/AIPanel/components/AIChat/index.tsx | 65 +++++++++++--- .../AIPanel/components/ToolCallSegment.tsx | 83 +++++++++++++++++ 6 files changed, 226 insertions(+), 52 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/ToolCallSegment.tsx diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 3311a7a5baa..614eea8a592 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -181,7 +181,9 @@ export type ChatNotify = | CodeDiagnostics | CodeMessages | ChatStop - | ChatError; + | ChatError + | ToolCall + | ToolResult; export interface ChatStart { type: "start"; @@ -218,6 +220,15 @@ export interface ChatError { type: "error"; content: string; } +export interface ToolCall { + type: "tool_call"; + toolName: string; +} +export interface ToolResult { + type: "tool_result"; + toolName: string; + libraryNames: string[]; +} export const stateChanged: NotificationType = { method: 'stateChanged' }; export const onDownloadProgress: NotificationType = { method: 'onDownloadProgress' }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 6e86ea74b22..47749e3e4ed 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -86,11 +86,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const allMessages: CoreMessage[] = [ { role: "system", - content: getSystemPromptPrefix( - sourceFiles, - params.operationType, - GenerationType.CODE_GENERATION - ), + content: getSystemPromptPrefix(sourceFiles, params.operationType, GenerationType.CODE_GENERATION), }, { role: "system", @@ -128,19 +124,36 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; - let assistantThinking: string = ""; + let finalResponse: string = ""; let lastType: string | null = null; for await (const part of fullStream) { - if (part.type === "tool-result") { - console.log( - "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", - part.result as Library[] - ); - } switch (part.type) { + case "tool-call": { + const toolName = part.toolName; + console.log(`[Tool Call] Tool call started: ${toolName}`); + eventHandler({ type: "tool_call", toolName }); + assistantResponse += `\n\nAnalyzing request & selecting libraries...`; + break; + } + case "tool-result": { + const toolName = part.toolName; + console.log(`[Tool Call] Tool call finished: ${toolName}`); + console.log( + "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", + part.result as Library[] + ); + const libraryNames = (part.result as Library[]).map((lib) => lib.name); + assistantResponse = assistantResponse.replace( + `Analyzing request & selecting libraries...`, + `Fetched libraries: [${libraryNames.join(", ")}]` + ); + eventHandler({ type: "tool_result", toolName, libraryNames }); + break; + } case "text-delta": { const textPart = lastType !== "text-delta" ? "\n" + part.textDelta : part.textDelta; + assistantResponse += textPart; eventHandler({ type: "content_block", content: textPart }); break; } @@ -165,25 +178,19 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler .slice() .reverse() .find((msg) => msg.role === "assistant"); - assistantResponse = lastAssistantMessage - ? (lastAssistantMessage.content as any[]).find((c) => c.type === "text")?.text || assistantResponse - : assistantResponse; - - const assistantMessages = finalMessages - .filter((msg) => msg.role === "assistant" && msg !== lastAssistantMessage) - .map((msg) => (msg.content as any[]).find((c) => c.type === "text")?.text || "") - .filter((text) => text !== ""); - assistantThinking = assistantMessages.join("\n"); + finalResponse = lastAssistantMessage + ? (lastAssistantMessage.content as any[]).find((c) => c.type === "text")?.text || finalResponse + : finalResponse; const postProcessedResp: PostProcessResponse = await postProcess({ - assistant_response: assistantResponse, + assistant_response: finalResponse, }); - assistantResponse = postProcessedResp.assistant_response; + finalResponse = postProcessedResp.assistant_response; let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; const MAX_REPAIR_ATTEMPTS = 3; let repair_attempt = 0; - let diagnosticFixResp = assistantResponse; //TODO: Check if we need this variable + let diagnosticFixResp = finalResponse; //TODO: Check if we need this variable while ( hasCodeBlocks(diagnosticFixResp) && diagnostics.length > 0 && @@ -201,8 +208,20 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler diagnostics = repairedResponse.diagnostics; repair_attempt++; } - console.log("Final Diagnostics ", diagnostics); - eventHandler({ type: "content_replace", content: assistantThinking + "\n" + diagnosticFixResp }); + + // Replace the final response segment in assistant response + const lastAssistantMessageContent = lastAssistantMessage + ? (lastAssistantMessage.content as any[]).find((c) => c.type === "text")?.text || "" + : ""; + + if (lastAssistantMessageContent && assistantResponse.includes(lastAssistantMessageContent)) { + assistantResponse = assistantResponse.replace(lastAssistantMessageContent, diagnosticFixResp); + } else { + // Fallback: append the final response if replacement fails + assistantResponse += "\n\n" + diagnosticFixResp; + } + + eventHandler({ type: "content_replace", content: assistantResponse }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); eventHandler({ type: "stop", command: Command.Code }); @@ -228,14 +247,13 @@ function getSystemPromptPrefix(sourceFiles: SourceFiles[], op: OperationType, ge const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the API documentation provided by the LibraryProviderTool. # Instructions -1. Analyze the user query to determine the required functionality. -2. Use the LibraryProviderTool to fetch detailed information (clients, functions, types) for only the relevant Ballerina libraries based on the user query. -3. Use the tool's output as API documentation in the context of the query to generate accurate Ballerina code. -4. Do not include libraries unless they are explicitly needed for the query. -${generationType === GenerationType.HEALTHCARE_GENERATION - ? "5. For healthcare-related queries, ALWAYS include the following libraries in the LibraryProviderTool call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." +- Analyze the user query to determine the required functionality. +- Do not include libraries unless they are explicitly needed for the query. +${ + generationType === GenerationType.HEALTHCARE_GENERATION + ? "- For healthcare-related queries, ALWAYS include the following libraries in the LibraryProviderTool call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." : "" - }`; +}`; if (op === "CODE_FOR_USER_REQUIREMENT") { return getRequirementAnalysisCodeGenPrefix(extractResourceDocumentContent(sourceFiles)); @@ -322,11 +340,7 @@ The explanation should explain the control flow decided in step 2, along with th Each file that needs modifications should have a codeblock segment, and it MUST contain the complete file content with the proposed change. The codeblock segments should only contain .bal contents and should not generate or modify any other file types. Politely decline if the query requests such cases. -- Begin your response with the **Explanation** section. -- Do not include any introductory phrases, speculation, hedging, or meta commentary about the task. -- Avoid phrases like "may", "might", "let me…", or any descriptions about task complexity or requirements. -- Do not mention whether libraries are required or not. -- Present the information as if you already have complete knowledge of the required libraries to hide the tool usage from the user. +- DO NOT mention if libraries are not required for the user query or task. - Format responses using professional markdown with proper headings, lists, and styling Example Codeblock segment: diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts index f8f57417b3e..ffdb1bd06c1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts @@ -15,7 +15,7 @@ // under the License. import { ChatNotify, ChatContent, Command } from "@wso2/ballerina-core"; -import { sendContentAppendNotification, sendContentReplaceNotification, sendDiagnosticMessageNotification, sendErrorNotification, sendMessagesNotification, sendMessageStartNotification, sendMessageStopNotification, sendTestGenIntermidateStateNotification } from "./utils"; +import { sendContentAppendNotification, sendContentReplaceNotification, sendDiagnosticMessageNotification, sendErrorNotification, sendMessagesNotification, sendMessageStartNotification, sendMessageStopNotification, sendTestGenIntermidateStateNotification, sendToolCallNotification, sendToolResultNotification } from "./utils"; export type CopilotEventHandler = (event: ChatNotify) => void; @@ -44,6 +44,12 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler case 'messages': sendMessagesNotification(event.messages); break; + case 'tool_call': + sendToolCallNotification(event.toolName); + break; + case 'tool_result': + sendToolResultNotification(event.toolName,event.libraryNames); + break; case 'diagnostics': sendDiagnosticMessageNotification(event.diagnostics); break; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index 7e88627d5b6..8bc8ab32e6c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -28,6 +28,8 @@ import { ProjectSource, SourceFiles, TestGeneratorIntermediaryState, + ToolCall, + ToolResult, Command } from "@wso2/ballerina-core"; import { CoreMessage } from "ai"; @@ -191,6 +193,23 @@ export function sendTestGenIntermidateStateNotification(testGenState: TestGenera sendAIPanelNotification(msg); } +export function sendToolCallNotification(toolName: string): void { + const msg: ToolCall = { + type: "tool_call", + toolName: toolName, + }; + sendAIPanelNotification(msg); +} + +export function sendToolResultNotification(toolName: string, libraryNames: string[]): void { + const msg: ToolResult = { + type: "tool_result", + toolName: toolName, + libraryNames: libraryNames + }; + sendAIPanelNotification(msg); +} + function sendAIPanelNotification(msg: ChatNotify): void { RPCLayer._messenger.sendNotification(onChatNotify, { type: "webview", webviewType: AiPanelWebview.viewType }, msg); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index a3448ee92d8..4232c6a9ef2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -54,6 +54,7 @@ import { Button, Icon, Codicon, Typography } from "@wso2/ui-toolkit"; import { AIChatInputRef } from "../AIChatInput"; import ProgressTextSegment from "../ProgressTextSegment"; +import ToolCallSegment from "../ToolCallSegment"; import RoleContainer from "../RoleContainter"; import { Attachment, AttachmentStatus } from "@wso2/ballerina-core"; import { formatWithProperIndentation } from "../../../../utils/utils"; @@ -271,6 +272,7 @@ const AIChat: React.FC = () => { }, []); rpcClient?.onChatNotify((response: ChatNotify) => { + // TODO: Need to handle the content as step blocks const type = response.type; if (type === "content_block") { const content = response.content; @@ -286,6 +288,26 @@ const AIChat: React.FC = () => { newMessages[newMessages.length - 1].content = content; return newMessages; }); + } else if (type === "tool_call") { + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content += `\n\nAnalyzing request & selecting libraries...`; + } + return newMessages; + }); + } else if (type === "tool_result") { + const libraryNames = response.libraryNames; + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content = newMessages[newMessages.length - 1].content.replace( + `Analyzing request & selecting libraries...`, + `Fetched libraries: [${libraryNames.join(", ")}]` + ); + } + return newMessages; + }); } else if (type === "intermediary_state") { const state = response.state; setTestGenIntermediaryState(state); @@ -1921,6 +1943,14 @@ const AIChat: React.FC = () => { failed={segment.failed} /> ); + } else if (segment.type === SegmentType.ToolCall) { + return ( + + ); } else if (segment.type === SegmentType.Attachment) { return ( @@ -2170,6 +2200,7 @@ export enum SegmentType { Code = "Code", Text = "Text", Progress = "Progress", + ToolCall = "ToolCall", Attachment = "Attachment", InlineCode = "InlineCode", References = "References", @@ -2245,13 +2276,13 @@ export function splitContent(content: string): Segment[] { // Combined regex to capture either ``` code ``` or Text const regex = - /\s*```(\w+)\s*([\s\S]*?)```\s*<\/code>|([\s\S]*?)<\/progress>|([\s\S]*?)<\/attachment>|([\s\S]*?)<\/scenario>|([\s\S]*?)<\/button>|([\s\S]*?)|([\s\S]*?)/g; + /\s*```(\w+)\s*([\s\S]*?)```\s*<\/code>|([\s\S]*?)<\/progress>|([\s\S]*?)<\/toolcall>|([\s\S]*?)<\/attachment>|([\s\S]*?)<\/scenario>|([\s\S]*?)<\/button>|([\s\S]*?)|([\s\S]*?)/g; let match; let lastIndex = 0; function updateLastProgressSegmentLoading(failed: boolean = false) { const lastSegment = segments[segments.length - 1]; - if (lastSegment && lastSegment.type === SegmentType.Progress) { + if (lastSegment && (lastSegment.type === SegmentType.Progress || lastSegment.type === SegmentType.ToolCall)) { lastSegment.loading = false; lastSegment.failed = failed; } @@ -2292,8 +2323,18 @@ export function splitContent(content: string): Segment[] { text: progressText, }); } else if (match[6]) { + // block matched + const toolcallText = match[6]; + + updateLastProgressSegmentLoading(); + segments.push({ + type: SegmentType.ToolCall, + loading: true, + text: toolcallText, + }); + } else if (match[7]) { // block matched - const attachmentName = match[6].trim(); + const attachmentName = match[7].trim(); updateLastProgressSegmentLoading(); @@ -2308,9 +2349,9 @@ export function splitContent(content: string): Segment[] { text: attachmentName, }); } - } else if (match[7]) { + } else if (match[8]) { // block matched - const scenarioContent = match[7].trim(); + const scenarioContent = match[8].trim(); updateLastProgressSegmentLoading(true); segments.push({ @@ -2318,10 +2359,10 @@ export function splitContent(content: string): Segment[] { loading: false, text: scenarioContent, }); - } else if (match[8]) { + } else if (match[9]) { // From e17fbae2e247530d24574dc57fcd27551172298f Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Mon, 22 Sep 2025 18:50:07 +0530 Subject: [PATCH 049/730] Change AI tests to extension hosts --- .vscode/launch.json | 22 +++++ .../ballerina-extension/package.json | 4 +- .../code/result-management/result-manager.ts | 5 +- .../test/ai/evals/code/test-cases.ts | 9 +- .../test/ai/evals/code/utils/constants.ts | 5 +- .../ballerina-extension/test/lib/index.ts | 7 +- .../test/runTest-extensionHost.ts | 89 +++++++++++++++++++ 7 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/runTest-extensionHost.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 4c8b9ea1e16..d8e0752c01b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -250,6 +250,28 @@ "cwd": "${workspaceFolder}/workspaces/ballerina/ballerina-extension", "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" }, + { + "name": "Ballerina Extension AI Tests (ExtensionHost)", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}/workspaces/ballerina/ballerina-extension", + "--extensionTestsPath=${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test", + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/test/data/bi_empty" + ], + "env": { + "LS_EXTENSIONS_PATH": "", + "LSDEBUG": "false", + "WEB_VIEW_WATCH_MODE": "false", + "AI_TEST_ENV": "true" + }, + "outFiles": [ + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test/**/*.js" + ], + "preLaunchTask": "compile:ballerina-tests", + "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" + }, { "name": "APK Extension", "type": "extensionHost", diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index c791c125483..29b084e7b29 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1225,5 +1225,7 @@ "type": "git", "url": "git+https://github.com/wso2/ballerina-plugin-vscode.git" }, - "_originalExtensionDependencies": [] + "_originalExtensionDependencies": [ + "redhat.vscode-yaml" + ] } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts index 104e24f8a60..6cba07256e1 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts @@ -27,7 +27,8 @@ export class ResultManager { private readonly resultsDir: string; constructor(baseDir: string = PATHS.DEFAULT_RESULTS_DIR) { - this.resultsDir = path.resolve(baseDir); + // console.log(`Results directory set to: ${path.resolve(__dirname, "")}`); + this.resultsDir = path.resolve(__dirname, baseDir); } /** @@ -63,4 +64,4 @@ export class ResultManager { getResultsDirectory(): string { return this.resultsDir; } -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index 38b9d8f9cf9..defbeb86e79 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -1,4 +1,7 @@ -export const testCases = [ +// For development/testing: Set this to a small number (e.g., 1) for faster execution +const MAX_TEST_CASES = process.env.AI_TEST_ENV === 'true' ? 1 : undefined; + +const allTestCases = [ { prompt: "write an integration to get emails of the Users from a mysql table and send an email using gmail connector saying that you for buying the product", projectPath: "fresh_bi_package" @@ -79,4 +82,6 @@ export const testCases = [ prompt: "Generate a CSV report from Google Sheets data and send the report to a Slack channel.", projectPath: "fresh_bi_package" } -]; \ No newline at end of file +]; + +export const testCases = MAX_TEST_CASES ? allTestCases.slice(0, MAX_TEST_CASES) : allTestCases; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts index f96ac2ddd69..e89f4fb2ab4 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -15,6 +15,7 @@ // under the License. import { TestConfiguration } from '../types'; +import * as path from 'path'; /** * Default test configuration @@ -42,7 +43,7 @@ export const TIMING = { export const PATHS = { PROJECT_ROOT_RELATIVE: "../../../../../test/data/bi_empty", ENV_FILE_RELATIVE: "../../../../.env", - DEFAULT_RESULTS_DIR: "./test/ai/evals/code/results" + DEFAULT_RESULTS_DIR: "../../../../../../test/ai/evals/code/results" } as const; /** @@ -75,4 +76,4 @@ export const VSCODE_COMMANDS = { OPEN: "vscode.open", SHOW_EXAMPLES: "ballerina.showExamples", AI_GENERATE_CODE_CORE: "ballerina.test.ai.generateCodeCore" -} as const; \ No newline at end of file +} as const; diff --git a/workspaces/ballerina/ballerina-extension/test/lib/index.ts b/workspaces/ballerina/ballerina-extension/test/lib/index.ts index f493725fd35..be8d524df10 100644 --- a/workspaces/ballerina/ballerina-extension/test/lib/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/lib/index.ts @@ -33,13 +33,18 @@ export async function runTests(options: TestOptions): Promise { if (!options.vscodeExecutablePath) { options.vscodeExecutablePath = await downloadAndUnzipVSCode(); const [cli, ...args] = resolveCliPathFromVSCodeExecutablePath(options.vscodeExecutablePath) - if (packageJson.extensionDependencies) { + if (packageJson.extensionDependencies && packageJson.extensionDependencies.length > 0) { + console.log(`Installing ${packageJson.extensionDependencies.length} extension dependencies...`); for (const extensionId of packageJson.extensionDependencies) { + console.log(`Installing extension: ${extensionId}`); cp.spawnSync(cli, [...args, '--install-extension', extensionId], { encoding: 'utf-8', stdio: 'inherit', }) } + console.log('Extension dependencies installed successfully'); + } else { + console.log('No extension dependencies found in package.json'); } } if (!options.vscodeExecutablePath) { diff --git a/workspaces/ballerina/ballerina-extension/test/runTest-extensionHost.ts b/workspaces/ballerina/ballerina-extension/test/runTest-extensionHost.ts new file mode 100644 index 00000000000..298fb0ba14b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/runTest-extensionHost.ts @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as path from 'path'; +import * as cp from 'child_process'; +import { downloadAndUnzipVSCode, resolveCliPathFromVSCodeExecutablePath, runTests } from '@vscode/test-electron'; +const dotenv = require('dotenv'); +const packageJson = require('../../package.json'); +const { createEnvDefinePlugin } = require('../../../../../common/scripts/env-webpack-helper'); + +async function main() { + try { + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + const extensionTestsPath = path.resolve(__dirname, '.'); + + // Load environment variables + const envPath = path.resolve(__dirname, '../../.env'); + const env = dotenv.config({ path: envPath }).parsed; + console.log("Fetching values for environment variables..."); + const { envKeys, missingVars } = createEnvDefinePlugin(env); + + if (missingVars.length > 0) { + console.warn( + '\n⚠️ Environment Variable Configuration Warning:\n' + + `Missing required environment variables: ${missingVars.join(', ')}\n` + + `Please provide values in either .env file or runtime environment.\n` + ); + } + + // Download VS Code and get CLI path + const vscodeExecutablePath = await downloadAndUnzipVSCode(); + const [cli, ...args] = resolveCliPathFromVSCodeExecutablePath(vscodeExecutablePath); + + // Install extension dependencies if they exist + if (packageJson.extensionDependencies && packageJson.extensionDependencies.length > 0) { + console.log(`Installing ${packageJson.extensionDependencies.length} extension dependencies...`); + for (const extensionId of packageJson.extensionDependencies) { + console.log(`Installing extension: ${extensionId}`); + cp.spawnSync(cli, [...args, '--install-extension', extensionId], { + encoding: 'utf-8', + stdio: 'inherit', + }); + } + console.log('Extension dependencies installed successfully'); + } else { + console.log('No extension dependencies to install'); + } + + // Run tests with specific grep pattern for AI tests + await runTests({ + vscodeExecutablePath, + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: [ + '--grep=^AI Code Generator Tests Suite' + ], + extensionTestsEnv: { + ...envKeys, + AI_TEST_ENV: 'true', + LS_EXTENSIONS_PATH: '', + LSDEBUG: 'false', + WEB_VIEW_WATCH_MODE: 'false' + } + }); + + console.log('✅ AI tests completed successfully using extensionHost!'); + + } catch (err) { + console.error('❌ AI tests failed:', err); + process.exit(1); + } +} + +main(); \ No newline at end of file From 4d6a7efc9526c5da5bfcc8c67c0de1750c810935 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Tue, 23 Sep 2025 14:44:21 +0530 Subject: [PATCH 050/730] remove unused code blocks --- .../BI/HelperPaneNew/Views/CreateValue.tsx | 75 +------------------ 1 file changed, 2 insertions(+), 73 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/Views/CreateValue.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/Views/CreateValue.tsx index c8f4c64370e..e2bad4ac5d7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/Views/CreateValue.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/Views/CreateValue.tsx @@ -16,9 +16,8 @@ * under the License. */ -import { GetRecordConfigResponse, PropertyTypeMemberInfo, RecordTypeField, TypeField } from "@wso2/ballerina-core"; -import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { RefObject, useEffect, useRef, useState } from "react"; +import { RecordTypeField } from "@wso2/ballerina-core"; +import { RefObject} from "react"; import ExpandableList from "../Components/ExpandableList"; import { SlidingPaneNavContainer } from "@wso2/ui-toolkit/lib/components/ExpressionEditor/components/Common/SlidingPane"; import { ValueCreationOption } from ".."; @@ -33,78 +32,8 @@ type CreateValuePageProps = { valueCreationOptions?: ValueCreationOption[]; } -const passPackageInfoIfExists = (recordTypeMember: PropertyTypeMemberInfo) => { - let org = ""; - let module = ""; - let version = ""; - if (recordTypeMember?.packageInfo) { - const parts = recordTypeMember?.packageInfo.split(':'); - if (parts.length === 3) { - [org, module, version] = parts; - } - } - return { org, module, version } -} - -const getPropertyMember = (field: RecordTypeField) => { - return field?.recordTypeMembers.at(0); -} - export const CreateValue = (props: CreateValuePageProps) => { const { fileName, currentValue, onChange, selectedType, recordTypeField, valueCreationOptions } = props; - const [recordModel, setRecordModel] = useState([]); - const [isModalOpen, setIsModalOpen] = useState(false); - - const { rpcClient } = useRpcContext(); - const propertyMember = getPropertyMember(recordTypeField) - - const sourceCode = useRef(currentValue); - - const getRecordConfigRequest = async () => { - if (recordTypeField) { - const packageInfo = passPackageInfoIfExists(recordTypeField?.recordTypeMembers.at(0)) - return { - filePath: fileName, - codedata: { - org: packageInfo.org, - module: packageInfo.module, - version: packageInfo.version, - packageName: propertyMember?.packageName, - }, - typeConstraint: propertyMember?.type, - } - } - else { - const tomValues = await rpcClient.getCommonRpcClient().getCurrentProjectTomlValues(); - return { - filePath: fileName, - codedata: { - org: tomValues.package.org, - module: tomValues.package.name, - version: tomValues.package.version, - packageName: propertyMember?.packageName, - }, - typeConstraint: propertyMember?.type || Array.isArray(selectedType) ? selectedType[0] : selectedType, - } - } - } - - const fetchRecordModel = async () => { - const request = await getRecordConfigRequest(); - const typeFieldResponse: GetRecordConfigResponse = await rpcClient.getBIDiagramRpcClient().getRecordConfig(request); - if (typeFieldResponse.recordConfig) { - const recordConfig: TypeField = { - name: propertyMember?.type, - ...typeFieldResponse.recordConfig - } - - setRecordModel([recordConfig]); - } - } - - useEffect(() => { - fetchRecordModel() - }, []); return ( (recordTypeField) ? From c7ec093f7e946a530cb05f9be7d64c7fddbc548d Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Tue, 23 Sep 2025 14:44:51 +0530 Subject: [PATCH 051/730] fix create value suggestions not loading for primitive types --- .../ballerina-visualizer/src/views/BI/HelperPaneNew/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/index.tsx index 2427c3a80a3..c520cd526a5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/HelperPaneNew/index.tsx @@ -273,7 +273,7 @@ const HelperPaneNewEl = ({ return unionTypes.includes(searchType); }; - const defaultValue = getDefaultValue(Array.isArray(selectedType) ? selectedType[0] : selectedType); + const defaultValue = getDefaultValue(selectedType?.label); const allValueCreationOptions = [ { From 0611d0afccd7ed3c471f16dd869fbbb7081434b9 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 23 Sep 2025 23:46:56 +0530 Subject: [PATCH 052/730] Impl listener config section --- .../src/views/BI/ServiceDesigner/index.tsx | 481 +++++++++++------- 1 file changed, 307 insertions(+), 174 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 4a1a1d83179..7f276382a1b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -43,6 +43,7 @@ import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { TitleBar } from "../../../components/TitleBar"; import { LoadingRing } from "../../../components/Loader"; import { ResourceAccordionV2 } from "./components/ResourceAccordionV2"; +import { set } from "lodash"; const LoadingContainer = styled.div` display: flex; @@ -88,12 +89,88 @@ const HeaderContainer = styled.div` justify-content: space-between; `; +const ListenerContainer = styled.div` + padding: 15px; + border-bottom: 1px solid var(--vscode-editorIndentGuide-background); + display: flex; + gap: 20px; +`; + +const ListenerSection = styled.div` + display: flex; + flex-direction: column; + gap: 10px; + flex: 3; +`; + +const ListenerHeader = styled.div` + display: flex; + flex-direction: column; + gap: 4px; +`; + +const ListenerContent = styled.div` + display: flex; + align-items: center; + gap: 15px; + margin-top: 10px; +`; + +const ListenerItem = styled.div` + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; + background-color: var(--vscode-editor-background); +`; + +const ListenerIcon = styled.div` + width: 32px; + height: 32px; + background-color: var(--vscode-editor-background); + display: flex; + align-items: center; + justify-content: center; +`; + +const PropertiesSection = styled.div` + display: flex; + flex-direction: column; + gap: 15px; + flex: 1; + padding-left: 20px; + border-left: 1px solid var(--vscode-editorIndentGuide-background); +`; + +const PropertyItem = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const PropertyLabel = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +const PropertyValue = styled.div` + display: flex; + align-items: center; +`; + + interface ServiceDesignerProps { filePath: string; position: NodePosition; serviceIdentifier: string; } +interface ReadonlyProperty { + label: string; + value: string | string[]; +} + export function ServiceDesigner(props: ServiceDesignerProps) { const { filePath, position, serviceIdentifier } = props; const { rpcClient } = useRpcContext(); @@ -110,6 +187,9 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [resources, setResources] = useState([]); const [searchValue, setSearchValue] = useState(""); + const [listeners, setListeners] = useState([]); + const [readonlyProperties, setReadonlyProperties] = useState>(new Set()); + useEffect(() => { if (!serviceModel || isPositionChanged(prevPosition.current, position)) { fetchService(position); @@ -129,6 +209,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { console.log("Service Model: ", res.service); setShowForm(false); setServiceModel(res.service); + setServiceMetaInfo(res.service); setIsSaving(false); prevPosition.current = targetPosition; }); @@ -138,6 +219,31 @@ export function ServiceDesigner(props: ServiceDesignerProps) { getProjectListeners(); }; + const setServiceMetaInfo = (service: ServiceModel) => { + if (service?.properties?.listener) { + const listenerProperty = service.properties.listener; + if (listenerProperty.values && listenerProperty.values.length > 0) { + setListeners(listenerProperty.values); + } else if (listenerProperty.value) { + setListeners([listenerProperty.value]); + } + } + if (service?.properties) { + // iterate over each property and check if it's readonly + const readonlyProps: Set = new Set(); + Object.keys(service.properties).forEach((key) => { + if (key === "listener" || service.properties[key].codedata.type === "ANNOTATION_ATTACHMENT") { + return; + } + const property = service.properties[key]; + if (property.enabled === true) { + readonlyProps.add({ label: property.metadata.label, value: property.value || property.values }); + } + }); + setReadonlyProperties(readonlyProps); + } + } + const getProjectListeners = () => { rpcClient .getBIDiagramRpcClient() @@ -317,6 +423,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { rpcClient.getServiceDesignerRpcClient().exportOASFile({}); }; + const handleAddListener = () => { + // TODO: Implement add listener functionality + console.log("Add listener clicked"); + }; + const findIcon = (label: string) => { label = label.toLowerCase(); switch (true) { @@ -367,187 +478,209 @@ export function ServiceDesigner(props: ServiceDesignerProps) { return ( - + + + )} + { + serviceModel && ( <> - - {serviceModel && serviceModel.moduleName === "http" && ( - - )} - {serviceModel && serviceModel.moduleName === "http" && ( - - )} - {serviceModel && - serviceModel.moduleName !== "http" && - serviceModel.functions.some((func) => !func.enabled) && ( - + + + {serviceModel && serviceModel.moduleName === "http" && ( + + )} + {serviceModel && serviceModel.moduleName === "http" && ( + + )} + {serviceModel && + serviceModel.moduleName !== "http" && + serviceModel.functions.some((func) => !func.enabled) && ( + + )} + {serviceModel && serviceModel.moduleName === "http" && !haveServiceTypeName && ( + + )} + + } + /> + + + + + + + {listeners.length > 1 ? 'Listeners' : 'Listener'} + + + Connected {listeners.length > 1 ? 'listeners' : 'listener'} to the service + + + + { + listeners.map((listener, index) => ( + handleOpenListener(listener)} + style={{ cursor: 'pointer' }} + > + + { + serviceModel.icon && ( + {listener} + ) + } + { + !serviceModel.icon && ( + + ) + } + + + {listener} + + + + )) + } + + + {readonlyProperties.size > 0 && ( + + { + Array.from(readonlyProperties).map(prop => ( + + + + {prop.label}: + + + + + {Array.isArray(prop.value) ? prop.value.join(", ") : prop.value} + + + + )) + } + + )} + + + + Available {serviceModel.moduleName === "http" ? "Resources" : "Functions"} + + + {serviceModel.moduleName === "http" && resources.length > 10 && ( + + )} + + {serviceModel.moduleName === "http" && ( + + {resources + .filter((resource) => { + const search = searchValue.toLowerCase(); + const nameMatch = resource.name && resource.name.toLowerCase().includes(search); + const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); + return nameMatch || iconMatch; + }) + .map((resource, index) => ( + + ))} + )} - {serviceModel && serviceModel.moduleName === "http" && !haveServiceTypeName && ( - - )} - - } - /> - - {!serviceModel && ( - - - - )} - {serviceModel && ( - <> - - {Object.keys(serviceModel.properties).map( - (key, index) => - serviceModel.properties[key].value && - serviceModel.properties[key].codedata.type !== "ANNOTATION_ATTACHMENT" && ( - - + {serviceModel.functions + .filter( + (functionModel) => functionModel.kind === "REMOTE" && functionModel.enabled + ) + .map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} /> - - {serviceModel.properties[key].metadata.label}: - - - {getAttributeComponent(serviceModel.properties[key])} - - - ) + ))} + + )} + {functionModel && functionModel.kind === "RESOURCE" && ( + + + + )} + {functionModel && functionModel.kind === "REMOTE" && ( + + + )} - {serviceModel.moduleName === "http" && - serviceModel.functions - .filter((func) => func.kind === "DEFAULT" && func.enabled) - .map((functionModel, index) => ( - - - - Constructor: - - - handleOpenDiagram(functionModel)} - > - {functionModel.name.value} - - - - ))} - - - - Available {serviceModel.moduleName === "http" ? "Resources" : "Functions"} - - - {serviceModel.moduleName === "http" && resources.length > 10 && ( - + {serviceModel?.moduleName !== "http" && ( + + + )} - - {serviceModel.moduleName === "http" && ( - - {resources - .filter((resource) => { - const search = searchValue.toLowerCase(); - const nameMatch = resource.name && resource.name.toLowerCase().includes(search); - const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); - return nameMatch || iconMatch; - }) - .map((resource, index) => ( - - ))} - - )} - {serviceModel.moduleName !== "http" && ( - - {serviceModel.functions - .filter( - (functionModel) => functionModel.kind === "REMOTE" && functionModel.enabled - ) - .map((functionModel, index) => ( - { }} - onEditResource={handleFunctionEdit} - onDeleteResource={handleFunctionDelete} - onResourceImplement={handleOpenDiagram} - /> - ))} - - )} + - )} - {functionModel && functionModel.kind === "RESOURCE" && ( - - - - )} - {functionModel && functionModel.kind === "REMOTE" && ( - - - - )} - - {serviceModel?.moduleName !== "http" && ( - - - - )} - + ) + } ); } From 3cceeb666c482acb8563595b26b46ff5e9dc0fe7 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 24 Sep 2025 00:11:33 +0530 Subject: [PATCH 053/730] Add dotted resource accordion --- .../components/ResourceAccordion.tsx | 72 +++++++++++++------ .../src/views/BI/ServiceDesigner/index.tsx | 37 +++++++--- 2 files changed, 77 insertions(+), 32 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx index 32e56cfa858..93e26b3d2aa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx @@ -29,6 +29,7 @@ type MethodProp = { type ContainerProps = { borderColor?: string; haveErrors?: boolean; + showDottedBorder?: boolean; }; type ButtonSectionProps = { @@ -47,7 +48,12 @@ const AccordionContainer = styled.div` background-color: var(--vscode-list-hoverBackground); cursor: pointer; } - border: ${(p: ContainerProps) => p.haveErrors ? "1px solid red" : "none"}; + border: ${(p: ContainerProps) => { + if (p.haveErrors) return "1px solid red"; + if (p.showDottedBorder) return "1px dashed var(--vscode-textSeparator-foreground)"; + return "none"; + }}; + opacity: ${(p: ContainerProps) => p.showDottedBorder ? 0.6 : 1}; `; const AccordionHeader = styled.div` @@ -158,10 +164,26 @@ export interface ResourceAccordionProps { onEditResource: (resource: FunctionModel) => void; onDeleteResource: (resource: FunctionModel) => void; onResourceImplement: (resource: FunctionModel) => void; + showDottedBorder?: boolean; + showEnableButton?: boolean; + showDeleteIcon?: boolean; + showEditIcon?: boolean; + onEnable?: (func: FunctionModel) => void; } export function ResourceAccordion(params: ResourceAccordionProps) { - const { functionModel, goToSource, onEditResource, onDeleteResource, onResourceImplement } = params; + const { + functionModel, + goToSource, + onEditResource, + onDeleteResource, + onResourceImplement, + showDottedBorder = false, + showEnableButton = false, + showDeleteIcon = true, + showEditIcon = true, + onEnable + } = params; const [isOpen, setIsOpen] = useState(false); const [isConfirmOpen, setConfirmOpen] = useState(false); @@ -200,35 +222,41 @@ export function ResourceAccordion(params: ResourceAccordionProps) { setConfirmEl(null); }; + const handleEnableFunction = (e: React.MouseEvent) => { + e.stopPropagation(); + if (onEnable) { + onEnable(functionModel); + } + }; + const handleResourceImplement = () => { onResourceImplement(functionModel) } return ( - + - - {functionModel.accessor?.value || functionModel.kind.toLowerCase()} - {functionModel.name.value} + - {functionModel.editable && - - <> - {onEditResource! && ( - - )} - {onDeleteResource! && ( - - )} - - - } + + {showEnableButton && ( + + )} + {functionModel.editable && showEditIcon && onEditResource && ( + + )} + {functionModel.editable && showDeleteIcon && onDeleteResource && ( + + )} + - - Available {serviceModel.moduleName === "http" ? "Resources" : "Functions"} - +
+ + {serviceModel.moduleName === "http" ? "Resource Functions" : "Trigger Functions"} + + + {serviceModel.moduleName === "http" ? "Resource functions to handle HTTP requests" : "Enable trigger functions to handle events"} + +
{serviceModel.moduleName === "http" && resources.length > 10 && ( )}
+ {/* Listing Resources in HTTP */} {serviceModel.moduleName === "http" && ( {resources @@ -615,12 +625,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { ))} )} + {/* Listing service type bound functions */} {serviceModel.moduleName !== "http" && ( {serviceModel.functions - .filter( - (functionModel) => functionModel.kind === "REMOTE" && functionModel.enabled - ) + .filter((functionModel) => functionModel.kind === "REMOTE") .map((functionModel, index) => ( { + const updatedFunc = { ...func, enabled: true }; + handleFunctionSubmit(updatedFunc); + }} /> ))} From 5ff5d3f335d1988b44ccb0469488183d80ee98a5 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Wed, 24 Sep 2025 10:26:21 +0530 Subject: [PATCH 054/730] Fix popup moves up when dragging the terminal issue --- .../src/components/Modal/index.tsx | 10 ++++++---- .../src/components/Popup/Form/index.tsx | 10 ++++++---- .../src/components/Popup/index.tsx | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Modal/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Modal/index.tsx index c0cc02e87de..9e05c2ea111 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Modal/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Modal/index.tsx @@ -46,17 +46,19 @@ const ModalContainer = styled.div` `; const ModalBox = styled.div<{ width?: number; height?: number }>` - width: ${({ width }: { width?: number }) => (width ? `${width}px` : 'auto')}; - height: ${({ height }: { height?: number }) => (height ? `${height}px` : 'auto')}; + width: ${({width}:{width:number}) => (width ? `${width}px` : 'auto')}; + height: ${({height}:{height:number}) => (height ? `${height}px` : 'auto')}; + max-width: 90vw; + max-height: 90vh; position: relative; display: flex; flex-direction: column; - overflow-y: hidden; + overflow: auto; padding: 16px; border-radius: 3px; background-color: ${ThemeColors.SURFACE_DIM}; box-shadow: 0 3px 8px rgb(0 0 0 / 0.2); - z-index: 30001; + z-index: 30001; `; const InvisibleButton = styled.button` diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Popup/Form/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Popup/Form/index.tsx index 35d24a63d37..14cd93e6175 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Popup/Form/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Popup/Form/index.tsx @@ -33,17 +33,19 @@ const PopupFormContainer = styled.div` `; const PopupFormBox = styled.div<{ width?: number; height?: number }>` - width: ${({ width }: { width?: number }) => (width ? `${width}px` : 'auto')}; - height: ${({ height }: { height?: number }) => (height ? `${height}px` : 'auto')}; + width: ${({width}:{width:number}) => (width ? `${width}px` : 'auto')}; + height: ${({height}:{height:number}) => (height ? `${height}px` : 'auto')}; + max-width: 90vw; + max-height: 90vh; position: relative; display: flex; flex-direction: column; - overflow-y: hidden; + overflow: auto; padding: 16px; border-radius: 3px; background-color: ${ThemeColors.SURFACE_DIM}; box-shadow: 0 3px 8px rgb(0 0 0 / 0.2); - z-index: 30001; + z-index: 30001; `; const PopupFormHeader = styled.header` diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx index f2aded9a4db..51239697844 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx @@ -33,7 +33,7 @@ const PopupContentContainer = styled.div` top: 0; left: 0; width: 100%; - height: 100%; + height: 100vh; z-index: 30000; display: flex; justify-content: center; From 75c608ca80ece1d733195fb3cf8ec78f98afdc9d Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Wed, 24 Sep 2025 11:09:41 +0530 Subject: [PATCH 055/730] Remove unnecessory css changes --- .../ballerina-visualizer/src/components/Popup/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx index 51239697844..f2aded9a4db 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Popup/index.tsx @@ -33,7 +33,7 @@ const PopupContentContainer = styled.div` top: 0; left: 0; width: 100%; - height: 100vh; + height: 100%; z-index: 30000; display: flex; justify-content: center; From fea5106a0da7ae6c40ae3f4b60706c7cd1ac29ca Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Wed, 24 Sep 2025 11:30:19 +0530 Subject: [PATCH 056/730] Add more improvements --- .../src/views/BI/ServiceDesigner/index.tsx | 432 ++++++++++++++++-- 1 file changed, 400 insertions(+), 32 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index c23636e4bbc..efc72968c24 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -30,8 +30,9 @@ import { DIRECTORY_MAP, ProjectStructureArtifactResponse, PropertyModel, + FieldType, } from "@wso2/ballerina-core"; -import { Button, Codicon, Icon, LinkButton, Typography, View, TextField } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon, LinkButton, Typography, View, TextField, DropdownButton } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { ResourceAccordion } from "./components/ResourceAccordion"; import { PanelContainer } from "@wso2/ballerina-side-panel"; @@ -43,7 +44,6 @@ import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { TitleBar } from "../../../components/TitleBar"; import { LoadingRing } from "../../../components/Loader"; import { ResourceAccordionV2 } from "./components/ResourceAccordionV2"; -import { set } from "lodash"; const LoadingContainer = styled.div` display: flex; @@ -159,6 +159,62 @@ const PropertyValue = styled.div` align-items: center; `; +// ServiceFieldsContainer and ServiceFieldsHeader are no longer needed as the table is now inside PropertiesSection + +const ServiceFieldsTable = styled.table` + width: 100%; + border-collapse: collapse; + background-color: var(--vscode-editor-background); +`; + +const TableHeader = styled.th` + padding: 12px 8px; + text-align: left; + border-bottom: 1px solid var(--vscode-editorIndentGuide-background); + background-color: var(--vscode-editorWidget-background); + font-weight: 500; +`; + +const TableRow = styled.tr` + border-bottom: 1px solid var(--vscode-editorIndentGuide-background); + + &:hover { + background-color: var(--vscode-list-hoverBackground); + } +`; + +const TableCell = styled.td` + padding: 12px 8px; +`; + +const ActionButtons = styled.div` + display: flex; + gap: 8px; + align-items: center; +`; + +const ActionButton = styled.button` + background: none; + border: none; + cursor: pointer; + padding: 6px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + color: var(--vscode-foreground); + transition: all 0.2s ease; + + &:hover { + background-color: var(--vscode-button-hoverBackground); + color: var(--vscode-button-foreground); + } + + &:active { + background-color: var(--vscode-button-background); + } +`; + interface ServiceDesignerProps { filePath: string; @@ -171,6 +227,13 @@ interface ReadonlyProperty { value: string | string[]; } +interface ServiceField { + name: string; + type: string; + isPrivate?: boolean; + isFinal?: boolean; +} + export function ServiceDesigner(props: ServiceDesignerProps) { const { filePath, position, serviceIdentifier } = props; const { rpcClient } = useRpcContext(); @@ -181,6 +244,8 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [isNew, setIsNew] = useState(false); const [showForm, setShowForm] = useState(false); const [showFunctionConfigForm, setShowFunctionConfigForm] = useState(false); + const [showInitFunctionForm, setShowInitFunctionForm] = useState(false); + const [showFieldForm, setShowFieldForm] = useState(false); const [projectListeners, setProjectListeners] = useState([]); const prevPosition = useRef(position); @@ -189,6 +254,8 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [listeners, setListeners] = useState([]); const [readonlyProperties, setReadonlyProperties] = useState>(new Set()); + const [serviceFields, setServiceFields] = useState([]); + const [isHttpService, setIsHttpService] = useState(false); useEffect(() => { if (!serviceModel || isPositionChanged(prevPosition.current, position)) { @@ -241,7 +308,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { } }); setReadonlyProperties(readonlyProps); + setIsHttpService(service.moduleName === "http"); } + + // Extract service fields if available (for service classes) + setServiceFields([{ name: "field1", type: "string" }, { name: "field2", type: "int" }]); } const getProjectListeners = () => { @@ -314,6 +385,30 @@ export function ServiceDesigner(props: ServiceDesignerProps) { setShowFunctionConfigForm(true); }; + const handleNewInitFunction = () => { + setIsNew(true); + setShowInitFunctionForm(true); + }; + + const handleNewField = () => { + setIsNew(true); + setShowFieldForm(true); + }; + + const handleAddDropdownOption = (option: string) => { + switch (option) { + case "reusable-function": + handleNewFunction(); + break; + case "init-function": + handleNewInitFunction(); + break; + case "field": + handleNewField(); + break; + } + }; + const handleNewFunctionClose = () => { setIsNew(false); setShowForm(false); @@ -412,6 +507,16 @@ export function ServiceDesigner(props: ServiceDesignerProps) { setShowFunctionConfigForm(false); }; + const handleInitFunctionClose = () => { + setIsNew(false); + setShowInitFunctionForm(false); + }; + + const handleFieldClose = () => { + setIsNew(false); + setShowFieldForm(false); + }; + const handleServiceTryIt = () => { const basePath = serviceModel.properties?.basePath?.value?.trim(); const listener = serviceModel.properties?.listener?.value?.trim(); @@ -428,6 +533,17 @@ export function ServiceDesigner(props: ServiceDesignerProps) { console.log("Add listener clicked"); }; + const handleFieldEdit = () => { + }; + + const handleFieldDelete = () => { + }; + + const handleAddServiceField = () => { + // TODO: Implement add service field functionality + console.log("Add service field clicked"); + }; + const findIcon = (label: string) => { label = label.toLowerCase(); switch (true) { @@ -494,27 +610,110 @@ export function ServiceDesigner(props: ServiceDesignerProps) { - {serviceModel && serviceModel.moduleName === "http" && ( - - )} - {serviceModel && serviceModel.moduleName === "http" && ( - - )} - {serviceModel && - serviceModel.moduleName !== "http" && - serviceModel.functions.some((func) => !func.enabled) && ( - - )} - {serviceModel && serviceModel.moduleName === "http" && !haveServiceTypeName && ( - + { + serviceModel && isHttpService && ( + <> + + + { + !haveServiceTypeName && ( + + ) + } + + ) + } + {serviceModel && !isHttpService && ( +
+ + + Add + + } + selecteOption="reusable-function" + tooltip="Add Function or Fields" + dropDownAlign="bottom" + buttonSx={{ + appearance: 'none', + backgroundColor: 'var(--vscode-button-background)', + color: 'var(--vscode-button-foreground)', + '&:hover': { + backgroundColor: 'var(--vscode-button-hoverBackground)', + } + }} + optionButtonSx={{ + backgroundColor: 'var(--vscode-button-background)', + borderColor: 'var(--vscode-button-border)', + '&:hover': { + backgroundColor: 'var(--vscode-button-hoverBackground)', + } + }} + dropdownSx={{ + zIndex: 9999, + boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)', + border: '1px solid var(--vscode-dropdown-border)', + backgroundColor: 'var(--vscode-dropdown-background)', + minWidth: '280px', + position: 'absolute', + right: '0', + left: 'auto' + }} + onOptionChange={handleAddDropdownOption} + onClick={() => {}} + options={[ + { + content: ( +
+ +
+ Add Reusable Function + + Create a new reusable function + +
+
+ ), + value: "reusable-function", + }, + { + content: ( +
+ +
+ Add Init Function + + Create an initialization function + +
+
+ ), + value: "init-function", + }, + { + content: ( +
+ +
+ Add Field + + Add a new service field + +
+
+ ), + value: "field", + } + ]} + /> +
)} } @@ -578,6 +777,64 @@ export function ServiceDesigner(props: ServiceDesignerProps) { )) } + + {/* Service Fields Table */} + {serviceFields.length > 0 && ( +
+
+
+ + Service Fields + + + Fields defined in the service class + +
+
+ + + + + Type + Field Name + Actions + + + + {serviceFields.map((field, index) => ( + + + + {field.type} + + + + + {field.name} + + + + + handleFieldEdit()} + title="Edit Field" + > + + + handleFieldDelete()} + title="Delete Field" + > + + + + + + ))} + + +
+ )} )} @@ -588,23 +845,21 @@ export function ServiceDesigner(props: ServiceDesignerProps) { variant="h3" sx={{ marginLeft: 10, fontWeight: 'bold' }} > - {serviceModel.moduleName === "http" ? "Resource Functions" : "Trigger Functions"} + {isHttpService ? "Resource Functions" : "Trigger Functions"} - - {serviceModel.moduleName === "http" ? "Resource functions to handle HTTP requests" : "Enable trigger functions to handle events"} + {isHttpService ? "Resource functions to handle HTTP requests" : "Enable trigger functions to handle events"} - {serviceModel.moduleName === "http" && resources.length > 10 && ( + {isHttpService && resources.length > 10 && ( )} {/* Listing Resources in HTTP */} - {serviceModel.moduleName === "http" && ( + {isHttpService && ( {resources .filter((resource) => { @@ -626,7 +881,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { )} {/* Listing service type bound functions */} - {serviceModel.moduleName !== "http" && ( + {!isHttpService && ( {serviceModel.functions .filter((functionModel) => functionModel.kind === "REMOTE") @@ -650,6 +905,52 @@ export function ServiceDesigner(props: ServiceDesignerProps) { ))} )} + + +
+ + Functions + + + Reusable functions within the service + +
+
+ {/* Listing service type bound functions */} + {( + + {serviceModel.functions + .filter((functionModel) => functionModel.kind === "DEFAULT") + .map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + showDottedBorder={!functionModel.enabled} + showEnableButton={!functionModel.enabled} + showDeleteIcon={functionModel.enabled} + showEditIcon={functionModel.enabled} + onEnable={(func: FunctionModel) => { + const updatedFunc = { ...func, enabled: true }; + handleFunctionSubmit(updatedFunc); + }} + /> + ))} + + )} + + {functionModel && functionModel.kind === "RESOURCE" && ( )} + {functionModel && functionModel.kind === "REMOTE" && ( )} - {serviceModel?.moduleName !== "http" && ( + {serviceModel && !isHttpService && ( )} + + {/* Init Function Form Panel */} + {serviceModel && !isHttpService && ( + +
+ + Configure the initialization function for your service + +
+ + +
+
+
+ )} + + {/* Field Form Panel */} + {serviceModel && !isHttpService && ( + +
+ + Add a new field to your service + +
+ + +
+
+ + +
+
+
+ )} ) From 82d4f45620236bda1d7fcf02e95976313fb31e10 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Thu, 25 Sep 2025 11:27:07 +0530 Subject: [PATCH 057/730] Improve http service designer --- .../components/ResourceAccordionV2.tsx | 115 +++-- .../src/views/BI/ServiceDesigner/index.tsx | 398 ++++++++++-------- 2 files changed, 304 insertions(+), 209 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx index f81f0f17b23..24687ebc42b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx @@ -30,6 +30,7 @@ type MethodProp = { type ContainerProps = { borderColor?: string; haveErrors?: boolean; + isPlaceholder?: boolean; }; type ButtonSectionProps = { @@ -44,11 +45,17 @@ const AccordionContainer = styled.div` margin-top: 10px; overflow: hidden; background-color: var(--vscode-editorHoverWidget-background); + border: ${(p: ContainerProps) => + p.haveErrors + ? "1px solid red" + : p.isPlaceholder + ? "2px dashed var(--vscode-inputOption-activeBorder)" + : "none" + }; &:hover { background-color: var(--vscode-list-hoverBackground); cursor: pointer; } - border: ${(p: ContainerProps) => p.haveErrors ? "1px solid red" : "none"}; `; const AccordionHeader = styled.div` @@ -94,9 +101,11 @@ const MethodBox = styled.div` font-weight: bold; `; -const MethodSection = styled.div` +const MethodSection = styled.div<{ isPlaceholder?: boolean }>` display: flex; gap: 4px; + align-items: center; + justify-content: ${(p: { isPlaceholder?: boolean }) => p.isPlaceholder ? 'center' : 'flex-start'}; `; const verticalIconStyles = { @@ -139,10 +148,11 @@ export interface ResourceAccordionPropsV2 { onDeleteResource: (resource: FunctionModel) => void; onResourceImplement: (resource: FunctionModel) => void; readOnly?: boolean; + isPlaceholder?: boolean; } export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { - const { resource, onEditResource, onDeleteResource, onResourceImplement, readOnly } = params; + const { resource, onEditResource, onDeleteResource, onResourceImplement, readOnly, isPlaceholder } = params; const [isOpen, setIsOpen] = useState(false); const [isConfirmOpen, setConfirmOpen] = useState(false); @@ -168,6 +178,13 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { const handleEditResource = async (e: React.MouseEvent) => { e.stopPropagation(); // Stop the event propagation + + // If it's a placeholder, just call the handler directly + if (isPlaceholder) { + onEditResource(null); + return; + } + const functionModel = await getFunctionModel(); onEditResource(functionModel.function); }; @@ -192,6 +209,12 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { }; const handleResourceImplement = async () => { + // If it's a placeholder, just call the handler directly + if (isPlaceholder) { + onResourceImplement(null); + return; + } + const functionModel = await getFunctionModel(); onResourceImplement(functionModel.function); } @@ -218,48 +241,60 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { } return ( - + - - - {resource.icon.split("-")[0].toUpperCase()} - - {resource.name} + + {isPlaceholder ? ( + <> + + Add new resource + + ) : ( + <> + + {resource.icon.split("-")[0].toUpperCase()} + + {resource.name} + + )} - <> - - - + {!isPlaceholder && ( + <> + + + + )} - - + {!isPlaceholder && ( + + )} ); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index efc72968c24..7d5ad8f39ac 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -68,6 +68,9 @@ const InfoSection = styled.div` const ServiceContainer = styled.div` padding-right: 10px; padding-left: 10px; + flex-grow: 1; + overflow-y: auto; + height: 0; /* This forces the flex item to use available space */ `; const FunctionsContainer = styled.div` @@ -256,6 +259,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [readonlyProperties, setReadonlyProperties] = useState>(new Set()); const [serviceFields, setServiceFields] = useState([]); const [isHttpService, setIsHttpService] = useState(false); + const [objectMethods, setObjectMethods] = useState([]); useEffect(() => { if (!serviceModel || isPositionChanged(prevPosition.current, position)) { @@ -312,7 +316,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { } // Extract service fields if available (for service classes) - setServiceFields([{ name: "field1", type: "string" }, { name: "field2", type: "int" }]); + // setServiceFields([{ name: "field1", type: "string" }, { name: "field2", type: "int" }]); + + // Extract object methods if available (for service classes) + const objectMethods = service.functions.filter((func) => func.kind === "DEFAULT"); + setObjectMethods(objectMethods); } const getProjectListeners = () => { @@ -619,17 +627,17 @@ export function ServiceDesigner(props: ServiceDesignerProps) { - { + {/* { !haveServiceTypeName && ( ) - } + } */} ) } - {serviceModel && !isHttpService && ( + {serviceModel && (
{}} + onClick={() => { }} options={[ { content: ( @@ -777,177 +789,225 @@ export function ServiceDesigner(props: ServiceDesignerProps) { )) } - - {/* Service Fields Table */} - {serviceFields.length > 0 && ( -
-
-
- - Service Fields - - - Fields defined in the service class - -
-
- - - - - Type - Field Name - Actions - - - - {serviceFields.map((field, index) => ( - - - - {field.type} - - - - - {field.name} - - - - - handleFieldEdit()} - title="Edit Field" - > - - - handleFieldDelete()} - title="Delete Field" - > - - - - - - ))} - - -
- )} )} - -
- - {isHttpService ? "Resource Functions" : "Trigger Functions"} - - - {isHttpService ? "Resource functions to handle HTTP requests" : "Enable trigger functions to handle events"} - -
- - {isHttpService && resources.length > 10 && ( - - )} -
{/* Listing Resources in HTTP */} {isHttpService && ( - - {resources - .filter((resource) => { - const search = searchValue.toLowerCase(); - const nameMatch = resource.name && resource.name.toLowerCase().includes(search); - const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); - return nameMatch || iconMatch; - }) - .map((resource, index) => ( + <> + +
+ + Resource Functions + + + Resource functions to handle HTTP requests + +
+ +
+ {resources.length > 10 && ( + + )} + {/* {!haveServiceTypeName && ( + + )} */} +
+
+ + {/* Add Resource Function - Dotted Accordion */} + {!haveServiceTypeName && ( handleNewResourceFunction()} + onDeleteResource={() => { }} + onResourceImplement={() => handleNewResourceFunction()} /> - ))} - + )} + {resources + .filter((resource) => { + const search = searchValue.toLowerCase(); + const nameMatch = resource.name && resource.name.toLowerCase().includes(search); + const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); + return nameMatch || iconMatch; + }) + .map((resource, index) => ( + + ))} +
+ )} {/* Listing service type bound functions */} {!isHttpService && ( - - {serviceModel.functions - .filter((functionModel) => functionModel.kind === "REMOTE") - .map((functionModel, index) => ( - { }} - onEditResource={handleFunctionEdit} - onDeleteResource={handleFunctionDelete} - onResourceImplement={handleOpenDiagram} - showDottedBorder={!functionModel.enabled} - showEnableButton={!functionModel.enabled} - showDeleteIcon={functionModel.enabled} - showEditIcon={functionModel.enabled} - onEnable={(func: FunctionModel) => { - const updatedFunc = { ...func, enabled: true }; - handleFunctionSubmit(updatedFunc); - }} - /> - ))} - + <> + +
+ Trigger Functions + + + Enable trigger functions to handle events + +
+
+ + {serviceModel.functions + .filter((functionModel) => functionModel.kind === "REMOTE") + .map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + showDottedBorder={!functionModel.enabled} + showEnableButton={!functionModel.enabled} + showDeleteIcon={functionModel.enabled} + showEditIcon={functionModel.enabled} + onEnable={(func: FunctionModel) => { + const updatedFunc = { ...func, enabled: true }; + handleFunctionSubmit(updatedFunc); + }} + /> + ))} + + )} - -
- - Functions - - - Reusable functions within the service - -
-
{/* Listing service type bound functions */} - {( - - {serviceModel.functions - .filter((functionModel) => functionModel.kind === "DEFAULT") - .map((functionModel, index) => ( - { }} - onEditResource={handleFunctionEdit} - onDeleteResource={handleFunctionDelete} - onResourceImplement={handleOpenDiagram} - showDottedBorder={!functionModel.enabled} - showEnableButton={!functionModel.enabled} - showDeleteIcon={functionModel.enabled} - showEditIcon={functionModel.enabled} - onEnable={(func: FunctionModel) => { - const updatedFunc = { ...func, enabled: true }; - handleFunctionSubmit(updatedFunc); - }} - /> - ))} - + {(objectMethods.length > 0 && ( + <> + +
+ + Functions + + + Reusable functions within the service + +
+
+ + {serviceModel.functions + .filter((functionModel) => functionModel.kind === "DEFAULT") + .map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + showDottedBorder={!functionModel.enabled} + showEnableButton={!functionModel.enabled} + showDeleteIcon={functionModel.enabled} + showEditIcon={functionModel.enabled} + onEnable={(func: FunctionModel) => { + const updatedFunc = { ...func, enabled: true }; + handleFunctionSubmit(updatedFunc); + }} + /> + ))} + + + ))} + + {/* Service Fields Section */} + {serviceFields.length > 0 && ( +
+
+ + Service Fields + + + Fields defined in the service class + +
+ + + + + Type + Field Name + Actions + + + + {serviceFields.map((field, index) => ( + + + + {field.type} + + + + + {field.name} + + + + + handleFieldEdit()} + title="Edit Field" + > + + + handleFieldDelete()} + title="Delete Field" + > + + + + + + ))} + + +
)} @@ -1038,12 +1098,12 @@ export function ServiceDesigner(props: ServiceDesignerProps) { Add a new field to your service
- -
From 0fb3e817857f9dee945906c66230ce31e9057d52 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 25 Sep 2025 16:53:46 +0530 Subject: [PATCH 058/730] Without the operation form thing --- .../ballerina-core/src/interfaces/bi.ts | 1 + .../ballerina-core/src/state-machine-types.ts | 3 +- .../ballerina-visualizer/src/MainPanel.tsx | 4 + .../src/views/BI/DiagramWrapper/index.tsx | 53 +++++- .../src/views/BI/FlowDiagram/index.tsx | 11 +- .../src/views/BI/FocusFlowDiagram/index.tsx | 13 +- .../src/views/BI/SequenceDiagram/index.tsx | 8 +- .../BI/ServiceFunctionForm/Paramters.tsx | 159 ++++++++++++++++ .../views/BI/ServiceFunctionForm/index.tsx | 175 ++++++++++++++++++ 9 files changed, 408 insertions(+), 19 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index cd33eece8cc..ea79d4976cc 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -97,6 +97,7 @@ export type ParentMetadata = { accessor?: string; parameters?: string[]; return?: string; + isServiceFunction?: boolean; }; export type ToolData = { diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index fda4f8b21e5..f0df585d30a 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -96,7 +96,8 @@ export enum MACHINE_VIEW { BIDataMapperForm = "Add Data Mapper SKIP", AIAgentDesigner = "AI Agent Designer", AIChatAgentWizard = "AI Chat Agent Wizard", - ResolveMissingDependencies = "Resolve Missing Dependencies" + ResolveMissingDependencies = "Resolve Missing Dependencies", + ServiceFunctionForm = "Service Function Form " } export interface MachineEvent { diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index e49c9d45a17..8bb367761af 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -77,6 +77,7 @@ import { VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react"; import { DataMapper } from "./views/DataMapper"; import { ImportIntegration } from "./views/BI/ImportIntegration"; import Popup from "./components/Popup"; +import { ServiceFunctionForm } from "./views/BI/ServiceFunctionForm"; const globalStyles = css` *, @@ -527,6 +528,9 @@ const MainPanel = () => { /> ); break; + case MACHINE_VIEW.ServiceFunctionForm: + setViewComponent(); + break; default: setNavActive(false); setViewComponent(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 81ba9dcdd6d..69cdc4ec7ea 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -24,7 +24,7 @@ import { BISequenceDiagram } from "../SequenceDiagram"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { TitleBar } from "../../../components/TitleBar"; -import { EVENT_TYPE, FOCUS_FLOW_DIAGRAM_VIEW, FocusFlowDiagramView, ParentMetadata } from "@wso2/ballerina-core"; +import { EVENT_TYPE, FOCUS_FLOW_DIAGRAM_VIEW, FocusFlowDiagramView, ParentMetadata, NodePosition } from "@wso2/ballerina-core"; import { VisualizerLocation } from "@wso2/ballerina-core"; import { MACHINE_VIEW } from "@wso2/ballerina-core"; import styled from "@emotion/styled"; @@ -178,6 +178,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { const [basePath, setBasePath] = useState(""); const [listener, setListener] = useState(""); const [parentMetadata, setParentMetadata] = useState(); + const [currentPosition, setCurrentPosition] = useState(); useEffect(() => { rpcClient.getVisualizerLocation().then((location) => { @@ -232,7 +233,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { setLoadingDiagram(true); }; - const handleReadyDiagram = (fileName?: string, parentMetadata?: ParentMetadata) => { + const handleReadyDiagram = (fileName?: string, parentMetadata?: ParentMetadata, position?: NodePosition) => { setLoadingDiagram(false); if (fileName) { setFileName(fileName); @@ -240,22 +241,62 @@ export function DiagramWrapper(param: DiagramWrapperProps) { if (parentMetadata) { setParentMetadata(parentMetadata); } + if (position) { + setCurrentPosition(position); + } }; - const handleEdit = (fileUri?: string) => { + const handleEdit = async (fileUri?: string, position?: NodePosition) => { + // Get CodeData using the current position instead of flow model + let functionCodeData: any = undefined; + + if (position || currentPosition) { + try { + // Get the flow model to extract CodeData + const flowModelResponse = await rpcClient.getBIDiagramRpcClient().getFlowModel(); + if (flowModelResponse?.flowModel?.nodes) { + // Find the function definition node or EVENT_START node that contains the CodeData + const functionNode = flowModelResponse.flowModel.nodes.find(node => + node.codedata.node === "EVENT_START" || + node.codedata.node === "FUNCTION_DEFINITION" + ); + if (functionNode) { + functionCodeData = functionNode.codedata; + } + } + } catch (error) { + console.error("Error getting flow model for edit:", error); + } + } + const context: VisualizerLocation = { view: view === FOCUS_FLOW_DIAGRAM_VIEW.NP_FUNCTION ? MACHINE_VIEW.BINPFunctionForm - : MACHINE_VIEW.BIFunctionForm, + : parentMetadata?.isServiceFunction ? + MACHINE_VIEW.ServiceFunctionForm : MACHINE_VIEW.BIFunctionForm, identifier: parentMetadata?.label || "", documentUri: fileUri, + dataMapperMetadata: functionCodeData ? { + name: parentMetadata?.label || "Function", + codeData: { + lineRange: { + fileName: fileUri || "", + startLine: { + line: position?.startLine || currentPosition?.startLine || 0, + offset: position?.startColumn || currentPosition?.startColumn || 0, + }, + endLine: { + line: position?.endLine || currentPosition?.endLine || 0, + offset: position?.endColumn || currentPosition?.endColumn || 0, + }, + }, + } } : undefined, }; rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); }; let isAutomation = parentMetadata?.kind === "Function" && parentMetadata?.label === "main"; - let isFunction = parentMetadata?.kind === "Function" && parentMetadata?.label !== "main"; let isResource = parentMetadata?.kind === "Resource"; let isRemote = parentMetadata?.kind === "Remote Function"; let isAgent = parentMetadata?.kind === "AI Chat Agent" && parentMetadata?.label === "chat"; @@ -336,7 +377,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { if (parentMetadata && !isResource && !isRemote) { return ( - handleEdit(fileName)}> + handleEdit(fileName, currentPosition)}> Edit diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 6bdd13e1fc1..f984fdcddc8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -85,7 +85,7 @@ export interface BIFlowDiagramProps { breakpointState?: boolean; syntaxTree?: STNode; onUpdate: () => void; - onReady: (fileName: string, parentMetadata?: ParentMetadata) => void; + onReady: (fileName: string, parentMetadata?: ParentMetadata, position?: NodePosition) => void; onSave?: () => void; } @@ -474,7 +474,12 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const parentMetadata = model.flowModel.nodes.find( (node) => node.codedata.node === "EVENT_START" )?.metadata.data as ParentMetadata | undefined; - onReady(model.flowModel.fileName, parentMetadata); + + // Get visualizer location and pass position to onReady + rpcClient.getVisualizerLocation().then((location: VisualizerLocation) => { + console.log(">>> Visualizer location", location?.position); + onReady(model.flowModel.fileName, parentMetadata, location?.position); + }); if (shouldUpdateLineRangeRef.current) { const varName = typeof updatedNodeRef.current?.properties?.variable?.value === "string" ? updatedNodeRef.current.properties.variable.value @@ -489,7 +494,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }) .finally(() => { setShowProgressIndicator(false); - onReady(undefined); + onReady(undefined, undefined, undefined); }); }); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 3aa089e4854..cc511f1e630 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -42,7 +42,8 @@ import { TriggerCharacter, TextEdit, ParentMetadata, - UpdatedArtifactsResponse + UpdatedArtifactsResponse, + NodePosition } from "@wso2/ballerina-core"; import { PanelContainer } from "@wso2/ballerina-side-panel"; import { ConnectionConfig, ConnectionCreator, ConnectionSelectionList } from "../../../components/ConnectionSelector"; @@ -56,7 +57,6 @@ import { updateLineRange, } from "../../../utils/bi"; import { getNodeTemplateForConnection } from "../FlowDiagram/utils"; -import { NodePosition } from "@wso2/syntax-tree"; import { View, ProgressRing, ProgressIndicator, ThemeColors, CompletionItem } from "@wso2/ui-toolkit"; import { EXPRESSION_EXTRACTION_REGEX } from "../../../constants"; import { ConnectionKind } from "../../../components/ConnectionSelector"; @@ -78,7 +78,7 @@ export interface BIFocusFlowDiagramProps { projectPath: string; filePath: string; onUpdate: () => void; - onReady: (fileName: string, parentMetadata?: ParentMetadata) => void; + onReady: (fileName: string, parentMetadata?: ParentMetadata, position?: NodePosition) => void; } export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { @@ -164,13 +164,16 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { const parentMetadata = model.flowModel.nodes.find( (node) => node.codedata.node === "EVENT_START" )?.metadata.data as ParentMetadata | undefined; - onReady(model.flowModel.fileName, parentMetadata); + // Get visualizer location and pass position to onReady + rpcClient.getVisualizerLocation().then((location: VisualizerLocation) => { + onReady(model.flowModel.fileName, parentMetadata, location?.position); + }); } } }) .finally(() => { setShowProgressIndicator(false); - onReady(undefined); + onReady(undefined, undefined, undefined); }); }); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx index 8b9ad905a80..f7b6026d538 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx @@ -18,7 +18,7 @@ import React, { useEffect, useState } from "react"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { SqFlow } from "@wso2/ballerina-core"; +import { SqFlow, ParentMetadata, NodePosition } from "@wso2/ballerina-core"; import { Diagram } from "@wso2/sequence-diagram"; import styled from "@emotion/styled"; import { ThemeColors } from "@wso2/ui-toolkit"; @@ -51,7 +51,7 @@ const MessageContainer = styled.div({ interface BISequenceDiagramProps { onUpdate: () => void; - onReady: () => void; + onReady: (fileName?: string, parentMetadata?: ParentMetadata, position?: NodePosition) => void; } export function BISequenceDiagram(props: BISequenceDiagramProps) { @@ -82,7 +82,7 @@ export function BISequenceDiagram(props: BISequenceDiagramProps) { // TODO: handle SequenceModelDiagnostic }) .finally(() => { - // onReady(); + // onReady(undefined, undefined, undefined); }); }; @@ -97,7 +97,7 @@ export function BISequenceDiagram(props: BISequenceDiagramProps) { model={flowModel} onClickParticipant={() => {}} onAddParticipant={() => {}} - onReady={onReady} + onReady={() => onReady(undefined, undefined, undefined)} /> )} {!flowModel && Loading sequence diagram ...} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx new file mode 100644 index 00000000000..56195438f41 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx @@ -0,0 +1,159 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useEffect } from 'react'; +import { Typography, Codicon, LinkButton } from '@wso2/ui-toolkit'; +import styled from '@emotion/styled'; +import { ParameterModel } from '@wso2/ballerina-core'; + +const FormContainer = styled.div` + margin-bottom: 16px; +`; + +const ParameterItem = styled.div` + display: flex; + align-items: center; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + margin-bottom: 8px; + overflow: hidden; +`; + +const ParameterName = styled.div` + flex: 1; + background: var(--vscode-input-background); + color: #FFFFFF; + padding: 8px 12px; + font-weight: 500; + min-width: 60px; + text-align: center; + display: flex; + align-items: center; + justify-content: left; +`; + +const ParameterType = styled.div` + padding: 8px 12px; + color: var(--vscode-foreground); + background: var(--vscode-inputValidation-infoBackground); +`; + +const ActionIcons = styled.div` + display: flex; + align-items: center; + gap: 4px; + padding: 4px 8px; +`; + +const IconButton = styled.button` + background: transparent; + border: none; + cursor: pointer; + padding: 4px; + border-radius: 2px; + color: var(--vscode-foreground); + + &:hover { + background: var(--vscode-toolbar-hoverBackground); + } +`; + +const AddButtonWrapper = styled.div` + margin: 8px 0; +`; + +export interface ParametersProps { + functionNode?: { + parameters?: ParameterModel[]; + }; +} + +interface ParameterDisplay { + type: string; + name: string; +} + +export function Parameters(props: ParametersProps) { + const { functionNode } = props; + const [parameters, setParameters] = useState([]); + + useEffect(() => { + if (functionNode?.parameters) { + const parameterData = functionNode.parameters.map(param => ({ + type: param.type?.value || 'unknown', + name: param.name?.value || 'unnamed' + })); + setParameters(parameterData); + } + }, [functionNode]); + + const handleEdit = (param: ParameterDisplay) => { + console.log('Edit parameter:', param); + }; + + const handleDelete = (param: ParameterDisplay) => { + console.log('Delete parameter:', param); + }; + + const handleAddParameter = () => { + console.log('Add new parameter'); + }; + + return ( + + + Parameters + + + {parameters.length === 0 ? ( + + No parameters defined + + ) : ( +
+ {parameters.map((param, index) => ( + + + {param.type} + + + {param.name} + + + handleEdit(param)}> + + + handleDelete(param)}> + + + + + ))} +
+ )} + + + + + Add Parameter + + +
+ ); +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx new file mode 100644 index 00000000000..6c7afd2eb52 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -0,0 +1,175 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useEffect, useState } from 'react'; +import { ActionButtons, View, ViewContent } from '@wso2/ui-toolkit'; +import styled from '@emotion/styled'; +import { FunctionModel, VisualizerLocation } from '@wso2/ballerina-core'; +import { LoadingContainer } from '../ComponentListView/styles'; +import { LoadingRing } from '../../../components/Loader'; +import { FormHeader } from '../../../components/FormHeader'; +import { TopNavigationBar } from '../../../components/TopNavigationBar'; +import { TitleBar } from '../../../components/TitleBar'; +import { BodyText } from '../../styles'; +import { useRpcContext } from '@wso2/ballerina-rpc-client'; +import { Parameters } from './Paramters'; +import { FunctionName } from '../ServiceDesigner/Forms/FunctionForm/FunctionName/FunctionName'; +import { FunctionReturn } from '../ServiceDesigner/Forms/FunctionForm/Return/FunctionReturn'; + +const FormContainer = styled.div` + display: flex; + flex-direction: column; + max-width: 600px; + gap: 20px; + padding: 20px; +`; + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 10px; +`; + +const SaveButtonContainer = styled.div` + margin-top: 24px; + padding-top: 16px; + border-top: 1px solid var(--vscode-panel-border); +`; + +export interface ResourceFormProps { + // model: FunctionModel; + // isSaving: boolean; + // onSave: (functionModel: FunctionModel) => void; + // onClose: () => void; +} + +export function ServiceFunctionForm(props: ResourceFormProps) { + console.log('>>> ServiceFunctionForm - Component rendered', props); + + const { rpcClient } = useRpcContext(); + console.log('>>> ServiceFunctionForm - rpcClient from context:', rpcClient); + + const [functionNode, setFunctionNode] = useState(undefined); + const [saving, setSaving] = useState(false); + const [isLoading, setIsLoading] = useState(false); + + const handleClosePopup = () => { + // Close the popup - implement your close logic here + console.log('Closing ServiceFunctionForm'); + }; + + const handleSave = async () => { + setSaving(true); + try { + // TODO: Implement save functionality + console.log('Saving function:', functionNode); + // Add your save logic here + } catch (error) { + console.error('Error saving function:', error); + } finally { + setSaving(false); + } + }; + + // Load project components and structure + useEffect(() => { + console.log('>>> ServiceFunctionForm - useEffect triggered'); + console.log('>>> ServiceFunctionForm - rpcClient:', rpcClient); + + const loadProjectData = async () => { + setIsLoading(true); + try { + const location: VisualizerLocation = await rpcClient.getVisualizerLocation(); + + console.log('>>> ServiceFunctionForm - Retrieved location:', location); + + // Check if we have CodeData from the flow diagram + if (location.dataMapperMetadata?.codeData) { + const codeData = location.dataMapperMetadata.codeData; + console.log('>>> ServiceFunctionForm - Found CodeData from flow diagram:', codeData); + + const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ + filePath: location.documentUri , + codedata: codeData + }); + setFunctionNode(functionModel.function); + console.log('>>> ServiceFunctionForm - Retrieved function model from source:', functionModel); + } + } catch (error) { + console.error('>>> ServiceFunctionForm - Error loading project data:', error); + } finally { + setIsLoading(false); + } + }; + + if (rpcClient) { + loadProjectData(); + } else { + console.error('>>> ServiceFunctionForm - rpcClient is not available'); + } + }, [rpcClient]); + + const functionName = functionNode?.name ? functionNode.name.value : ""; + + return ( + + + + + + + {isLoading && ( + + + + )} + {functionNode && ( + + { }} readonly={true} /> + + { }} readonly={false} /> + + + + + )} + {!functionNode && !isLoading && ( + No function data available to display. + )} + + + + ); +} From e0c9dbc6592529767d9015bc1f7bb7234baa24b3 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 25 Sep 2025 17:27:34 +0530 Subject: [PATCH 059/730] Add operation form --- .../views/BI/ServiceFunctionForm/index.tsx | 342 ++++++++++++++---- workspaces/bi/bi-extension/package.json | 2 +- workspaces/bi/bi-extension/webpack.config.js | 4 +- 3 files changed, 267 insertions(+), 81 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index 6c7afd2eb52..032b0e30307 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -20,38 +20,10 @@ import { useEffect, useState } from 'react'; import { ActionButtons, View, ViewContent } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; -import { FunctionModel, VisualizerLocation } from '@wso2/ballerina-core'; -import { LoadingContainer } from '../ComponentListView/styles'; -import { LoadingRing } from '../../../components/Loader'; -import { FormHeader } from '../../../components/FormHeader'; -import { TopNavigationBar } from '../../../components/TopNavigationBar'; -import { TitleBar } from '../../../components/TitleBar'; -import { BodyText } from '../../styles'; +import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; -import { Parameters } from './Paramters'; -import { FunctionName } from '../ServiceDesigner/Forms/FunctionForm/FunctionName/FunctionName'; -import { FunctionReturn } from '../ServiceDesigner/Forms/FunctionForm/Return/FunctionReturn'; - -const FormContainer = styled.div` - display: flex; - flex-direction: column; - max-width: 600px; - gap: 20px; - padding: 20px; -`; - -const Container = styled.div` - display: flex; - flex-direction: column; - gap: 10px; -`; - -const SaveButtonContainer = styled.div` - margin-top: 24px; - padding-top: 16px; - border-top: 1px solid var(--vscode-panel-border); -`; - +import { FormField, FormImports, FormValues, Parameter } from '@wso2/ballerina-side-panel'; +import { FormGeneratorNew } from '../Forms/FormGeneratorNew'; export interface ResourceFormProps { // model: FunctionModel; // isSaving: boolean; @@ -65,10 +37,32 @@ export function ServiceFunctionForm(props: ResourceFormProps) { const { rpcClient } = useRpcContext(); console.log('>>> ServiceFunctionForm - rpcClient from context:', rpcClient); - const [functionNode, setFunctionNode] = useState(undefined); + const [model, setFunctionModel] = useState(null); const [saving, setSaving] = useState(false); const [isLoading, setIsLoading] = useState(false); + const [fields, setFields] = useState([]); + const [location, setLocation] = useState(null); + const [recordTypeFields, setRecordTypeFields] = useState([]); + + const handleParamChange = (param: Parameter) => { + const name = `${param.formValues['variable']}`; + const type = `${param.formValues['type']}`; + const hasDefaultValue = Object.keys(param.formValues).includes('defaultable') && + param.formValues['defaultable'] !== undefined && + param.formValues['defaultable'] !== ''; + const defaultValue = hasDefaultValue ? `${param.formValues['defaultable']}`.trim() : ''; + let value = `${type} ${name}`; + if (defaultValue) { + value += ` = ${defaultValue}`; + } + return { + ...param, + key: name, + value: value + } + }; + const handleClosePopup = () => { // Close the popup - implement your close logic here console.log('Closing ServiceFunctionForm'); @@ -78,7 +72,7 @@ export function ServiceFunctionForm(props: ResourceFormProps) { setSaving(true); try { // TODO: Implement save functionality - console.log('Saving function:', functionNode); + console.log('Saving function:', model); // Add your save logic here } catch (error) { console.error('Error saving function:', error); @@ -96,7 +90,7 @@ export function ServiceFunctionForm(props: ResourceFormProps) { setIsLoading(true); try { const location: VisualizerLocation = await rpcClient.getVisualizerLocation(); - + setLocation(location); console.log('>>> ServiceFunctionForm - Retrieved location:', location); // Check if we have CodeData from the flow diagram @@ -108,7 +102,7 @@ export function ServiceFunctionForm(props: ResourceFormProps) { filePath: location.documentUri , codedata: codeData }); - setFunctionNode(functionModel.function); + setFunctionModel(functionModel.function); console.log('>>> ServiceFunctionForm - Retrieved function model from source:', functionModel); } } catch (error) { @@ -125,51 +119,243 @@ export function ServiceFunctionForm(props: ResourceFormProps) { } }, [rpcClient]); - const functionName = functionNode?.name ? functionNode.name.value : ""; + if (model?.properties) { + const recordTypeFields: RecordTypeField[] = Object.entries(model?.properties) + .filter(([_, property]) => + property.typeMembers && + property.typeMembers.some((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") + ) + .map(([key, property]) => ({ + key, + property: { + ...property, + metadata: { + label: property.metadata?.label || key, + description: property.metadata?.description || '' + }, + valueType: property?.valueType || 'string', + diagnostics: { + hasDiagnostics: property.diagnostics && property.diagnostics.length > 0, + diagnostics: property.diagnostics + } + } as Property, + recordTypeMembers: property.typeMembers.filter((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") + })); + console.log(">>> recordTypeFields of model.advanceProperties", recordTypeFields); + + setRecordTypeFields(recordTypeFields); + } + + + const getFunctionParametersList = (params: Parameter[]) => { + const paramList: ParameterModel[] = []; + if (!model) { + return paramList; + } + const paramFields = convertSchemaToFormFields(model.schema); + + params.forEach(param => { + // Find matching field configurations from schema + const typeField = paramFields.find(field => field.key === 'type'); + const nameField = paramFields.find(field => field.key === 'variable'); + const defaultField = paramFields.find(field => field.key === 'defaultable'); + + paramList.push({ + kind: 'REQUIRED', + enabled: typeField?.enabled ?? true, + editable: typeField?.editable ?? true, + advanced: typeField?.advanced ?? false, + optional: typeField?.optional ?? false, + type: { + value: param.formValues['type'] as string, + valueType: typeField?.valueType, + isType: true, + optional: typeField?.optional, + advanced: typeField?.advanced, + addNewButton: false, + enabled: typeField?.enabled, + editable: typeField?.editable, + imports: param?.imports || {} + }, + name: { + value: param.formValues['variable'] as string, + valueType: nameField?.valueType, + isType: false, + optional: nameField?.optional, + advanced: nameField?.advanced, + addNewButton: false, + enabled: nameField?.enabled, + editable: nameField?.editable + }, + defaultValue: { + value: param.formValues['defaultable'], + valueType: defaultField?.valueType || 'string', + isType: false, + optional: defaultField?.optional, + advanced: defaultField?.advanced, + addNewButton: false, + enabled: defaultField?.enabled, + editable: defaultField?.editable + } + }); + }); + return paramList; + } + + // Initialize form fields + useEffect(() => { + if (!model) { + return; + } + + const initialFields: FormField[] = [ + { + key: 'name', + label: model.name.metadata?.label || 'Operation Name', + type: 'IDENTIFIER', + optional: model.name.optional, + editable: model.name.editable, + advanced: model.name.advanced, + enabled: model.name.enabled, + documentation: model.name.metadata?.description || '', + value: model.name.value, + valueType: model.name.valueType, + valueTypeConstraint: model.name.valueTypeConstraint || '', + lineRange: model?.name?.codedata?.lineRange, + }, + { + key: 'parameters', + label: 'Parameters', + type: 'PARAM_MANAGER', + optional: true, + editable: true, + enabled: true, + documentation: '', + value: model.parameters.map((param, index) => convertParameterToParamValue(param, index)), + paramManagerProps: { + paramValues: model.parameters.map((param, index) => convertParameterToParamValue(param, index)), + formFields: convertSchemaToFormFields(model.schema), + handleParameter: handleParamChange + }, + valueTypeConstraint: '' + }, + { + key: 'returnType', + label: model.returnType.metadata?.label || 'Return Type', + type: 'TYPE', + optional: model.returnType.optional, + enabled: model.returnType.enabled, + editable: model.returnType.editable, + advanced: model.returnType.advanced, + documentation: model.returnType.metadata?.description || '', + value: model.returnType.value, + valueType: model.returnType.valueType, + valueTypeConstraint: model.returnType.valueTypeConstraint || '' + } + ]; + setFields(initialFields); + }, [model]); + + const onClose = () => { + handleClosePopup(); + } + const handleFunctionCreate = (data: FormValues, formImports: FormImports) => { + if (!model) { + return; + } + const updatedFunctionModel: FunctionModel = { + ...model, + name: { + ...model.name, + value: data.name + }, + parameters: getFunctionParametersList(data.parameters as Parameter[]), + returnType: { + ...model.returnType, + value: data.returnType, + } + }; + setFunctionModel(updatedFunctionModel); + console.log('Function Create: ', updatedFunctionModel); + } + return ( - - - - - - - {isLoading && ( - - - + <> + {fields.length > 0 && ( + )} - {functionNode && ( - - { }} readonly={true} /> - - { }} readonly={false} /> - - - - - )} - {!functionNode && !isLoading && ( - No function data available to display. - )} - - - + ); } + + +export function convertSchemaToFormFields(schema: ConfigProperties): FormField[] { + const formFields: FormField[] = []; + + // Get the parameter configuration if it exists + const parameterConfig = schema["parameter"] as ConfigProperties; + if (parameterConfig) { + // Iterate over each parameter field in the parameter config + for (const key in parameterConfig) { + if (parameterConfig.hasOwnProperty(key)) { + const parameter = parameterConfig[key]; + if (parameter.metadata && parameter.metadata.label) { + const formField = convertParameterToFormField(key, parameter as ParameterModel); + console.log("Form Field: ", formField); + formFields.push(formField); + } + } + } + } + + return formFields; +} + + +export function convertParameterToFormField(key: string, param: ParameterModel): FormField { + return { + key: key === "defaultValue" ? "defaultable" : key === "name" ? "variable" : key, + label: param.metadata?.label, + type: param.valueType || 'string', + optional: param.optional || false, + editable: param.editable || false, + advanced: key === "defaultValue" ? true : param.advanced, + documentation: param.metadata?.description || '', + value: param.value || '', + valueType: param.valueType, + valueTypeConstraint: param?.valueTypeConstraint || '', + enabled: param.enabled ?? true, + lineRange: param?.codedata?.lineRange + }; +} + + +function convertParameterToParamValue(param: ParameterModel, index: number) { + return { + id: index, + key: param.name.value, + value: `${param.type.value} ${param.name.value}${(param.defaultValue as PropertyModel)?.value ? ` = ${(param.defaultValue as PropertyModel)?.value}` : ''}`, + formValues: { + variable: param.name.value, + type: param.type.value, + defaultable: (param.defaultValue as PropertyModel)?.value || '' + }, + icon: 'symbol-variable', + identifierEditable: param.name?.editable, + identifierRange: param.name.codedata?.lineRange, + hidden: param.hidden ?? false, + imports: param.type?.imports || {} + }; +} diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 0a57bdc8251..099d9613567 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -17,7 +17,7 @@ "activationEvents": [ "workspaceContains:**/Ballerina.toml" ], - "main": "./out/extension", + "main": "./dist/extension", "extensionDependencies": [ "wso2.ballerina" ], diff --git a/workspaces/bi/bi-extension/webpack.config.js b/workspaces/bi/bi-extension/webpack.config.js index f020f87fe76..9cf887e99af 100644 --- a/workspaces/bi/bi-extension/webpack.config.js +++ b/workspaces/bi/bi-extension/webpack.config.js @@ -21,7 +21,7 @@ const extensionConfig = { extension: './src/extension.ts' }, output: { - path: path.resolve(__dirname, 'out'), + path: path.resolve(__dirname, 'dist'), filename: '[name].js', libraryTarget: 'commonjs2', devtoolModuleFilenameTemplate: '../[resource-path]' @@ -70,7 +70,7 @@ const extensionConfig = { plugins: [ new PermissionsOutputPlugin({ buildFolders: [{ - path: path.resolve(__dirname, 'out/'), // Everything under resources/ gets these modes + path: path.resolve(__dirname, 'dist/'), // Everything under dist/ gets these modes fileMode: '755', dirMode: '755' }] From 176b8ecc8a9ed6a0a970c4622a2d9cb0616aeb0e Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Fri, 26 Sep 2025 15:12:54 +0530 Subject: [PATCH 060/730] Add initial working init method --- .../views/BI/ServiceFunctionForm/index.tsx | 91 +++++++++++++++---- 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index 032b0e30307..ce0c4b2cb91 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -18,12 +18,13 @@ */ import { useEffect, useState } from 'react'; -import { ActionButtons, View, ViewContent } from '@wso2/ui-toolkit'; -import styled from '@emotion/styled'; import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { FormField, FormImports, FormValues, Parameter } from '@wso2/ballerina-side-panel'; import { FormGeneratorNew } from '../Forms/FormGeneratorNew'; +import { TopNavigationBar } from '../../../components/TopNavigationBar'; +import { TitleBar } from '../../../components/TitleBar'; +import { getImportsForProperty } from '../../../utils/bi'; export interface ResourceFormProps { // model: FunctionModel; // isSaving: boolean; @@ -43,6 +44,8 @@ export function ServiceFunctionForm(props: ResourceFormProps) { const [fields, setFields] = useState([]); const [location, setLocation] = useState(null); const [recordTypeFields, setRecordTypeFields] = useState([]); + const [isSaving, setIsSaving] = useState(false); + const handleParamChange = (param: Parameter) => { const name = `${param.formValues['variable']}`; @@ -279,28 +282,77 @@ export function ServiceFunctionForm(props: ResourceFormProps) { console.log('Function Create: ', updatedFunctionModel); } + const handleFunctionSave = async (updatedFunction: FunctionModel) => { + try { + setIsSaving(true); + let artifacts; + const currentFilePath = await rpcClient.getVisualizerRpcClient().joinProjectPath(model.codedata.lineRange.fileName); + + artifacts = await rpcClient.getServiceDesignerRpcClient().updateResourceSourceCode({ + filePath: currentFilePath, + codedata: { + lineRange: { + startLine: { + line: model.codedata.lineRange.startLine.line, + offset: model.codedata.lineRange.startLine.offset + }, + endLine: { + line: model.codedata.lineRange.endLine.line, + offset: model.codedata.lineRange.endLine.offset + } + } + }, + function: updatedFunction + }); + } catch (error) { + console.error('Error updating function:', error); + } finally { + setIsSaving(false); + } + }; + + const handleFunctionCreate1 = (data: FormValues, formImports: FormImports) => { + console.log("Function create with data:", data); + const { name, returnType, parameters: params } = data; + const paramList = params ? getFunctionParametersList(params) : []; + const newFunctionModel = { ...model }; + newFunctionModel.name.value = name; + newFunctionModel.returnType.value = returnType; + newFunctionModel.parameters = paramList; + newFunctionModel.returnType.imports = getImportsForProperty('returnType', formImports); + Object.entries(data).forEach(([key, value]) => { + if (newFunctionModel?.properties?.[key]) { + newFunctionModel.properties[key].value = value as string; + } + }); + handleFunctionSave(newFunctionModel); + }; return ( - <> - {fields.length > 0 && ( - - )} - + <> + + + {fields.length > 0 && ( + + )} + ); } - export function convertSchemaToFormFields(schema: ConfigProperties): FormField[] { const formFields: FormField[] = []; @@ -323,7 +375,6 @@ export function convertSchemaToFormFields(schema: ConfigProperties): FormField[] return formFields; } - export function convertParameterToFormField(key: string, param: ParameterModel): FormField { return { key: key === "defaultValue" ? "defaultable" : key === "name" ? "variable" : key, From d1ae857bb080960da39183485feb3fe1062942b2 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Fri, 26 Sep 2025 16:47:51 +0530 Subject: [PATCH 061/730] Remove field table --- .../components/ResourceAccordion.tsx | 123 +++----------- .../src/views/BI/ServiceDesigner/index.tsx | 160 +----------------- 2 files changed, 24 insertions(+), 259 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx index 93e26b3d2aa..4e4ce4fab14 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx @@ -18,18 +18,13 @@ */ import React, { useState } from 'react'; import styled from '@emotion/styled'; -import { Button, Codicon, Confirm, ContextMenu, Icon, LinkButton, Typography } from '@wso2/ui-toolkit'; +import { Button, Codicon, Confirm, Icon } from '@wso2/ui-toolkit'; import { FunctionModel } from '@wso2/ballerina-core'; -type MethodProp = { - color: string; - hasLeftMargin?: boolean; -}; type ContainerProps = { borderColor?: string; haveErrors?: boolean; - showDottedBorder?: boolean; }; type ButtonSectionProps = { @@ -48,12 +43,7 @@ const AccordionContainer = styled.div` background-color: var(--vscode-list-hoverBackground); cursor: pointer; } - border: ${(p: ContainerProps) => { - if (p.haveErrors) return "1px solid red"; - if (p.showDottedBorder) return "1px dashed var(--vscode-textSeparator-foreground)"; - return "none"; - }}; - opacity: ${(p: ContainerProps) => p.showDottedBorder ? 0.6 : 1}; + border: ${(p: ContainerProps) => p.haveErrors ? "1px solid red" : "none"}; `; const AccordionHeader = styled.div` @@ -63,54 +53,11 @@ const AccordionHeader = styled.div` grid-template-columns: 3fr 1fr; `; -const LinkButtonWrapper = styled.div` - display: flex; - justify-content: center; - align-items: center; - height: 100%; - padding: 0 16px; - - :hover { - outline: 1px solid var(--vscode-inputOption-activeBorder); - } -`; - -const ButtonWrapper = styled.div` - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - font-size: 10px; - width: 40px; -`; - -const MethodBox = styled.div` - display: flex; - justify-content: center; - height: 25px; - min-width: 70px; - width: auto; - margin-left: ${(p: MethodProp) => p.hasLeftMargin ? "10px" : "0px"}; - text-align: center; - padding: 3px 5px 3px 5px; - background-color: ${(p: MethodProp) => p.color}; - color: #FFF; - align-items: center; - font-weight: bold; -`; - const MethodSection = styled.div` display: flex; gap: 4px; `; -const verticalIconStyles = { - transform: "rotate(90deg)", - ":hover": { - backgroundColor: "var(--vscode-welcomePage-tileHoverBackground)", - } -}; - const ButtonSection = styled.div` display: flex; align-items: center; @@ -118,10 +65,6 @@ const ButtonSection = styled.div` gap: ${(p: ButtonSectionProps) => p.isExpanded ? "8px" : "6px"}; `; -const AccordionContent = styled.div` - padding: 10px; -`; - const MethodPath = styled.span` align-self: center; margin-left: 10px; @@ -164,26 +107,10 @@ export interface ResourceAccordionProps { onEditResource: (resource: FunctionModel) => void; onDeleteResource: (resource: FunctionModel) => void; onResourceImplement: (resource: FunctionModel) => void; - showDottedBorder?: boolean; - showEnableButton?: boolean; - showDeleteIcon?: boolean; - showEditIcon?: boolean; - onEnable?: (func: FunctionModel) => void; } export function ResourceAccordion(params: ResourceAccordionProps) { - const { - functionModel, - goToSource, - onEditResource, - onDeleteResource, - onResourceImplement, - showDottedBorder = false, - showEnableButton = false, - showDeleteIcon = true, - showEditIcon = true, - onEnable - } = params; + const { functionModel, goToSource, onEditResource, onDeleteResource, onResourceImplement } = params; const [isOpen, setIsOpen] = useState(false); const [isConfirmOpen, setConfirmOpen] = useState(false); @@ -222,41 +149,32 @@ export function ResourceAccordion(params: ResourceAccordionProps) { setConfirmEl(null); }; - const handleEnableFunction = (e: React.MouseEvent) => { - e.stopPropagation(); - if (onEnable) { - onEnable(functionModel); - } - }; - const handleResourceImplement = () => { onResourceImplement(functionModel) } return ( - + {functionModel.name.value} - - - {showEnableButton && ( - - )} - {functionModel.editable && showEditIcon && onEditResource && ( - - )} - {functionModel.editable && showDeleteIcon && onDeleteResource && ( - - )} - + {functionModel.editable && + + <> + {onEditResource! && ( + + )} + {onDeleteResource! && ( + + )} + + + } ); }; - diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 7d5ad8f39ac..70a0829fed5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -53,18 +53,6 @@ const LoadingContainer = styled.div` flex-direction: column; `; -const InfoContainer = styled.div` - display: flex; - gap: 20px; - padding: 15px; - //border: 1px solid var(--vscode-editorIndentGuide-background); -`; - -const InfoSection = styled.div` - display: flex; - align-items: center; -`; - const ServiceContainer = styled.div` padding-right: 10px; padding-left: 10px; @@ -162,63 +150,6 @@ const PropertyValue = styled.div` align-items: center; `; -// ServiceFieldsContainer and ServiceFieldsHeader are no longer needed as the table is now inside PropertiesSection - -const ServiceFieldsTable = styled.table` - width: 100%; - border-collapse: collapse; - background-color: var(--vscode-editor-background); -`; - -const TableHeader = styled.th` - padding: 12px 8px; - text-align: left; - border-bottom: 1px solid var(--vscode-editorIndentGuide-background); - background-color: var(--vscode-editorWidget-background); - font-weight: 500; -`; - -const TableRow = styled.tr` - border-bottom: 1px solid var(--vscode-editorIndentGuide-background); - - &:hover { - background-color: var(--vscode-list-hoverBackground); - } -`; - -const TableCell = styled.td` - padding: 12px 8px; -`; - -const ActionButtons = styled.div` - display: flex; - gap: 8px; - align-items: center; -`; - -const ActionButton = styled.button` - background: none; - border: none; - cursor: pointer; - padding: 6px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 4px; - color: var(--vscode-foreground); - transition: all 0.2s ease; - - &:hover { - background-color: var(--vscode-button-hoverBackground); - color: var(--vscode-button-foreground); - } - - &:active { - background-color: var(--vscode-button-background); - } -`; - - interface ServiceDesignerProps { filePath: string; position: NodePosition; @@ -230,13 +161,6 @@ interface ReadonlyProperty { value: string | string[]; } -interface ServiceField { - name: string; - type: string; - isPrivate?: boolean; - isFinal?: boolean; -} - export function ServiceDesigner(props: ServiceDesignerProps) { const { filePath, position, serviceIdentifier } = props; const { rpcClient } = useRpcContext(); @@ -257,7 +181,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [listeners, setListeners] = useState([]); const [readonlyProperties, setReadonlyProperties] = useState>(new Set()); - const [serviceFields, setServiceFields] = useState([]); const [isHttpService, setIsHttpService] = useState(false); const [objectMethods, setObjectMethods] = useState([]); @@ -315,9 +238,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { setIsHttpService(service.moduleName === "http"); } - // Extract service fields if available (for service classes) - // setServiceFields([{ name: "field1", type: "string" }, { name: "field2", type: "int" }]); - // Extract object methods if available (for service classes) const objectMethods = service.functions.filter((func) => func.kind === "DEFAULT"); setObjectMethods(objectMethods); @@ -874,18 +794,19 @@ export function ServiceDesigner(props: ServiceDesignerProps) {
Trigger Functions + > Handlers - Enable trigger functions to handle events + Handle functions to process events
{serviceModel.functions - .filter((functionModel) => functionModel.kind === "REMOTE") + .filter((functionModel) => + functionModel.kind === "REMOTE" && functionModel.enabled) .map((functionModel, index) => ( { - const updatedFunc = { ...func, enabled: true }; - handleFunctionSubmit(updatedFunc); - }} /> ))} @@ -940,77 +853,12 @@ export function ServiceDesigner(props: ServiceDesignerProps) { onEditResource={handleFunctionEdit} onDeleteResource={handleFunctionDelete} onResourceImplement={handleOpenDiagram} - showDottedBorder={!functionModel.enabled} - showEnableButton={!functionModel.enabled} - showDeleteIcon={functionModel.enabled} - showEditIcon={functionModel.enabled} - onEnable={(func: FunctionModel) => { - const updatedFunc = { ...func, enabled: true }; - handleFunctionSubmit(updatedFunc); - }} /> ))} ))} - {/* Service Fields Section */} - {serviceFields.length > 0 && ( -
-
- - Service Fields - - - Fields defined in the service class - -
- - - - - Type - Field Name - Actions - - - - {serviceFields.map((field, index) => ( - - - - {field.type} - - - - - {field.name} - - - - - handleFieldEdit()} - title="Edit Field" - > - - - handleFieldDelete()} - title="Delete Field" - > - - - - - - ))} - - -
- )} - - {functionModel && functionModel.kind === "RESOURCE" && ( Date: Fri, 26 Sep 2025 18:41:54 +0530 Subject: [PATCH 062/730] Cleanup code --- .vscode/launch.json | 16 --- .../ballerina-extension/package.json | 11 +- .../ballerina-extension/scripts/test-ai.js | 117 ------------------ .../ballerina-extension/src/utils/ai/auth.ts | 25 ---- .../ai/evals/code/result-management/index.ts | 2 +- .../result-management/report-generator.ts | 2 +- .../result-management/result-conversion.ts | 2 +- .../result-management/result-persistence.ts | 2 +- .../test/ai/evals/code/types/config-types.ts | 2 +- .../test/ai/evals/code/types/index.ts | 2 +- .../test/ai/evals/code/types/result-types.ts | 2 +- .../test/ai/evals/code/types/test-types.ts | 2 +- .../ai/evals/code/utils/batch-processing.ts | 2 +- .../ai/evals/code/utils/content-parser.ts | 2 +- .../test/ai/evals/code/utils/index.ts | 2 +- .../ai/evals/code/utils/test-event-handler.ts | 2 +- .../ai/evals/code/utils/test-execution.ts | 2 +- .../ai/evals/code/utils/test-validation.ts | 2 +- ...{runTest-extensionHost.ts => runAiTest.ts} | 2 +- 19 files changed, 20 insertions(+), 179 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-extension/scripts/test-ai.js rename workspaces/ballerina/ballerina-extension/test/{runTest-extensionHost.ts => runAiTest.ts} (99%) diff --git a/.vscode/launch.json b/.vscode/launch.json index d8e0752c01b..0e45b297521 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -236,22 +236,6 @@ }, { "name": "Ballerina Extension AI Tests", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/scripts/test-ai.js", - "args": [], - "env": { - "LS_EXTENSIONS_PATH": "", - "LSDEBUG": "false", - "WEB_VIEW_WATCH_MODE": "false" - }, - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "cwd": "${workspaceFolder}/workspaces/ballerina/ballerina-extension", - "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" - }, - { - "name": "Ballerina Extension AI Tests (ExtensionHost)", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 29b084e7b29..406198a7694 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -31,7 +31,10 @@ "onNotebook:ballerina-notebook", "onUri" ], - "extensionDependencies": [], + "extensionDependencies": [ + "anweber.httpbook", + "WSO2.wso2-platform" + ], "contributes": { "languages": [ { @@ -1123,7 +1126,6 @@ "watch-ballerina": "webpack --mode none --watch", "test-compile": "tsc -p ./", "test": "pnpm run test-compile && node ./out/test/runTest.js", - "test:ai": "node scripts/test-ai.js", "e2e-test-setup": "npx extest get-vscode -c 1.83.1 && npx extest get-chromedriver -c 1.83.1 && npx extest install-vsix -f $(ls vsix/*.vsix)", "preui-test": "node -e \"const fs = require('fs'); if (fs.existsSync('test-resou')) { fs.unlinkSync('test-resou'); }\"", "e2e-test": "pnpm run test-compile && npx extest run-tests 'out/ui-test/*.test.js' --mocha_config ui-test/.mocharc.js -o ui-test/settings.json", @@ -1224,8 +1226,5 @@ "repository": { "type": "git", "url": "git+https://github.com/wso2/ballerina-plugin-vscode.git" - }, - "_originalExtensionDependencies": [ - "redhat.vscode-yaml" - ] + } } diff --git a/workspaces/ballerina/ballerina-extension/scripts/test-ai.js b/workspaces/ballerina/ballerina-extension/scripts/test-ai.js deleted file mode 100644 index 7039be82786..00000000000 --- a/workspaces/ballerina/ballerina-extension/scripts/test-ai.js +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env node - -/** - * AI Test Runner - * Temporarily removes extension dependencies, runs AI tests, then restores them - */ - -const fs = require('fs'); -const { spawn } = require('child_process'); -const path = require('path'); - -const PACKAGE_JSON_PATH = path.join(__dirname, '../package.json'); -const BACKUP_PATH = path.join(__dirname, '../package.json.backup'); - -let originalPackageJson = null; - -function log(message) { - console.log(`[AI Test] ${message}`); -} - -function backupPackageJson() { - log('Backing up package.json...'); - originalPackageJson = fs.readFileSync(PACKAGE_JSON_PATH, 'utf8'); - fs.writeFileSync(BACKUP_PATH, originalPackageJson); -} - -function removeExtensionDependencies() { - log('Temporarily removing extension dependencies...'); - const pkg = JSON.parse(originalPackageJson); - - // Store original dependencies for reference - pkg._originalExtensionDependencies = pkg.extensionDependencies || []; - pkg.extensionDependencies = []; - - fs.writeFileSync(PACKAGE_JSON_PATH, JSON.stringify(pkg, null, 2)); - log(`Removed ${pkg._originalExtensionDependencies.length} extension dependencies`); -} - -function restorePackageJson() { - if (originalPackageJson) { - log('Restoring original package.json...'); - fs.writeFileSync(PACKAGE_JSON_PATH, originalPackageJson); - - // Clean up backup - if (fs.existsSync(BACKUP_PATH)) { - fs.unlinkSync(BACKUP_PATH); - } - log('Package.json restored successfully'); - } -} - -function runCommand(command, args, env = {}) { - return new Promise((resolve, reject) => { - log(`Running: ${command} ${args.join(' ')}`); - - const child = spawn(command, args, { - stdio: 'inherit', - env: { ...process.env, ...env }, - shell: true - }); - - child.on('close', (code) => { - if (code === 0) { - resolve(code); - } else { - reject(new Error(`Command failed with exit code ${code}`)); - } - }); - - child.on('error', reject); - }); -} - -async function runAITests() { - try { - // Step 1: Backup and modify package.json - backupPackageJson(); - removeExtensionDependencies(); - - // Step 2: Build the extension - log('Building extension...'); - await runCommand('pnpm', ['run', 'compile'], { AI_TEST_ENV: 'true' }); - - // Step 3: Compile tests - log('Compiling tests...'); - await runCommand('pnpm', ['run', 'test-compile'], { AI_TEST_ENV: 'true' }); - - // Step 4: Run AI tests - log('Running AI tests...'); - await runCommand('node', ['./out/test/runTest.js', '--grep', '^AI Code Generator Tests Suite'], { AI_TEST_ENV: 'true' }); - - log('✅ AI tests completed successfully!'); - - } catch (error) { - log(`❌ AI tests failed: ${error.message}`); - process.exit(1); - } finally { - // Always restore package.json - restorePackageJson(); - } -} - -// Handle cleanup on process termination -process.on('SIGINT', () => { - log('Received SIGINT, cleaning up...'); - restorePackageJson(); - process.exit(1); -}); - -process.on('SIGTERM', () => { - log('Received SIGTERM, cleaning up...'); - restorePackageJson(); - process.exit(1); -}); - -// Run the tests -runAITests(); \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 380920dd7f5..a115938fd33 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -122,21 +122,11 @@ async function copilotTokenExists() { // Structured Auth Credentials Utils // ================================== export const storeAuthCredentials = async (credentials: AuthCredentials): Promise => { - // Safely handle missing extension context - if (!extension.context?.secrets) { - console.warn('Extension context or secrets not available - skipping credential storage'); - return; - } const credentialsJson = JSON.stringify(credentials); await extension.context.secrets.store(AUTH_CREDENTIALS_SECRET_KEY, credentialsJson); }; export const getAuthCredentials = async (): Promise => { - // Safely handle missing extension context - if (!extension.context?.secrets) { - return undefined; - } - const credentialsJson = await extension.context.secrets.get(AUTH_CREDENTIALS_SECRET_KEY); if (!credentialsJson) { return undefined; @@ -151,11 +141,6 @@ export const getAuthCredentials = async (): Promise }; export const clearAuthCredentials = async (): Promise => { - // Safely handle missing extension context - if (!extension.context?.secrets) { - console.warn('Extension context or secrets not available - skipping credential cleanup'); - return; - } await extension.context.secrets.delete(AUTH_CREDENTIALS_SECRET_KEY); }; @@ -163,10 +148,6 @@ export const clearAuthCredentials = async (): Promise => { // BI Copilot Auth Utils // ================================== export const getLoginMethod = async (): Promise => { - // Test environment fallback - check for ANTHROPIC_API_KEY - if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { - return LoginMethod.ANTHROPIC_KEY; - } const credentials = await getAuthCredentials(); if (credentials) { @@ -178,12 +159,6 @@ export const getLoginMethod = async (): Promise => { export const getAccessToken = async (): Promise => { return new Promise(async (resolve, reject) => { try { - // Test environment fallback - check for ANTHROPIC_API_KEY first - if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { - resolve(process.env.ANTHROPIC_API_KEY.trim()); - return; - } - const credentials = await getAuthCredentials(); if (credentials) { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts index 700d72cfa08..3c48b411c32 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/index.ts @@ -17,4 +17,4 @@ export * from './result-conversion'; export * from './result-persistence'; export * from './result-manager'; -export * from './report-generator'; \ No newline at end of file +export * from './report-generator'; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts index 82e904ffa1d..d63646ba716 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts @@ -109,4 +109,4 @@ export function logExecutionCompletion(startTime: number, usecaseResults: readon console.log(` Total Time: ${totalDuration}ms (${Math.round(totalDuration / 1000)}s)`); console.log(` Success Rate: ${Math.round(passedTests / usecaseResults.length * 100)}%`); console.log(` Results saved to: ${resultsDir}`); -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index e7425f2659d..6f8afdbaf33 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -85,4 +85,4 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[]): averageDuration: Math.round(averageDuration), timestamp: Date.now() }; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts index 3aee6674a61..02eb4ec077e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -89,4 +89,4 @@ export async function persistSummary(summary: Summary, resultsDir: string): Prom ); console.log("Summary files saved"); -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts index 7673b74778d..61674a3464e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts @@ -19,4 +19,4 @@ */ export interface TestConfiguration { readonly maxConcurrency: number; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts index 37be1f739c4..70a5e24582e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/index.ts @@ -16,4 +16,4 @@ export * from './test-types'; export * from './result-types'; -export * from './config-types'; \ No newline at end of file +export * from './config-types'; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index 1afd063535a..39cb5b01b04 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -80,4 +80,4 @@ export interface UsecaseCompact { readonly usecase: string; readonly compiled: boolean; readonly duration?: number; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts index c4964f8b542..45fbfbde213 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts @@ -56,4 +56,4 @@ export interface TestCaseResult { readonly noErrorCheck: boolean; readonly noDiagnosticsCheck: boolean; }; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts index 05547539c7a..7649b9cce24 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts @@ -73,4 +73,4 @@ export async function handleBatchDelay( */ export function wait(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts index 3190d698997..79e97b17f60 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/content-parser.ts @@ -43,4 +43,4 @@ export function extractSourceFilesFromContent(content: string): readonly SourceF } return files; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts index 6fb5ac0edb7..f01f72a8031 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts @@ -19,4 +19,4 @@ export * from './test-event-handler'; export * from './test-validation'; export * from './test-execution'; export * from './batch-processing'; -export * from './content-parser'; \ No newline at end of file +export * from './content-parser'; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts index 4f64713155a..eec6dd0b531 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts @@ -95,4 +95,4 @@ export function createTestEventHandler(useCase?: TestUseCase): { }); return { handler, getResult }; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts index 4c9428b5c28..3b234d2f635 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts @@ -52,4 +52,4 @@ export async function executeSingleTestCase(useCase: TestUseCase): Promise Date: Sat, 27 Sep 2025 22:03:28 +0530 Subject: [PATCH 063/730] Add helperPaneSx prop to TokenEditor and FormTokenEditor for styling flexibility and fix heperpane positioning --- .../components/ExpressionEditor/components/Token/index.tsx | 5 ++++- .../src/components/ExpressionEditor/types/token.ts | 2 ++ .../mi-diagram/src/components/Form/FormTokenEditor/index.tsx | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx index de2a906b078..4a8b33f5ce5 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx @@ -215,6 +215,7 @@ export const TokenEditor = ({ getExpressionEditorIcon, editorSx, height, + helperPaneSx, enableFullscreen = false }: TokenEditorProps) => { const [isFocused, setIsFocused] = useState(false); @@ -590,9 +591,11 @@ export const TokenEditor = ({ } } : {}; + console.log( "helperPaneSx: ", helperPaneSx ); + const getHelperPaneWithEditorComponent = (): JSX.Element => { return createPortal( - + {/* Title and close button */} void; isHelperPaneOpen: boolean; + helperPaneSx?: CSSProperties; } | { getHelperPane?: never; helperPaneOrigin?: never; changeHelperPaneState?: never; isHelperPaneOpen?: never; + helperPaneSx?: never; }; export type TokenEditorProps = TokenEditorBaseProps & HelperPaneConditionalProps; diff --git a/workspaces/mi/mi-diagram/src/components/Form/FormTokenEditor/index.tsx b/workspaces/mi/mi-diagram/src/components/Form/FormTokenEditor/index.tsx index 01f499b343a..92d2b601fe3 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/FormTokenEditor/index.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/FormTokenEditor/index.tsx @@ -161,6 +161,7 @@ export const FormTokenEditor = ({ } editorSx={editorSx} + helperPaneSx={{ position: 'fixed' }} /> {errorMsg && } From 7066bd95a9b21c549ec48dbbf1db0d74aa414fc1 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Fri, 26 Sep 2025 09:32:46 +0530 Subject: [PATCH 064/730] Fix glitch#2 --- .../ballerina-visualizer/src/views/TypeDiagram/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx index ca141acf3df..cb069484d61 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/TypeDiagram/index.tsx @@ -293,6 +293,7 @@ export function TypeDiagram(props: TypeDiagramProps) { isGraphql: false }, }); + return; } setTypeEditorState((prevState) => ({ ...prevState, From 07a6dfc298aee65c4b05abb0df3424664106bf9f Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Fri, 26 Sep 2025 09:32:56 +0530 Subject: [PATCH 065/730] Fix glitch#1 --- .../BI/ServiceDesigner/ServiceWizard.tsx | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx index 815a4cf8a5d..bd14b0df66b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx @@ -77,25 +77,30 @@ export function ServiceWizard(props: ServiceWizardProps) { title: res.service.displayName || res.service.name, moduleName: res.service.moduleName }); + return rpcClient.getServiceDesignerRpcClient().getListeners({ filePath: "", moduleName: type }); + }) + .then(res => { + console.log("Existing Listeners: ", res); + setExisting(res.hasListeners); + if (res.hasListeners) { + return rpcClient.getServiceDesignerRpcClient().getServiceModel({ filePath: "", moduleName: type, listenerName: "" }) + .then(serviceRes => { + console.log("Service Model: ", serviceRes); + serviceRes.service.properties["listener"].editable = true; + serviceRes.service.properties["listener"].addNewButton = true; + setServiceModel(serviceRes.service); + setStep(1); + setListeners(res); + return rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type }); + }); + } + setListeners(res); + return rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type }); + }) + .then(res => { + console.log("Listener Model: ", res); + setListenerModel(res.listener); }); - rpcClient.getServiceDesignerRpcClient().getListeners({ filePath: "", moduleName: type }).then(res => { - console.log("Existing Listeners: ", res); - setExisting(res.hasListeners); - if (res.hasListeners) { - rpcClient.getServiceDesignerRpcClient().getServiceModel({ filePath: "", moduleName: type, listenerName: "" }).then(res => { - console.log("Service Model: ", res); - res.service.properties["listener"].editable = true; - res.service.properties["listener"].addNewButton = true; - setServiceModel(res.service); - setStep(1); - }); - } - setListeners(res); - }); - rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type }).then(res => { - console.log("Listener Model: ", res); - setListenerModel(res.listener); - }); }, []); const handleListenerSubmit = async (value?: ListenerModel) => { From 924a09ab91c4353d7d32dd3e7f4921a6d71eb0f6 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Fri, 26 Sep 2025 10:20:31 +0530 Subject: [PATCH 066/730] Replace nested case with async await --- .../BI/ServiceDesigner/ServiceWizard.tsx | 62 ++++++++++--------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx index bd14b0df66b..406f77ff735 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceWizard.tsx @@ -70,37 +70,43 @@ export function ServiceWizard(props: ServiceWizardProps) { const [pullingModules, setPullingModules] = useState(false); useEffect(() => { - rpcClient.getServiceDesignerRpcClient() - .getServiceModel({ filePath: "", moduleName: type, listenerName: "" }) - .then(res => { + const initializeServiceWizard = async () => { + try { + const serviceModelRes = await rpcClient.getServiceDesignerRpcClient() + .getServiceModel({ filePath: "", moduleName: type, listenerName: "" }); + setHeaderInfo({ - title: res.service.displayName || res.service.name, - moduleName: res.service.moduleName + title: serviceModelRes.service.displayName || serviceModelRes.service.name, + moduleName: serviceModelRes.service.moduleName }); - return rpcClient.getServiceDesignerRpcClient().getListeners({ filePath: "", moduleName: type }); - }) - .then(res => { - console.log("Existing Listeners: ", res); - setExisting(res.hasListeners); - if (res.hasListeners) { - return rpcClient.getServiceDesignerRpcClient().getServiceModel({ filePath: "", moduleName: type, listenerName: "" }) - .then(serviceRes => { - console.log("Service Model: ", serviceRes); - serviceRes.service.properties["listener"].editable = true; - serviceRes.service.properties["listener"].addNewButton = true; - setServiceModel(serviceRes.service); - setStep(1); - setListeners(res); - return rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type }); - }); + + const listenersRes = await rpcClient.getServiceDesignerRpcClient() + .getListeners({ filePath: "", moduleName: type }); + + console.log("Existing Listeners: ", listenersRes); + setExisting(listenersRes.hasListeners); + + if (listenersRes.hasListeners) { + const serviceRes = await rpcClient.getServiceDesignerRpcClient() + .getServiceModel({ filePath: "", moduleName: type, listenerName: "" }); + + console.log("Service Model: ", serviceRes); + serviceRes.service.properties["listener"].editable = true; + serviceRes.service.properties["listener"].addNewButton = true; + setServiceModel(serviceRes.service); + setStep(1); } - setListeners(res); - return rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type }); - }) - .then(res => { - console.log("Listener Model: ", res); - setListenerModel(res.listener); - }); + setListeners(listenersRes); + const listenerModelRes = await rpcClient.getServiceDesignerRpcClient() + .getListenerModel({ moduleName: type }); + console.log("Listener Model: ", listenerModelRes); + setListenerModel(listenerModelRes.listener); + } catch (error) { + console.error("Error initializing service wizard:", error); + } + }; + + initializeServiceWizard(); }, []); const handleListenerSubmit = async (value?: ListenerModel) => { From da9d32af8f520ca283a3b333682a9778f60692f7 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Mon, 29 Sep 2025 09:32:14 +0530 Subject: [PATCH 067/730] Improve right side panel --- .../Forms/FunctionConfigForm.tsx | 51 +- .../components/AddServiceElementDropdown.tsx | 116 ++++ .../src/views/BI/ServiceDesigner/index.tsx | 639 ++++++++---------- 3 files changed, 438 insertions(+), 368 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionConfigForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionConfigForm.tsx index 63ac9313760..8c23d17bc52 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionConfigForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionConfigForm.tsx @@ -17,8 +17,9 @@ */ import React, { useState } from "react"; -import { ActionButtons, Dropdown, SidePanelBody } from "@wso2/ui-toolkit"; +import { SidePanelBody } from "@wso2/ui-toolkit"; import { FunctionModel, ServiceModel } from "@wso2/ballerina-core"; +import ButtonCard from "../../../../components/ButtonCard"; import { EditorContentColumn } from "../styles"; @@ -33,36 +34,42 @@ export function FunctionConfigForm(props: FunctionConfigFormProps) { const { serviceModel, onSubmit, onBack, isSaving } = props; - const options = serviceModel.functions.filter(func => !func.enabled).map((func, index) => ({ id: index.toString(), value: func.name.value })); - const [functionName, setFunctionName] = useState(options.length > 0 ? options[0].value : undefined); + const nonEnabledFunctions = serviceModel.functions.filter(func => !func.enabled); + const [selectedFunctionName, setSelectedFunctionName] = useState( + nonEnabledFunctions.length > 0 ? nonEnabledFunctions[0].name.value : undefined + ); - const handleOnSelect = (value: string) => { - setFunctionName(value); + const handleOnSelect = (functionName: string) => { + setSelectedFunctionName(functionName); + handleConfigSave(); }; const handleConfigSave = () => { - const selectedFunction = serviceModel.functions.find(func => func.name.value === functionName); - selectedFunction.enabled = true; - onSubmit(selectedFunction); + if (selectedFunctionName) { + const selectedFunction = serviceModel.functions.find(func => func.name.value === selectedFunctionName); + if (selectedFunction) { + selectedFunction.enabled = true; + onSubmit(selectedFunction); + } + } }; return ( - - + {nonEnabledFunctions.map((func, index) => ( + handleOnSelect(func.name.value)} + disabled={isSaving} + /> + ))} + {nonEnabledFunctions.length === 0 && ( +
No functions available to enable.
+ )}
); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx new file mode 100644 index 00000000000..b87b47e663e --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx @@ -0,0 +1,116 @@ +/** + * 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 { Codicon, DropdownButton, Typography } from "@wso2/ui-toolkit"; +import styled from "@emotion/styled"; + +const ButtonText = styled.span` + @media (max-width: 768px) { + display: none; + } + width: 100%; +`; + +interface AddServiceElementDropdownProps { + buttonTitle: string; + toolTip?: string; + defaultOption?: string; + onOptionChange: (option: string) => void; + options: DropdownOptionProps[]; +} + + +export function AddServiceElementDropdown(props: AddServiceElementDropdownProps) { + const { buttonTitle, toolTip, defaultOption, onOptionChange, options } = props; + const dropdownOptions = options.map((option) => ( + { + content: , + value: option.value, + } + )); + + return ( +
+ + + {buttonTitle} + + } + selecteOption={""} + tooltip={toolTip ?? "Add Functions or Handlers"} + dropDownAlign="bottom" + buttonSx={{ + appearance: 'none', + backgroundColor: 'var(--vscode-button-background)', + color: 'var(--vscode-button-foreground)', + '&:hover': { + backgroundColor: 'var(--vscode-button-hoverBackground)', + }, + height: '28px', + minHeight: '28px' + }} + optionButtonSx={{ + backgroundColor: 'var(--vscode-button-background)', + borderColor: 'var(--vscode-button-border)', + '&:hover': { + backgroundColor: 'var(--vscode-button-hoverBackground)', + }, + height: '28px', + minHeight: '28px' + }} + dropdownSx={{ + zIndex: 9999, + boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)', + border: '1px solid var(--vscode-dropdown-border)', + backgroundColor: 'var(--vscode-dropdown-background)', + minWidth: '280px', + position: 'absolute', + right: '0', + left: 'auto' + }} + onOptionChange={onOptionChange} + onClick={() => { }} + options={dropdownOptions} + /> +
+ ); +} + +export interface DropdownOptionProps { + title: string; + description: string; + value?: string; +} + +function DropdownOption({ title, description }: DropdownOptionProps) { + return ( +
+
+ {title} + + {description} + +
+
+ ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 70a0829fed5..d249ebfc524 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -16,34 +16,34 @@ * under the License. */ -import { useEffect, useState, useRef } from "react"; -import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { NodePosition } from "@wso2/syntax-tree"; +import styled from "@emotion/styled"; import { + DIRECTORY_MAP, EVENT_TYPE, + FunctionModel, LineRange, MACHINE_VIEW, - ServiceModel, - FunctionModel, + ProjectStructureArtifactResponse, STModification, + ServiceModel, removeStatement, - DIRECTORY_MAP, - ProjectStructureArtifactResponse, - PropertyModel, - FieldType, } from "@wso2/ballerina-core"; -import { Button, Codicon, Icon, LinkButton, Typography, View, TextField, DropdownButton } from "@wso2/ui-toolkit"; -import styled from "@emotion/styled"; -import { ResourceAccordion } from "./components/ResourceAccordion"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { PanelContainer } from "@wso2/ballerina-side-panel"; -import { FunctionConfigForm } from "./Forms/FunctionConfigForm"; -import { ResourceForm } from "./Forms/ResourceForm"; -import { FunctionForm } from "./Forms/FunctionForm"; -import { applyModifications, isPositionChanged } from "../../../utils/utils"; -import { TopNavigationBar } from "../../../components/TopNavigationBar"; -import { TitleBar } from "../../../components/TitleBar"; +import { NodePosition } from "@wso2/syntax-tree"; +import { Button, Codicon, Icon, TextField, Typography, View } from "@wso2/ui-toolkit"; +import { useEffect, useRef, useState } from "react"; import { LoadingRing } from "../../../components/Loader"; +import { TitleBar } from "../../../components/TitleBar"; +import { TopNavigationBar } from "../../../components/TopNavigationBar"; +import { applyModifications, isPositionChanged } from "../../../utils/utils"; +import { AddServiceElementDropdown, DropdownOptionProps } from "./components/AddServiceElementDropdown"; +import { ResourceAccordion } from "./components/ResourceAccordion"; import { ResourceAccordionV2 } from "./components/ResourceAccordionV2"; +import { FunctionConfigForm } from "./Forms/FunctionConfigForm"; +import { FunctionForm } from "./Forms/FunctionForm"; +import { ResourceForm } from "./Forms/ResourceForm"; +import { getCustomEntryNodeIcon } from "../ComponentListView/EventIntegrationPanel"; const LoadingContainer = styled.div` display: flex; @@ -80,7 +80,7 @@ const HeaderContainer = styled.div` justify-content: space-between; `; -const ListenerContainer = styled.div` +const ServiceMetadataContainer = styled.div` padding: 15px; border-bottom: 1px solid var(--vscode-editorIndentGuide-background); display: flex; @@ -113,41 +113,64 @@ const ListenerItem = styled.div` gap: 10px; padding: 8px 12px; background-color: var(--vscode-editor-background); + transition: all 0.2s ease; + + &:hover .listener-icon { + border-color: var(--vscode-focusBorder); + } + + &:hover .listener-text { + color: var(--vscode-focusBorder); + } `; const ListenerIcon = styled.div` - width: 32px; - height: 32px; + width: 48px; + height: 48px; background-color: var(--vscode-editor-background); display: flex; align-items: center; justify-content: center; + border-radius: 50%; + border: 1px solid var(--vscode-editorIndentGuide-background); + transition: border-color 0.2s ease; `; const PropertiesSection = styled.div` display: flex; flex-direction: column; - gap: 15px; - flex: 1; + gap: 12px; + flex: 2; padding-left: 20px; border-left: 1px solid var(--vscode-editorIndentGuide-background); `; const PropertyItem = styled.div` display: flex; - align-items: center; - gap: 8px; + flex-direction: column; + gap: 6px; + padding: 12px 16px; + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-editorWidget-border); + border-radius: 6px; `; const PropertyLabel = styled.div` display: flex; align-items: center; gap: 8px; + margin-bottom: 4px; `; const PropertyValue = styled.div` display: flex; align-items: center; + padding: 4px 8px; + background-color: var(--vscode-editor-background); + border-radius: 4px; + border: 1px solid var(--vscode-editorIndentGuide-background); + font-family: var(--vscode-editor-font-family); + font-size: 13px; `; interface ServiceDesignerProps { @@ -161,6 +184,10 @@ interface ReadonlyProperty { value: string | string[]; } +export const ADD_HANDLER = "add-handler"; +export const ADD_INIT_FUNCTION = "add-init-function"; +export const ADD_REUSABLE_FUNCTION = "add-reusable-function"; + export function ServiceDesigner(props: ServiceDesignerProps) { const { filePath, position, serviceIdentifier } = props; const { rpcClient } = useRpcContext(); @@ -171,8 +198,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [isNew, setIsNew] = useState(false); const [showForm, setShowForm] = useState(false); const [showFunctionConfigForm, setShowFunctionConfigForm] = useState(false); - const [showInitFunctionForm, setShowInitFunctionForm] = useState(false); - const [showFieldForm, setShowFieldForm] = useState(false); const [projectListeners, setProjectListeners] = useState([]); const prevPosition = useRef(position); @@ -183,6 +208,10 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [readonlyProperties, setReadonlyProperties] = useState>(new Set()); const [isHttpService, setIsHttpService] = useState(false); const [objectMethods, setObjectMethods] = useState([]); + const [dropdownOptions, setDropdownOptions] = useState([]); + const [initMethod, setInitMethod] = useState(undefined); + const [enabledHandlers, setEnabledHandlers] = useState([]); + const [unusedHandlers, setUnusedHandlers] = useState([]); useEffect(() => { if (!serviceModel || isPositionChanged(prevPosition.current, position)) { @@ -239,8 +268,57 @@ export function ServiceDesigner(props: ServiceDesignerProps) { } // Extract object methods if available (for service classes) - const objectMethods = service.functions.filter((func) => func.kind === "DEFAULT"); + const objectMethods: FunctionModel[] = []; + const enabledHandlers: FunctionModel[] = []; + const unusedHandlers: FunctionModel[] = []; + + let hasInitMethod = false; + service.functions.forEach(func => { + if (func.kind === "DEFAULT") { + if (func.name?.value === "init") { + hasInitMethod = true; + setInitMethod(func); + } else { + objectMethods.push(func); + } + } + if (func.kind === "REMOTE" || func.kind === "RESOURCE") { + if (func.enabled) { + enabledHandlers.push(func); + } else { + unusedHandlers.push(func); + } + } + }); + + setEnabledHandlers(enabledHandlers); + setUnusedHandlers(unusedHandlers); setObjectMethods(objectMethods); + + // Set dropdown options + const options: DropdownOptionProps[] = []; + + if (unusedHandlers.length > 0) { + options.push({ + title: "Add Handler", + description: "Select the handler to add", + value: ADD_HANDLER + }); + } + if (!hasInitMethod) { + options.push({ + title: "Add Init Function", + description: "Add a new init function within the service", + value: ADD_INIT_FUNCTION + }); + } + + options.push({ + title: "Add Function", + description: "Add a new reusable function within the service", + value: ADD_REUSABLE_FUNCTION + }); + setDropdownOptions(options); } const getProjectListeners = () => { @@ -308,31 +386,43 @@ export function ServiceDesigner(props: ServiceDesignerProps) { }); }; - const handleNewFunction = () => { - setIsNew(true); - setShowFunctionConfigForm(true); + const handleNewObjectMethod = () => { + rpcClient + .getServiceDesignerRpcClient() + .getFunctionModel({ type: "object", functionName: "default" }) + .then((res) => { + console.log("New Function Model: ", res.function); + setFunctionModel(res.function); + setIsNew(true); + setShowForm(true); + }); }; - const handleNewInitFunction = () => { + const onSelectAddReusableFunction = () => { setIsNew(true); - setShowInitFunctionForm(true); + // setShowFunctionConfigForm(true); + handleNewObjectMethod(); }; - const handleNewField = () => { + const onSelectAddHandler = () => { setIsNew(true); - setShowFieldForm(true); + setShowFunctionConfigForm(true); + }; + + const onSelectAddInitFunction = () => { + // TODO: Implement add init function functionality }; const handleAddDropdownOption = (option: string) => { switch (option) { - case "reusable-function": - handleNewFunction(); + case ADD_REUSABLE_FUNCTION: + onSelectAddReusableFunction(); break; - case "init-function": - handleNewInitFunction(); + case ADD_INIT_FUNCTION: + onSelectAddInitFunction(); break; - case "field": - handleNewField(); + case ADD_HANDLER: + onSelectAddHandler(); break; } }; @@ -399,6 +489,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { setIsNew(false); }; + /** + * This function invokes when a new function is added using right panel form. + * + * @param value + */ const handleFunctionSubmit = async (value: FunctionModel) => { setIsSaving(true); const lineRange: LineRange = { @@ -437,12 +532,10 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const handleInitFunctionClose = () => { setIsNew(false); - setShowInitFunctionForm(false); }; - const handleFieldClose = () => { + const handleAddHandleClose = () => { setIsNew(false); - setShowFieldForm(false); }; const handleServiceTryIt = () => { @@ -477,48 +570,70 @@ export function ServiceDesigner(props: ServiceDesignerProps) { switch (true) { case label.includes("listener"): return "bell"; - case label.includes("path"): + case label.includes("path") || label.includes("base"): return "link"; + case label.includes("port"): + return "ports"; + case label.includes("host"): + return "server"; + case label.includes("name") || label.includes("queue"): + return "tag"; + case label.includes("timeout"): + return "clock"; + case label.includes("ssl") || label.includes("secure"): + return "lock"; + case label.includes("config"): + return "gear"; default: return "info"; } }; - const getAttributeComponent = (component: PropertyModel) => { - const label = component.metadata.label.toLowerCase(); - switch (true) { - case label.includes("listener"): - return component.values?.length > 0 ? ( - component.values.map((item, index) => ( - handleOpenListener(item)} - > - {item} - - )) - ) : ( - handleOpenListener(component.value)} - > - {component.value} - - ); - case label.includes("path"): - return component.value; - default: - return component.value; - } - }; - const handleSearch = (event: React.ChangeEvent) => { setSearchValue(event.target.value); }; const haveServiceTypeName = serviceModel?.properties["serviceTypeName"]?.value; + const ListenerList = () => { + const listenerLabel = listeners.length > 1 ? "Listeners" : "Listener"; + return ( + <> + + + {listenerLabel} + + + {listenerLabel} connected to the service + + + + { + listeners.map((listener, index) => ( + handleOpenListener(listener)} + style={{ cursor: 'pointer' }} + > + + + + + {listener} + + + + )) + } + + + ); + } + return ( @@ -558,138 +673,23 @@ export function ServiceDesigner(props: ServiceDesignerProps) { ) } {serviceModel && ( -
- - - Add - - } - selecteOption="reusable-function" - tooltip="Add Function or Fields" - dropDownAlign="bottom" - buttonSx={{ - appearance: 'none', - backgroundColor: 'var(--vscode-button-background)', - color: 'var(--vscode-button-foreground)', - '&:hover': { - backgroundColor: 'var(--vscode-button-hoverBackground)', - }, - height: '28px', - minHeight: '28px' - }} - optionButtonSx={{ - backgroundColor: 'var(--vscode-button-background)', - borderColor: 'var(--vscode-button-border)', - '&:hover': { - backgroundColor: 'var(--vscode-button-hoverBackground)', - }, - height: '28px', - minHeight: '28px' - }} - dropdownSx={{ - zIndex: 9999, - boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)', - border: '1px solid var(--vscode-dropdown-border)', - backgroundColor: 'var(--vscode-dropdown-background)', - minWidth: '280px', - position: 'absolute', - right: '0', - left: 'auto' - }} - onOptionChange={handleAddDropdownOption} - onClick={() => { }} - options={[ - { - content: ( -
- -
- Add Reusable Function - - Create a new reusable function - -
-
- ), - value: "reusable-function", - }, - { - content: ( -
- -
- Add Init Function - - Create an initialization function - -
-
- ), - value: "init-function", - }, - { - content: ( -
- -
- Add Field - - Add a new service field - -
-
- ), - value: "field", - } - ]} - /> -
+ )} } /> - + {/* Listing Listener and Service Configurations */} + - - - {listeners.length > 1 ? 'Listeners' : 'Listener'} - - - Connected {listeners.length > 1 ? 'listeners' : 'listener'} to the service - - - - { - listeners.map((listener, index) => ( - handleOpenListener(listener)} - style={{ cursor: 'pointer' }} - > - - { - serviceModel.icon && ( - {listener} - ) - } - { - !serviceModel.icon && ( - - ) - } - - - {listener} - - - - )) - } - + {readonlyProperties.size > 0 && ( @@ -697,12 +697,13 @@ export function ServiceDesigner(props: ServiceDesignerProps) { Array.from(readonlyProperties).map(prop => ( - - {prop.label}: + + + {prop.label} - + {Array.isArray(prop.value) ? prop.value.join(", ") : prop.value} @@ -711,26 +712,15 @@ export function ServiceDesigner(props: ServiceDesignerProps) { } )} - + + {/* Listing Resources in HTTP */} {isHttpService && ( <> - -
- - Resource Functions - - - Resource functions to handle HTTP requests - -
- +
{resources.length > 10 && ( @@ -741,7 +731,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { )} */}
-
+ {/* Add Resource Function - Dotted Accordion */} {!haveServiceTypeName && ( @@ -788,78 +778,71 @@ export function ServiceDesigner(props: ServiceDesignerProps) { )} {/* Listing service type bound functions */} - {!isHttpService && ( + {!isHttpService && enabledHandlers.length > 0 && ( <> - -
- Handlers - - - Handle functions to process events - -
-
+ - {serviceModel.functions - .filter((functionModel) => - functionModel.kind === "REMOTE" && functionModel.enabled) - .map((functionModel, index) => ( - { }} - onEditResource={handleFunctionEdit} - onDeleteResource={handleFunctionDelete} - onResourceImplement={handleOpenDiagram} - /> - ))} + {enabledHandlers.map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + /> + ))} )} + {/* Listing service type bound functions */} + {(initMethod && ( + <> + + + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + /> + + + ))} + {/* Listing service type bound functions */} {(objectMethods.length > 0 && ( <> - -
- - Functions - - - Reusable functions within the service - -
-
+ - {serviceModel.functions - .filter((functionModel) => functionModel.kind === "DEFAULT") - .map((functionModel, index) => ( - { }} - onEditResource={handleFunctionEdit} - onDeleteResource={handleFunctionDelete} - onResourceImplement={handleOpenDiagram} - /> - ))} + {objectMethods.map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + /> + ))} ))} - {functionModel && functionModel.kind === "RESOURCE" && ( + {/* This is for adding or editing a http resource */} + {functionModel && isHttpService && functionModel.kind === "RESOURCE" && ( )} - {functionModel && functionModel.kind === "REMOTE" && ( + {/* This is for editing a remote or resource function */} + {functionModel && !isHttpService && ( )} + {/* This is for adding a new handler to the service */} {serviceModel && !isHttpService && ( @@ -904,72 +889,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { /> )} - - {/* Init Function Form Panel */} - {serviceModel && !isHttpService && ( - -
- - Configure the initialization function for your service - -
- - -
-
-
- )} - - {/* Field Form Panel */} - {serviceModel && !isHttpService && ( - -
- - Add a new field to your service - -
- - -
-
- - -
-
-
- )}
) @@ -977,3 +896,31 @@ export function ServiceDesigner(props: ServiceDesignerProps) {
); } + +interface SectionHeaderProps { + title: string; + subtitle: string; + children?: React.ReactNode; +} + +function SectionHeader({ title, subtitle, children }: SectionHeaderProps) { + return ( + +
+ + {title} + + + {subtitle} + +
+ {children} +
+ ); +} From 37b7a83b7e8abec75bf1323bb676dd4f4fc579cb Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 29 Sep 2025 09:42:06 +0530 Subject: [PATCH 068/730] Refactor the service function form --- .../ballerina-visualizer/src/MainPanel.tsx | 6 +- .../views/BI/ServiceFunctionForm/index.tsx | 165 ++++++++---------- 2 files changed, 79 insertions(+), 92 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 8bb367761af..046365c9c42 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -529,7 +529,11 @@ const MainPanel = () => { ); break; case MACHINE_VIEW.ServiceFunctionForm: - setViewComponent(); + setViewComponent(); break; default: setNavActive(false); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index ce0c4b2cb91..285b3387724 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -18,22 +18,37 @@ */ import { useEffect, useState } from 'react'; -import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo } from '@wso2/ballerina-core'; +import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo, CodeData } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { FormField, FormImports, FormValues, Parameter } from '@wso2/ballerina-side-panel'; import { FormGeneratorNew } from '../Forms/FormGeneratorNew'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { TitleBar } from '../../../components/TitleBar'; import { getImportsForProperty } from '../../../utils/bi'; +import { ViewContent, View } from '@wso2/ui-toolkit'; +import styled from '@emotion/styled'; + +const FormContainer = styled.div` + display: flex; + flex-direction: column; + max-width: 600px; + gap: 20px; +`; + +const Container = styled.div` + display: flex; + flex-direction: column; + gap: 10px; +`; export interface ResourceFormProps { - // model: FunctionModel; - // isSaving: boolean; - // onSave: (functionModel: FunctionModel) => void; - // onClose: () => void; + codeData?: CodeData; + currentFilePath?: string; + projectPath?: string; } export function ServiceFunctionForm(props: ResourceFormProps) { console.log('>>> ServiceFunctionForm - Component rendered', props); + const { codeData, currentFilePath, projectPath } = props; const { rpcClient } = useRpcContext(); console.log('>>> ServiceFunctionForm - rpcClient from context:', rpcClient); @@ -45,42 +60,23 @@ export function ServiceFunctionForm(props: ResourceFormProps) { const [location, setLocation] = useState(null); const [recordTypeFields, setRecordTypeFields] = useState([]); const [isSaving, setIsSaving] = useState(false); - - - const handleParamChange = (param: Parameter) => { - const name = `${param.formValues['variable']}`; - const type = `${param.formValues['type']}`; - const hasDefaultValue = Object.keys(param.formValues).includes('defaultable') && - param.formValues['defaultable'] !== undefined && - param.formValues['defaultable'] !== ''; - - const defaultValue = hasDefaultValue ? `${param.formValues['defaultable']}`.trim() : ''; - let value = `${type} ${name}`; - if (defaultValue) { - value += ` = ${defaultValue}`; - } - return { - ...param, - key: name, - value: value - } - }; - const handleClosePopup = () => { - // Close the popup - implement your close logic here - console.log('Closing ServiceFunctionForm'); - }; + const handleParamChange = (param: Parameter) => { + const name = `${param.formValues['variable']}`; + const type = `${param.formValues['type']}`; + const hasDefaultValue = Object.keys(param.formValues).includes('defaultable') && + param.formValues['defaultable'] !== undefined && + param.formValues['defaultable'] !== ''; - const handleSave = async () => { - setSaving(true); - try { - // TODO: Implement save functionality - console.log('Saving function:', model); - // Add your save logic here - } catch (error) { - console.error('Error saving function:', error); - } finally { - setSaving(false); + const defaultValue = hasDefaultValue ? `${param.formValues['defaultable']}`.trim() : ''; + let value = `${type} ${name}`; + if (defaultValue) { + value += ` = ${defaultValue}`; + } + return { + ...param, + key: name, + value: value } }; @@ -88,21 +84,27 @@ export function ServiceFunctionForm(props: ResourceFormProps) { useEffect(() => { console.log('>>> ServiceFunctionForm - useEffect triggered'); console.log('>>> ServiceFunctionForm - rpcClient:', rpcClient); + console.log('>>> ServiceFunctionForm - codeData:', codeData); + console.log('>>> ServiceFunctionForm - currentFilePath:', currentFilePath); const loadProjectData = async () => { setIsLoading(true); try { - const location: VisualizerLocation = await rpcClient.getVisualizerLocation(); + // Create a mock location object with the passed props + const location: VisualizerLocation = { + documentUri: currentFilePath, + projectUri: projectPath, + dataMapperMetadata: codeData ? { name: '', codeData } : undefined + }; setLocation(location); - console.log('>>> ServiceFunctionForm - Retrieved location:', location); + console.log('>>> ServiceFunctionForm - Using passed location:', location); - // Check if we have CodeData from the flow diagram - if (location.dataMapperMetadata?.codeData) { - const codeData = location.dataMapperMetadata.codeData; - console.log('>>> ServiceFunctionForm - Found CodeData from flow diagram:', codeData); + // Check if we have CodeData from props + if (codeData && currentFilePath) { + console.log('>>> ServiceFunctionForm - Found CodeData from props:', codeData); const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ - filePath: location.documentUri , + filePath: currentFilePath, codedata: codeData }); setFunctionModel(functionModel.function); @@ -115,12 +117,12 @@ export function ServiceFunctionForm(props: ResourceFormProps) { } }; - if (rpcClient) { + if (rpcClient && codeData && currentFilePath) { loadProjectData(); } else { - console.error('>>> ServiceFunctionForm - rpcClient is not available'); + console.error('>>> ServiceFunctionForm - Missing required props or rpcClient:', { rpcClient: !!rpcClient, codeData: !!codeData, currentFilePath: !!currentFilePath }); } - }, [rpcClient]); + }, [rpcClient, codeData, currentFilePath, projectPath]); if (model?.properties) { const recordTypeFields: RecordTypeField[] = Object.entries(model?.properties) @@ -259,36 +261,12 @@ export function ServiceFunctionForm(props: ResourceFormProps) { setFields(initialFields); }, [model]); - const onClose = () => { - handleClosePopup(); - } - const handleFunctionCreate = (data: FormValues, formImports: FormImports) => { - if (!model) { - return; - } - const updatedFunctionModel: FunctionModel = { - ...model, - name: { - ...model.name, - value: data.name - }, - parameters: getFunctionParametersList(data.parameters as Parameter[]), - returnType: { - ...model.returnType, - value: data.returnType, - } - }; - setFunctionModel(updatedFunctionModel); - console.log('Function Create: ', updatedFunctionModel); - } - const handleFunctionSave = async (updatedFunction: FunctionModel) => { try { setIsSaving(true); - let artifacts; const currentFilePath = await rpcClient.getVisualizerRpcClient().joinProjectPath(model.codedata.lineRange.fileName); - artifacts = await rpcClient.getServiceDesignerRpcClient().updateResourceSourceCode({ + await rpcClient.getServiceDesignerRpcClient().updateResourceSourceCode({ filePath: currentFilePath, codedata: { lineRange: { @@ -311,7 +289,7 @@ export function ServiceFunctionForm(props: ResourceFormProps) { } }; - const handleFunctionCreate1 = (data: FormValues, formImports: FormImports) => { + const handleFunctionCreate = (data: FormValues, formImports: FormImports) => { console.log("Function create with data:", data); const { name, returnType, parameters: params } = data; const paramList = params ? getFunctionParametersList(params) : []; @@ -329,27 +307,32 @@ export function ServiceFunctionForm(props: ResourceFormProps) { }; return ( - <> + - {fields.length > 0 && ( - - )} - + + + + {fields.length > 0 && ( + + )} + + + + ); } From 9639f066bca374de529c9a19148cf5794f5f2ece Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 29 Sep 2025 11:26:50 +0530 Subject: [PATCH 069/730] Replace position with datamapper metadata --- .../ballerina-visualizer/src/MainPanel.tsx | 3 +- .../src/views/BI/DiagramWrapper/index.tsx | 31 +++--- .../views/BI/ServiceFunctionForm/index.tsx | 97 +++++++++---------- 3 files changed, 65 insertions(+), 66 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 046365c9c42..469e10b66ad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -530,7 +530,8 @@ const MainPanel = () => { break; case MACHINE_VIEW.ServiceFunctionForm: setViewComponent(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 69cdc4ec7ea..0373ad69c02 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -277,21 +277,22 @@ export function DiagramWrapper(param: DiagramWrapperProps) { MACHINE_VIEW.ServiceFunctionForm : MACHINE_VIEW.BIFunctionForm, identifier: parentMetadata?.label || "", documentUri: fileUri, - dataMapperMetadata: functionCodeData ? { - name: parentMetadata?.label || "Function", - codeData: { - lineRange: { - fileName: fileUri || "", - startLine: { - line: position?.startLine || currentPosition?.startLine || 0, - offset: position?.startColumn || currentPosition?.startColumn || 0, - }, - endLine: { - line: position?.endLine || currentPosition?.endLine || 0, - offset: position?.endColumn || currentPosition?.endColumn || 0, - }, - }, - } } : undefined, + position: position || currentPosition + // metadata: functionCodeData ? { + // name: parentMetadata?.label || "Function", + // codeData: { + // lineRange: { + // fileName: fileUri || "", + // startLine: { + // line: position?.startLine || currentPosition?.startLine || 0, + // offset: position?.startColumn || currentPosition?.startColumn || 0, + // }, + // endLine: { + // line: position?.endLine || currentPosition?.endLine || 0, + // offset: position?.endColumn || currentPosition?.endColumn || 0, + // }, + // }, + // } } : undefined, }; rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index 285b3387724..542e3d145f2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -18,7 +18,7 @@ */ import { useEffect, useState } from 'react'; -import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo, CodeData } from '@wso2/ballerina-core'; +import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo, CodeData, NodePosition } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { FormField, FormImports, FormValues, Parameter } from '@wso2/ballerina-side-panel'; import { FormGeneratorNew } from '../Forms/FormGeneratorNew'; @@ -41,20 +41,16 @@ const Container = styled.div` gap: 10px; `; export interface ResourceFormProps { - codeData?: CodeData; + // codeData?: CodeData; + position: NodePosition; currentFilePath?: string; projectPath?: string; } export function ServiceFunctionForm(props: ResourceFormProps) { - console.log('>>> ServiceFunctionForm - Component rendered', props); - const { codeData, currentFilePath, projectPath } = props; - + const { position, currentFilePath, projectPath } = props; const { rpcClient } = useRpcContext(); - console.log('>>> ServiceFunctionForm - rpcClient from context:', rpcClient); - const [model, setFunctionModel] = useState(null); - const [saving, setSaving] = useState(false); const [isLoading, setIsLoading] = useState(false); const [fields, setFields] = useState([]); const [location, setLocation] = useState(null); @@ -82,11 +78,6 @@ export function ServiceFunctionForm(props: ResourceFormProps) { // Load project components and structure useEffect(() => { - console.log('>>> ServiceFunctionForm - useEffect triggered'); - console.log('>>> ServiceFunctionForm - rpcClient:', rpcClient); - console.log('>>> ServiceFunctionForm - codeData:', codeData); - console.log('>>> ServiceFunctionForm - currentFilePath:', currentFilePath); - const loadProjectData = async () => { setIsLoading(true); try { @@ -94,21 +85,31 @@ export function ServiceFunctionForm(props: ResourceFormProps) { const location: VisualizerLocation = { documentUri: currentFilePath, projectUri: projectPath, - dataMapperMetadata: codeData ? { name: '', codeData } : undefined + position: position, }; setLocation(location); console.log('>>> ServiceFunctionForm - Using passed location:', location); // Check if we have CodeData from props - if (codeData && currentFilePath) { - console.log('>>> ServiceFunctionForm - Found CodeData from props:', codeData); - + if (position && currentFilePath) { const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ filePath: currentFilePath, - codedata: codeData + codedata: { + lineRange: { + fileName: currentFilePath, + startLine: { + line: position.startLine, + offset: position.startColumn + }, + endLine: { + line: position.endLine, + offset: position.endColumn + } + + } + } }); setFunctionModel(functionModel.function); - console.log('>>> ServiceFunctionForm - Retrieved function model from source:', functionModel); } } catch (error) { console.error('>>> ServiceFunctionForm - Error loading project data:', error); @@ -117,41 +118,38 @@ export function ServiceFunctionForm(props: ResourceFormProps) { } }; - if (rpcClient && codeData && currentFilePath) { + if (rpcClient && position && currentFilePath) { loadProjectData(); } else { - console.error('>>> ServiceFunctionForm - Missing required props or rpcClient:', { rpcClient: !!rpcClient, codeData: !!codeData, currentFilePath: !!currentFilePath }); + console.error('>>> ServiceFunctionForm - Missing required props or rpcClient:', { rpcClient: !!rpcClient, position: !!position, currentFilePath: !!currentFilePath }); } - }, [rpcClient, codeData, currentFilePath, projectPath]); + }, [rpcClient, position, currentFilePath, projectPath]); - if (model?.properties) { - const recordTypeFields: RecordTypeField[] = Object.entries(model?.properties) - .filter(([_, property]) => - property.typeMembers && - property.typeMembers.some((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") - ) - .map(([key, property]) => ({ - key, - property: { - ...property, - metadata: { - label: property.metadata?.label || key, - description: property.metadata?.description || '' - }, - valueType: property?.valueType || 'string', - diagnostics: { - hasDiagnostics: property.diagnostics && property.diagnostics.length > 0, - diagnostics: property.diagnostics - } - } as Property, - recordTypeMembers: property.typeMembers.filter((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") - })); - console.log(">>> recordTypeFields of model.advanceProperties", recordTypeFields); - - setRecordTypeFields(recordTypeFields); - } + if (model?.properties) { + const recordTypeFields: RecordTypeField[] = Object.entries(model?.properties) + .filter(([_, property]) => + property.typeMembers && + property.typeMembers.some((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") + ) + .map(([key, property]) => ({ + key, + property: { + ...property, + metadata: { + label: property.metadata?.label || key, + description: property.metadata?.description || '' + }, + valueType: property?.valueType || 'string', + diagnostics: { + hasDiagnostics: property.diagnostics && property.diagnostics.length > 0, + diagnostics: property.diagnostics + } + } as Property, + recordTypeMembers: property.typeMembers.filter((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") + })); + setRecordTypeFields(recordTypeFields); + } - const getFunctionParametersList = (params: Parameter[]) => { const paramList: ParameterModel[] = []; if (!model) { @@ -375,7 +373,6 @@ export function convertParameterToFormField(key: string, param: ParameterModel): }; } - function convertParameterToParamValue(param: ParameterModel, index: number) { return { id: index, From 5cb3d0337e7e2d0c6afed71a686c1821d54a69af Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 29 Sep 2025 11:44:03 +0530 Subject: [PATCH 070/730] Add navigate back capability --- .../views/BI/ServiceFunctionForm/index.tsx | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index 542e3d145f2..2075b1d4d3a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -18,7 +18,7 @@ */ import { useEffect, useState } from 'react'; -import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo, CodeData, NodePosition } from '@wso2/ballerina-core'; +import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo, NodePosition, EVENT_TYPE } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { FormField, FormImports, FormValues, Parameter } from '@wso2/ballerina-side-panel'; import { FormGeneratorNew } from '../Forms/FormGeneratorNew'; @@ -53,7 +53,6 @@ export function ServiceFunctionForm(props: ResourceFormProps) { const [model, setFunctionModel] = useState(null); const [isLoading, setIsLoading] = useState(false); const [fields, setFields] = useState([]); - const [location, setLocation] = useState(null); const [recordTypeFields, setRecordTypeFields] = useState([]); const [isSaving, setIsSaving] = useState(false); @@ -81,16 +80,6 @@ export function ServiceFunctionForm(props: ResourceFormProps) { const loadProjectData = async () => { setIsLoading(true); try { - // Create a mock location object with the passed props - const location: VisualizerLocation = { - documentUri: currentFilePath, - projectUri: projectPath, - position: position, - }; - setLocation(location); - console.log('>>> ServiceFunctionForm - Using passed location:', location); - - // Check if we have CodeData from props if (position && currentFilePath) { const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ filePath: currentFilePath, @@ -259,6 +248,18 @@ export function ServiceFunctionForm(props: ResourceFormProps) { setFields(initialFields); }, [model]); + const handleNavigateBack = () => { + if (currentFilePath && position) { + rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { + documentUri: currentFilePath, + position: position + } + }); + } + }; + const handleFunctionSave = async (updatedFunction: FunctionModel) => { try { setIsSaving(true); @@ -280,6 +281,9 @@ export function ServiceFunctionForm(props: ResourceFormProps) { }, function: updatedFunction }); + + handleNavigateBack(); + } catch (error) { console.error('Error updating function:', error); } finally { @@ -316,7 +320,7 @@ export function ServiceFunctionForm(props: ResourceFormProps) { {fields.length > 0 && ( Date: Mon, 29 Sep 2025 13:57:41 +0530 Subject: [PATCH 071/730] Resolve navigation issue --- .../BI/ServiceFunctionForm/Paramters.tsx | 159 -------- .../views/BI/ServiceFunctionForm/index.tsx | 350 +++++------------- .../src/views/BI/ServiceFunctionForm/utils.ts | 240 ++++++++++++ 3 files changed, 336 insertions(+), 413 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx deleted file mode 100644 index 56195438f41..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/Paramters.tsx +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React, { useState, useEffect } from 'react'; -import { Typography, Codicon, LinkButton } from '@wso2/ui-toolkit'; -import styled from '@emotion/styled'; -import { ParameterModel } from '@wso2/ballerina-core'; - -const FormContainer = styled.div` - margin-bottom: 16px; -`; - -const ParameterItem = styled.div` - display: flex; - align-items: center; - background: var(--vscode-input-background); - border: 1px solid var(--vscode-input-border); - border-radius: 4px; - margin-bottom: 8px; - overflow: hidden; -`; - -const ParameterName = styled.div` - flex: 1; - background: var(--vscode-input-background); - color: #FFFFFF; - padding: 8px 12px; - font-weight: 500; - min-width: 60px; - text-align: center; - display: flex; - align-items: center; - justify-content: left; -`; - -const ParameterType = styled.div` - padding: 8px 12px; - color: var(--vscode-foreground); - background: var(--vscode-inputValidation-infoBackground); -`; - -const ActionIcons = styled.div` - display: flex; - align-items: center; - gap: 4px; - padding: 4px 8px; -`; - -const IconButton = styled.button` - background: transparent; - border: none; - cursor: pointer; - padding: 4px; - border-radius: 2px; - color: var(--vscode-foreground); - - &:hover { - background: var(--vscode-toolbar-hoverBackground); - } -`; - -const AddButtonWrapper = styled.div` - margin: 8px 0; -`; - -export interface ParametersProps { - functionNode?: { - parameters?: ParameterModel[]; - }; -} - -interface ParameterDisplay { - type: string; - name: string; -} - -export function Parameters(props: ParametersProps) { - const { functionNode } = props; - const [parameters, setParameters] = useState([]); - - useEffect(() => { - if (functionNode?.parameters) { - const parameterData = functionNode.parameters.map(param => ({ - type: param.type?.value || 'unknown', - name: param.name?.value || 'unnamed' - })); - setParameters(parameterData); - } - }, [functionNode]); - - const handleEdit = (param: ParameterDisplay) => { - console.log('Edit parameter:', param); - }; - - const handleDelete = (param: ParameterDisplay) => { - console.log('Delete parameter:', param); - }; - - const handleAddParameter = () => { - console.log('Add new parameter'); - }; - - return ( - - - Parameters - - - {parameters.length === 0 ? ( - - No parameters defined - - ) : ( -
- {parameters.map((param, index) => ( - - - {param.type} - - - {param.name} - - - handleEdit(param)}> - - - handleDelete(param)}> - - - - - ))} -
- )} - - - - - Add Parameter - - -
- ); -} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index 2075b1d4d3a..e97ef52de97 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -1,4 +1,3 @@ -/* eslint-disable react-hooks/exhaustive-deps */ /** * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. * @@ -18,15 +17,21 @@ */ import { useEffect, useState } from 'react'; -import { FunctionModel, VisualizerLocation, LineRange, ParameterModel, ConfigProperties, PropertyModel, RecordTypeField, Property, PropertyTypeMemberInfo, NodePosition, EVENT_TYPE } from '@wso2/ballerina-core'; +import { FunctionModel, LineRange, RecordTypeField, Property, PropertyTypeMemberInfo, NodePosition } from '@wso2/ballerina-core'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; -import { FormField, FormImports, FormValues, Parameter } from '@wso2/ballerina-side-panel'; +import { FormField, FormImports, FormValues } from '@wso2/ballerina-side-panel'; import { FormGeneratorNew } from '../Forms/FormGeneratorNew'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { TitleBar } from '../../../components/TitleBar'; -import { getImportsForProperty } from '../../../utils/bi'; import { ViewContent, View } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; +import { + logError, + handleParamChange, + convertSchemaToFormFields, + convertParameterToParamValue, + handleFunctionCreate +} from './utils'; const FormContainer = styled.div` display: flex; @@ -40,165 +45,91 @@ const Container = styled.div` flex-direction: column; gap: 10px; `; -export interface ResourceFormProps { - // codeData?: CodeData; +export interface ServiceFunctionFormProps { position: NodePosition; currentFilePath?: string; projectPath?: string; } -export function ServiceFunctionForm(props: ResourceFormProps) { +export function ServiceFunctionForm(props: ServiceFunctionFormProps) { const { position, currentFilePath, projectPath } = props; const { rpcClient } = useRpcContext(); const [model, setFunctionModel] = useState(null); - const [isLoading, setIsLoading] = useState(false); const [fields, setFields] = useState([]); const [recordTypeFields, setRecordTypeFields] = useState([]); const [isSaving, setIsSaving] = useState(false); - const handleParamChange = (param: Parameter) => { - const name = `${param.formValues['variable']}`; - const type = `${param.formValues['type']}`; - const hasDefaultValue = Object.keys(param.formValues).includes('defaultable') && - param.formValues['defaultable'] !== undefined && - param.formValues['defaultable'] !== ''; - - const defaultValue = hasDefaultValue ? `${param.formValues['defaultable']}`.trim() : ''; - let value = `${type} ${name}`; - if (defaultValue) { - value += ` = ${defaultValue}`; - } - return { - ...param, - key: name, - value: value - } - }; - - // Load project components and structure - useEffect(() => { - const loadProjectData = async () => { - setIsLoading(true); - try { - if (position && currentFilePath) { - const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ - filePath: currentFilePath, - codedata: { - lineRange: { - fileName: currentFilePath, - startLine: { - line: position.startLine, - offset: position.startColumn - }, - endLine: { - line: position.endLine, - offset: position.endColumn - } - + const loadFunctionData = async () => { + try { + if (position && currentFilePath) { + const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ + filePath: currentFilePath, + codedata: { + lineRange: { + fileName: currentFilePath, + startLine: { + line: position.startLine, + offset: position.startColumn + }, + endLine: { + line: position.endLine, + offset: position.endColumn } } - }); - setFunctionModel(functionModel.function); - } - } catch (error) { - console.error('>>> ServiceFunctionForm - Error loading project data:', error); - } finally { - setIsLoading(false); + } + }); + setFunctionModel(functionModel.function); } - }; + } catch (error) { + logError({ + type: 'LOAD_ERROR', + message: 'Failed to load function data from source', + originalError: error + }); + } + }; + useEffect(() => { if (rpcClient && position && currentFilePath) { - loadProjectData(); + loadFunctionData(); } else { - console.error('>>> ServiceFunctionForm - Missing required props or rpcClient:', { rpcClient: !!rpcClient, position: !!position, currentFilePath: !!currentFilePath }); + logError({ + type: 'VALIDATION_ERROR', + message: 'Missing required props or rpcClient', + originalError: { rpcClient: !!rpcClient, position: !!position, currentFilePath: !!currentFilePath } + }); } }, [rpcClient, position, currentFilePath, projectPath]); - if (model?.properties) { - const recordTypeFields: RecordTypeField[] = Object.entries(model?.properties) - .filter(([_, property]) => - property.typeMembers && - property.typeMembers.some((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") - ) - .map(([key, property]) => ({ - key, - property: { - ...property, - metadata: { - label: property.metadata?.label || key, - description: property.metadata?.description || '' - }, - valueType: property?.valueType || 'string', - diagnostics: { - hasDiagnostics: property.diagnostics && property.diagnostics.length > 0, - diagnostics: property.diagnostics - } - } as Property, - recordTypeMembers: property.typeMembers.filter((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") - })); - setRecordTypeFields(recordTypeFields); - } - - const getFunctionParametersList = (params: Parameter[]) => { - const paramList: ParameterModel[] = []; - if (!model) { - return paramList; - } - const paramFields = convertSchemaToFormFields(model.schema); - - params.forEach(param => { - // Find matching field configurations from schema - const typeField = paramFields.find(field => field.key === 'type'); - const nameField = paramFields.find(field => field.key === 'variable'); - const defaultField = paramFields.find(field => field.key === 'defaultable'); - - paramList.push({ - kind: 'REQUIRED', - enabled: typeField?.enabled ?? true, - editable: typeField?.editable ?? true, - advanced: typeField?.advanced ?? false, - optional: typeField?.optional ?? false, - type: { - value: param.formValues['type'] as string, - valueType: typeField?.valueType, - isType: true, - optional: typeField?.optional, - advanced: typeField?.advanced, - addNewButton: false, - enabled: typeField?.enabled, - editable: typeField?.editable, - imports: param?.imports || {} - }, - name: { - value: param.formValues['variable'] as string, - valueType: nameField?.valueType, - isType: false, - optional: nameField?.optional, - advanced: nameField?.advanced, - addNewButton: false, - enabled: nameField?.enabled, - editable: nameField?.editable - }, - defaultValue: { - value: param.formValues['defaultable'], - valueType: defaultField?.valueType || 'string', - isType: false, - optional: defaultField?.optional, - advanced: defaultField?.advanced, - addNewButton: false, - enabled: defaultField?.enabled, - editable: defaultField?.editable - } - }); - }); - return paramList; + const initializeRecordTypeFields = () => { + if (model?.properties) { + const recordFields: RecordTypeField[] = Object.entries(model.properties) + .filter(([_, property]) => + property.typeMembers && + property.typeMembers.some((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") + ) + .map(([key, property]) => ({ + key, + property: { + ...property, + metadata: { + label: property.metadata?.label || key, + description: property.metadata?.description || '' + }, + valueType: property?.valueType || 'string', + diagnostics: { + hasDiagnostics: property.diagnostics && property.diagnostics.length > 0, + diagnostics: property.diagnostics + } + } as Property, + recordTypeMembers: property.typeMembers.filter((member: PropertyTypeMemberInfo) => member.kind === "RECORD_TYPE") + })); + setRecordTypeFields(recordFields); } + }; - // Initialize form fields - useEffect(() => { - if (!model) { - return; - } + const initializeFormFields = () => { + if (!model) return; const initialFields: FormField[] = [ { @@ -246,67 +177,35 @@ export function ServiceFunctionForm(props: ResourceFormProps) { } ]; setFields(initialFields); - }, [model]); - - const handleNavigateBack = () => { - if (currentFilePath && position) { - rpcClient.getVisualizerRpcClient().openView({ - type: EVENT_TYPE.OPEN_VIEW, - location: { - documentUri: currentFilePath, - position: position - } - }); - } }; - const handleFunctionSave = async (updatedFunction: FunctionModel) => { - try { - setIsSaving(true); - const currentFilePath = await rpcClient.getVisualizerRpcClient().joinProjectPath(model.codedata.lineRange.fileName); - - await rpcClient.getServiceDesignerRpcClient().updateResourceSourceCode({ - filePath: currentFilePath, - codedata: { - lineRange: { - startLine: { - line: model.codedata.lineRange.startLine.line, - offset: model.codedata.lineRange.startLine.offset - }, - endLine: { - line: model.codedata.lineRange.endLine.line, - offset: model.codedata.lineRange.endLine.offset - } - } - }, - function: updatedFunction - }); - - handleNavigateBack(); + useEffect(() => { + initializeFormFields(); + initializeRecordTypeFields(); + }, [model]); - } catch (error) { - console.error('Error updating function:', error); - } finally { - setIsSaving(false); + const onFunctionCreate = (data: FormValues, formImports: FormImports) => { + if (model) { + handleFunctionCreate(data, formImports, model, rpcClient, setIsSaving, currentFilePath, position); } }; - const handleFunctionCreate = (data: FormValues, formImports: FormImports) => { - console.log("Function create with data:", data); - const { name, returnType, parameters: params } = data; - const paramList = params ? getFunctionParametersList(params) : []; - const newFunctionModel = { ...model }; - newFunctionModel.name.value = name; - newFunctionModel.returnType.value = returnType; - newFunctionModel.parameters = paramList; - newFunctionModel.returnType.imports = getImportsForProperty('returnType', formImports); - Object.entries(data).forEach(([key, value]) => { - if (newFunctionModel?.properties?.[key]) { - newFunctionModel.properties[key].value = value as string; - } - }); - handleFunctionSave(newFunctionModel); - }; + if (!model) { + return ( + + + + + +
Loading function data...
+
+
+
+ ); + } return ( @@ -323,8 +222,8 @@ export function ServiceFunctionForm(props: ResourceFormProps) { fileName={currentFilePath || ''} targetLineRange={model.codedata?.lineRange as LineRange} fields={fields} - onSubmit={handleFunctionCreate} - submitText={ "Save"} + onSubmit={onFunctionCreate} + submitText="Save" helperPaneSide="left" isSaving={isSaving} preserveFieldOrder={true} @@ -337,60 +236,3 @@ export function ServiceFunctionForm(props: ResourceFormProps) { ); } - -export function convertSchemaToFormFields(schema: ConfigProperties): FormField[] { - const formFields: FormField[] = []; - - // Get the parameter configuration if it exists - const parameterConfig = schema["parameter"] as ConfigProperties; - if (parameterConfig) { - // Iterate over each parameter field in the parameter config - for (const key in parameterConfig) { - if (parameterConfig.hasOwnProperty(key)) { - const parameter = parameterConfig[key]; - if (parameter.metadata && parameter.metadata.label) { - const formField = convertParameterToFormField(key, parameter as ParameterModel); - console.log("Form Field: ", formField); - formFields.push(formField); - } - } - } - } - - return formFields; -} - -export function convertParameterToFormField(key: string, param: ParameterModel): FormField { - return { - key: key === "defaultValue" ? "defaultable" : key === "name" ? "variable" : key, - label: param.metadata?.label, - type: param.valueType || 'string', - optional: param.optional || false, - editable: param.editable || false, - advanced: key === "defaultValue" ? true : param.advanced, - documentation: param.metadata?.description || '', - value: param.value || '', - valueType: param.valueType, - valueTypeConstraint: param?.valueTypeConstraint || '', - enabled: param.enabled ?? true, - lineRange: param?.codedata?.lineRange - }; -} - -function convertParameterToParamValue(param: ParameterModel, index: number) { - return { - id: index, - key: param.name.value, - value: `${param.type.value} ${param.name.value}${(param.defaultValue as PropertyModel)?.value ? ` = ${(param.defaultValue as PropertyModel)?.value}` : ''}`, - formValues: { - variable: param.name.value, - type: param.type.value, - defaultable: (param.defaultValue as PropertyModel)?.value || '' - }, - icon: 'symbol-variable', - identifierEditable: param.name?.editable, - identifierRange: param.name.codedata?.lineRange, - hidden: param.hidden ?? false, - imports: param.type?.imports || {} - }; -} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts new file mode 100644 index 00000000000..8f1a2948f6f --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts @@ -0,0 +1,240 @@ +import { FunctionModel, ParameterModel, ConfigProperties, NodePosition, EVENT_TYPE, MACHINE_VIEW } from '@wso2/ballerina-core'; +import { FormField, Parameter, FormValues, FormImports } from '@wso2/ballerina-side-panel'; +import { getImportsForProperty } from '../../../utils/bi'; + +type ServiceFunctionError = { + type: 'LOAD_ERROR' | 'SAVE_ERROR' | 'VALIDATION_ERROR'; + message: string; + originalError?: unknown; +}; + +const resolveFilePath = async (rpcClient: any, fileName: string): Promise => { + try { + return await rpcClient.getVisualizerRpcClient().joinProjectPath(fileName); + } catch (error) { + throw new Error(`Failed to resolve file path for ${fileName}`); + } +}; + +const getFunctionParametersList = (params: Parameter[], model: FunctionModel | null) => { + const paramList: ParameterModel[] = []; + if (!model) { + return paramList; + } + const paramFields = convertSchemaToFormFields(model.schema); + + params.forEach(param => { + const typeField = paramFields.find(field => field.key === 'type'); + const nameField = paramFields.find(field => field.key === 'variable'); + const defaultField = paramFields.find(field => field.key === 'defaultable'); + + paramList.push({ + kind: 'REQUIRED', + enabled: typeField?.enabled ?? true, + editable: typeField?.editable ?? true, + advanced: typeField?.advanced ?? false, + optional: typeField?.optional ?? false, + type: { + value: param.formValues['type'] as string, + valueType: typeField?.valueType, + isType: true, + optional: typeField?.optional, + advanced: typeField?.advanced, + addNewButton: false, + enabled: typeField?.enabled, + editable: typeField?.editable, + imports: param?.imports || {} + }, + name: { + value: param.formValues['variable'] as string, + valueType: nameField?.valueType, + isType: false, + optional: nameField?.optional, + advanced: nameField?.advanced, + addNewButton: false, + enabled: nameField?.enabled, + editable: nameField?.editable + }, + defaultValue: { + value: param.formValues['defaultable'], + valueType: defaultField?.valueType || 'string', + isType: false, + optional: defaultField?.optional, + advanced: defaultField?.advanced, + addNewButton: false, + enabled: defaultField?.enabled, + editable: defaultField?.editable + } + }); + }); + return paramList; +}; + +function convertParameterToFormField(key: string, param: ParameterModel): FormField { + return { + key: key === "defaultValue" ? "defaultable" : key === "name" ? "variable" : key, + label: param.metadata?.label, + type: param.valueType || 'string', + optional: param.optional || false, + editable: param.editable || false, + advanced: key === "defaultValue" ? true : param.advanced, + documentation: param.metadata?.description || '', + value: param.value || '', + valueType: param.valueType, + valueTypeConstraint: param?.valueTypeConstraint || '', + enabled: param.enabled ?? true, + lineRange: param?.codedata?.lineRange + }; +} + + +const handleNavigateBack = (rpcClient: any, currentFilePath?: string, position?: NodePosition) => { + if (currentFilePath && position) { + rpcClient.getVisualizerRpcClient()?.goBack(); + } +}; + +const handleFunctionSave = async ( + rpcClient: any, + model: FunctionModel, + updatedFunction: FunctionModel, + setIsSaving: (saving: boolean) => void, + currentFilePath?: string, + position?: NodePosition +) => { + if (!model?.codedata?.lineRange) { + logError({ + type: 'VALIDATION_ERROR', + message: 'Missing model or codedata for function save' + }); + return; + } + + try { + setIsSaving(true); + const resolvedFilePath = await resolveFilePath(rpcClient, model.codedata.lineRange.fileName); + + await rpcClient.getServiceDesignerRpcClient().updateResourceSourceCode({ + filePath: resolvedFilePath, + codedata: { + lineRange: { + startLine: { + line: model.codedata.lineRange.startLine.line, + offset: model.codedata.lineRange.startLine.offset + }, + endLine: { + line: model.codedata.lineRange.endLine.line, + offset: model.codedata.lineRange.endLine.offset + } + } + }, + function: updatedFunction + }); + + handleNavigateBack(rpcClient, currentFilePath, position); + + } catch (error) { + logError({ + type: 'SAVE_ERROR', + message: 'Failed to update function source code', + originalError: error + }); + } finally { + setIsSaving(false); + } +}; + +export const logError = (error: ServiceFunctionError) => { + console.error(`[ServiceFunctionForm] ${error.type}: ${error.message}`, error.originalError); +}; + +export const handleParamChange = (param: Parameter) => { + const name = `${param.formValues['variable']}`; + const type = `${param.formValues['type']}`; + const hasDefaultValue = Object.keys(param.formValues).includes('defaultable') && + param.formValues['defaultable'] !== undefined && + param.formValues['defaultable'] !== ''; + + const defaultValue = hasDefaultValue ? `${param.formValues['defaultable']}`.trim() : ''; + let value = `${type} ${name}`; + if (defaultValue) { + value += ` = ${defaultValue}`; + } + return { + ...param, + key: name, + value: value + } +}; + +export function convertSchemaToFormFields(schema: ConfigProperties): FormField[] { + const formFields: FormField[] = []; + + const parameterConfig = schema["parameter"] as ConfigProperties; + if (parameterConfig) { + for (const key in parameterConfig) { + if (parameterConfig.hasOwnProperty(key)) { + const parameter = parameterConfig[key]; + if (parameter.metadata && parameter.metadata.label) { + const formField = convertParameterToFormField(key, parameter as ParameterModel); + formFields.push(formField); + } + } + } + } + + return formFields; +} + +export function convertParameterToParamValue(param: ParameterModel, index: number) { + return { + id: index, + key: param.name.value, + value: `${param.type.value} ${param.name.value}${(param.defaultValue as any)?.value ? ` = ${(param.defaultValue as any)?.value}` : ''}`, + formValues: { + variable: param.name.value, + type: param.type.value, + defaultable: (param.defaultValue as any)?.value || '' + }, + icon: 'symbol-variable', + identifierEditable: param.name?.editable, + identifierRange: param.name.codedata?.lineRange, + hidden: param.hidden ?? false, + imports: param.type?.imports || {} + }; +} + +export const handleFunctionCreate = async ( + data: FormValues, + formImports: FormImports, + model: FunctionModel, + rpcClient: any, + setIsSaving: (saving: boolean) => void, + currentFilePath?: string, + position?: NodePosition +) => { + if (!model) { + logError({ + type: 'VALIDATION_ERROR', + message: 'Cannot create function without base model' + }); + return; + } + + const { name, returnType, parameters: params } = data; + const paramList = params ? getFunctionParametersList(params, model) : []; + + const updatedModel = { ...model }; + updatedModel.name.value = name; + updatedModel.returnType.value = returnType; + updatedModel.parameters = paramList; + updatedModel.returnType.imports = getImportsForProperty('returnType', formImports); + + Object.entries(data).forEach(([key, value]) => { + if (updatedModel?.properties?.[key]) { + updatedModel.properties[key].value = value as string; + } + }); + + await handleFunctionSave(rpcClient, model, updatedModel, setIsSaving, currentFilePath, position); +}; From 12db041bfa7425f67f1c265bb80389fb126ebf9b Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 29 Sep 2025 15:09:44 +0530 Subject: [PATCH 072/730] Refactor the code --- .../ballerina-visualizer/src/MainPanel.tsx | 1 - .../src/views/BI/DiagramWrapper/index.tsx | 37 ------------------- .../src/views/BI/SequenceDiagram/index.tsx | 2 +- .../src/views/BI/ServiceFunctionForm/utils.ts | 19 ++++++++++ workspaces/bi/bi-extension/package.json | 2 +- workspaces/bi/bi-extension/webpack.config.js | 4 +- 6 files changed, 23 insertions(+), 42 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 469e10b66ad..f52d6ceeec4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -530,7 +530,6 @@ const MainPanel = () => { break; case MACHINE_VIEW.ServiceFunctionForm: setViewComponent( { - // Get CodeData using the current position instead of flow model - let functionCodeData: any = undefined; - - if (position || currentPosition) { - try { - // Get the flow model to extract CodeData - const flowModelResponse = await rpcClient.getBIDiagramRpcClient().getFlowModel(); - if (flowModelResponse?.flowModel?.nodes) { - // Find the function definition node or EVENT_START node that contains the CodeData - const functionNode = flowModelResponse.flowModel.nodes.find(node => - node.codedata.node === "EVENT_START" || - node.codedata.node === "FUNCTION_DEFINITION" - ); - if (functionNode) { - functionCodeData = functionNode.codedata; - } - } - } catch (error) { - console.error("Error getting flow model for edit:", error); - } - } - const context: VisualizerLocation = { view: view === FOCUS_FLOW_DIAGRAM_VIEW.NP_FUNCTION @@ -278,21 +256,6 @@ export function DiagramWrapper(param: DiagramWrapperProps) { identifier: parentMetadata?.label || "", documentUri: fileUri, position: position || currentPosition - // metadata: functionCodeData ? { - // name: parentMetadata?.label || "Function", - // codeData: { - // lineRange: { - // fileName: fileUri || "", - // startLine: { - // line: position?.startLine || currentPosition?.startLine || 0, - // offset: position?.startColumn || currentPosition?.startColumn || 0, - // }, - // endLine: { - // line: position?.endLine || currentPosition?.endLine || 0, - // offset: position?.endColumn || currentPosition?.endColumn || 0, - // }, - // }, - // } } : undefined, }; rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx index f7b6026d538..18999fc1cfd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/SequenceDiagram/index.tsx @@ -97,7 +97,7 @@ export function BISequenceDiagram(props: BISequenceDiagramProps) { model={flowModel} onClickParticipant={() => {}} onAddParticipant={() => {}} - onReady={() => onReady(undefined, undefined, undefined)} + onReady={onReady} /> )} {!flowModel && Loading sequence diagram ...} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts index 8f1a2948f6f..48e8b0de1db 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts @@ -1,3 +1,22 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + import { FunctionModel, ParameterModel, ConfigProperties, NodePosition, EVENT_TYPE, MACHINE_VIEW } from '@wso2/ballerina-core'; import { FormField, Parameter, FormValues, FormImports } from '@wso2/ballerina-side-panel'; import { getImportsForProperty } from '../../../utils/bi'; diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 099d9613567..0a57bdc8251 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -17,7 +17,7 @@ "activationEvents": [ "workspaceContains:**/Ballerina.toml" ], - "main": "./dist/extension", + "main": "./out/extension", "extensionDependencies": [ "wso2.ballerina" ], diff --git a/workspaces/bi/bi-extension/webpack.config.js b/workspaces/bi/bi-extension/webpack.config.js index 9cf887e99af..f020f87fe76 100644 --- a/workspaces/bi/bi-extension/webpack.config.js +++ b/workspaces/bi/bi-extension/webpack.config.js @@ -21,7 +21,7 @@ const extensionConfig = { extension: './src/extension.ts' }, output: { - path: path.resolve(__dirname, 'dist'), + path: path.resolve(__dirname, 'out'), filename: '[name].js', libraryTarget: 'commonjs2', devtoolModuleFilenameTemplate: '../[resource-path]' @@ -70,7 +70,7 @@ const extensionConfig = { plugins: [ new PermissionsOutputPlugin({ buildFolders: [{ - path: path.resolve(__dirname, 'dist/'), // Everything under dist/ gets these modes + path: path.resolve(__dirname, 'out/'), // Everything under resources/ gets these modes fileMode: '755', dirMode: '755' }] From cb2fb933b8c26eea6f45f3b65a2276a753130690 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Mon, 29 Sep 2025 15:34:32 +0530 Subject: [PATCH 073/730] Fix eof issue --- .../ballerina-extension/src/utils/ai/auth.ts | 8 ++++++- .../test/ai/evals/code/code.test.ts | 2 +- .../test/ai/evals/code/test-cases.ts | 21 ++++++++++++++----- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index a115938fd33..465db245f82 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -148,7 +148,9 @@ export const clearAuthCredentials = async (): Promise => { // BI Copilot Auth Utils // ================================== export const getLoginMethod = async (): Promise => { - + if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { + return LoginMethod.ANTHROPIC_KEY; + } const credentials = await getAuthCredentials(); if (credentials) { return credentials.loginMethod; @@ -159,6 +161,10 @@ export const getLoginMethod = async (): Promise => { export const getAccessToken = async (): Promise => { return new Promise(async (resolve, reject) => { try { + if (process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.trim() !== "") { + resolve(process.env.ANTHROPIC_API_KEY.trim()); + return; + } const credentials = await getAuthCredentials(); if (credentials) { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index 97b99f1170c..7e23451eedb 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -216,4 +216,4 @@ suite.only("AI Code Generator Tests Suite", () => { }); }); -}); \ No newline at end of file +}); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index defbeb86e79..e27788f5ca3 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -1,7 +1,20 @@ -// For development/testing: Set this to a small number (e.g., 1) for faster execution -const MAX_TEST_CASES = process.env.AI_TEST_ENV === 'true' ? 1 : undefined; +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. -const allTestCases = [ +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +export const testCases = [ { prompt: "write an integration to get emails of the Users from a mysql table and send an email using gmail connector saying that you for buying the product", projectPath: "fresh_bi_package" @@ -83,5 +96,3 @@ const allTestCases = [ projectPath: "fresh_bi_package" } ]; - -export const testCases = MAX_TEST_CASES ? allTestCases.slice(0, MAX_TEST_CASES) : allTestCases; From b2459aa66f0577323e0b1be1216b4a0ef894ad2d Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 29 Sep 2025 18:40:59 +0530 Subject: [PATCH 074/730] Reset Query Clauses Panel store when cleanup --- .../src/components/DataMapper/DataMapperEditor.tsx | 1 + workspaces/ballerina/data-mapper/src/store/store.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx index 3ad59f53d24..ae49237b456 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx @@ -280,6 +280,7 @@ export function DataMapperEditor(props: DataMapperEditorProps) { useDMCollapsedFieldsStore.getState().resetFields(); useDMExpandedFieldsStore.getState().resetFields(); useDMExpressionBarStore.getState().resetExpressionBarStore(); + useDMQueryClausesPanelStore.getState().resetQueryClausesPanelStore(); } const handleOnClose = () => { diff --git a/workspaces/ballerina/data-mapper/src/store/store.ts b/workspaces/ballerina/data-mapper/src/store/store.ts index e5b2fa3248a..545d518bb8c 100644 --- a/workspaces/ballerina/data-mapper/src/store/store.ts +++ b/workspaces/ballerina/data-mapper/src/store/store.ts @@ -162,9 +162,13 @@ export const useDMExpressionBarStore = create((set export interface DataMapperQueryClausesPanelState { isQueryClausesPanelOpen: boolean; setIsQueryClausesPanelOpen: (isQueryClausesPanelOpen: boolean) => void; + resetQueryClausesPanelStore: () => void; } export const useDMQueryClausesPanelStore = create((set) => ({ isQueryClausesPanelOpen: false, setIsQueryClausesPanelOpen: (isQueryClausesPanelOpen: boolean) => set({ isQueryClausesPanelOpen }), + resetQueryClausesPanelStore: () => set({ + isQueryClausesPanelOpen: false + }) })); From b2cd5473634da594c1371c9c40e5de5fc98c45e9 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 29 Sep 2025 19:59:03 +0530 Subject: [PATCH 075/730] Add refresh and reset functionality --- .../src/views/DataMapper/DataMapperView.tsx | 49 +++++++++++++------ .../DataMapper/DataMapperEditor.tsx | 4 ++ .../DataMapper/Header/DataMapperHeader.tsx | 23 ++++++++- .../ballerina/data-mapper/src/index.tsx | 4 +- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 7909fd0644f..7e00b54930b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -92,7 +92,8 @@ export function DataMapperView(props: DataMapperProps) { const { model, isFetching, - isError + isError, + refetch } = useDataMapperModel(filePath, viewState, position); const prevPositionRef = useRef(position); @@ -189,21 +190,6 @@ export function DataMapperView(props: DataMapperProps) { [modelState] ); - - const onDMClose = () => { - onClose ? onClose() : rpcClient.getVisualizerRpcClient()?.goBack(); - } - - const onEdit = () => { - const context: VisualizerLocation = { - view: MACHINE_VIEW.BIDataMapperForm, - identifier: modelState.model.output.name, - documentUri: filePath, - }; - - rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); - } - const updateExpression = async (outputId: string, expression: string, viewId: string, name: string) => { try { const resp = await rpcClient @@ -537,6 +523,35 @@ export function DataMapperView(props: DataMapperProps) { parentField.isDeepNested = false; } + + + const onDMClose = () => { + onClose ? onClose() : rpcClient.getVisualizerRpcClient()?.goBack(); + } + + + const onDMRefresh = async () => { + await refetch(); + }; + + const onDMReset = async () => { + await deleteMapping( + { output: name, expression: undefined }, + name + ); + }; + + const onEdit = () => { + const context: VisualizerLocation = { + view: MACHINE_VIEW.BIDataMapperForm, + identifier: modelState.model.output.name, + documentUri: filePath, + }; + + rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); + } + + useEffect(() => { // Hack to hit the error boundary if (isError) { @@ -652,6 +667,8 @@ export function DataMapperView(props: DataMapperProps) { modelState={modelState} name={name} onClose={onDMClose} + onRefresh={onDMRefresh} + onReset={onDMReset} onEdit={reusable ? onEdit : undefined} applyModifications={updateExpression} addArrayElement={addArrayElement} diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx index ae49237b456..8ae68b725f9 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/DataMapperEditor.tsx @@ -126,6 +126,8 @@ export function DataMapperEditor(props: DataMapperEditorProps) { name, applyModifications, onClose, + onRefresh, + onReset, onEdit, addArrayElement, handleView, @@ -331,6 +333,8 @@ export function DataMapperEditor(props: DataMapperEditorProps) { hasEditDisabled={!!errorKind} onClose={handleOnClose} onBack={handleOnBack} + onRefresh={onRefresh} + onReset={onReset} onEdit={onEdit} autoMapWithAI={autoMapWithAI} undoRedoGroup={undoRedoGroup} diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index 624931a2c90..f5de7697e0b 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -18,7 +18,7 @@ // tslint:disable: jsx-no-multiline-js import React from "react"; import styled from "@emotion/styled"; -import { Codicon, Icon } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon } from "@wso2/ui-toolkit"; import HeaderSearchBox from "./HeaderSearchBox"; import HeaderBreadcrumb from "./HeaderBreadcrumb"; @@ -35,17 +35,34 @@ export interface DataMapperHeaderProps { onClose: () => void; onBack: () => void; onEdit?: () => void; + onRefresh: () => Promise; + onReset: () => Promise; autoMapWithAI: () => Promise; undoRedoGroup: () => JSX.Element; } export function DataMapperHeader(props: DataMapperHeaderProps) { - const { views, switchView, hasEditDisabled, onClose, onBack, onEdit, autoMapWithAI, undoRedoGroup } = props; + const { views, switchView, hasEditDisabled, onClose, onBack, onRefresh, onReset, onEdit, autoMapWithAI, undoRedoGroup } = props; + + const [isRefreshing, setIsRefreshing] = React.useState(false); + const [isResetting, setIsResetting] = React.useState(false); const handleAutoMap = async () => { await autoMapWithAI(); }; + const handleOnRefresh = async () => { + setIsRefreshing(true); + await onRefresh(); + setIsRefreshing(false); + }; + + const handleOnReset = async () => { + setIsResetting(true); + await onReset(); + setIsResetting(false); + }; + return ( @@ -53,6 +70,8 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} + + Data Mapper {!hasEditDisabled && ( diff --git a/workspaces/ballerina/data-mapper/src/index.tsx b/workspaces/ballerina/data-mapper/src/index.tsx index d1140ed4dc5..e46a4914ea2 100644 --- a/workspaces/ballerina/data-mapper/src/index.tsx +++ b/workspaces/ballerina/data-mapper/src/index.tsx @@ -64,7 +64,6 @@ export interface DataMapperEditorProps { name: string; applyModifications: (outputId: string, expression: string, viewId: string, name: string) => Promise; addArrayElement: (outputId: string, viewId: string, name: string) => Promise; - generateForm: (formProps: DMFormProps) => JSX.Element; convertToQuery: (mapping: Mapping, clauseType: ResultClauseType, viewId: string, name: string) => Promise; addClauses: (clause: IntermediateClause, targetField: string, isNew: boolean, index:number) => Promise; deleteClause: (targetField: string, index: number) => Promise; @@ -75,9 +74,12 @@ export interface DataMapperEditorProps { mapWithTransformFn: (mapping: Mapping, metadata: FnMetadata, viewId: string) => Promise; goToFunction: (functionRange: LineRange) => Promise; enrichChildFields: (parentField: IOType) => Promise; + onRefresh: () => Promise; + onReset: () => Promise; onClose: () => void; onEdit?: () => void; handleView: (viewId: string, isSubMapping?: boolean) => void; + generateForm: (formProps: DMFormProps) => JSX.Element; undoRedoGroup: () => JSX.Element; } From a4b0e6880be47791fbcf57f9c8627fa968495039 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 29 Sep 2025 22:06:18 +0530 Subject: [PATCH 076/730] Enhance Refresh and Reset buttons with icons, loading indicators and tooltips --- .../DataMapper/Header/DataMapperHeader.tsx | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index f5de7697e0b..c29ff3c19d7 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -18,7 +18,7 @@ // tslint:disable: jsx-no-multiline-js import React from "react"; import styled from "@emotion/styled"; -import { Button, Codicon, Icon } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon, ProgressRing } from "@wso2/ui-toolkit"; import HeaderSearchBox from "./HeaderSearchBox"; import HeaderBreadcrumb from "./HeaderBreadcrumb"; @@ -70,8 +70,24 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} - - + + Data Mapper {!hasEditDisabled && ( From 1de830418e3e89f2050fd1cf4308f82580d4630a Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 30 Sep 2025 10:59:22 +0530 Subject: [PATCH 077/730] Address review suggestions --- .../src/core/extended-language-client.ts | 2 +- .../editors/CheckBoxConditionalEditor.tsx | 11 -- .../ServiceDesigner/ServiceCreationView.tsx | 158 +++++++++--------- 3 files changed, 80 insertions(+), 91 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index db74559d98f..ea34b792bdd 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -398,7 +398,7 @@ enum EXTENDED_APIS { BI_SERVICE_GET_LISTENER_SOURCE = 'serviceDesign/getListenerFromSource', BI_SERVICE_GET_SERVICE = 'serviceDesign/getServiceModel', BI_SERVICE_GET_SERVICE_INIT = 'serviceDesign/getServiceInitModel', - BI_SERVICE_CREATE_SERVICE_AND_LISTENER = 'serviceDesign/createServiceAndListener', + BI_SERVICE_CREATE_SERVICE_AND_LISTENER = 'serviceDesign/addServiceAndListener', BI_SERVICE_GET_FUNCTION = 'serviceDesign/getFunctionModel', BI_SERVICE_ADD_SERVICE = 'serviceDesign/addService', BI_SERVICE_UPDATE_SERVICE = 'serviceDesign/updateService', diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx index 8fdfd9db215..649a32c62fa 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx @@ -22,7 +22,6 @@ import { CheckBoxGroup, FormCheckBox } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { EditorFactory } from "./EditorFactory"; import { useFormContext } from "../../context"; -import { ContextAwareExpressionEditor } from "./ExpressionEditor"; import { PropertyModel } from "@wso2/ballerina-core"; const Form = styled.div` @@ -69,7 +68,6 @@ export function CheckBoxConditionalEditor(props: CheckBoxConditionalEditorProps) const { field } = props; const { form } = useFormContext(); const { register, control, watch } = form; - const [conditionalFields, setConditionalFields] = useState([]); const [checkedStateFields, setCheckedStateFields] = useState([]); const [uncheckedStateFields, setUncheckedStateFields] = useState([]); @@ -88,15 +86,6 @@ export function CheckBoxConditionalEditor(props: CheckBoxConditionalEditorProps) } }, [field]); - - // useEffect(() => { - // if (checked) { - // setConditionalFields(checkedStateFields); - // } else { - // setConditionalFields(uncheckedStateFields); - // } - // }, [checked, checkedStateFields, uncheckedStateFields]); - // Add useEffect to set initial values useEffect(() => { if (checkedStateFields.length > 0) { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx index b77423dcc8f..02557829915 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceCreationView.tsx @@ -98,6 +98,85 @@ enum PullingStatus { ERROR = "error", } +/** + * Maps the properties to an array of FormField objects. + * + * @param properties The properties to map. + * @returns An array of FormField objects. + */ +function mapPropertiesToFormFields(properties: { [key: string]: PropertyModel; }): FormField[] { + if (!properties) return []; + + return Object.entries(properties).map(([key, property]) => { + + // Determine value for MULTIPLE_SELECT + let value: any = property.value; + if (property.valueType === "MULTIPLE_SELECT") { + if (property.values && property.values.length > 0) { + value = property.values; + } else if (property.value) { + value = [property.value]; + } else if (property.items && property.items.length > 0) { + value = [property.items[0]]; + } else { + value = []; + } + } + + let items = undefined; + if (property.valueType === "MULTIPLE_SELECT" || property.valueType === "SINGLE_SELECT") { + items = property.items; + } + + return { + key, + label: property?.metadata?.label, + type: property.valueType, + documentation: property?.metadata?.description || "", + valueType: property.valueTypeConstraint, + editable: true, + enabled: property.enabled ?? true, + optional: property.optional, + value, + valueTypeConstraint: property.valueTypeConstraint, + advanced: property.advanced, + diagnostics: [], + items, + choices: property.choices, + placeholder: property.placeholder, + addNewButton: property.addNewButton, + lineRange: property?.codedata?.lineRange, + advanceProps: mapPropertiesToFormFields(property.properties) + } as FormField; + }); +} + +/** + * Populate the ServiceInitModel from the form fields. + * + * @param formFields The form fields to update. + * @param model The ServiceInitModel to update. + * @returns The updated ServiceInitModel. + */ +function populateServiceInitModelFromFormFields(formFields: FormField[], model: ServiceInitModel): ServiceInitModel { + if (!model || !model.properties || !formFields) return model; + + formFields.forEach(field => { + const property = model.properties[field.key]; + if (!property) return; + + const value = field.value; + + // Handle MULTIPLE_SELECT and EXPRESSION_SET types + if (field.type === "MULTIPLE_SELECT" || field.type === "EXPRESSION_SET") { + property.values = Array.isArray(value) ? value : value ? [value] : []; + } else { + property.value = value as string; + } + }); + return model; +} + export function ServiceCreationView(props: ServiceCreationViewProps) { const { orgName, packageName, moduleName, version } = props; @@ -372,82 +451,3 @@ export function ServiceCreationView(props: ServiceCreationViewProps) { ); } - -/** - * Maps the properties to an array of FormField objects. - * - * @param properties The properties to map. - * @returns An array of FormField objects. - */ -function mapPropertiesToFormFields(properties: { [key: string]: PropertyModel; }): FormField[] { - if (!properties) return []; - - return Object.entries(properties).map(([key, property]) => { - - // Determine value for MULTIPLE_SELECT - let value: any = property.value; - if (property.valueType === "MULTIPLE_SELECT") { - if (property.values && property.values.length > 0) { - value = property.values; - } else if (property.value) { - value = [property.value]; - } else if (property.items && property.items.length > 0) { - value = [property.items[0]]; - } else { - value = []; - } - } - - let items = undefined; - if (property.valueType === "MULTIPLE_SELECT" || property.valueType === "SINGLE_SELECT") { - items = property.items; - } - - return { - key, - label: property?.metadata?.label, - type: property.valueType, - documentation: property?.metadata?.description || "", - valueType: property.valueTypeConstraint, - editable: true, - enabled: property.enabled ?? true, - optional: property.optional, - value, - valueTypeConstraint: property.valueTypeConstraint, - advanced: property.advanced, - diagnostics: [], - items, - choices: property.choices, - placeholder: property.placeholder, - addNewButton: property.addNewButton, - lineRange: property?.codedata?.lineRange, - advanceProps: mapPropertiesToFormFields(property.properties) - } as FormField; - }); -} - -/** - * Populate the ServiceInitModel from the form fields. - * - * @param formFields The form fields to update. - * @param model The ServiceInitModel to update. - * @returns The updated ServiceInitModel. - */ -function populateServiceInitModelFromFormFields(formFields: FormField[], model: ServiceInitModel): ServiceInitModel { - if (!model || !model.properties || !formFields) return model; - - formFields.forEach(field => { - const property = model.properties[field.key]; - if (!property) return; - - const value = field.value; - - // Handle MULTIPLE_SELECT and EXPRESSION_SET types - if (field.type === "MULTIPLE_SELECT" || field.type === "EXPRESSION_SET") { - property.values = Array.isArray(value) ? value : value ? [value] : []; - } else { - property.value = value as string; - } - }); - return model; -} From 03f356819e7431ba25bb5075c492626eedf14928 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Tue, 30 Sep 2025 11:42:04 +0530 Subject: [PATCH 078/730] Remove dotted http resource accordion --- .../components/ResourceAccordionV2.tsx | 116 ++++++------------ .../src/views/BI/ServiceDesigner/index.tsx | 37 ++---- 2 files changed, 53 insertions(+), 100 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx index 24687ebc42b..8024afe19ae 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx @@ -30,7 +30,6 @@ type MethodProp = { type ContainerProps = { borderColor?: string; haveErrors?: boolean; - isPlaceholder?: boolean; }; type ButtonSectionProps = { @@ -45,17 +44,11 @@ const AccordionContainer = styled.div` margin-top: 10px; overflow: hidden; background-color: var(--vscode-editorHoverWidget-background); - border: ${(p: ContainerProps) => - p.haveErrors - ? "1px solid red" - : p.isPlaceholder - ? "2px dashed var(--vscode-inputOption-activeBorder)" - : "none" - }; &:hover { background-color: var(--vscode-list-hoverBackground); cursor: pointer; } + border: ${(p: ContainerProps) => p.haveErrors ? "1px solid red" : "none"}; `; const AccordionHeader = styled.div` @@ -101,11 +94,9 @@ const MethodBox = styled.div` font-weight: bold; `; -const MethodSection = styled.div<{ isPlaceholder?: boolean }>` +const MethodSection = styled.div` display: flex; gap: 4px; - align-items: center; - justify-content: ${(p: { isPlaceholder?: boolean }) => p.isPlaceholder ? 'center' : 'flex-start'}; `; const verticalIconStyles = { @@ -148,11 +139,10 @@ export interface ResourceAccordionPropsV2 { onDeleteResource: (resource: FunctionModel) => void; onResourceImplement: (resource: FunctionModel) => void; readOnly?: boolean; - isPlaceholder?: boolean; } export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { - const { resource, onEditResource, onDeleteResource, onResourceImplement, readOnly, isPlaceholder } = params; + const { resource, onEditResource, onDeleteResource, onResourceImplement, readOnly } = params; const [isOpen, setIsOpen] = useState(false); const [isConfirmOpen, setConfirmOpen] = useState(false); @@ -178,13 +168,6 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { const handleEditResource = async (e: React.MouseEvent) => { e.stopPropagation(); // Stop the event propagation - - // If it's a placeholder, just call the handler directly - if (isPlaceholder) { - onEditResource(null); - return; - } - const functionModel = await getFunctionModel(); onEditResource(functionModel.function); }; @@ -209,12 +192,6 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { }; const handleResourceImplement = async () => { - // If it's a placeholder, just call the handler directly - if (isPlaceholder) { - onResourceImplement(null); - return; - } - const functionModel = await getFunctionModel(); onResourceImplement(functionModel.function); } @@ -241,61 +218,48 @@ export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { } return ( - + - - {isPlaceholder ? ( - <> - - Add new resource - - ) : ( - <> - - {resource.icon.split("-")[0].toUpperCase()} - - {resource.name} - - )} + + + {resource.icon.split("-")[0].toUpperCase()} + + {resource.name} - {!isPlaceholder && ( - <> - - - - )} + <> + + + + - {!isPlaceholder && ( - - )} + ); }; - diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 16e0057da05..78c498a2c85 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -186,6 +186,7 @@ interface ReadonlyProperty { export const ADD_HANDLER = "add-handler"; export const ADD_INIT_FUNCTION = "add-init-function"; export const ADD_REUSABLE_FUNCTION = "add-reusable-function"; +export const ADD_HTTP_RESOURCE = "add-http-resource"; export function ServiceDesigner(props: ServiceDesignerProps) { const { filePath, position, serviceIdentifier } = props; @@ -308,6 +309,15 @@ export function ServiceDesigner(props: ServiceDesignerProps) { value: ADD_HANDLER }); } + + if (service.moduleName === "http" && !service.properties.hasOwnProperty('serviceTypeName')) { + options.push({ + title: "Add Resource", + description: "Add a new resource endpoint to the service", + value: ADD_HTTP_RESOURCE + }); + } + if (!hasInitMethod) { options.push({ title: "Add Init Function", @@ -427,6 +437,9 @@ export function ServiceDesigner(props: ServiceDesignerProps) { case ADD_HANDLER: onSelectAddHandler(); break; + case ADD_HTTP_RESOURCE: + handleNewResourceFunction(); + break; } }; @@ -743,30 +756,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) {
- {/* Add Resource Function - Dotted Accordion */} - {!haveServiceTypeName && ( - handleNewResourceFunction()} - onDeleteResource={() => { }} - onResourceImplement={() => handleNewResourceFunction()} - /> - )} {resources .filter((resource) => { const search = searchValue.toLowerCase(); From 556d0c0d46ed3ebb00b81725b19cd8ce70e3a0b1 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 30 Sep 2025 14:01:34 +0530 Subject: [PATCH 079/730] Update chat agent creation to use AGENT_CALL template --- .../ballerina-core/src/interfaces/bi.ts | 1 + .../src/utils/project-artifacts.ts | 67 ------ .../src/utils/source-utils.ts | 17 -- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 199 +++++++++--------- 4 files changed, 98 insertions(+), 186 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index cd33eece8cc..6a3cf4786a9 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -328,6 +328,7 @@ export type NodePropertyKey = | "model" | "modelProvider" | "msg" + | "name" | "parameters" | "path" | "patterns" diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index c9638370f2d..185bc617958 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -19,12 +19,7 @@ import * as vscode from "vscode"; import { URI, Utils } from "vscode-uri"; import { ARTIFACT_TYPE, Artifacts, ArtifactsNotification, BaseArtifact, DIRECTORY_MAP, NodePosition, ProjectStructureArtifactResponse, ProjectStructureResponse } from "@wso2/ballerina-core"; import { StateMachine } from "../stateMachine"; -import * as fs from 'fs'; -import * as path from 'path'; import { ExtendedLangClient } from "../core/extended-language-client"; -import { ServiceDesignerRpcManager } from "../rpc-managers/service-designer/rpc-manager"; -import { AiAgentRpcManager } from "../rpc-managers/ai-agent/rpc-manager"; -import { injectAgentCode } from "./source-utils"; import { ArtifactsUpdated, ArtifactNotificationHandler } from "./project-artifacts-handler"; import { CommonRpcManager } from "../rpc-managers/common/rpc-manager"; @@ -199,54 +194,6 @@ async function getEntryValue(artifact: BaseArtifact, icon: string, moduleName?: return entryValue; } -// This is a hack to inject the AI agent code into the chat service function -// This has to be replaced once we have a proper design for AI Agent Chat Service -async function injectAIAgent(serviceArtifact: BaseArtifact) { - // Fetch the organization name for importing the AI package - const aiModuleOrg = await new AiAgentRpcManager().getAiModuleOrg({ projectPath: StateMachine.context().projectUri }); - - //get AgentName - const agentName = serviceArtifact.name.split('-')[1].trim().replace(/\//g, ''); - - // Retrieve the service model - const targetFile = Utils.joinPath(URI.file(StateMachine.context().projectUri), serviceArtifact.location.fileName).fsPath; - const updatedService = await new ServiceDesignerRpcManager().getServiceModelFromCode({ - filePath: targetFile, - codedata: { - lineRange: { - startLine: { line: serviceArtifact.location.startLine.line, offset: serviceArtifact.location.startLine.offset }, - endLine: { line: serviceArtifact.location.endLine.line, offset: serviceArtifact.location.endLine.offset } - } - } - }); - if (!updatedService?.service?.functions?.[0]?.codedata?.lineRange?.endLine) { - console.error('Unable to determine injection position: Invalid service structure'); - return; - } - const injectionPosition = updatedService.service.functions[0].codedata.lineRange.endLine; - const serviceFile = path.join(StateMachine.context().projectUri, `main.bal`); - ensureFileExists(serviceFile); - await injectAgentCode(agentName, serviceFile, injectionPosition, aiModuleOrg.orgName); - const functionPosition: NodePosition = { - startLine: updatedService.service.functions[0].codedata.lineRange.startLine.line, - startColumn: updatedService.service.functions[0].codedata.lineRange.startLine.offset, - endLine: updatedService.service.functions[0].codedata.lineRange.endLine.line + 2, - endColumn: updatedService.service.functions[0].codedata.lineRange.endLine.offset - }; - return { - position: functionPosition - }; -} - -function ensureFileExists(targetFile: string) { - // Check if the file exists - if (!fs.existsSync(targetFile)) { - // Create the file if it does not exist - fs.writeFileSync(targetFile, ""); - console.log(`>>> Created file at ${targetFile}`); - } -} - /** * Maps an ARTIFACT_TYPE category key and a specific artifact to the corresponding DIRECTORY_MAP key and a default icon. * Note: The icon returned here is a base icon; `getEntryValue` might assign a more specific icon later based on the module. @@ -334,20 +281,6 @@ async function processAddition(artifact: BaseArtifact, artifactCategoryKey: stri projectStructure.directoryMap[mapping.mapKey] = []; } entryValue.isNew = true; // This is a flag to identify the new artifact - - // Hack to handle AI services ---------------------------------> - // Inject the AI agent code into the service when new service is created - if (artifact.module === "ai" && artifact.type === DIRECTORY_MAP.SERVICE) { - const aiResourceLocation = Object.values(artifact.children).find(child => child.type === DIRECTORY_MAP.RESOURCE)?.location; - const startLine = aiResourceLocation.startLine.line; - const endLine = aiResourceLocation.endLine.line; - const isEmptyResource = endLine - startLine === 1; - if (isEmptyResource) { - const injectedResult = await injectAIAgent(artifact); - entryValue.position = injectedResult.position; - } - } - // <------------------------------------------------------------- projectStructure.directoryMap[mapping.mapKey]?.push(entryValue); return entryValue; } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index d5de7ac0c61..4fba516d642 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -214,20 +214,3 @@ export async function injectImportIfMissing(importStatement: string, filePath: s } } -export async function injectAgentCode(name: string, serviceFile: string, injectionPosition: LinePosition, orgName: string) { - // Update the service function code - const serviceEdit = new vscode.WorkspaceEdit(); - // Choose agent invocation code based on orgName - const serviceSourceCode = - orgName === "ballerina" - ? - ` string stringResult = check _${name}Agent.run(request.message, request.sessionId); - return {message: stringResult}; -` - : - ` string stringResult = check _${name}Agent->run(request.message, request.sessionId); - return {message: stringResult}; -`; - serviceEdit.insert(Uri.file(serviceFile), new Position(injectionPosition.line, 0), serviceSourceCode); - await workspace.applyEdit(serviceEdit); -} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 19b357b08a3..ae3fefcf676 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -17,17 +17,15 @@ */ import { useRef, useState } from 'react'; -import { AvailableNode, EVENT_TYPE, FlowNode, LinePosition, ListenerModel } from '@wso2/ballerina-core'; +import { CodeData, EVENT_TYPE } from '@wso2/ballerina-core'; import { View, ViewContent, TextField, Button, Typography } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; -import { URI, Utils } from "vscode-uri"; import { TitleBar } from '../../../components/TitleBar'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; import { getAiModuleOrg, getNodeTemplate } from './utils'; -import { AI, AI_COMPONENT_PROGRESS_MESSAGE_TIMEOUT, BALLERINA, GET_DEFAULT_MODEL_PROVIDER } from '../../../constants'; const FormContainer = styled.div` display: flex; @@ -107,133 +105,130 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { // Initialize wizard data when user clicks create setCurrentStep(0); - // get agent org + // Get AI module organization aiModuleOrg.current = await getAiModuleOrg(rpcClient); - // get project path - const filePath = await rpcClient.getVisualizerLocation(); - projectPath.current = filePath.projectUri; - - // Search for agent node in the current file - const agentSearchResponse = await rpcClient.getBIDiagramRpcClient().search({ - filePath: projectPath.current, - queryMap: { orgName: aiModuleOrg.current }, - searchKind: "AGENT" - }); - - // Validate search response structure - if (!agentSearchResponse?.categories?.[0]?.items?.[0]) { - throw new Error('No agent node found in search response'); - } - - const agentNode = agentSearchResponse.categories[0].items[0] as AvailableNode; - console.log(">>> agentNode", agentNode); - - // Generate template from agent node - const agentNodeTemplate = await getNodeTemplate(rpcClient, agentNode.codedata, projectPath.current); - - // hack: fetching from Central to build module dependency map in LS may take time - progressTimeoutRef.current = setTimeout(() => { - setCurrentStep(2); - progressTimeoutRef.current = null; - }, AI_COMPONENT_PROGRESS_MESSAGE_TIMEOUT); - - // Search for model providers - const modelProviderSearchResponse = await rpcClient.getBIDiagramRpcClient().search({ - filePath: projectPath.current, - queryMap: { q: aiModuleOrg.current === BALLERINA ? "ai" : "OpenAiProvider" }, - searchKind: aiModuleOrg.current === BALLERINA ? "MODEL_PROVIDER" : "CLASS_INIT" - }); - - const modelNodes = modelProviderSearchResponse.categories[0].items as AvailableNode[]; - console.log(">>> modelNodes", modelNodes); - - // get default model - const defaultModelNode = modelNodes.find((model) => - model.codedata.object === "OpenAiProvider" || (model.codedata.org === BALLERINA && model.codedata.module === AI) - ); - if (!defaultModelNode) { - console.log(">>> no default model found"); - throw new Error("No default model found"); - } - - // get model node template - const modelNodeTemplate = await getNodeTemplate(rpcClient, defaultModelNode.codedata, projectPath.current); - - // Get listener model - const listenerName = agentName + "Listener"; - const listenerModelResponse = await rpcClient.getServiceDesignerRpcClient().getListenerModel({ + const visualizerLocation = await rpcClient.getVisualizerLocation(); + projectPath.current = visualizerLocation.projectUri; + + const agentCallCodeData: CodeData = { + "node": "AGENT_CALL", + "org": "ballerina", + "module": "ai", + "packageName": "ai", + "object": "Agent", + "symbol": "run" + }; + const agentCallTemplate = await getNodeTemplate(rpcClient, agentCallCodeData, projectPath.current); + agentCallTemplate.properties["name"].value = `_${agentName}`; + + const listenerVariableName = `${agentName}Listener`; + const listenerResponse = await rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: aiModuleOrg.current }); - console.log(">>> listenerModelResponse", listenerModelResponse); - const listener = listenerModelResponse.listener; - // Update the listener name and create the listener - listener.properties['name'].value = listenerName; - listener.properties['listenOn'].value = "check http:getDefaultListener()"; + const listenerConfiguration = listenerResponse.listener; + listenerConfiguration.properties['variableNameKey'].value = listenerVariableName; + listenerConfiguration.properties['listenOn'].value = "check http:getDefaultListener()"; setCurrentStep(1); - await rpcClient.getServiceDesignerRpcClient().addListenerSourceCode({ filePath: "", listener }); + await rpcClient.getServiceDesignerRpcClient().addListenerSourceCode({ + filePath: "", + listener: listenerConfiguration + }); setCurrentStep(3); - // Update the service name and create the service - const serviceModelResponse = await rpcClient.getServiceDesignerRpcClient().getServiceModel({ + + const serviceResponse = await rpcClient.getServiceDesignerRpcClient().getServiceModel({ filePath: "", moduleName: type, - listenerName: listenerName, + listenerName: listenerVariableName, orgName: aiModuleOrg.current, }); - const serviceModel = serviceModelResponse.service; - console.log("Service Model: ", serviceModel); - serviceModel.properties["listener"].editable = true; - serviceModel.properties["listener"].items = [listenerName]; - serviceModel.properties["listener"].values = [listenerName]; - serviceModel.properties["basePath"].value = `/${agentName}`; + const serviceConfiguration = serviceResponse.service; + serviceConfiguration.properties["listener"].editable = true; + serviceConfiguration.properties["listener"].items = [listenerVariableName]; + serviceConfiguration.properties["listener"].values = [listenerVariableName]; + serviceConfiguration.properties["basePath"].value = `/${agentName}`; - const sourceCode = await rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ + const serviceSourceCodeResult = await rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ filePath: "", - service: serviceModelResponse.service + service: serviceConfiguration }); setCurrentStep(4); - const newArtifact = sourceCode.artifacts.find(res => res.isNew); - console.log(">>> agent service sourceCode", sourceCode); - console.log(">>> newArtifact", newArtifact); - - // save model node - const modelVarName = `_${agentName}Model`; - modelNodeTemplate.properties.variable.value = modelVarName; - const modelResponse = await rpcClient + + const newServiceArtifact = serviceSourceCodeResult.artifacts.find(artifact => artifact.isNew); + + rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, + location: { + documentUri: newServiceArtifact.path, + position: newServiceArtifact.position + } + }); + + const currentFlowModel = await rpcClient.getBIDiagramRpcClient().getFlowModel(); + + const serviceEntryNode = currentFlowModel.flowModel.nodes.find( + (node) => node.codedata.node === "EVENT_START" + ); + + agentCallTemplate.codedata.lineRange = { + fileName: newServiceArtifact.path, + startLine: { + line: serviceEntryNode.codedata.lineRange.startLine.line, + offset: serviceEntryNode.codedata.lineRange.startLine.offset + 1 + }, + endLine: { + line: serviceEntryNode.codedata.lineRange.startLine.line, + offset: serviceEntryNode.codedata.lineRange.startLine.offset + 1 + } + }; + + await rpcClient .getBIDiagramRpcClient() - .getSourceCode({ filePath: projectPath.current, flowNode: modelNodeTemplate }); - console.log(">>> modelResponse getSourceCode", { modelResponse }); - - // save the agent node - const systemPromptValue = `{role: "", instructions: string \`\`}`; - const agentVarName = `_${agentName}Agent`; - agentNodeTemplate.properties.systemPrompt.value = systemPromptValue; - agentNodeTemplate.properties.model.value = modelVarName; - agentNodeTemplate.properties.tools.value = []; - agentNodeTemplate.properties.variable.value = agentVarName; - - const agentResponse = await rpcClient + .getSourceCode({ filePath: newServiceArtifact.path, flowNode: agentCallTemplate }); + + const agentResponseVariable = agentCallTemplate.properties["variable"].value; + + const updatedFlowModel = await rpcClient.getBIDiagramRpcClient().getFlowModel(); + const insertedAgentCallNode = updatedFlowModel.flowModel.nodes.find( + (node) => node.codedata.node === "AGENT_CALL" + ); + + const returnStatementCodeData: CodeData = { + "node": "RETURN", + "isNew": true + }; + const returnStatementTemplate = await getNodeTemplate(rpcClient, returnStatementCodeData, newServiceArtifact.path); + returnStatementTemplate.properties["expression"].value = `{message: ${agentResponseVariable}}`; + returnStatementTemplate.codedata.lineRange = { + fileName: newServiceArtifact.path, + startLine: { + line: insertedAgentCallNode.codedata.lineRange.endLine.line, + offset: insertedAgentCallNode.codedata.lineRange.endLine.offset + }, + endLine: { + line: insertedAgentCallNode.codedata.lineRange.endLine.line, + offset: insertedAgentCallNode.codedata.lineRange.endLine.offset + } + }; + + await rpcClient .getBIDiagramRpcClient() - .getSourceCode({ filePath: projectPath.current, flowNode: agentNodeTemplate }); - console.log(">>> agentResponse getSourceCode", { agentResponse }); + .getSourceCode({ filePath: newServiceArtifact.path, flowNode: returnStatementTemplate }); - // If the selected model is the default WSO2 model provider, configure it - if (defaultModelNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER) { - await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); - } + await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); - if (newArtifact) { + if (newServiceArtifact) { setCurrentStep(5); rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, - location: { documentUri: newArtifact.path, position: newArtifact.position } + location: { documentUri: newServiceArtifact.path, position: newServiceArtifact.position } }); } } catch (error) { From 6c97fb1da6707bc6006c5ef9d78f177ae25937ed Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 30 Sep 2025 20:55:42 +0530 Subject: [PATCH 080/730] Update agentCallCodeData to use aiModuleOrg --- .../src/views/BI/AIChatAgent/AIChatAgentWizard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index ae3fefcf676..f8e0be31cf4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -113,7 +113,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const agentCallCodeData: CodeData = { "node": "AGENT_CALL", - "org": "ballerina", + "org": aiModuleOrg.current, "module": "ai", "packageName": "ai", "object": "Agent", From 9f160ec16209f20adf7550942b32fa7b835c3770 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 1 Oct 2025 09:11:35 +0530 Subject: [PATCH 081/730] Resolve review requests --- .../ballerina/ballerina-core/src/state-machine-types.ts | 2 +- .../src/views/BI/DiagramWrapper/index.tsx | 2 +- .../src/views/BI/ServiceFunctionForm/utils.ts | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index f0df585d30a..853bd964897 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -97,7 +97,7 @@ export enum MACHINE_VIEW { AIAgentDesigner = "AI Agent Designer", AIChatAgentWizard = "AI Chat Agent Wizard", ResolveMissingDependencies = "Resolve Missing Dependencies", - ServiceFunctionForm = "Service Function Form " + ServiceFunctionForm = "Service Function Form" } export interface MachineEvent { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index c856d1ed33d..4097279968c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -246,7 +246,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { } }; - const handleEdit = async (fileUri?: string, position?: NodePosition) => { + const handleEdit = (fileUri?: string, position?: NodePosition) => { const context: VisualizerLocation = { view: view === FOCUS_FLOW_DIAGRAM_VIEW.NP_FUNCTION diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts index 48e8b0de1db..602bc8cd241 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/utils.ts @@ -206,14 +206,15 @@ export function convertSchemaToFormFields(schema: ConfigProperties): FormField[] } export function convertParameterToParamValue(param: ParameterModel, index: number) { + const paramDefaultValue = typeof param?.defaultValue === 'string' ? param?.defaultValue : param?.defaultValue?.value; return { id: index, key: param.name.value, - value: `${param.type.value} ${param.name.value}${(param.defaultValue as any)?.value ? ` = ${(param.defaultValue as any)?.value}` : ''}`, + value: `${param.type.value} ${param.name.value}${paramDefaultValue ? ` = ${paramDefaultValue}` : ''}`, formValues: { variable: param.name.value, type: param.type.value, - defaultable: (param.defaultValue as any)?.value || '' + defaultable: paramDefaultValue || '' }, icon: 'symbol-variable', identifierEditable: param.name?.editable, From 0337e34e5ffde561a0d8919747fe220d251cfca6 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 1 Oct 2025 09:37:49 +0530 Subject: [PATCH 082/730] Resolve review requests --- .../service-class-designer/service-class.spec.ts | 4 +--- .../service-class-designer/serviceEditorUtils.ts | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts index f8ecfb6afce..a8eff596a71 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts @@ -17,8 +17,6 @@ */ import { test } from '@playwright/test'; import { addArtifact, getWebview, initTest, page } from '../utils'; -import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; -import { ProjectExplorer } from '../ProjectExplorer'; import { ServiceClassEditorUtils } from './serviceEditorUtils'; export default function createTests() { @@ -59,4 +57,4 @@ export default function createTests() { await serviceClassUtils.deleteVariable('id'); }) }); -} \ No newline at end of file +} diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts index 8e86c76a0a2..cd9d623e5a7 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts @@ -1,4 +1,4 @@ -import { Frame, FrameLocator, Page } from '@playwright/test'; +import { Frame, Page } from '@playwright/test'; import { Form } from '@wso2/playwright-vscode-tester'; export interface ServiceMethod { @@ -190,4 +190,4 @@ export class ServiceClassEditorUtils { const saveButton = await this.waitForButton('Save'); await saveButton.click(); } -} \ No newline at end of file +} From 1df4549e1f6592188a341781519bdcc3b80b81da Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 1 Oct 2025 11:35:08 +0530 Subject: [PATCH 083/730] Show components of the function form based on the LS request --- .../src/views/BI/ServiceFunctionForm/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index e97ef52de97..dc4bc2c9d51 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -176,7 +176,8 @@ export function ServiceFunctionForm(props: ServiceFunctionFormProps) { valueTypeConstraint: model.returnType.valueTypeConstraint || '' } ]; - setFields(initialFields); + const enabledFields = initialFields.filter(field => field.enabled); + setFields(enabledFields); }; useEffect(() => { From dae5c495c0b777ce6062e936f44102ef05ccc9e6 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 1 Oct 2025 14:08:13 +0530 Subject: [PATCH 084/730] Remove redundant case handling --- .../ballerina-visualizer/src/MainPanel.tsx | 12 ++-- .../views/BI/ServiceFunctionForm/index.tsx | 55 ++++++++----------- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 6a01225d31a..12fd0d84883 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -532,11 +532,13 @@ const MainPanel = () => { ); break; case MACHINE_VIEW.ServiceFunctionForm: - setViewComponent(); + setViewComponent( + + ); break; default: setNavActive(false); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx index dc4bc2c9d51..7753966ef51 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceFunctionForm/index.tsx @@ -32,6 +32,8 @@ import { convertParameterToParamValue, handleFunctionCreate } from './utils'; +import { LoaderContainer } from '../../../components/RelativeLoader/styles'; +import { RelativeLoader } from '../../../components/RelativeLoader'; const FormContainer = styled.div` display: flex; @@ -191,23 +193,6 @@ export function ServiceFunctionForm(props: ServiceFunctionFormProps) { } }; - if (!model) { - return ( - - - - - -
Loading function data...
-
-
-
- ); - } - return ( @@ -217,21 +202,27 @@ export function ServiceFunctionForm(props: ServiceFunctionFormProps) { /> - - {fields.length > 0 && ( - - )} - + {!model ? ( + + + + ) : ( + + {fields.length > 0 && ( + + )} + + )} From 5aa1cc21db2c3212ce5ec85289ab33e87db3c43a Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Wed, 1 Oct 2025 15:17:52 +0530 Subject: [PATCH 085/730] Update form to support nullable field --- .../src/components/Form/types.ts | 3 +- .../components/editors/ActionTypeEditor.tsx | 557 ++++++++++++++++++ .../src/components/editors/EditorFactory.tsx | 15 +- .../views/GraphQLDiagram/OperationForm.tsx | 3 +- 4 files changed, 575 insertions(+), 3 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts index e2222fe028f..a2bcbd3bf82 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts @@ -17,7 +17,7 @@ */ import { RefObject } from "react"; -import { DiagnosticMessage, FormDiagnostics, TextEdit, PropertyModel, LinePosition, LineRange, ExpressionProperty, Metadata, RecordTypeField, Imports } from "@wso2/ballerina-core"; +import { DiagnosticMessage, FormDiagnostics, TextEdit, PropertyModel, LinePosition, LineRange, ExpressionProperty, Metadata, RecordTypeField, Imports, ConfigProperties } from "@wso2/ballerina-core"; import { ParamConfig } from "../ParamManager/ParamManager"; import { CompletionItem, FormExpressionEditorRef, HelperPaneHeight, HelperPaneOrigin, OptionProps } from "@wso2/ui-toolkit"; @@ -56,6 +56,7 @@ export type FormField = { codedata?: { [key: string]: any }; imports?: { [key: string]: string }; actionLabel?: string | JSX.Element; + properties?: ConfigProperties; actionCallback?: () => void; onValueChange?: (value: string) => void; }; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx new file mode 100644 index 00000000000..f6c6f06cd4d --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx @@ -0,0 +1,557 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useRef, useState } from "react"; +import { + Codicon, + ErrorBanner, + FormExpressionEditor, + FormExpressionEditorRef, + HelperPaneHeight, + Icon, + Item, + Menu, + MenuItem, + RequiredFormInput, + ThemeColors, + Tooltip, + Typography, + CompletionItem, + Button, +} from "@wso2/ui-toolkit"; +import { FormField } from "../Form/types"; +import { useFormContext } from "../../context"; +import { Controller } from "react-hook-form"; +import { S } from "./ExpressionEditor"; +import { getPropertyFromFormField, sanitizeType } from "./utils"; +import { debounce } from "lodash"; +import styled from "@emotion/styled"; +import ReactMarkdown from "react-markdown"; +import { NodeProperties, PropertyModel } from "@wso2/ballerina-core"; + +interface ActionTypeEditorProps { + field: FormField; + openRecordEditor: (open: boolean, newType?: string | NodeProperties) => void; + handleOnFieldFocus?: (key: string) => void; + handleOnTypeChange?: (value?: string) => void; + handleNewTypeSelected?: (type: string | CompletionItem) => void; + autoFocus?: boolean; +} + +const Ribbon = styled.div({ + backgroundColor: ThemeColors.PRIMARY, + opacity: 0.6, + width: '24px', + height: `calc(100% - 6.5px)`, + display: 'flex', + justifyContent: 'center', + alignItems: 'flex-start', + borderTopLeftRadius: '2px', + borderBottomLeftRadius: '2px', + borderRight: 'none', + marginTop: '3.75px', + paddingTop: '6px', + cursor: 'pointer' +}); + +const codiconStyles = { + color: 'var(--vscode-editorLightBulb-foreground)', + marginRight: '2px' +} + +const EditorRibbon = ({ onClick }: { onClick: () => void }) => { + return ( + + + + + + ); +}; + +const getDefaultCompletion = (newType: string) => { + return ( + + + + Add Type: {newType} + + + ) +} + +export function ActionTypeEditor(props: ActionTypeEditorProps) { + const { field, openRecordEditor, handleOnFieldFocus, handleOnTypeChange, autoFocus, handleNewTypeSelected } = props; + const { form, expressionEditor } = useFormContext(); + const { control } = form; + const { + types, + referenceTypes, + helperPaneOrigin: typeHelperOrigin, + helperPaneHeight: typeHelperHeight, + retrieveVisibleTypes, + getTypeHelper, + onFocus, + onBlur, + onCompletionItemSelect, + onSave, + onCancel, + getExpressionEditorDiagnostics + } = expressionEditor; + + const exprRef = useRef(null); + const typeBrowserRef = useRef(null); + const codeActionRef = useRef(null); + const onChangeRef = useRef<((value: string) => void) | null>(null); + + const cursorPositionRef = useRef(undefined); + const [showDefaultCompletion, setShowDefaultCompletion] = useState(false); + const [focused, setFocused] = useState(false); + const [isTypeOptional, setIsTypeOptional] = useState(false); + const [isCodeActionMenuOpen, setIsCodeActionMenuOpen] = useState(false); + + const [isTypeHelperOpen, setIsTypeHelperOpen] = useState(false); + + /** HACK: FE implementation till we get the LS api to check the optionalsupport + * Checks if a type is optional by detecting various optional patterns: + */ + const checkTypeOptional = (typeValue: string | any[]): boolean => { + if (!typeValue) { + return false; + } + + // Handle string values + if (typeof typeValue === 'string') { + const trimmedValue = typeValue.trim(); + + // Check for traditional optional syntax (ends with '?') + if (trimmedValue.endsWith('?')) { + return true; + } + + if (trimmedValue === '()') { + return true; + } + + if (trimmedValue.includes('()')) { + const unionParts = trimmedValue.split('|').map(part => part.trim()); + return unionParts.some(part => part === '()'); + } + + return false; + } + + // Handle array values - check if any item is optional + if (Array.isArray(typeValue)) { + return typeValue.some(item => + typeof item === 'string' && checkTypeOptional(item) + ); + } + + return false; + }; + + const handleMakeOptional = async () => { + console.log('handleMakeOptional triggered', form.getValues(field.key), form.watch(field.key)); + const currentValue = form.getValues(field.key) || field.value || ''; + console.log('handleMakeOptional - currentValue:', currentValue, 'field.value:', field.value); + + if (!currentValue.toString().endsWith('?') && exprRef.current) { + const newValue = currentValue + '?'; + console.log('Adding ? to make optional:', newValue); + + // Update the form value using setValue instead of onChange + form.setValue(field.key, newValue, { shouldValidate: true, shouldDirty: true }); + + // Update the expression editor value directly + if (exprRef.current.inputElement) { + exprRef.current.inputElement.value = newValue; + } + + // Move cursor to the end + const newCursorPosition = newValue.length; + cursorPositionRef.current = newCursorPosition; + + // Immediately update the optional state + setIsTypeOptional(true); + + } else { + console.log('Not adding ? - already ends with ? or no exprRef'); + } + }; + + const handleCodeActionClick = () => { + setIsCodeActionMenuOpen(prev => !prev); + }; + + const handleCodeActionClose = () => { + setIsCodeActionMenuOpen(false); + }; + + const handleFocus = async (value: string) => { + setFocused(true); + // Trigger actions on focus + await onFocus?.(); + await retrieveVisibleTypes(value, value.length, true, field.valueTypeConstraint as string); + handleOnFieldFocus?.(field.key); + }; + + const handleBlur = async () => { + setFocused(false); + // Trigger actions on blur + await onBlur?.(); + setShowDefaultCompletion(undefined); + // Clean up memory + cursorPositionRef.current = undefined; + }; + + const handleCompletionSelect = async (value: string) => { + // Trigger actions on completion select + await onCompletionItemSelect?.(value, field.key); + + // Set cursor position + const cursorPosition = exprRef.current?.shadowRoot?.querySelector('textarea')?.selectionStart; + cursorPositionRef.current = cursorPosition; + setShowDefaultCompletion(false); + }; + + const handleCancel = () => { + onCancel?.(); + handleChangeTypeHelperState(false); + setShowDefaultCompletion(false); + } + + const handleDefaultCompletionSelect = (value: string | NodeProperties) => { + openRecordEditor(true, value); + handleCancel(); + } + + const handleTypeEdit = (value: string) => { + handleOnTypeChange && handleOnTypeChange(value); + }; + + const debouncedTypeEdit = debounce(handleTypeEdit, 300); + + const handleChangeTypeHelperState = (isOpen: boolean) => { + setIsTypeHelperOpen(isOpen); + }; + + const toggleTypeHelperPaneState = () => { + if (!isTypeHelperOpen) { + exprRef.current?.focus(); + } else { + handleChangeTypeHelperState(false); + } + }; + + const handleGetTypeHelper = ( + value: string, + onChange: (value: string, updatedCursorPosition: number) => void, + helperPaneHeight: HelperPaneHeight + ) => { + return getTypeHelper( + field.key, + field.valueTypeConstraint as string, + typeBrowserRef, + value, + cursorPositionRef.current, + isTypeHelperOpen, + onChange, + handleChangeTypeHelperState, + helperPaneHeight, + handleCancel, + exprRef + ); + } + + /* Track cursor position */ + const handleSelectionChange = () => { + const selection = window.getSelection(); + if (!selection || selection.rangeCount === 0) { + return; + } + + const range = selection.getRangeAt(0); + + if (exprRef.current?.parentElement.contains(range.startContainer)) { + cursorPositionRef.current = exprRef.current?.inputElement?.selectionStart ?? 0; + } + } + + // Initialize optional type state based on field value + useEffect(() => { + if (field.value) { + const isOptional = checkTypeOptional(field.value); + setIsTypeOptional(isOptional); + } + }, [field.value]); + + // Create code actions and menu items + const createCodeActionsAndMenuItems = () => { + const nullableAction = field.properties ? field.properties["nullableAction"] : undefined; + if (!nullableAction) return { codeActions: [], menuItems: [] }; + + const nullableProperty: PropertyModel = field.properties["nullableAction"].properties; + const action = nullableProperty["false"]?.value; + + const codeActions = !isTypeOptional && action ? [{ + title: action, + onClick: async () => { + handleMakeOptional(); + handleCodeActionClose(); + } + }] : []; + + const menuItems: React.ReactNode[] = []; + codeActions.forEach((item, index) => { + const menuItem: Item = { + id: `${item.title}-${index}`, + label: item.title, + onClick: item.onClick + } + menuItems.push( + + ); + }); + + return { codeActions, menuItems }; + }; + + const { codeActions, menuItems } = createCodeActionsAndMenuItems(); + + useEffect(() => { + const typeField = exprRef.current; + if (!typeField) { + return; + } + + document.addEventListener('selectionchange', handleSelectionChange); + return () => { + document.removeEventListener('selectionchange', handleSelectionChange); + } + }, [exprRef.current]); + + // Handle click outside to close code action menu + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (codeActionRef.current && !codeActionRef.current.contains(event.target as Node)) { + setIsCodeActionMenuOpen(false); + } + }; + + if (isCodeActionMenuOpen) { + document.addEventListener('mousedown', handleClickOutside); + } + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [isCodeActionMenuOpen]); + + return ( + + + + + {field.label} + {!field.optional && } + + + {field.documentation && {field.documentation}} + + + {/* Conditional metadata rendering based on optional type state */} + {(() => { + let msg; + const nullableAction = field.properties ? field.properties["nullableAction"] : undefined; + + // Check if there are any diagnostics for this field + const hasDiagnostics = form.formState.errors && form.formState.errors[field.key]; + + // Get current form value to check if field has content + const currentValue = form.watch(field.key) || field.value || ''; + + // Only show nullable action UI if there are no diagnostics, nullableAction exists, and field has a value + if (nullableAction && !hasDiagnostics && currentValue.trim()) { + const nullableProperty: PropertyModel = field.properties["nullableAction"].properties; + + if (isTypeOptional) { + msg = nullableProperty["true"]?.metadata?.description || ''; + } else { + msg = nullableProperty["false"]?.metadata?.description || ''; + } + + return ( +
+ {!isTypeOptional && codeActions.length > 0 && ( + <> + + {isCodeActionMenuOpen && ( +
+ + {menuItems} + +
+ )} + + )} + + {msg} + + +
+ ); + + } else { + return null; + } + })() + } +
+ {field.valueTypeConstraint && + {sanitizeType(field.valueTypeConstraint as string)}} +
+ { + // Store onChange function and current value in refs so they can be accessed by the icon click handler + onChangeRef.current = onChange; + // currentValueRef.current = value; + + return ( +
+ } + completions={types} + showDefaultCompletion={showDefaultCompletion} + getDefaultCompletion={() => getDefaultCompletion(value)} + value={value} + ariaLabel={field.label} + onChange={async (updatedValue: string, updatedCursorPosition: number) => { + if (updatedValue === value) { + return; + } + + onChange(updatedValue); + debouncedTypeEdit(updatedValue); + cursorPositionRef.current = updatedCursorPosition; + + // Check if type is optional and update state + const isOptional = checkTypeOptional(updatedValue); + setIsTypeOptional(isOptional); + + // Set show default completion + const typeExists = referenceTypes.find((type) => type.label === updatedValue); + + if (getExpressionEditorDiagnostics) { + const required = !field.optional; + + getExpressionEditorDiagnostics( + (required ?? !field.optional) || updatedValue !== '', + updatedValue, + field.key, + getPropertyFromFormField(field) + ); + } + + handleNewTypeSelected && handleNewTypeSelected(typeExists ? typeExists : updatedValue) + const validTypeForCreation = updatedValue.match(/^[a-zA-Z_'][a-zA-Z0-9_]*$/); + if (updatedValue && !typeExists && validTypeForCreation) { + setShowDefaultCompletion(true); + } else { + setShowDefaultCompletion(false); + } + + // Retrieve types + await retrieveVisibleTypes( + updatedValue, + updatedCursorPosition, + false, + field.valueTypeConstraint as string + ); + }} + onCompletionSelect={handleCompletionSelect} + onDefaultCompletionSelect={() => handleDefaultCompletionSelect(value)} + onFocus={() => handleFocus(value)} + enableExIcon={false} + isHelperPaneOpen={isTypeHelperOpen} + changeHelperPaneState={handleChangeTypeHelperState} + getHelperPane={handleGetTypeHelper} + helperPaneOrigin={typeHelperOrigin} + helperPaneHeight={typeHelperHeight} + onBlur={handleBlur} + onSave={onSave} + onCancel={handleCancel} + placeholder={field.placeholder} + autoFocus={autoFocus} + sx={{ paddingInline: '0' }} + helperPaneZIndex={40001} + /> + {error?.message && } +
+ ); + }} + /> +
+ ); +} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index 7ee5730e912..8cd30a5c81f 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -44,6 +44,7 @@ import { HeaderSetEditor } from "./HeaderSetEditor"; import { CompletionItem } from "@wso2/ui-toolkit"; import { CustomDropdownEditor } from "./CustomDropdownEditor"; import { ActionExpressionEditor } from "./ActionExpressionEditor"; +import { ActionTypeEditor } from "./ActionTypeEditor"; interface FormFieldEditorProps { field: FormField; @@ -139,7 +140,19 @@ export const EditorFactory = (props: FormFieldEditorProps) => { /> ); - } else if (!field.items && (field.type === "EXPRESSION" || field.type === "LV_EXPRESSION" || field.type == "ACTION_OR_EXPRESSION") && field.editable) { + } else if (!field.items && (field.type === "ACTION_TYPE") && field.editable) { + return ( + + ); + } else if (!field.items && (field.type === "EXPRESSION" || field.type === "LV_EXPRESSION" || field.type == "ACTION_OR_EXPRESSION") && field.editable) { // Expression field is a inline expression editor return ( Date: Wed, 1 Oct 2025 16:21:16 +0530 Subject: [PATCH 086/730] Added resource configuration button and improved dropdown options for service elements. --- .../src/views/BI/DiagramWrapper/index.tsx | 88 +++++++++++++++++-- .../components/AddServiceElementDropdown.tsx | 10 --- .../src/views/BI/ServiceDesigner/index.tsx | 27 ++++-- 3 files changed, 98 insertions(+), 27 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 81ba9dcdd6d..bc4668182e7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -24,13 +24,15 @@ import { BISequenceDiagram } from "../SequenceDiagram"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { TitleBar } from "../../../components/TitleBar"; -import { EVENT_TYPE, FOCUS_FLOW_DIAGRAM_VIEW, FocusFlowDiagramView, ParentMetadata } from "@wso2/ballerina-core"; -import { VisualizerLocation } from "@wso2/ballerina-core"; +import { CodeData, EVENT_TYPE, FOCUS_FLOW_DIAGRAM_VIEW, FocusFlowDiagramView, FunctionModel, LineRange, ParentMetadata } from "@wso2/ballerina-core"; +import { VisualizerLocation, NodePosition } from "@wso2/ballerina-core"; import { MACHINE_VIEW } from "@wso2/ballerina-core"; import styled from "@emotion/styled"; import { BIFocusFlowDiagram } from "../FocusFlowDiagram"; import { getColorByMethod } from "../ServiceDesigner/components/ResourceAccordion"; import { SwitchSkeleton, TitleBarSkeleton } from "../../../components/Skeletons"; +import { PanelContainer } from "@wso2/ballerina-side-panel"; +import { ResourceForm } from "../ServiceDesigner/Forms/ResourceForm"; const ActionButton = styled(Button)` display: flex; @@ -179,6 +181,10 @@ export function DiagramWrapper(param: DiagramWrapperProps) { const [listener, setListener] = useState(""); const [parentMetadata, setParentMetadata] = useState(); + const [functionModel, setFunctionModel] = useState(); + const [servicePosition, setServicePosition] = useState(); + const [isSaving, setIsSaving] = useState(false); + useEffect(() => { rpcClient.getVisualizerLocation().then((location) => { if (location.metadata?.enableSequenceDiagram) { @@ -215,6 +221,12 @@ export function DiagramWrapper(param: DiagramWrapperProps) { }, }) .then((serviceModel) => { + setServicePosition({ + startLine: serviceModel.service?.codedata.lineRange.startLine.line, + startColumn: serviceModel.service?.codedata.lineRange.startLine.offset, + endLine: serviceModel.service?.codedata.lineRange.endLine.line, + endColumn: serviceModel.service?.codedata.lineRange.endLine.offset, + }); setServiceType(serviceModel.service?.type); setBasePath(serviceModel.service?.properties?.basePath?.value?.trim()); setListener(serviceModel.service?.properties?.listener?.value?.trim()); @@ -224,6 +236,11 @@ export function DiagramWrapper(param: DiagramWrapperProps) { }); }, [rpcClient]); + + const handleFunctionClose = () => { + setFunctionModel(undefined); + }; + const handleToggleDiagram = () => { setShowSequenceDiagram(!showSequenceDiagram); }; @@ -242,6 +259,37 @@ export function DiagramWrapper(param: DiagramWrapperProps) { } }; + + const getFunctionModel = async () => { + const location = (await rpcClient.getVisualizerLocation()).position; + const codeData: CodeData = { + lineRange: { + fileName: filePath, + startLine: { line: location.startLine, offset: location.startColumn }, + endLine: { line: location.endLine, offset: location.endColumn }, + } + } + const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ filePath: filePath, codedata: codeData }); + setFunctionModel(functionModel.function); + } + + + const handleResourceSubmit = async (value: FunctionModel) => { + setIsSaving(true); + const lineRange: LineRange = { + startLine: { line: servicePosition.startLine, offset: servicePosition.startColumn }, + endLine: { line: servicePosition.endLine, offset: servicePosition.endColumn }, + }; + let res = undefined; + + res = await rpcClient + .getServiceDesignerRpcClient() + .updateResourceSourceCode({ filePath, codedata: { lineRange }, function: value }); + setIsSaving(false); + setFunctionModel(undefined); + }; + + const handleEdit = (fileUri?: string) => { const context: VisualizerLocation = { view: @@ -324,13 +372,19 @@ export function DiagramWrapper(param: DiagramWrapperProps) { if (isResource && serviceType === "http") { return ( - handleResourceTryIt(parentMetadata?.accessor || "", parentMetadata?.label || "")} - > - - {"Try It"} - + <> + getFunctionModel()}> + + Edit + + handleResourceTryIt(parentMetadata?.accessor || "", parentMetadata?.label || "")} + > + + {"Try It"} + + ); } @@ -411,6 +465,22 @@ export function DiagramWrapper(param: DiagramWrapperProps) { /> ) } + {/* This is for adding or editing a http resource */} + {functionModel && isResource && functionModel.kind === "RESOURCE" && ( + + + + )} ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx index b87b47e663e..fb8cd823a4d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/AddServiceElementDropdown.tsx @@ -52,7 +52,6 @@ export function AddServiceElementDropdown(props: AddServiceElementDropdownProps) - {buttonTitle} } @@ -61,20 +60,11 @@ export function AddServiceElementDropdown(props: AddServiceElementDropdownProps) dropDownAlign="bottom" buttonSx={{ appearance: 'none', - backgroundColor: 'var(--vscode-button-background)', - color: 'var(--vscode-button-foreground)', - '&:hover': { - backgroundColor: 'var(--vscode-button-hoverBackground)', - }, height: '28px', minHeight: '28px' }} optionButtonSx={{ - backgroundColor: 'var(--vscode-button-background)', borderColor: 'var(--vscode-button-border)', - '&:hover': { - backgroundColor: 'var(--vscode-button-hoverBackground)', - }, height: '28px', minHeight: '28px' }} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 78c498a2c85..7457bc183ac 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -186,6 +186,7 @@ interface ReadonlyProperty { export const ADD_HANDLER = "add-handler"; export const ADD_INIT_FUNCTION = "add-init-function"; export const ADD_REUSABLE_FUNCTION = "add-reusable-function"; +export const EXPORT_OAS = "export-oas"; export const ADD_HTTP_RESOURCE = "add-http-resource"; export function ServiceDesigner(props: ServiceDesignerProps) { @@ -331,6 +332,13 @@ export function ServiceDesigner(props: ServiceDesignerProps) { description: "Add a new reusable function within the service", value: ADD_REUSABLE_FUNCTION }); + + options.push({ + title: "Export OpenAPI Spec", + description: "Export the OpenAPI spec for the service", + value: EXPORT_OAS + }); + setDropdownOptions(options); } @@ -440,6 +448,9 @@ export function ServiceDesigner(props: ServiceDesignerProps) { case ADD_HTTP_RESOURCE: handleNewResourceFunction(); break; + case EXPORT_OAS: + handleExportOAS(); + break; } }; @@ -639,7 +650,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { - Try It - + */} {/* { !haveServiceTypeName && ( - )} */} + )} From 734e790f0feac4d8d0221467f4694498722edda4 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Wed, 1 Oct 2025 16:22:46 +0530 Subject: [PATCH 087/730] Merge remote-tracking branch 'upstream/main' into revamp-service-designer From 996431e516de28d44a0911cd7d531fe255e8e4b4 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 1 Oct 2025 23:40:00 +0530 Subject: [PATCH 088/730] Improve AI code generation formatting and step handling --- .../ballerina/ballerina-core/src/state-machine-types.ts | 2 ++ .../src/features/ai/service/code/code.ts | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 17228efc715..560689f4cf4 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -223,10 +223,12 @@ export interface ChatError { type: "error"; content: string; } + export interface ToolCall { type: "tool_call"; toolName: string; } + export interface ToolResult { type: "tool_result"; toolName: string; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index dd41a08b8e6..1872f2116ec 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -161,9 +161,11 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "error", content: getErrorMessage(error) }); break; } - case "step-finish": { - eventHandler({ type: "content_block", content: "\n" }); - assistantResponse += "\n"; + case "step-start": { + if (assistantResponse !== "") { + eventHandler({ type: "content_block", content: " \n" }); + assistantResponse += " \n"; + } break; } case "finish": { From 7cf01adb78bfeebd7ec5625dbe0b8b77c3715f2f Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Thu, 2 Oct 2025 11:16:23 +0530 Subject: [PATCH 089/730] Added a call to handleUpdateDiagram in the handleResourceSubmit function to ensure the diagram is updated when a resource is submitted. --- .../ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index bc4668182e7..932637d57f9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -276,12 +276,12 @@ export function DiagramWrapper(param: DiagramWrapperProps) { const handleResourceSubmit = async (value: FunctionModel) => { setIsSaving(true); + handleUpdateDiagram(); const lineRange: LineRange = { startLine: { line: servicePosition.startLine, offset: servicePosition.startColumn }, endLine: { line: servicePosition.endLine, offset: servicePosition.endColumn }, }; let res = undefined; - res = await rpcClient .getServiceDesignerRpcClient() .updateResourceSourceCode({ filePath, codedata: { lineRange }, function: value }); From c2ed71d537cb39f2930031405e2d7ae15de32555 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Thu, 2 Oct 2025 13:09:06 +0530 Subject: [PATCH 090/730] Implement updateCurrentArtifactLocation in Visualizer API and RPC handler --- .../src/rpc-types/visualizer/index.ts | 2 + .../src/rpc-types/visualizer/rpc-type.ts | 2 + .../rpc-managers/visualizer/rpc-handler.ts | 5 +- .../rpc-managers/visualizer/rpc-manager.ts | 67 ++++++++++++++++--- .../src/utils/state-machine-utils.ts | 49 -------------- .../src/rpc-clients/visualizer/rpc-client.ts | 10 ++- 6 files changed, 75 insertions(+), 60 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts index 9b74657224a..8bd924bbbc6 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts @@ -17,6 +17,7 @@ */ import { HistoryEntry } from "../../history"; +import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind } from "../../state-machine-types"; import { AddToUndoStackRequest, OpenViewRequest, UndoRedoStateResponse } from "./interfaces"; @@ -33,4 +34,5 @@ export interface VisualizerAPI { undoRedoState: () => Promise; joinProjectPath: (segments: string | string[]) => Promise; getThemeKind: () => Promise; + updateCurrentArtifactLocation: (params: UpdatedArtifactsResponse) => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts index f33a9bcf362..3347c1363d6 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts @@ -18,6 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { HistoryEntry } from "../../history"; +import { ProjectStructureArtifactResponse, UpdatedArtifactsResponse } from "../../interfaces/bi"; import { ColorThemeKind } from "../../state-machine-types"; import { AddToUndoStackRequest, OpenViewRequest, UndoRedoStateResponse } from "./interfaces"; import { NotificationType, RequestType } from "vscode-messenger-common"; @@ -35,3 +36,4 @@ export const addToUndoStack: NotificationType = { method: export const undoRedoState: RequestType = { method: `${_preFix}/undoRedoState` }; export const joinProjectPath: RequestType = { method: `${_preFix}/joinProjectPath` }; export const getThemeKind: RequestType = { method: `${_preFix}/getThemeKind` }; +export const updateCurrentArtifactLocation: RequestType = { method: `${_preFix}/updateCurrentArtifactLocation` }; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts index 72023e8f11a..20a990373b8 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts @@ -32,7 +32,9 @@ import { OpenViewRequest, redo, undo, - undoRedoState + undoRedoState, + updateCurrentArtifactLocation, + UpdatedArtifactsResponse } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { VisualizerRpcManager } from "./rpc-manager"; @@ -51,4 +53,5 @@ export function registerVisualizerRpcHandlers(messenger: Messenger) { messenger.onRequest(undoRedoState, () => rpcManger.undoRedoState()); messenger.onRequest(joinProjectPath, (args: string | string[]) => rpcManger.joinProjectPath(args)); messenger.onRequest(getThemeKind, () => rpcManger.getThemeKind()); + messenger.onRequest(updateCurrentArtifactLocation, (args: UpdatedArtifactsResponse) => rpcManger.updateCurrentArtifactLocation(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index 2d67a76554c..b2056d551eb 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -23,21 +23,20 @@ import { MACHINE_VIEW, OpenViewRequest, PopupVisualizerLocation, + ProjectStructureArtifactResponse, SHARED_COMMANDS, UndoRedoStateResponse, - UpdateUndoRedoMangerRequest, + UpdatedArtifactsResponse, VisualizerAPI, - VisualizerLocation, - vscode, + VisualizerLocation } from "@wso2/ballerina-core"; +import fs from "fs"; import { commands, Range, Uri, window, workspace, WorkspaceEdit } from "vscode"; import { URI, Utils } from "vscode-uri"; -import fs from "fs"; +import { notifyCurrentWebview } from "../../RPCLayer"; import { history, openView, StateMachine, undoRedoManager, updateView } from "../../stateMachine"; import { openPopupView } from "../../stateMachinePopup"; import { ArtifactNotificationHandler, ArtifactsUpdated } from "../../utils/project-artifacts-handler"; -import { notifyCurrentWebview } from "../../RPCLayer"; -import { updateCurrentArtifactLocation } from "../../utils/state-machine-utils"; import { refreshDataMapper } from "../data-mapper/utils"; export class VisualizerRpcManager implements VisualizerAPI { @@ -109,7 +108,7 @@ export class VisualizerRpcManager implements VisualizerAPI { // Subscribe to artifact updated notifications let unsubscribe = notificationHandler.subscribe(ArtifactsUpdated.method, undefined, async (payload) => { console.log("Received notification:", payload); - updateCurrentArtifactLocation({ artifacts: payload.data }); + await this.updateCurrentArtifactLocation({ artifacts: payload.data }); clearTimeout(timeoutId); StateMachine.setReadyMode(); notifyCurrentWebview(); @@ -154,7 +153,7 @@ export class VisualizerRpcManager implements VisualizerAPI { // Subscribe to artifact updated notifications let unsubscribe = notificationHandler.subscribe(ArtifactsUpdated.method, undefined, async (payload) => { console.log("Received notification:", payload); - updateCurrentArtifactLocation({ artifacts: payload.data }); + await this.updateCurrentArtifactLocation({ artifacts: payload.data }); clearTimeout(timeoutId); StateMachine.setReadyMode(); notifyCurrentWebview(); @@ -205,4 +204,56 @@ export class VisualizerRpcManager implements VisualizerAPI { async undoRedoState(): Promise { return undoRedoManager.getUIState(); } + + async updateCurrentArtifactLocation(params: UpdatedArtifactsResponse): Promise { + return new Promise((resolve) => { + if (params.artifacts.length === 0) { + resolve(undefined); + return; + } + console.log(">>> Updating current artifact location", { artifacts: params.artifacts }); + // Get the updated component and update the location + const currentIdentifier = StateMachine.context().identifier; + const currentType = StateMachine.context().type; + + // Find the correct artifact by currentIdentifier (id) + let currentArtifact = undefined; + for (const artifact of params.artifacts) { + if (currentType && currentType.codedata.node === "CLASS" && currentType.name === artifact.name) { + currentArtifact = artifact; + if (artifact.resources && artifact.resources.length > 0) { + const resource = artifact.resources.find( + (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier + ); + if (resource) { + currentArtifact = resource; + break; + } + } + + } else if (artifact.id === currentIdentifier || artifact.name === currentIdentifier) { + currentArtifact = artifact; + } + + // Check if artifact has resources and find within those + if (artifact.resources && artifact.resources.length > 0) { + const resource = artifact.resources.find( + (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier + ); + if (resource) { + currentArtifact = resource; + } + } + } + + if (currentArtifact) { + openView(EVENT_TYPE.UPDATE_PROJECT_LOCATION, { + documentUri: currentArtifact.path, + position: currentArtifact.position, + identifier: currentIdentifier, + }); + } + resolve(currentArtifact); + }); + } } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts index 3a36bd1bce4..fecdb1aef64 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts @@ -482,52 +482,3 @@ function getSTByRangeReq(documentUri: string, position: NodePosition) { } }; } - -export async function updateCurrentArtifactLocation(artifacts: UpdatedArtifactsResponse) { - if (artifacts.artifacts.length === 0) { - return; - } - console.log(">>> Updating current artifact location", { artifacts }); - // Get the updated component and update the location - const currentIdentifier = StateMachine.context().identifier; - const currentType = StateMachine.context().type; - - // Find the correct artifact by currentIdentifier (id) - let currentArtifact = undefined; - for (const artifact of artifacts.artifacts) { - if (currentType && currentType.codedata.node === "CLASS" && currentType.name === artifact.name) { - currentArtifact = artifact; - if (artifact.resources && artifact.resources.length > 0) { - const resource = artifact.resources.find( - (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier - ); - if (resource) { - currentArtifact = resource; - break; - } - } - - } else if (artifact.id === currentIdentifier || artifact.name === currentIdentifier) { - currentArtifact = artifact; - } - - // Check if artifact has resources and find within those - if (artifact.resources && artifact.resources.length > 0) { - const resource = artifact.resources.find( - (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier - ); - if (resource) { - currentArtifact = resource; - } - } - } - - if (currentArtifact) { - openView(EVENT_TYPE.UPDATE_PROJECT_LOCATION, { - documentUri: currentArtifact.path, - position: currentArtifact.position, - identifier: currentIdentifier, - }); - } -} - diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts index b8841f763cf..bbdde39ea7e 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts @@ -22,8 +22,9 @@ import { ColorThemeKind, HistoryEntry, OpenViewRequest, + ProjectStructureArtifactResponse, UndoRedoStateResponse, - UpdateUndoRedoMangerRequest, + UpdatedArtifactsResponse, VisualizerAPI, addToHistory, addToUndoStack, @@ -36,7 +37,8 @@ import { openView, redo, undo, - undoRedoState + undoRedoState, + updateCurrentArtifactLocation } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -95,4 +97,8 @@ export class VisualizerRpcClient implements VisualizerAPI { getThemeKind(): Promise { return this._messenger.sendRequest(getThemeKind, HOST_EXTENSION); } + + updateCurrentArtifactLocation(params: UpdatedArtifactsResponse): Promise { + return this._messenger.sendRequest(updateCurrentArtifactLocation, HOST_EXTENSION, params); + } } From 9e284bf5ebf9a61223c96a3872417a820d66332b Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 2 Oct 2025 14:18:06 +0530 Subject: [PATCH 091/730] Resolve the infinite rerender issue --- .../components/editors/MultiSelectEditor.tsx | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiSelectEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiSelectEditor.tsx index ab6ab07bc6f..789447d082d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiSelectEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiSelectEditor.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, useMemo } from "react"; import { Button, Codicon, Dropdown, OptionProps, ThemeColors } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; @@ -98,20 +98,30 @@ export function MultiSelectEditor(props: MultiSelectEditorProps) { const noOfSelectedValues = field.items.length === 0 ? 0 : (field.value === "" ? 1 : field.value.length); const [dropdownCount, setDropdownCount] = useState(noOfSelectedValues); - // Watch all the individual dropdown values, including the default value - const values = [...Array(dropdownCount)].map((_, index) => { - const value = watch(`${field.key}-${index}`); - if (value === NEW_OPTION) { - return; - } - const itemValue = value || getValueForDropdown(field, index); - if (value === undefined) { - setValue(`${field.key}-${index}`, itemValue); + useEffect(() => { + for (let index = 0; index < dropdownCount; index++) { + const currentValue = watch(`${field.key}-${index}`); + if (currentValue === undefined) { + const defaultValue = getValueForDropdown(field, index); + setValue(`${field.key}-${index}`, defaultValue); + } } - return itemValue; - }).filter(Boolean); + }, [dropdownCount, field.key, field, watch, setValue]); + + // Watch all the individual dropdown values + const watchedValues = useMemo(() => + [...Array(dropdownCount)].map((_, index) => + watch(`${field.key}-${index}`) + ), + [dropdownCount, field.key, watch] + ); + + // Calculate values array without side effects + const values = useMemo(() => { + return watchedValues + .filter(value => value && value !== NEW_OPTION); + }, [watchedValues, NEW_OPTION]); - // Update the main field with the array of values useEffect(() => { setValue(field.key, values); }, [values, field.key, setValue]); From be571d2f391cdc0018d90d9e879769d75a565605 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Thu, 2 Oct 2025 15:02:44 +0530 Subject: [PATCH 092/730] Refactor artifact location update logic in FlowDiagram and FocusFlowDiagram components --- .../src/views/BI/DiagramWrapper/index.tsx | 11 +++- .../src/views/BI/FlowDiagram/index.tsx | 53 +++---------------- .../src/views/BI/FocusFlowDiagram/index.tsx | 35 ------------ 3 files changed, 16 insertions(+), 83 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 932637d57f9..ceb4c35b0f0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -285,6 +285,15 @@ export function DiagramWrapper(param: DiagramWrapperProps) { res = await rpcClient .getServiceDesignerRpcClient() .updateResourceSourceCode({ filePath, codedata: { lineRange }, function: value }); + /** + * Update the artifact identifier to the current updated resource + * Resource identifier pattern --> METHOD#PATH --> 'get#foo' OR METHOD#WITH_PARAMS ---> 'post#bar/[string car]]' + */ + const accessor = value.accessor.value; + const path = value.name.value; + const resourceIdentifier = `${accessor}#${path}`; + await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { identifier: resourceIdentifier } }); + setIsSaving(false); setFunctionModel(undefined); }; @@ -465,7 +474,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { /> ) } - {/* This is for adding or editing a http resource */} + {/* This is for editing a http resource */} {functionModel && isResource && functionModel.kind === "RESOURCE" && ( { - console.log(">>> Updating current artifact location", { artifacts }); - // Get the updated component and update the location - const currentIdentifier = (await rpcClient.getVisualizerLocation()).identifier; - const currentType = (await rpcClient.getVisualizerLocation()).type; - - // Find the correct artifact by currentIdentifier (id) - let currentArtifact = artifacts.artifacts.at(0); - for (const artifact of artifacts.artifacts) { - if (currentType && currentType.codedata.node === "CLASS" && currentType.name === artifact.name) { - currentArtifact = artifact; - if (artifact.resources && artifact.resources.length > 0) { - const resource = artifact.resources.find( - (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier - ); - if (resource) { - currentArtifact = resource; - break; - } - } - - } else if (artifact.id === currentIdentifier || artifact.name === currentIdentifier) { - currentArtifact = artifact; - } - - // Check if artifact has resources and find within those - if (artifact.resources && artifact.resources.length > 0) { - const resource = artifact.resources.find( - (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier - ); - if (resource) { - currentArtifact = resource; - } - } - } + const updateArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { + const currentArtifact = await rpcClient.getVisualizerRpcClient().updateCurrentArtifactLocation(artifacts); if (currentArtifact) { console.log(">>> currentArtifact", currentArtifact); if (isCreatingNewModelProvider.current) { @@ -921,14 +888,6 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { await handleVectorKnowledgeBaseAdded(); return; } - await rpcClient.getVisualizerRpcClient().openView({ - type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, - location: { - documentUri: currentArtifact.path, - position: currentArtifact.position, - identifier: currentIdentifier, - }, - }); } handleOnCloseSidePanel(); if (isCreatingNewDataLoader.current) { @@ -1287,7 +1246,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } if (noFormSubmitOptions) { selectedNodeRef.current = undefined; - await updateCurrentArtifactLocation(response); + await updateArtifactLocation(response); } if (options?.closeSidePanel) { selectedNodeRef.current = undefined; @@ -1331,7 +1290,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } } - await updateCurrentArtifactLocation(deleteNodeResponse); + await updateArtifactLocation(deleteNodeResponse); selectedNodeRef.current = undefined; closeSidePanelAndFetchUpdatedFlowModel(); @@ -1380,7 +1339,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { .then(async (response) => { if (response.artifacts.length > 0) { selectedNodeRef.current = undefined; - await updateCurrentArtifactLocation(response); + await updateArtifactLocation(response); closeSidePanelAndFetchUpdatedFlowModel(); } else { console.error(">>> Error updating source code", response); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 3aa089e4854..4ca72ee9b44 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -330,41 +330,6 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { }); }; - const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { - console.log(">>> Updating current artifact location", { artifacts }); - // Get the updated component and update the location - const currentIdentifier = (await rpcClient.getVisualizerLocation()).identifier; - // Find the correct artifact by currentIdentifier (id) - let currentArtifact = artifacts.artifacts.at(0); - artifacts.artifacts.forEach((artifact: any) => { - if (artifact.id === currentIdentifier || artifact.name === currentIdentifier) { - currentArtifact = artifact; - } - // Check if artifact has resources and find within those - if (artifact.resources && artifact.resources.length > 0) { - const resource = artifact.resources.find( - (resource: any) => resource.id === currentIdentifier || resource.name === currentIdentifier - ); - if (resource) { - currentArtifact = resource; - } - } - }); - - if (currentArtifact) { - console.log(">>> currentArtifact", currentArtifact); - await rpcClient.getVisualizerRpcClient().openView({ - type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, - location: { - documentUri: currentArtifact.path, - position: currentArtifact.position, - identifier: currentIdentifier, - }, - }); - } - debouncedGetFlowModel(); - }; - const handleOnEditNode = (node: FlowNode) => { console.log(">>> on edit node", node); selectedNodeRef.current = node; From 3ed0a42d4cbc445e999a9a30bdaced5c63c9ae30 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 2 Oct 2025 15:54:34 +0530 Subject: [PATCH 093/730] Add setup script for WSO2 BI Extension Code-Server --- .../src/test/code-server/README.md | 147 ++++++++ .../test/code-server/setup-bi-code-server.sh | 348 ++++++++++++++++++ 2 files changed, 495 insertions(+) create mode 100644 workspaces/bi/bi-extension/src/test/code-server/README.md create mode 100755 workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh diff --git a/workspaces/bi/bi-extension/src/test/code-server/README.md b/workspaces/bi/bi-extension/src/test/code-server/README.md new file mode 100644 index 00000000000..96aca465c3f --- /dev/null +++ b/workspaces/bi/bi-extension/src/test/code-server/README.md @@ -0,0 +1,147 @@ +# WSO2 BI Extension Code-Server Setup Script + +## Overview +This script automates the complete setup process for running WSO2 BI extensions in code-server (VS Code in browser). + +## Features +- ✅ **Auto-detects and installs code-server** if not present +- ✅ **Cross-platform support** (macOS with Homebrew, Linux) +- ✅ **Interactive prompts** for VSIX file paths +- ✅ **Proper dependency handling** (installs Ballerina extension first) +- ✅ **Configurable server settings** (host, port, workspace) +- ✅ **Error handling and validation** +- ✅ **Colored output** for better user experience + +## Usage + +### Quick Start +```bash +cd /Users/tharinduj/Documents/wso2/git/vscode-extensions/workspaces/bi/bi-extension/src/test +./setup-bi-code-server.sh +``` + +### What the Script Does + +#### Step 1: Code-Server Installation +- Checks if code-server is already installed +- If not found: + - **macOS**: Uses Homebrew (`brew install code-server`) + - **Linux**: Uses official install script +- Verifies successful installation + +#### Step 2: VSIX File Collection +- Prompts for **Ballerina VSIX file path** +- Prompts for **Ballerina Integrator VSIX file path** +- Validates that files exist and have `.vsix` extension +- Supports `~` (tilde) expansion for home directory + +#### Step 3: Extension Installation +- Installs **Ballerina extension first** (required dependency) +- Installs **Ballerina Integrator extension** +- Verifies successful installation +- Lists installed WSO2/Ballerina extensions + +#### Step 4: Server Configuration +- Prompts for workspace directory (defaults to current directory) +- Prompts for port number (defaults to 8080) +- Prompts for host address (defaults to 127.0.0.1) +- Validates workspace directory exists + +#### Step 5: Code-Server Launch +- Displays server configuration summary +- Shows access URL and password (if available) +- Starts code-server with specified settings + +## Example Usage Session + +``` +============================================ + WSO2 BI Extension Code-Server Setup +============================================ + +[STEP] Checking if code-server is installed... +[SUCCESS] Code-server is already installed! + +[STEP] Getting VSIX file paths... +Enter the path to the Ballerina VSIX file: ~/Downloads/ballerina-5.4.0.vsix +[SUCCESS] Ballerina VSIX file found: /Users/username/Downloads/ballerina-5.4.0.vsix + +Enter the path to the Ballerina Integrator VSIX file: ~/Downloads/ballerina-integrator-1.3.0.vsix +[SUCCESS] Ballerina Integrator VSIX file found: /Users/username/Downloads/ballerina-integrator-1.3.0.vsix + +[STEP] Installing extensions to code-server... +[INFO] Installing Ballerina extension... +[SUCCESS] Ballerina extension installed successfully! +[INFO] Installing Ballerina Integrator extension... +[SUCCESS] Ballerina Integrator extension installed successfully! + +[STEP] Configuring server settings... +Enter workspace path (leave empty for current directory): ~/my-project +[SUCCESS] Workspace set to: /Users/username/my-project + +Enter port number (default: 8080): 8080 +Enter host address (default: 127.0.0.1): 127.0.0.1 + +[STEP] Starting code-server... +[INFO] Access URL: http://127.0.0.1:8080 +[INFO] Password: abc123def456 +[SUCCESS] Starting code-server... Press Ctrl+C to stop. +``` + +## Prerequisites + +### macOS +- **Homebrew** installed for automatic code-server installation +- Or manually install code-server from: https://github.com/coder/code-server#install + +### Linux +- **curl** available for automatic installation +- Or manually install code-server + +### VSIX Files Required +- **Ballerina extension VSIX** (`ballerina-*.vsix`) +- **Ballerina Integrator extension VSIX** (`ballerina-integrator-*.vsix`) + +## Troubleshooting + +### Code-Server Installation Issues +- **macOS**: Install Homebrew first: `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` +- **Linux**: Ensure curl is installed: `sudo apt-get install curl` (Ubuntu/Debian) + +### VSIX File Issues +- Ensure files have `.vsix` extension +- Use absolute paths or paths with `~` for home directory +- Verify files are not corrupted + +### Extension Installation Issues +- Check that code-server is properly installed +- Ensure VSIX files are valid WSO2 extensions +- Try installing extensions manually if script fails + +### Port Already in Use +- Change the port number when prompted +- Check what's using the port: `lsof -i :8080` +- Kill existing processes if needed + +## Advanced Usage + +### Running with Custom Parameters +You can modify the script variables at the top for different defaults: +```bash +DEFAULT_PORT=3000 +DEFAULT_HOST="0.0.0.0" # Allow external connections +``` + +### Batch Mode (Future Enhancement) +The script can be extended to support command-line arguments for automated deployment. + +## Security Notes +- The script runs code-server on localhost by default (127.0.0.1) +- To allow external access, change host to `0.0.0.0` (not recommended for production) +- Always use HTTPS in production environments +- Keep your VSIX files secure + +## File Location +``` +/Users/tharinduj/Documents/wso2/git/vscode-extensions/workspaces/bi/bi-extension/src/test/setup-bi-code-server.sh +``` \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh b/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh new file mode 100755 index 00000000000..a79668c8c97 --- /dev/null +++ b/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh @@ -0,0 +1,348 @@ +#!/bin/bash + +# ============================================================================= +# WSO2 BI Extension Code-Server Setup Script +# ============================================================================= +# This script automates the setup of code-server with WSO2 BI extensions +# +# Features: +# 1. Installs code-server if not present +# 2. Prompts for VSIX file paths +# 3. Installs extensions to code-server +# 4. Starts code-server with proper configuration +# ============================================================================= + +set -e # Exit on any error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Default configuration +DEFAULT_PORT=8080 +DEFAULT_HOST="127.0.0.1" +WORKSPACE_PATH="" + +# ============================================================================= +# Utility Functions +# ============================================================================= + +print_header() { + echo "" + echo -e "${BLUE}============================================${NC}" + echo -e "${BLUE} WSO2 BI Extension Code-Server Setup${NC}" + echo -e "${BLUE}============================================${NC}" + echo "" +} + +print_step() { + echo -e "${YELLOW}[STEP]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +# ============================================================================= +# Step 1: Check and Install Code-Server +# ============================================================================= + +check_and_install_code_server() { + print_step "Checking if code-server is installed..." + + if command -v code-server &> /dev/null; then + print_success "Code-server is already installed!" + code-server --version + return 0 + fi + + print_info "Code-server not found. Installing..." + + # Detect OS and install accordingly + if [[ "$OSTYPE" == "darwin"* ]]; then + # macOS + if command -v brew &> /dev/null; then + print_info "Installing code-server using Homebrew..." + brew install code-server + else + print_error "Homebrew not found. Please install Homebrew first or install code-server manually." + echo "Visit: https://github.com/coder/code-server#install" + exit 1 + fi + elif [[ "$OSTYPE" == "linux-gnu"* ]]; then + # Linux + print_info "Installing code-server using curl..." + curl -fsSL https://code-server.dev/install.sh | sh + else + print_error "Unsupported operating system: $OSTYPE" + echo "Please install code-server manually: https://github.com/coder/code-server#install" + exit 1 + fi + + # Verify installation + if command -v code-server &> /dev/null; then + print_success "Code-server installed successfully!" + code-server --version + else + print_error "Failed to install code-server!" + exit 1 + fi +} + +# ============================================================================= +# Step 2: Get VSIX File Paths +# ============================================================================= + +get_vsix_paths() { + print_step "Getting VSIX file paths..." + + # Get Ballerina VSIX path + while true; do + echo "" + read -p "Enter the path to the Ballerina VSIX file: " BALLERINA_VSIX_PATH + + if [[ -z "$BALLERINA_VSIX_PATH" ]]; then + print_error "Path cannot be empty!" + continue + fi + + # Expand tilde to home directory + BALLERINA_VSIX_PATH="${BALLERINA_VSIX_PATH/#\~/$HOME}" + + if [[ -f "$BALLERINA_VSIX_PATH" ]] && [[ "$BALLERINA_VSIX_PATH" == *.vsix ]]; then + print_success "Ballerina VSIX file found: $BALLERINA_VSIX_PATH" + break + else + print_error "File not found or not a .vsix file: $BALLERINA_VSIX_PATH" + fi + done + + # Get Ballerina Integrator VSIX path + while true; do + echo "" + read -p "Enter the path to the Ballerina Integrator VSIX file: " BI_VSIX_PATH + + if [[ -z "$BI_VSIX_PATH" ]]; then + print_error "Path cannot be empty!" + continue + fi + + # Expand tilde to home directory + BI_VSIX_PATH="${BI_VSIX_PATH/#\~/$HOME}" + + if [[ -f "$BI_VSIX_PATH" ]] && [[ "$BI_VSIX_PATH" == *.vsix ]]; then + print_success "Ballerina Integrator VSIX file found: $BI_VSIX_PATH" + break + else + print_error "File not found or not a .vsix file: $BI_VSIX_PATH" + fi + done +} + +# ============================================================================= +# Step 3: Uninstall Existing Extensions +# ============================================================================= + +uninstall_existing_extensions() { + print_step "Uninstalling existing Ballerina and Ballerina Integrator extensions (if any)..." + code-server --uninstall-extension "ballerina.ballerina" || true + code-server --uninstall-extension "wso2.ballerina-integrator" || true + print_success "Uninstallation step completed." +} + +# ============================================================================= +# Step 4: Install Extensions +# ============================================================================= + +install_extensions() { + print_step "Installing extensions to code-server..." + + # Install Ballerina extension first (dependency) + print_info "Installing Ballerina extension..." + if code-server --install-extension "$BALLERINA_VSIX_PATH"; then + print_success "Ballerina extension installed successfully!" + else + print_error "Failed to install Ballerina extension!" + exit 1 + fi + + # Install Ballerina Integrator extension + print_info "Installing Ballerina Integrator extension..." + if code-server --install-extension "$BI_VSIX_PATH"; then + print_success "Ballerina Integrator extension installed successfully!" + else + print_error "Failed to install Ballerina Integrator extension!" + exit 1 + fi + + # List installed extensions for verification + echo "" + print_info "Installed extensions:" + code-server --list-extensions | grep -E "(ballerina|wso2)" || true +} + +# ============================================================================= +# Step 4: Get Workspace and Server Configuration +# ============================================================================= + +get_server_config() { + print_step "Configuring server settings..." + + # Get workspace path + echo "" + print_info "Current directory: $(pwd)" + read -p "Enter workspace path (leave empty for current directory): " WORKSPACE_INPUT + + if [[ -z "$WORKSPACE_INPUT" ]]; then + WORKSPACE_PATH="$(pwd)" + print_info "Using current directory as workspace" + else + # Expand tilde to home directory + WORKSPACE_PATH="${WORKSPACE_INPUT/#\~/$HOME}" + + # Convert to absolute path if it's relative + if [[ ! "$WORKSPACE_PATH" = /* ]]; then + WORKSPACE_PATH="$(cd "$WORKSPACE_PATH" 2>/dev/null && pwd)" || { + print_error "Cannot resolve relative path: $WORKSPACE_INPUT" + print_info "Please use an absolute path or ensure the directory exists" + exit 1 + } + fi + + print_info "Processed workspace path: $WORKSPACE_PATH" + fi + + # Verify workspace exists + if [[ ! -d "$WORKSPACE_PATH" ]]; then + print_error "Workspace directory does not exist: $WORKSPACE_PATH" + print_info "Please check the path and try again" + exit 1 + fi + + # Get the absolute path to avoid any issues + WORKSPACE_PATH="$(cd "$WORKSPACE_PATH" && pwd)" + print_success "Workspace set to: $WORKSPACE_PATH" + + # Get port (optional) + echo "" + read -p "Enter port number (default: $DEFAULT_PORT): " PORT_INPUT + if [[ -z "$PORT_INPUT" ]]; then + SERVER_PORT=$DEFAULT_PORT + else + SERVER_PORT=$PORT_INPUT + fi + + # Get host (optional) + echo "" + read -p "Enter host address (default: $DEFAULT_HOST): " HOST_INPUT + if [[ -z "$HOST_INPUT" ]]; then + SERVER_HOST=$DEFAULT_HOST + else + SERVER_HOST=$HOST_INPUT + fi + + print_info "Server will run on: http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH" +} + +# ============================================================================= +# Step 5: Start Code-Server +# ============================================================================= + +start_code_server() { + print_step "Starting code-server..." + + echo "" + print_info "Code-server is starting with the following configuration:" + echo " - Host: $SERVER_HOST" + echo " - Port: $SERVER_PORT" + echo " - Workspace: $WORKSPACE_PATH" + echo "" + + # Double-check workspace exists + if [[ ! -d "$WORKSPACE_PATH" ]]; then + print_error "CRITICAL: Workspace directory disappeared: $WORKSPACE_PATH" + exit 1 + fi + + print_info "Final workspace verification successful: $(ls -la "$WORKSPACE_PATH" | head -3)" + + # Get password from config + CONFIG_FILE="$HOME/.config/code-server/config.yaml" + if [[ -f "$CONFIG_FILE" ]]; then + PASSWORD=$(grep "^password:" "$CONFIG_FILE" | cut -d' ' -f2) + if [[ -n "$PASSWORD" ]]; then + print_info "Access URL: http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH" + print_info "Password: $PASSWORD" + fi + else + print_info "Access URL: http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH" + fi + + echo "" + echo -e "${GREEN}🚀 CODE-SERVER READY!${NC}" + echo -e "${GREEN}===========================================${NC}" + echo -e "${GREEN}1. Open your web browser${NC}" + echo -e "${GREEN}2. Navigate to: ${BLUE}http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH${NC}" + if [[ -n "$PASSWORD" ]]; then + echo -e "${GREEN}3. Enter password: ${YELLOW}$PASSWORD${NC}" + fi + echo -e "${GREEN}4. Your WSO2 BI extensions are ready to use!${NC}" + echo "" + print_success "Code-server running... Press Ctrl+C to stop." + echo "" + + # Debug: Show the exact command that will be executed + print_info "Executing command: code-server --bind-addr \"$SERVER_HOST:$SERVER_PORT\" \"$WORKSPACE_PATH\"" + + # Start code-server + exec code-server --bind-addr "$SERVER_HOST:$SERVER_PORT" "$WORKSPACE_PATH" +} + +# ============================================================================= +# Main Execution +# ============================================================================= + +main() { + print_header + + # Step 1: Check and install code-server + check_and_install_code_server + + # Step 2: Get VSIX file paths + get_vsix_paths + + # Step 3: Uninstall existing extensions to avoid conflicts + uninstall_existing_extensions + + # Step 4: Install extensions + install_extensions + + # Step 5: Get server configuration + get_server_config + + # Step 6: Start code-server + start_code_server +} + +# ============================================================================= +# Script Entry Point +# ============================================================================= + +# Handle Ctrl+C gracefully +trap 'echo -e "\n${YELLOW}Script interrupted by user${NC}"; exit 0' INT + +# Check if running as source +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi \ No newline at end of file From d80035c71508e3f8954a5d5c7709d90321e014d8 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 1 Oct 2025 12:48:02 +0530 Subject: [PATCH 094/730] Updates AI SDK dependencies and zod version Updates the versions of the AI SDK dependencies including amazon-bedrock, anthropic, and ai, along with updating the zod version. This ensures compatibility with the latest features and improvements in the AI SDK and addresses potential security vulnerabilities associated with older versions. --- common/config/rush/pnpm-lock.yaml | 243 +++---------- .../ballerina-core/src/state-machine-types.ts | 12 +- .../ballerina-extension/package.json | 8 +- .../src/features/ai/service/ask/ask.ts | 16 +- .../src/features/ai/service/code/code.ts | 35 +- .../ai/service/datamapper/context_api.ts | 18 +- .../ai/service/datamapper/datamapper.ts | 6 +- .../ai/service/documentation/documentation.ts | 10 +- .../ai/service/documentation/prompts.ts | 6 +- .../ai/service/healthcare/healthcare.ts | 12 +- .../src/features/ai/service/libs/funcs.ts | 332 ++++++++++-------- .../ai/service/libs/libraryProviderTool.ts | 21 +- .../src/features/ai/service/libs/libs.ts | 8 +- .../features/ai/service/openapi/openapi.ts | 8 +- .../src/features/ai/service/test/prompts.ts | 18 +- .../src/features/ai/service/test/test.ts | 6 +- .../src/features/ai/service/test/test_plan.ts | 8 +- .../src/features/ai/service/utils.ts | 6 +- .../src/views/ai-panel/utils.ts | 4 +- .../ballerina-visualizer/package.json | 4 +- 20 files changed, 333 insertions(+), 448 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index df29118bd73..46cf166aa6c 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -131,11 +131,11 @@ importers: ../../workspaces/ballerina/ballerina-extension: dependencies: '@ai-sdk/amazon-bedrock': - specifier: ^2.2.12 - version: 2.2.12(zod@3.25.76) + specifier: ^3.0.25 + version: 3.0.30(zod@4.1.11) '@ai-sdk/anthropic': - specifier: ^1.2.12 - version: 1.2.12(zod@3.25.76) + specifier: ^2.0.20 + version: 2.0.23(zod@4.1.11) '@types/lodash': specifier: ^4.14.200 version: 4.17.17 @@ -161,8 +161,8 @@ importers: specifier: workspace:* version: link:../../wso2-platform/wso2-platform-core ai: - specifier: ^4.3.16 - version: 4.3.19(react@19.1.0)(zod@3.25.76) + specifier: ^5.0.56 + version: 5.0.59(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -245,8 +245,8 @@ importers: specifier: ^4.38.3 version: 4.38.3 zod: - specifier: ^3.25.74 - version: 3.25.76 + specifier: ^4.1.8 + version: 4.1.11 devDependencies: '@sentry/webpack-plugin': specifier: ^1.20.1 @@ -828,9 +828,6 @@ importers: specifier: ~1.6.1 version: 1.6.1 devDependencies: - '@ai-sdk/openai': - specifier: ^1.3.22 - version: 1.3.23(zod@4.1.11) '@types/lodash.debounce': specifier: ^4.0.6 version: 4.0.9 @@ -861,9 +858,6 @@ importers: '@typescript-eslint/parser': specifier: ^8.32.1 version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) - ai: - specifier: ^4.3.16 - version: 4.3.19(react@18.2.0)(zod@4.1.11) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -3989,50 +3983,34 @@ packages: '@adobe/css-tools@4.4.3': resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} - '@ai-sdk/amazon-bedrock@2.2.12': - resolution: {integrity: sha512-m8gARnh45pr1s08Uu4J/Pm8913mwJPejPOm59b+kUqMsP9ilhUtH/bp8432Ra/v+vHuMoBrglG2ZvXtctAaH2g==} + '@ai-sdk/amazon-bedrock@3.0.30': + resolution: {integrity: sha512-aF21FFpTusWAdXc70bqA8SIFnIfCokwrp4G8efMETIRXIH+N5QGd6UYEMbfMfwx4P9iN9v3oUwsHsRtr87TKPQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@1.2.12': - resolution: {integrity: sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==} + '@ai-sdk/anthropic@2.0.23': + resolution: {integrity: sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@1.3.23': - resolution: {integrity: sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ==} + '@ai-sdk/gateway@1.0.32': + resolution: {integrity: sha512-TQRIM63EI/ccJBc7RxeB8nq/CnGNnyl7eu5stWdLwL41stkV5skVeZJe0QRvFbaOrwCkgUVE0yrUqJi4tgDC1A==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + '@ai-sdk/provider-utils@3.0.10': + resolution: {integrity: sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@1.1.3': - resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/react@1.2.12': - resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - - '@ai-sdk/ui-utils@1.2.11': - resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -7309,6 +7287,9 @@ packages: resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==} engines: {node: '>=18.0.0'} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -8658,9 +8639,6 @@ packages: '@types/detect-port@1.3.5': resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - '@types/doctrine@0.0.3': resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} @@ -9834,15 +9812,11 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@4.3.19: - resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} + ai@5.0.59: + resolution: {integrity: sha512-SuAFxKXt2Ha9FiXB3gaOITkOg9ek/3QNVatGVExvTT4gNXc+hJpuNe1dmuwf6Z5Op4fzc8wdbsrYP27ZCXBzlw==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true + zod: ^3.25.76 || ^4.1.8 airbnb-js-shims@2.2.1: resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} @@ -12135,9 +12109,6 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff-sequences@25.2.6: resolution: {integrity: sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==} engines: {node: '>= 8.3'} @@ -12817,10 +12788,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.3: - resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==} - engines: {node: '>=20.0.0'} - eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -15364,11 +15331,6 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsondiffpatch@0.6.0: - resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} @@ -18940,9 +18902,6 @@ packages: secure-compare@3.0.1: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -19782,11 +19741,6 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' - swr@2.3.6: - resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -19956,10 +19910,6 @@ packages: throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - throttleit@2.1.0: - resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} - engines: {node: '>=18'} - through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -21649,78 +21599,38 @@ snapshots: '@adobe/css-tools@4.4.3': {} - '@ai-sdk/amazon-bedrock@2.2.12(zod@3.25.76)': + '@ai-sdk/amazon-bedrock@3.0.30(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/anthropic': 2.0.23(zod@4.1.11) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) '@smithy/eventstream-codec': 4.0.5 '@smithy/util-utf8': 4.0.0 aws4fetch: 1.0.20 - zod: 3.25.76 - - '@ai-sdk/anthropic@1.2.12(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 - - '@ai-sdk/openai@1.3.23(zod@4.1.11)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.11 - secure-json-parse: 2.7.0 - zod: 3.25.76 - - '@ai-sdk/provider-utils@2.2.8(zod@4.1.11)': + '@ai-sdk/anthropic@2.0.23(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.11 - secure-json-parse: 2.7.0 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/provider@1.1.3': + '@ai-sdk/gateway@1.0.32(zod@4.1.11)': dependencies: - json-schema: 0.4.0 - - '@ai-sdk/react@1.2.12(react@18.2.0)(zod@4.1.11)': - dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@4.1.11) - '@ai-sdk/ui-utils': 1.2.11(zod@4.1.11) - react: 18.2.0 - swr: 2.3.6(react@18.2.0) - throttleit: 2.1.0 - optionalDependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/react@1.2.12(react@19.1.0)(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.10(zod@4.1.11)': dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - react: 19.1.0 - swr: 2.3.6(react@19.1.0) - throttleit: 2.1.0 - optionalDependencies: - zod: 3.25.76 - - '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.11 - '@ai-sdk/ui-utils@1.2.11(zod@4.1.11)': + '@ai-sdk/provider@2.0.0': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@4.1.11) - zod: 4.1.11 - zod-to-json-schema: 3.24.6(zod@4.1.11) + json-schema: 0.4.0 '@alloc/quick-lru@5.2.0': {} @@ -24535,7 +24445,7 @@ snapshots: cors: 2.8.5 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.3 + eventsource-parser: 3.0.6 express: 5.1.0 express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 5.0.0 @@ -26375,6 +26285,8 @@ snapshots: '@smithy/types': 4.3.2 tslib: 2.8.1 + '@standard-schema/spec@1.0.0': {} + '@standard-schema/utils@0.3.0': {} '@storybook/addon-actions@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -31419,8 +31331,6 @@ snapshots: '@types/detect-port@1.3.5': {} - '@types/diff-match-patch@1.0.36': {} - '@types/doctrine@0.0.3': {} '@types/doctrine@0.0.9': {} @@ -33032,29 +32942,13 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@4.3.19(react@18.2.0)(zod@4.1.11): + ai@5.0.59(zod@4.1.11): dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@4.1.11) - '@ai-sdk/react': 1.2.12(react@18.2.0)(zod@4.1.11) - '@ai-sdk/ui-utils': 1.2.11(zod@4.1.11) + '@ai-sdk/gateway': 1.0.32(zod@4.1.11) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 zod: 4.1.11 - optionalDependencies: - react: 18.2.0 - - ai@4.3.19(react@19.1.0)(zod@3.25.76): - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/react': 1.2.12(react@19.1.0)(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.25.76 - optionalDependencies: - react: 19.1.0 airbnb-js-shims@2.2.1: dependencies: @@ -35942,8 +35836,6 @@ snapshots: didyoumean@1.2.2: {} - diff-match-patch@1.0.5: {} - diff-sequences@25.2.6: {} diff-sequences@29.6.3: {} @@ -36903,8 +36795,6 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.3: {} - eventsource-parser@3.0.6: {} eventsource@0.1.6: @@ -39825,7 +39715,10 @@ snapshots: pretty-format: 25.5.0 throat: 5.0.0 transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - utf-8-validate jest-leak-detector@25.5.0: dependencies: @@ -40597,12 +40490,6 @@ snapshots: jsonc-parser@3.3.1: {} - jsondiffpatch@0.6.0: - dependencies: - '@types/diff-match-patch': 1.0.36 - chalk: 5.5.0 - diff-match-patch: 1.0.5 - jsonfile@2.4.0: optionalDependencies: graceful-fs: 4.2.11 @@ -45158,8 +45045,6 @@ snapshots: secure-compare@3.0.1: {} - secure-json-parse@2.7.0: {} - select-hose@2.0.0: {} selenium-webdriver@4.34.0: @@ -46287,18 +46172,6 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.101.0(webpack-cli@5.1.4) - swr@2.3.6(react@18.2.0): - dependencies: - dequal: 2.0.3 - react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) - - swr@2.3.6(react@19.1.0): - dependencies: - dequal: 2.0.3 - react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - symbol-tree@3.2.4: {} symbol.prototype.description@1.0.7: @@ -46551,8 +46424,6 @@ snapshots: throat@5.0.0: {} - throttleit@2.1.0: {} - through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -48823,10 +48694,6 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.24.6(zod@4.1.11): - dependencies: - zod: 4.1.11 - zod@3.25.76: {} zod@4.1.11: {} diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 560689f4cf4..b4ad38cc60e 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -255,7 +255,7 @@ export const getPopupVisualizerState: RequestType export const breakpointChanged: NotificationType = { method: 'breakpointChanged' }; -// ------------------> AI Related state types <----------------------- +// ------------------> AI Related state types <----------------------- export type AIMachineStateValue = | 'Initialize' // (checking auth, first load) | 'Unauthenticated' // (show login window) @@ -284,11 +284,11 @@ export type AIMachineEventMap = { [AIMachineEventType.AUTH_WITH_API_KEY]: undefined; [AIMachineEventType.SUBMIT_API_KEY]: { apiKey: string }; [AIMachineEventType.AUTH_WITH_AWS_BEDROCK]: undefined; - [AIMachineEventType.SUBMIT_AWS_CREDENTIALS]: { - accessKeyId: string; - secretAccessKey: string; - region: string; - sessionToken?: string; + [AIMachineEventType.SUBMIT_AWS_CREDENTIALS]: { + accessKeyId: string; + secretAccessKey: string; + region: string; + sessionToken?: string; }; [AIMachineEventType.LOGOUT]: undefined; [AIMachineEventType.SILENT_LOGOUT]: undefined; diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index edf7d3eba50..30056322878 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1143,8 +1143,8 @@ "copyJSLibs": "copyfiles -f ../ballerina-visualizer/build/*.js resources/jslibs" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^2.2.12", - "@ai-sdk/anthropic": "^1.2.12", + "@ai-sdk/amazon-bedrock": "^3.0.25", + "@ai-sdk/anthropic": "^2.0.20", "@types/lodash": "^4.14.200", "@vscode/test-electron": "^2.5.2", "@vscode/vsce": "^2.22.0", @@ -1153,7 +1153,7 @@ "@wso2/font-wso2-vscode": "workspace:*", "@wso2/syntax-tree": "workspace:*", "@wso2/wso2-platform-core": "workspace:*", - "ai": "^4.3.16", + "ai": "^5.0.56", "cors-anywhere": "^0.4.4", "del-cli": "^5.1.0", "dotenv": "~16.5.0", @@ -1181,7 +1181,7 @@ "vscode-uri": "^3.0.8", "xml-js": "^1.6.11", "xstate": "^4.38.3", - "zod": "^3.25.74" + "zod": "^4.1.8" }, "devDependencies": { "@sentry/webpack-plugin": "^1.20.1", diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts index e9009e71d00..a61456a1496 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { generateText } from "ai"; +import { generateText, stepCountIs } from "ai"; import { BACKEND_URL } from "../../utils"; import { selectRequiredFunctions } from "../libs/funcs"; import { GenerationType, getSelectedLibraries } from "../libs/libs"; @@ -75,13 +75,13 @@ interface DocChunk { const tools = { extract_learn_pages: tool({ description: "Retrieves information about Ballerina language concepts, features, tools, and implementation details from the Ballerina Learn Pages. This includes guidance on syntax, usage, best practices, and examples for addressing various use cases.", - parameters: z.object({ + inputSchema: z.object({ query: z.string().describe("A question or query requiring information about Ballerina language concepts, features, tools, best practices, or practical use cases related to implementing solutions using the language.") }) }), extract_central_api_docs: tool({ description: "Retrieves technical details about Ballerina libraries, modules, clients, functions, type definitions, parameters, return types, and records.", - parameters: z.object({ + inputSchema: z.object({ query: z.string().describe("A question or query requiring information about Ballerina libraries, including clients, functions, constructors, type definitions, parameters, and return types") }) }) @@ -173,7 +173,7 @@ export async function getAskResponse(question: string): Promise // Build system message const systemMessage = buildLlmMessage(docChunks, documentationContext, centralContext); - + // Get final response from Claude const finalResponse = await getFinalResponseFromClaude(systemMessage, question); @@ -220,7 +220,7 @@ export async function getAskResponse(question: string): Promise async function getToolCallsFromClaude(question: string): Promise { const { text, toolCalls } = await generateText({ model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxTokens: 8192, + maxOutputTokens: 8192, tools: tools, messages: [ { @@ -228,14 +228,14 @@ async function getToolCallsFromClaude(question: string): Promise { content: question } ], - maxSteps: 1, // Limit to one step to get tool calls only + stopWhen: stepCountIs(1), // Limit to one step to get tool calls only abortSignal: AIPanelAbortController.getInstance().signal }); if (toolCalls && toolCalls.length > 0) { return toolCalls.map(toolCall => ({ name: toolCall.toolName, - input: toolCall.args + input: toolCall.input })); } @@ -245,7 +245,7 @@ async function getToolCallsFromClaude(question: string): Promise { async function getFinalResponseFromClaude(systemMessage: string, question: string): Promise { const { text } = await generateText({ model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxTokens: 8192, + maxOutputTokens: 8192, system: systemMessage, messages: [ { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 1872f2116ec..06e569b4638 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { CoreMessage, generateText, streamText } from "ai"; +import { ModelMessage, generateText, streamText, stepCountIs } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4, getProviderCacheControl, ProviderCacheOptions } from "../connection"; import { GenerationType, getAllLibraries } from "../libs/libs"; import { getLibraryProviderTool } from "../libs/libraryProviderTool"; @@ -45,23 +45,16 @@ import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; function appendFinalMessages( - history: CoreMessage[], - finalMessages: CoreMessage[], + history: ModelMessage[], + finalMessages: ModelMessage[], cacheOptions: ProviderCacheOptions ): void { - const knownIds = new Set(); for (let i = 0; i < finalMessages.length - 1; i++) { const message = finalMessages[i]; - const messageWithId = message as CoreMessage & { id?: string }; - const messageId = messageWithId.id; - - if ((message.role === "assistant" || message.role === "tool") && messageId && !knownIds.has(messageId)) { - knownIds.add(messageId); - + if (message.role === "assistant" || message.role === "tool") { if (i === finalMessages.length - 2) { message.providerOptions = cacheOptions; } - history.push(message); } } @@ -83,7 +76,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") : "- No libraries available"; - const allMessages: CoreMessage[] = [ + const allMessages: ModelMessage[] = [ { role: "system", content: getSystemPromptPrefix(sourceFiles, params.operationType, GenerationType.CODE_GENERATION), @@ -114,10 +107,10 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const { fullStream, response } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 4096 * 4, + maxOutputTokens: 4096 * 4, temperature: 0, messages: allMessages, - maxSteps: 10, + stopWhen: stepCountIs(10), tools, abortSignal: AIPanelAbortController.getInstance().signal, }); @@ -140,9 +133,9 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler console.log(`[Tool Call] Tool call finished: ${toolName}`); console.log( "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", - part.result as Library[] + part.output as Library[] ); - const libraryNames = (part.result as Library[]).map((lib) => lib.name); + const libraryNames = (part.output as Library[]).map((lib) => lib.name); assistantResponse = assistantResponse.replace( `Analyzing request & selecting libraries...`, `Fetched libraries: [${libraryNames.join(", ")}]` @@ -151,8 +144,8 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler break; } case "text-delta": { - assistantResponse += part.textDelta; - eventHandler({ type: "content_block", content: part.textDelta }); + assistantResponse += part.text; + eventHandler({ type: "content_block", content: part.text }); break; } case "error": { @@ -161,7 +154,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "error", content: getErrorMessage(error) }); break; } - case "step-start": { + case "text-start": { if (assistantResponse !== "") { eventHandler({ type: "content_block", content: " \n" }); assistantResponse += " \n"; @@ -429,7 +422,7 @@ export async function repairCodeCore( } export async function repairCode(params: RepairParams, libraryDescriptions: string): Promise { - const allMessages: CoreMessage[] = [ + const allMessages: ModelMessage[] = [ ...params.previousMessages, { role: "assistant", @@ -449,7 +442,7 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri const { text, usage, providerMetadata } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 4096 * 4, + maxOutputTokens: 4096 * 4, temperature: 0, tools, messages: allMessages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts index fdbbc67a4ec..0f8a331f16a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { generateText, CoreMessage } from "ai"; +import { generateText, ModelMessage } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -407,14 +407,14 @@ function getPromptForProcessType(processType: ProcessType): string { async function extractionUsingClaude({ pdfData, processType }: { pdfData: string; processType: ProcessType }): Promise { const promptText = getPromptForProcessType(processType); - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "user", content: [ { type: "file", data: pdfData, - mimeType: "application/pdf" + mediaType: "application/pdf" }, { type: "text", @@ -426,7 +426,7 @@ async function extractionUsingClaude({ pdfData, processType }: { pdfData: string const { text } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: messages, abortSignal: AIPanelAbortController.getInstance().signal @@ -449,14 +449,14 @@ async function imageExtractionUsingClaude({ // Convert extension to proper media type const mimeType = extension === "png" ? "image/png" : "image/jpeg"; - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "user", content: [ { type: "image", image: imgData, - mimeType: mimeType + mediaType: mimeType }, { type: "text", @@ -468,7 +468,7 @@ async function imageExtractionUsingClaude({ const { text } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: messages, abortSignal: AIPanelAbortController.getInstance().signal @@ -486,7 +486,7 @@ async function textExtractionUsingClaude({ }): Promise { const promptText = getPromptForProcessType(processType); - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "user", content: promptText + "\n\n" + textContent @@ -495,7 +495,7 @@ async function textExtractionUsingClaude({ const { text } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: messages, abortSignal: AIPanelAbortController.getInstance().signal diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts index 0d050ecbbd7..27e928ead2d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { CoreMessage, generateObject } from "ai"; +import { ModelMessage, generateObject } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { DatamapperResponse, @@ -657,14 +657,14 @@ async function getMappings( JSON.stringify(mappingTips) ); - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "user", content: prompt } ]; try { const { object } = await generateObject({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 4096, + maxOutputTokens: 4096, temperature: 0, messages: messages, schema: MappingSchema, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts index 68776574919..01c917fb644 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts @@ -15,7 +15,7 @@ // under the License. import { Command, ProjectSource } from "@wso2/ballerina-core"; -import { streamText, CoreMessage } from "ai"; +import { streamText, ModelMessage } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { getDocumentationGenerationSystemPrompt, @@ -37,9 +37,9 @@ export async function generateDocumentationCore( eventHandler: CopilotEventHandler ): Promise { const systemPrompt = getDocumentationGenerationSystemPrompt(); - const userMessages: CoreMessage[] = createDocumentationGenMessages(params); + const userMessages: ModelMessage[] = createDocumentationGenMessages(params); - const allMessages: CoreMessage[] = [ + const allMessages: ModelMessage[] = [ { role: "system", content: systemPrompt, @@ -49,7 +49,7 @@ export async function generateDocumentationCore( const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 16384, + maxOutputTokens: 16384, temperature: 0, messages: allMessages, abortSignal: AIPanelAbortController.getInstance().signal, @@ -61,7 +61,7 @@ export async function generateDocumentationCore( for await (const part of fullStream) { switch (part.type) { case "text-delta": { - const textPart = part.textDelta; + const textPart = part.text; assistantResponse += textPart; eventHandler({ type: "content_block", content: textPart }); break; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts index abc222a0fe8..467cb7fdcb0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts @@ -15,7 +15,7 @@ // under the License. import { DocumentationGenerationRequest } from "./documentation"; -import { CoreMessage } from "ai"; +import { ModelMessage } from "ai"; import { flattenProjectToText, getExternalTypesAsJsonSchema } from "./utils"; // ============================================== @@ -220,12 +220,12 @@ Important Guidelines: // MESSAGE CREATION FUNCTIONS // ============================================== -export function createDocumentationGenMessages(request: DocumentationGenerationRequest): CoreMessage[] { +export function createDocumentationGenMessages(request: DocumentationGenerationRequest): ModelMessage[] { const docGenUser1 = createDocumentationGenUser1Message(request); return [docGenUser1]; } -export function createDocumentationGenUser1Message(request: DocumentationGenerationRequest): CoreMessage { +export function createDocumentationGenUser1Message(request: DocumentationGenerationRequest): ModelMessage { const flattenedProject = flattenProjectToText(request.projectSource); const typeSchemas = request.openApiSpec ? getExternalTypesAsJsonSchema(request.openApiSpec) : "{}"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts index 8667d964865..5201e543d7f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { CoreMessage, generateObject, streamText } from "ai"; +import { ModelMessage, generateObject, streamText } from "ai"; import { getAnthropicClient, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4, getProviderCacheControl } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; @@ -59,7 +59,7 @@ export async function generateHealthcareCodeCore( const historyMessages = populateHistory(params.chatHistory); const cacheOptions = await getProviderCacheControl(); - const allMessages: CoreMessage[] = [ + const allMessages: ModelMessage[] = [ { role: "system", content: getSystemPromptPrefix(relevantTrimmedFuncs, sourceFiles), @@ -79,7 +79,7 @@ export async function generateHealthcareCodeCore( const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 4096 * 2, + maxOutputTokens: 4096 * 2, temperature: 0, messages: allMessages, abortSignal: AIPanelAbortController.getInstance().signal, @@ -90,7 +90,7 @@ export async function generateHealthcareCodeCore( for await (const part of fullStream) { switch (part.type) { case "text-delta": { - const textPart = part.textDelta; + const textPart = part.text; assistantResponse += textPart; eventHandler({ type: "content_block", content: textPart }); break; @@ -348,14 +348,14 @@ Think step-by-step to choose the required types in order to solve the given ques `; const getLibUserPrompt = "QUESTION\n```\n" + prompt + "\n```"; - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "system", content: getLibSystemPrompt }, { role: "user", content: getLibUserPrompt }, ]; try { const { object } = await generateObject({ model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: messages, schema: getTypesResponseSchema, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 6b935526c8d..db200e9d2e8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -14,9 +14,18 @@ // specific language governing permissions and limitations // under the License. -import { generateObject, CoreMessage } from "ai"; - -import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction, PathParameter } from "./funcs_inter_types"; +import { generateObject, ModelMessage } from "ai"; + +import { + GetFunctionResponse, + GetFunctionsRequest, + GetFunctionsResponse, + getFunctionsResponseSchema, + MinifiedClient, + MinifiedRemoteFunction, + MinifiedResourceFunction, + PathParameter, +} from "./funcs_inter_types"; import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; import { TypeDefinition, AbstractFunction, Type, RecordTypeDefinition } from "./libs_types"; import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; @@ -30,20 +39,19 @@ import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel const TYPE_RECORD = 'Record'; const TYPE_CONSTRUCTOR = 'Constructor'; - export async function selectRequiredFunctions(prompt: string, selectedLibNames: string[], generationType: GenerationType): Promise { const selectedLibs: Library[] = await getMaximizedSelectedLibs(selectedLibNames, generationType); const functionsResponse: GetFunctionResponse[] = await getRequiredFunctions(selectedLibNames, prompt, selectedLibs); let typeLibraries: Library[] = []; - if (generationType === GenerationType.HEALTHCARE_GENERATION) { + if (generationType === GenerationType.HEALTHCARE_GENERATION) { const resp: GetTypeResponse[] = await getRequiredTypesFromLibJson(selectedLibNames, prompt, selectedLibs); typeLibraries = toTypesToLibraries(resp, selectedLibs); } const maximizedLibraries: Library[] = await toMaximizedLibrariesFromLibJson(functionsResponse, selectedLibs); - + // Merge typeLibraries and maximizedLibraries without duplicates const mergedLibraries = mergeLibrariesWithoutDuplicates(maximizedLibraries, typeLibraries); - + return mergedLibraries; } @@ -53,33 +61,33 @@ function getClientFunctionCount(clients: MinifiedClient[]): number { function toTypesToLibraries(types: GetTypeResponse[], fullLibs: Library[]): Library[] { const librariesWithTypes: Library[] = []; - + for (const minifiedSelectedLib of types) { try { const fullDefOfSelectedLib = getLibraryByNameFromLibJson(minifiedSelectedLib.libName, fullLibs); if (!fullDefOfSelectedLib) { continue; } - + const filteredTypes = selectTypes(fullDefOfSelectedLib.typeDefs, minifiedSelectedLib); - + librariesWithTypes.push({ name: fullDefOfSelectedLib.name, description: fullDefOfSelectedLib.description, typeDefs: filteredTypes, services: fullDefOfSelectedLib.services, - clients: [] + clients: [], }); } catch (error) { console.error(`Error processing library ${minifiedSelectedLib.libName}:`, error); } } - + return librariesWithTypes; } function getLibraryByNameFromLibJson(libName: string, librariesJson: Library[]): Library | null { - return librariesJson.find(lib => lib.name === libName) || null; + return librariesJson.find((lib) => lib.name === libName) || null; } function selectTypes(fullDefOfSelectedLib: any[], minifiedSelectedLib: GetTypeResponse): any[] { @@ -87,16 +95,16 @@ function selectTypes(fullDefOfSelectedLib: any[], minifiedSelectedLib: GetTypeRe if (!typesResult) { return []; } - + const output: any[] = []; - + if (fullDefOfSelectedLib.length === 0) { throw new Error("Complete type list is not available"); } - + for (const miniType of typesResult) { const miniTypeName = miniType.name; - + for (const item of fullDefOfSelectedLib) { if (item.name === miniTypeName) { output.push(item); @@ -104,81 +112,100 @@ function selectTypes(fullDefOfSelectedLib: any[], minifiedSelectedLib: GetTypeRe } } } - + return output; } -async function getRequiredFunctions(libraries: string[], prompt: string, librariesJson: Library[]): Promise { +async function getRequiredFunctions( + libraries: string[], + prompt: string, + librariesJson: Library[] +): Promise { if (librariesJson.length === 0) { return []; } const startTime = Date.now(); - + const libraryList: GetFunctionsRequest[] = librariesJson - .filter(lib => libraryContains(lib.name, libraries)) - .map(lib => ({ + .filter((lib) => libraryContains(lib.name, libraries)) + .map((lib) => ({ name: lib.name, description: lib.description, clients: filteredClients(lib.clients), - functions: filteredNormalFunctions(lib.functions) + functions: filteredNormalFunctions(lib.functions), })); - const largeLibs = libraryList.filter(lib => getClientFunctionCount(lib.clients) >= 100); - const smallLibs = libraryList.filter(lib => !largeLibs.includes(lib)); + const largeLibs = libraryList.filter((lib) => getClientFunctionCount(lib.clients) >= 100); + const smallLibs = libraryList.filter((lib) => !largeLibs.includes(lib)); - console.log(`[Parallel Execution Plan] Large libraries: ${largeLibs.length} (${largeLibs.map(lib => lib.name).join(', ')}), Small libraries: ${smallLibs.length} (${smallLibs.map(lib => lib.name).join(', ')})`); + console.log( + `[Parallel Execution Plan] Large libraries: ${largeLibs.length} (${largeLibs + .map((lib) => lib.name) + .join(", ")}), Small libraries: ${smallLibs.length} (${smallLibs.map((lib) => lib.name).join(", ")})` + ); // Create promises for large libraries (each processed individually) - const largeLiberiesPromises: Promise[] = largeLibs.map(funcItem => + const largeLiberiesPromises: Promise[] = largeLibs.map((funcItem) => getSuggestedFunctions(prompt, [funcItem]) ); // Create promise for small libraries (processed in bulk) - const smallLibrariesPromise = smallLibs.length !== 0 - ? getSuggestedFunctions(prompt, smallLibs) - : Promise.resolve([]); + const smallLibrariesPromise = + smallLibs.length !== 0 ? getSuggestedFunctions(prompt, smallLibs) : Promise.resolve([]); - console.log(`[Parallel Execution Start] Starting ${largeLiberiesPromises.length} large library requests + 1 small libraries bulk request`); + console.log( + `[Parallel Execution Start] Starting ${largeLiberiesPromises.length} large library requests + 1 small libraries bulk request` + ); const parallelStartTime = Date.now(); // Wait for all promises to complete - const [smallLibResults, ...largeLibResults] = await Promise.all([ - smallLibrariesPromise, - ...largeLiberiesPromises - ]); + const [smallLibResults, ...largeLibResults] = await Promise.all([smallLibrariesPromise, ...largeLiberiesPromises]); const parallelEndTime = Date.now(); const parallelDuration = (parallelEndTime - parallelStartTime) / 1000; - + console.log(`[Parallel Execution Complete] Total parallel execution time: ${parallelDuration}s`); // Flatten the results - const collectiveResp: GetFunctionResponse[] = [ - ...smallLibResults, - ...largeLibResults.flat() - ]; + const collectiveResp: GetFunctionResponse[] = [...smallLibResults, ...largeLibResults.flat()]; const endTime = Date.now(); const totalDuration = (endTime - startTime) / 1000; - - console.log(`[getRequiredFunctions Complete] Total function count: ${collectiveResp.reduce((total, lib) => total + (lib.clients?.reduce((clientTotal, client) => clientTotal + client.functions.length, 0) || 0) + (lib.functions?.length || 0), 0)}, Total duration: ${totalDuration}s, Preparation time: ${(parallelStartTime - startTime) / 1000}s, Parallel time: ${parallelDuration}s`); - + + console.log( + `[getRequiredFunctions Complete] Total function count: ${collectiveResp.reduce( + (total, lib) => + total + + (lib.clients?.reduce((clientTotal, client) => clientTotal + client.functions.length, 0) || 0) + + (lib.functions?.length || 0), + 0 + )}, Total duration: ${totalDuration}s, Preparation time: ${ + (parallelStartTime - startTime) / 1000 + }s, Parallel time: ${parallelDuration}s` + ); + return collectiveResp; } -async function getSuggestedFunctions(prompt: string, libraryList: GetFunctionsRequest[]): Promise { +async function getSuggestedFunctions( + prompt: string, + libraryList: GetFunctionsRequest[] +): Promise { const startTime = Date.now(); - const libraryNames = libraryList.map(lib => lib.name).join(', '); - const functionCount = libraryList.reduce((total, lib) => total + getClientFunctionCount(lib.clients) + (lib.functions?.length || 0), 0); - + const libraryNames = libraryList.map((lib) => lib.name).join(", "); + const functionCount = libraryList.reduce( + (total, lib) => total + getClientFunctionCount(lib.clients) + (lib.functions?.length || 0), + 0 + ); + console.log(`[AI Request Start] Libraries: [${libraryNames}], Function Count: ${functionCount}`); - + const getLibSystemPrompt = `You are an AI assistant tasked with filtering and removing unwanted functions and clients from a provided set of libraries and clients based on a user query. The provided libraries are a subset of the full requirements for the query. Your goal is to return ONLY the relevant libraries, clients, and functions from the provided context that match the user's needs. Rules: 1. Use ONLY the libraries listed in Library_Context_JSON. 2. Do NOT create or infer new libraries or functions.`; -const getLibUserPrompt = `You will be provided with a list of libraries, clients, and their functions, and a user query. + const getLibUserPrompt = `You will be provided with a list of libraries, clients, and their functions, and a user query. ${prompt} @@ -200,18 +227,18 @@ To process the user query and filter the libraries, clients, and functions, foll Now, based on the provided libraries, clients, and functions, and the user query, please filter and return the relevant information. `; - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "system", content: getLibSystemPrompt }, - { role: "user", content: getLibUserPrompt } + { role: "user", content: getLibUserPrompt }, ]; try { const { object } = await generateObject({ model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: messages, schema: getFunctionsResponseSchema, - abortSignal: AIPanelAbortController.getInstance().signal + abortSignal: AIPanelAbortController.getInstance().signal, }); const libList = object as GetFunctionsResponse; @@ -222,9 +249,17 @@ Now, based on the provided libraries, clients, and functions, and the user query const filteredLibList = libList.libraries.filter((lib) => libraryList.some((inputLib) => inputLib.name === lib.name) ); - - console.log(`[AI Request Complete] Libraries: [${libraryNames}], Duration: ${duration}s, Selected Functions: ${libList.libraries.reduce((total, lib) => total + (lib.clients?.reduce((clientTotal, client) => clientTotal + client.functions.length, 0) || 0) + (lib.functions?.length || 0), 0)}`); - + + console.log( + `[AI Request Complete] Libraries: [${libraryNames}], Duration: ${duration}s, Selected Functions: ${libList.libraries.reduce( + (total, lib) => + total + + (lib.clients?.reduce((clientTotal, client) => clientTotal + client.functions.length, 0) || 0) + + (lib.functions?.length || 0), + 0 + )}` + ); + printSelectedFunctions(filteredLibList); return filteredLibList; } catch (error) { @@ -244,37 +279,40 @@ export function libraryContains(library: string, libraries: string[]): boolean { } function filteredClients(clients: Client[]): MinifiedClient[] { - return clients.map(cli => ({ + return clients.map((cli) => ({ name: cli.name, description: cli.description, - functions: filteredFunctions(cli.functions) + functions: filteredFunctions(cli.functions), })); } -function filteredFunctions(functions: (RemoteFunction | ResourceFunction)[]): (MinifiedRemoteFunction | MinifiedResourceFunction)[] { +function filteredFunctions( + functions: (RemoteFunction | ResourceFunction)[] +): (MinifiedRemoteFunction | MinifiedResourceFunction)[] { const output: (MinifiedRemoteFunction | MinifiedResourceFunction)[] = []; - + for (const item of functions) { - if ('accessor' in item) { // ResourceFunction + if ("accessor" in item) { + // ResourceFunction const res: MinifiedResourceFunction = { accessor: item.accessor, paths: item.paths, - parameters: item.parameters.map(param => param.name), - returnType: item.return.type.name + parameters: item.parameters.map((param) => param.name), + returnType: item.return.type.name, }; output.push(res); } else { // RemoteFunction if (item.type !== TYPE_CONSTRUCTOR) { const rem: MinifiedRemoteFunction = { name: item.name, - parameters: item.parameters.map(param => param.name), - returnType: item.return.type.name + parameters: item.parameters.map((param) => param.name), + returnType: item.return.type.name, }; output.push(rem); } } } - + return output; } @@ -282,58 +320,61 @@ function filteredNormalFunctions(functions?: RemoteFunction[]): MinifiedRemoteFu if (!functions) { return undefined; } - - return functions.map(item => ({ + + return functions.map((item) => ({ name: item.name, - parameters: item.parameters.map(param => param.name), - returnType: item.return.type.name + parameters: item.parameters.map((param) => param.name), + returnType: item.return.type.name, })); } -export async function getMaximizedSelectedLibs(libNames:string[], generationType: GenerationType): Promise { - const result = await langClient.getCopilotFilteredLibraries({ +export async function getMaximizedSelectedLibs(libNames: string[], generationType: GenerationType): Promise { + const result = (await langClient.getCopilotFilteredLibraries({ libNames: libNames, - mode: getGenerationMode(generationType) - }) as { libraries: Library[] }; + mode: getGenerationMode(generationType), + })) as { libraries: Library[] }; return result.libraries as Library[]; } -export async function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionResponse[], originalLibraries: Library[]): Promise { +export async function toMaximizedLibrariesFromLibJson( + functionResponses: GetFunctionResponse[], + originalLibraries: Library[] +): Promise { const minifiedLibrariesWithoutRecords: Library[] = []; - + for (const funcResponse of functionResponses) { // Find the original library to get complete information - const originalLib = originalLibraries.find(lib => lib.name === funcResponse.name); + const originalLib = originalLibraries.find((lib) => lib.name === funcResponse.name); if (!originalLib) { continue; } - + const filteredClients = selectClients(originalLib.clients, funcResponse); const filteredFunctions = selectFunctions(originalLib.functions, funcResponse); - + const maximizedLib: Library = { name: funcResponse.name, description: originalLib.description, clients: filteredClients, - functions: filteredFunctions, + functions: filteredFunctions ? filteredFunctions : null, // Get only the type definitions that are actually used by the selected functions and clients typeDefs: getOwnTypeDefsForLib(filteredClients, filteredFunctions, originalLib.typeDefs), - services: originalLib.services + services: originalLib.services ? originalLib.services : null, }; - + minifiedLibrariesWithoutRecords.push(maximizedLib); } - + // Handle external type references const externalRecordsRefs = getExternalTypeDefsRefs(minifiedLibrariesWithoutRecords); await getExternalRecords(minifiedLibrariesWithoutRecords, externalRecordsRefs, originalLibraries); - + return minifiedLibrariesWithoutRecords; } function mergeLibrariesWithoutDuplicates(maximizedLibraries: Library[], typeLibraries: Library[]): Library[] { const finalLibraries: Library[] = maximizedLibraries; - + for (const typeLib of typeLibraries) { const finalLib = findLibraryByName(typeLib.name, finalLibraries); if (finalLib) { @@ -342,12 +383,12 @@ function mergeLibrariesWithoutDuplicates(maximizedLibraries: Library[], typeLibr finalLibraries.push(typeLib); } } - + return finalLibraries; } function findLibraryByName(name: string, libraries: Library[]): Library | null { - return libraries.find(lib => lib.name === name) || null; + return libraries.find((lib) => lib.name === name) || null; } // Helper functions for type definition handling @@ -356,23 +397,23 @@ function selectClients(originalClients: Client[], funcResponse: GetFunctionRespo if (!funcResponse.clients) { return []; } - + const newClients: Client[] = []; - + for (const minClient of funcResponse.clients) { - const originalClient = originalClients.find(c => c.name === minClient.name); + const originalClient = originalClients.find((c) => c.name === minClient.name); if (!originalClient) { continue; } - + const completeClient: Client = { name: originalClient.name, description: originalClient.description, - functions: [] + functions: [], }; - + const output: (RemoteFunction | ResourceFunction)[] = []; - + // Add constructor if there are functions to add if (minClient.functions.length > 0) { const constructor = getConstructor(originalClient.functions); @@ -380,7 +421,7 @@ function selectClients(originalClients: Client[], funcResponse: GetFunctionRespo output.push(constructor); } } - + // Add selected functions for (const minFunc of minClient.functions) { const completeFunc = getCompleteFuncForMiniFunc(minFunc, originalClient.functions); @@ -388,28 +429,31 @@ function selectClients(originalClients: Client[], funcResponse: GetFunctionRespo output.push(completeFunc); } } - + completeClient.functions = output; newClients.push(completeClient); } - + return newClients; } -function selectFunctions(originalFunctions: RemoteFunction[] | undefined, funcResponse: GetFunctionResponse): RemoteFunction[] | undefined { +function selectFunctions( + originalFunctions: RemoteFunction[] | undefined, + funcResponse: GetFunctionResponse +): RemoteFunction[] | undefined { if (!funcResponse.functions || !originalFunctions) { return undefined; } - + const output: RemoteFunction[] = []; - + for (const minFunc of funcResponse.functions) { - const originalFunc = originalFunctions.find(f => f.name === minFunc.name); + const originalFunc = originalFunctions.find((f) => f.name === minFunc.name); if (originalFunc) { output.push(originalFunc); } } - + return output.length > 0 ? output : undefined; } @@ -430,18 +474,18 @@ function normalizePaths(paths: (PathParameter | string)[]): string[] { } function getCompleteFuncForMiniFunc( - minFunc: MinifiedRemoteFunction | MinifiedResourceFunction, + minFunc: MinifiedRemoteFunction | MinifiedResourceFunction, fullFunctions: (RemoteFunction | ResourceFunction)[] ): (RemoteFunction | ResourceFunction) | null { - if ('name' in minFunc) { + if ("name" in minFunc) { // MinifiedRemoteFunction - return fullFunctions.find(f => 'name' in f && f.name === minFunc.name) || null; + return fullFunctions.find((f) => "name" in f && f.name === minFunc.name) || null; } else { // MinifiedResourceFunction return ( fullFunctions.find( (f) => - 'accessor' in f && + "accessor" in f && f.accessor === minFunc.accessor && JSON.stringify(normalizePaths(f.paths)) === JSON.stringify(normalizePaths(minFunc.paths)) ) || null @@ -450,52 +494,52 @@ function getCompleteFuncForMiniFunc( } function getOwnTypeDefsForLib( - clients: Client[], - functions: RemoteFunction[] | undefined, + clients: Client[], + functions: RemoteFunction[] | undefined, allTypeDefs: TypeDefinition[] ): TypeDefinition[] { const allFunctions: AbstractFunction[] = []; - + // Collect all functions from clients for (const client of clients) { allFunctions.push(...client.functions); } - + // Add standalone functions if (functions) { allFunctions.push(...functions); } - + return getOwnRecordRefs(allFunctions, allTypeDefs); } function getOwnRecordRefs(functions: AbstractFunction[], allTypeDefs: TypeDefinition[]): TypeDefinition[] { const ownRecords = new Map(); - + // Process all functions to find type references for (const func of functions) { // Check parameter types for (const param of func.parameters) { addInternalRecord(param.type, ownRecords, allTypeDefs); } - + // Check return type addInternalRecord(func.return.type, ownRecords, allTypeDefs); } - + // Recursively process found type definitions to include dependent types const processedTypes = new Set(); const typesToProcess = Array.from(ownRecords.values()); - + while (typesToProcess.length > 0) { const typeDef = typesToProcess.shift()!; - + if (processedTypes.has(typeDef.name)) { continue; } - + processedTypes.add(typeDef.name); - + if (typeDef.type === TYPE_RECORD) { const recordDef = typeDef as RecordTypeDefinition; for (const field of recordDef.fields) { @@ -505,27 +549,27 @@ function getOwnRecordRefs(functions: AbstractFunction[], allTypeDefs: TypeDefini } // TODO: Handle EnumTypeDefinition and UnionTypeDefinition } - + return Array.from(ownRecords.values()); } function addInternalRecord( - paramType: Type, - ownRecords: Map, + paramType: Type, + ownRecords: Map, allTypeDefs: TypeDefinition[] ): TypeDefinition[] { const foundTypes: TypeDefinition[] = []; - + if (!paramType.links) { return foundTypes; } - + for (const link of paramType.links) { if (link.category === "internal") { if (isIgnoredRecordName(link.recordName)) { continue; } - + const typeDefResult = getTypeDefByName(link.recordName, allTypeDefs); if (typeDefResult) { ownRecords.set(link.recordName, typeDefResult); @@ -535,7 +579,7 @@ function addInternalRecord( } } } - + return foundTypes; } @@ -555,40 +599,40 @@ function isIgnoredRecordName(recordName: string): boolean { "Message_enum_schedule_type", "Message_enum_update_status", "Siprec_enum_update_status", - "Stream_enum_update_status" + "Stream_enum_update_status", ]; return ignoredRecords.includes(recordName); } function getTypeDefByName(name: string, typeDefs: TypeDefinition[]): TypeDefinition | null { - return typeDefs.find(def => def.name === name) || null; + return typeDefs.find((def) => def.name === name) || null; } function getExternalTypeDefsRefs(libraries: Library[]): Map { const externalRecords = new Map(); - + for (const lib of libraries) { const allFunctions: AbstractFunction[] = []; - + // Collect all functions from clients for (const client of lib.clients) { allFunctions.push(...client.functions); } - + // Add standalone functions if (lib.functions) { allFunctions.push(...lib.functions); } - + getExternalTypeDefRefs(externalRecords, allFunctions, lib.typeDefs); } - + return externalRecords; } function getExternalTypeDefRefs( - externalRecords: Map, - functions: AbstractFunction[], + externalRecords: Map, + functions: AbstractFunction[], allTypeDefs: TypeDefinition[] ): void { // Check function parameters and return types @@ -598,7 +642,7 @@ function getExternalTypeDefRefs( } addExternalRecord(func.return.type, externalRecords); } - + // Check type definition fields for (const typeDef of allTypeDefs) { if (typeDef.type === TYPE_RECORD) { @@ -615,7 +659,7 @@ function addExternalRecord(paramType: Type, externalRecords: Map, libraryName: } async function getExternalRecords( - newLibraries: Library[], - libRefs: Map, + newLibraries: Library[], + libRefs: Map, originalLibraries: Library[] ): Promise { for (const [libName, recordNames] of libRefs.entries()) { @@ -645,7 +689,7 @@ async function getExternalRecords( continue; } - let library = originalLibraries.find(lib => lib.name === libName); + let library = originalLibraries.find((lib) => lib.name === libName); if (!library) { console.warn(`Library ${libName} is not found in the context. Fetching library details.`); const result = (await langClient.getCopilotFilteredLibraries({ @@ -667,21 +711,21 @@ async function getExternalRecords( console.warn(`Record ${recordName} is not found in library ${libName}. Skipping the record.`); continue; } - - let newLibrary = newLibraries.find(lib => lib.name === libName); + + let newLibrary = newLibraries.find((lib) => lib.name === libName); if (!newLibrary) { newLibrary = { name: libName, description: library.description, clients: [], - functions: undefined, + functions: null, typeDefs: [typeDef], - services: library.services + services: library.services ? library.services : null, }; newLibraries.push(newLibrary); } else { // Check if type definition already exists - const existingTypeDef = newLibrary.typeDefs.find(def => def.name === recordName); + const existingTypeDef = newLibrary.typeDefs.find((def) => def.name === recordName); if (!existingTypeDef) { newLibrary.typeDefs.push(typeDef); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index 65ec0bc18ff..2826c822d24 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -23,7 +23,6 @@ import { selectRequiredFunctions } from "./funcs"; const LibraryProviderToolSchema = jsonSchema<{ libraryNames: string[]; userPrompt: string; - libraries: Library[]; }>({ type: "object", properties: { @@ -36,22 +35,6 @@ const LibraryProviderToolSchema = jsonSchema<{ type: "string", description: "User query to determine relevant functions and types", }, - libraries: { - type: "array", - items: { - type: "object", - properties: { - name: { type: "string" }, - description: { type: "string" }, - typeDefs: { type: "array", items: { type: "object" } }, - clients: { type: "array", items: { type: "object" } }, - functions: { type: "array", items: { type: "object" } }, - services: { type: "array", items: { type: "object" } }, - }, - required: ["name", "description", "typeDefs", "clients"], - }, - description: "Retrieved library details", - }, }, required: ["libraryNames", "userPrompt"], }); @@ -81,7 +64,7 @@ export function getLibraryProviderTool(libraryDescriptions: string, generationTy This tool analyzes a user query and returns **only the relevant** clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. To use this tool: -- Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. +- Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. - Select the minimal set of libraries that can fulfill the query based on their descriptions. Do not assume library contents unless provided by the tool. - Call this tool with the selected libraryNames and the user query. @@ -118,7 +101,7 @@ Before calling this tool: Available libraries: ${libraryDescriptions}`, - parameters: LibraryProviderToolSchema, + inputSchema: LibraryProviderToolSchema, execute: async (input: { libraryNames: string[]; userPrompt: string }) => { console.log( `[LibraryProviderTool] Called with ${input.libraryNames.length} libraries: ${input.libraryNames.join( diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts index 248e09adf1c..913d1f2d711 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -14,8 +14,8 @@ // specific language governing permissions and limitations // under the License. -import { generateObject, CoreMessage } from "ai"; -import { z } from "zod"; +import { generateObject, ModelMessage } from "ai"; +import { z } from 'zod'; import { MinifiedLibrary, RelevantLibrariesAndFunctionsRequest, @@ -64,7 +64,7 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener return []; } const cacheOptions = await getProviderCacheControl(); - const messages: CoreMessage[] = [ + const messages: ModelMessage[] = [ { role: "system", content: getSystemPrompt(allLibraries), @@ -80,7 +80,7 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener const startTime = Date.now(); const { object } = await generateObject({ model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxTokens: 4096, + maxOutputTokens: 4096, temperature: 0, messages: messages, schema: LibraryListSchema, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index a85e64399dd..51b7605f29e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -31,18 +31,18 @@ export async function generateOpenAPISpecCore( const cacheOptions = await getProviderCacheControl(); const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: [ { role: "system", content: getSystemPrompt(), - providerOptions: cacheOptions, + providerOptions: cacheOptions }, ...historyMessages, { role: "user", - content: getUserPrompt(params.query), + content: getUserPrompt(params.query) }, ], abortSignal: AIPanelAbortController.getInstance().signal, @@ -53,7 +53,7 @@ export async function generateOpenAPISpecCore( for await (const part of fullStream) { switch (part.type) { case "text-delta": { - const textPart = part.textDelta; + const textPart = part.text; eventHandler({ type: "content_block", content: textPart }); break; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts index bc6bb07fba5..268c82d4b02 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts @@ -15,7 +15,7 @@ // under the License. import { TestGenerationRequest1, ProjectSource, Diagnostic } from "./test"; -import { CoreMessage } from "ai"; +import { ModelMessage } from "ai"; import { flattenProjectToText, getExternalTypesAsJsonSchema, getTypesAsJsonSchema, getDiagnosticsAsText, extractSectionToFix } from "./utils"; // ============================================== @@ -675,7 +675,7 @@ Provide ONLY the fixed code section. Your response should be enclosed in // MESSAGE CREATION FUNCTIONS // ============================================== -export function createServiceTestGenMessages(request: TestGenerationRequest1): CoreMessage[] { +export function createServiceTestGenMessages(request: TestGenerationRequest1): ModelMessage[] { const serviceTestGenUser1 = createServiceTestGenUser1Message(request); if (!request.diagnostics || !request.existingTests) { @@ -689,7 +689,7 @@ export function createServiceTestGenMessages(request: TestGenerationRequest1): C } } -export function createServiceTestGenUser1Message(request: TestGenerationRequest1): CoreMessage { +export function createServiceTestGenUser1Message(request: TestGenerationRequest1): ModelMessage { if (!request.openApiSpec) { throw new Error("OpenAPI specification is required for test generation."); } @@ -708,14 +708,14 @@ export function createServiceTestGenUser1Message(request: TestGenerationRequest1 }; } -export function createServiceTestGenAssistant1Message(): CoreMessage { +export function createServiceTestGenAssistant1Message(): ModelMessage { return { role: "assistant", content: getServiceTestGenAssistant1Prompt() }; } -export function createServiceTestGenUser2Message(request: TestGenerationRequest1): CoreMessage { +export function createServiceTestGenUser2Message(request: TestGenerationRequest1): ModelMessage { const prompt = request.testPlan ? getServiceTestGenUser2WithPlanPrompt(request.targetIdentifier, request.testPlan) : getServiceTestGenUser2Prompt(request.targetIdentifier); @@ -726,14 +726,14 @@ export function createServiceTestGenUser2Message(request: TestGenerationRequest1 }; } -export function createServiceTestDiagnosticsAssistant1Message(request: TestGenerationRequest1): CoreMessage { +export function createServiceTestDiagnosticsAssistant1Message(request: TestGenerationRequest1): ModelMessage { return { role: "assistant", content: getServiceTestDiagnosticsAssistant1Prompt() }; } -export function createServiceTestDiagnosticsUser2Message(request: TestGenerationRequest1): CoreMessage { +export function createServiceTestDiagnosticsUser2Message(request: TestGenerationRequest1): ModelMessage { if (!request.diagnostics) { throw new Error("Diagnostics are required for test generation."); } @@ -750,12 +750,12 @@ export function createServiceTestDiagnosticsUser2Message(request: TestGeneration }; } -export function createFunctionTestGenMessages(request: TestGenerationRequest1): CoreMessage[] { +export function createFunctionTestGenMessages(request: TestGenerationRequest1): ModelMessage[] { const functionTestGenUser = createFunctionTestGenUserMessage(request); return [functionTestGenUser]; } -export function createFunctionTestGenUserMessage(request: TestGenerationRequest1): CoreMessage { +export function createFunctionTestGenUserMessage(request: TestGenerationRequest1): ModelMessage { if (!request.testPlan) { throw new Error("Test plan is required for function test generation."); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts index 7df7675b270..2f9a7f4a58a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -15,7 +15,7 @@ // under the License. import { Command } from "@wso2/ballerina-core"; -import { generateText, CoreMessage } from "ai"; +import { generateText, ModelMessage } from "ai"; import { getAnthropicClient, getProviderCacheControl } from "../connection"; import { getServiceTestGenerationSystemPrompt, @@ -93,7 +93,7 @@ type TestGenerationResponse = { async function getStreamedTestResponse(request: TestGenerationRequest1): Promise { const systemPrompt = createTestGenerationSystemPrompt(request); - let messages: CoreMessage[] = []; + let messages: ModelMessage[] = []; if (request.targetType === "service") { messages = createServiceTestGenMessages(request); @@ -118,7 +118,7 @@ async function getStreamedTestResponse(request: TestGenerationRequest1): Promise const { text } = await generateText({ model: await getAnthropicClient("claude-sonnet-4-20250514"), - maxTokens: 16384, + maxOutputTokens: 16384, temperature: 0, system: systemPrompt, messages: messages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts index ff65265998a..fa03e5ccebb 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { CoreMessage, streamText } from "ai"; +import { ModelMessage, streamText } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { getErrorMessage } from "../utils"; import { TestGenerationTarget, TestPlanGenerationRequest, Command } from "@wso2/ballerina-core"; @@ -111,7 +111,7 @@ export async function generateTestPlanCore( userPrompt = getFunctionUserPrompt(targetSource); } - const allMessages: CoreMessage[] = [ + const allMessages: ModelMessage[] = [ { role: "system", content: systemPrompt, @@ -123,7 +123,7 @@ export async function generateTestPlanCore( ]; const { fullStream } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxTokens: 8192, + maxOutputTokens: 8192, temperature: 0, messages: allMessages, abortSignal: AIPanelAbortController.getInstance().signal, @@ -136,7 +136,7 @@ export async function generateTestPlanCore( for await (const part of fullStream) { switch (part.type) { case "text-delta": { - const textPart = part.textDelta; + const textPart = part.text; assistantResponse += textPart; // Process through buffer for scenario tag detection diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index 76aff6fb9c8..358ee8eca95 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -33,19 +33,19 @@ import { Command, DocumentationGeneratorIntermediaryState } from "@wso2/ballerina-core"; -import { CoreMessage } from "ai"; +import { ModelMessage } from "ai"; import { MessageRole } from "./types"; import { RPCLayer } from "../../../../src/RPCLayer"; import { AiPanelWebview } from "../../../views/ai-panel/webview"; import { GenerationType } from "./libs/libs"; import { REQUIREMENTS_DOCUMENT_KEY } from "./code/np_prompts"; -export function populateHistory(chatHistory: ChatEntry[]): CoreMessage[] { +export function populateHistory(chatHistory: ChatEntry[]): ModelMessage[] { if (!chatHistory || chatHistory.length === 0) { return []; } - const messages: CoreMessage[] = []; + const messages: ModelMessage[] = []; for (const history of chatHistory) { // Map actor to role, defaulting to "user" if not "assistant" const role: MessageRole = history.actor === "assistant" ? "assistant" : "user"; diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts index ce70bf23016..d958ec2228c 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts @@ -101,7 +101,7 @@ export const validateApiKey = async (apiKey: string, loginMethod: LoginMethod): await generateText({ model: directAnthropic('claude-3-haiku-20240307'), - maxTokens: 1, + maxOutputTokens: 1, messages: [{ role: 'user', content: 'Hi' }] }); @@ -180,7 +180,7 @@ export const validateAwsCredentials = async (credentials: { // Make a minimal test call to validate credentials await generateText({ model: bedrockClient, - maxTokens: 1, + maxOutputTokens: 1, messages: [{ role: 'user', content: 'Hi' }] }); diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index 6faadfdf324..8d94ec3fba4 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -81,9 +81,7 @@ "webpack": "^5.99.8", "@types/react-lottie": "^1.2.5", "@types/lodash.debounce": "^4.0.6", - "webpack-dev-server": "^5.2.1", - "@ai-sdk/openai": "^1.3.22", - "ai": "^4.3.16" + "webpack-dev-server": "^5.2.1" }, "author": "wso2", "license": "UNLICENSED", From bf92395208d863cfb31b3b3469accca1319bd8c4 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 3 Oct 2025 15:49:08 +0530 Subject: [PATCH 095/730] Support stream nullable check and update --- .../components/editors/ActionTypeEditor.tsx | 74 ++++++++++++++----- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx index f6c6f06cd4d..a76174f1c50 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx @@ -144,20 +144,38 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { if (typeof typeValue === 'string') { const trimmedValue = typeValue.trim(); - // Check for traditional optional syntax (ends with '?') + // Check for optional syntax (ends with '?') if (trimmedValue.endsWith('?')) { return true; } + // Check for standalone () - representing nil if (trimmedValue === '()') { return true; } + // Check for union with () - representing nil if (trimmedValue.includes('()')) { const unionParts = trimmedValue.split('|').map(part => part.trim()); return unionParts.some(part => part === '()'); } + // Check for stream where T is optional + // Pattern: stream or stream + if (trimmedValue.startsWith('stream<') && trimmedValue.includes('>')) { + const streamMatch = trimmedValue.match(/^stream<(.+)>$/); + if (streamMatch) { + const typeParams = streamMatch[1]; + // Split by comma to get individual type parameters + const params = typeParams.split(',').map(param => param.trim()); + // Check if the first type parameter (T) is optional + if (params.length > 0) { + const firstParam = params[0]; + return checkTypeOptional(firstParam); + } + } + } + return false; } @@ -176,27 +194,49 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { const currentValue = form.getValues(field.key) || field.value || ''; console.log('handleMakeOptional - currentValue:', currentValue, 'field.value:', field.value); - if (!currentValue.toString().endsWith('?') && exprRef.current) { - const newValue = currentValue + '?'; - console.log('Adding ? to make optional:', newValue); - - // Update the form value using setValue instead of onChange - form.setValue(field.key, newValue, { shouldValidate: true, shouldDirty: true }); - - // Update the expression editor value directly - if (exprRef.current.inputElement) { - exprRef.current.inputElement.value = newValue; + if (exprRef.current) { + let newValue = currentValue; + + // Check if it's a stream type + if (currentValue.startsWith('stream<') && currentValue.includes('>')) { + const streamMatch = currentValue.match(/^stream<(.+)>$/); + if (streamMatch) { + const typeParams = streamMatch[1]; + const params = typeParams.split(',').map(param => param.trim()); + + if (params.length > 0) { + const firstParam = params[0]; + // Add ? to the first type parameter if it doesn't already have one + if (!firstParam.endsWith('?') && !checkTypeOptional(firstParam)) { + const modifiedFirstParam = firstParam + '?'; + params[0] = modifiedFirstParam; + newValue = `stream<${params.join(', ')}>`; + } + } + } + } else if (!currentValue.toString().endsWith('?')) { + // For non-stream types, add ? at the end + newValue = currentValue + '?'; } - // Move cursor to the end - const newCursorPosition = newValue.length; - cursorPositionRef.current = newCursorPosition; + // Only update if the value actually changed + if (newValue !== currentValue) { + // Update the form value using setValue instead of onChange + form.setValue(field.key, newValue, { shouldValidate: true, shouldDirty: true }); - // Immediately update the optional state - setIsTypeOptional(true); + // Update the expression editor value directly + if (exprRef.current.inputElement) { + exprRef.current.inputElement.value = newValue; + } + // Move cursor to the end + const newCursorPosition = newValue.length; + cursorPositionRef.current = newCursorPosition; + + setIsTypeOptional(true); + } } else { - console.log('Not adding ? - already ends with ? or no exprRef'); + console.log('Not adding ? - no exprRef'); } }; From 7fe9ece99683ed3824d13efeaf75b860b029baad Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 3 Oct 2025 16:02:04 +0530 Subject: [PATCH 096/730] Refactor code --- .../components/editors/ActionTypeEditor.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx index a76174f1c50..25018fa5bce 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx @@ -132,8 +132,8 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { const [isTypeHelperOpen, setIsTypeHelperOpen] = useState(false); - /** HACK: FE implementation till we get the LS api to check the optionalsupport - * Checks if a type is optional by detecting various optional patterns: + /** HACK: FE implementation check the optional support of a type till the LS supports it + * Issue: https://github.com/wso2/product-ballerina-integrator/issues/1262 */ const checkTypeOptional = (typeValue: string | any[]): boolean => { if (!typeValue) { @@ -190,9 +190,7 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { }; const handleMakeOptional = async () => { - console.log('handleMakeOptional triggered', form.getValues(field.key), form.watch(field.key)); const currentValue = form.getValues(field.key) || field.value || ''; - console.log('handleMakeOptional - currentValue:', currentValue, 'field.value:', field.value); if (exprRef.current) { let newValue = currentValue; @@ -235,8 +233,6 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { setIsTypeOptional(true); } - } else { - console.log('Not adding ? - no exprRef'); } }; @@ -497,7 +493,13 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { } {field.valueTypeConstraint && - {sanitizeType(field.valueTypeConstraint as string)}} + + {sanitizeType(field.valueTypeConstraint as string)} + + } { - // Store onChange function and current value in refs so they can be accessed by the icon click handler onChangeRef.current = onChange; - // currentValueRef.current = value; return (
From 2f1b01509a00a8388991d7ae2873b310d5bc59c3 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 3 Oct 2025 19:15:41 +0530 Subject: [PATCH 097/730] Gen RPC code for clearTypeCache --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 4 ++++ .../ballerina-core/src/rpc-types/data-mapper/index.ts | 4 +++- .../ballerina-core/src/rpc-types/data-mapper/rpc-type.ts | 4 +++- .../src/rpc-managers/data-mapper/rpc-handler.ts | 2 ++ .../src/rpc-managers/data-mapper/rpc-manager.ts | 6 ++++++ .../src/rpc-clients/data-mapper/rpc-client.ts | 6 ++++++ 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index 87b6d04102c..38500687843 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -470,6 +470,10 @@ export interface MapWithFnRequest { subMappingName?: string; } +export interface ClearTypeCacheResponse { + success: boolean; +} + export interface GetDataMapperCodedataRequest { filePath: string; codedata: CodeData; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts index dce3f653c96..0508511647d 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts @@ -41,7 +41,8 @@ import { DMModelRequest, ProcessTypeReferenceResponse, ProcessTypeReferenceRequest, - ExpandedDMModelResponse + ExpandedDMModelResponse, + ClearTypeCacheResponse } from "../../interfaces/extended-lang-client"; export interface DataMapperAPI { @@ -64,4 +65,5 @@ export interface DataMapperAPI { getProperty: (params: PropertyRequest) => Promise; getExpandedDMFromDMModel: (params: DMModelRequest) => Promise; getProcessTypeReference: (params: ProcessTypeReferenceRequest) => Promise; + clearTypeCache: () => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts index 774ebd4faa7..875a6920739 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts @@ -43,7 +43,8 @@ import { DMModelRequest, ProcessTypeReferenceResponse, ProcessTypeReferenceRequest, - ExpandedDMModelResponse + ExpandedDMModelResponse, + ClearTypeCacheResponse } from "../../interfaces/extended-lang-client"; import { RequestType } from "vscode-messenger-common"; @@ -67,3 +68,4 @@ export const getAllDataMapperSource: RequestType = { method: `${_preFix}/getProperty` }; export const getExpandedDMFromDMModel: RequestType = { method: `${_preFix}/getExpandedDMFromDMModel` }; export const getProcessTypeReference: RequestType = { method: `${_preFix}/getProcessTypeReference` }; +export const clearTypeCache: RequestType = { method: `${_preFix}/clearTypeCache` }; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts index 31773447c65..98e04b388c2 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts @@ -25,6 +25,7 @@ import { addSubMapping, AddSubMappingRequest, AllDataMapperSourceRequest, + clearTypeCache, convertToQuery, ConvertToQueryRequest, DataMapperModelRequest, @@ -80,4 +81,5 @@ export function registerDataMapperRpcHandlers(messenger: Messenger) { messenger.onRequest(getProperty, (args: PropertyRequest) => rpcManger.getProperty(args)); messenger.onRequest(getExpandedDMFromDMModel, (args: DMModelRequest) => rpcManger.getExpandedDMFromDMModel(args)); messenger.onRequest(getProcessTypeReference, (args: ProcessTypeReferenceRequest) => rpcManger.getProcessTypeReference(args)); + messenger.onRequest(clearTypeCache, () => rpcManger.clearTypeCache()); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts index 8f6869cc5ec..fca7be4a73f 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts @@ -22,6 +22,7 @@ import { AddClausesRequest, AddSubMappingRequest, AllDataMapperSourceRequest, + ClearTypeCacheResponse, ConvertToQueryRequest, DataMapperAPI, DataMapperModelRequest, @@ -409,4 +410,9 @@ export class DataMapperRpcManager implements DataMapperAPI { }); }); } + + async clearTypeCache(): Promise { + // ADD YOUR IMPLEMENTATION HERE + throw new Error('Not implemented'); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts index d0c9fcf2233..20a4f0978b3 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts @@ -22,6 +22,7 @@ import { AddClausesRequest, AddSubMappingRequest, AllDataMapperSourceRequest, + ClearTypeCacheResponse, ConvertToQueryRequest, DMModelRequest, DataMapperAPI, @@ -48,6 +49,7 @@ import { addClauses, addNewArrayElement, addSubMapping, + clearTypeCache, convertToQuery, deleteClause, deleteMapping, @@ -150,4 +152,8 @@ export class DataMapperRpcClient implements DataMapperAPI { getProcessTypeReference(params: ProcessTypeReferenceRequest): Promise { return this._messenger.sendRequest(getProcessTypeReference, HOST_EXTENSION, params); } + + clearTypeCache(): Promise { + return this._messenger.sendRequest(clearTypeCache, HOST_EXTENSION); + } } From 8c0ab5018cadf03b77002fea1561af6038865670 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:01:09 +0530 Subject: [PATCH 098/730] Clear type cache when refreshing data mapper explicitly --- .../src/core/extended-language-client.ts | 8 +++++++- .../src/rpc-managers/data-mapper/rpc-manager.ts | 10 ++++++++-- .../src/views/DataMapper/DataMapperView.tsx | 9 ++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index 0a95898359d..1094af3ecbd 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -259,7 +259,8 @@ import { onMigrationToolLogs, GetMigrationToolsResponse, DeleteSubMappingRequest, - DeleteClauseRequest + DeleteClauseRequest, + ClearTypeCacheResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -357,6 +358,7 @@ enum EXTENDED_APIS { DATA_MAPPER_CODEDATA = 'dataMapper/nodePosition', DATA_MAPPER_SUB_MAPPING_CODEDATA = 'dataMapper/subMapping', DATA_MAPPER_PROPERTY = 'dataMapper/fieldPosition', + DATA_MAPPER_CLEAR_TYPE_CACHE = 'dataMapper/clearTypeCache', VIEW_CONFIG_VARIABLES = 'configEditor/getConfigVariables', UPDATE_CONFIG_VARIABLES = 'configEditor/updateConfigVariables', VIEW_CONFIG_VARIABLES_V2 = 'configEditorV2/getConfigVariables', @@ -807,6 +809,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_PROPERTY, params); } + async clearTypeCache(): Promise { + return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_CLEAR_TYPE_CACHE); + } + async getGraphqlModel(params: GraphqlDesignServiceParams): Promise { return this.sendRequest(EXTENDED_APIS.GRAPHQL_DESIGN_MODEL, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts index fca7be4a73f..a374db3a2b0 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts @@ -412,7 +412,13 @@ export class DataMapperRpcManager implements DataMapperAPI { } async clearTypeCache(): Promise { - // ADD YOUR IMPLEMENTATION HERE - throw new Error('Not implemented'); + return new Promise(async (resolve) => { + await StateMachine + .langClient() + .clearTypeCache() + .then((resp) => { + resolve(resp); + }); + }); } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 7e00b54930b..c1dc9b02502 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -529,8 +529,15 @@ export function DataMapperView(props: DataMapperProps) { onClose ? onClose() : rpcClient.getVisualizerRpcClient()?.goBack(); } - const onDMRefresh = async () => { + try { + const resp = await rpcClient + .getDataMapperRpcClient() + .clearTypeCache(); + console.log(">>> [Data Mapper] clearTypeCache response:", resp); + } catch (error) { + console.error(error); + } await refetch(); }; From f5b4967ead18f2c58820d0190bbd89dd32e6daf5 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:17:12 +0530 Subject: [PATCH 099/730] Refactor DataMapperHeader to use RefreshResetGroup component for refresh and reset actions --- .../DataMapper/Header/DataMapperHeader.tsx | 35 +-------- .../DataMapper/Header/RefreshResetGroup.tsx | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index c29ff3c19d7..83a357af23e 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -27,6 +27,7 @@ import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"; import AutoMapButton from "./AutoMapButton"; import ExpressionBarWrapper from "./ExpressionBar"; import EditButton from "./EditButton"; +import { RefreshResetGroup } from "./RefreshResetGroup"; export interface DataMapperHeaderProps { views: View[]; @@ -44,25 +45,10 @@ export interface DataMapperHeaderProps { export function DataMapperHeader(props: DataMapperHeaderProps) { const { views, switchView, hasEditDisabled, onClose, onBack, onRefresh, onReset, onEdit, autoMapWithAI, undoRedoGroup } = props; - const [isRefreshing, setIsRefreshing] = React.useState(false); - const [isResetting, setIsResetting] = React.useState(false); - const handleAutoMap = async () => { await autoMapWithAI(); }; - const handleOnRefresh = async () => { - setIsRefreshing(true); - await onRefresh(); - setIsRefreshing(false); - }; - - const handleOnReset = async () => { - setIsResetting(true); - await onReset(); - setIsResetting(false); - }; - return ( @@ -70,24 +56,7 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} - - + Data Mapper {!hasEditDisabled && ( diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx new file mode 100644 index 00000000000..8fed8005939 --- /dev/null +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState } from "react"; +import styled from "@emotion/styled"; +import { Button, Codicon, ProgressRing } from "@wso2/ui-toolkit"; + +const ButtonGroup = styled.div` + display: flex; + align-items: center; +`; + +interface RefreshResetGroupProps { + onRefresh: () => Promise; + onReset: () => Promise; +} + +export function RefreshResetGroup({ onRefresh, onReset }: RefreshResetGroupProps) { + const [isRefreshing, setIsRefreshing] = useState(false); + const [isResetting, setIsResetting] = useState(false); + + const handleOnRefresh = async () => { + setIsRefreshing(true); + await onRefresh(); + setIsRefreshing(false); + }; + + const handleOnReset = async () => { + setIsResetting(true); + await onReset(); + setIsResetting(false); + }; + + return ( + + + + + ); +} From d0e6578eb838e1023bf1e33ec5d5b05af763ecab Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:27:51 +0530 Subject: [PATCH 100/730] Refactor RefreshResetGroup to use ActionButton component for refresh and reset actions; adjust HeaderContent gap --- .../DataMapper/Header/DataMapperHeader.tsx | 2 +- .../DataMapper/Header/RefreshResetGroup.tsx | 71 ++++++++++--------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index 83a357af23e..6a2d1a24f21 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -98,7 +98,7 @@ const HeaderContent = styled.div` background-color: var(--vscode-editorWidget-background); justify-content: space-between; align-items: center; - gap: 12px; + gap: 4px; border-bottom: 1px solid rgba(102,103,133,0.15); `; diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx index 8fed8005939..21df6374939 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/RefreshResetGroup.tsx @@ -25,47 +25,52 @@ const ButtonGroup = styled.div` align-items: center; `; +interface ActionButtonProps { + onClick: () => Promise; + iconName: string; + tooltip: string; +} + +function ActionButton({ onClick, iconName, tooltip }: ActionButtonProps) { + const [inProgress, setInProgress] = useState(false); + + const handleOnClick = async () => { + setInProgress(true); + await onClick(); + setInProgress(false); + }; + + return ( + + ); +} + interface RefreshResetGroupProps { onRefresh: () => Promise; onReset: () => Promise; } export function RefreshResetGroup({ onRefresh, onReset }: RefreshResetGroupProps) { - const [isRefreshing, setIsRefreshing] = useState(false); - const [isResetting, setIsResetting] = useState(false); - - const handleOnRefresh = async () => { - setIsRefreshing(true); - await onRefresh(); - setIsRefreshing(false); - }; - - const handleOnReset = async () => { - setIsResetting(true); - await onReset(); - setIsResetting(false); - }; - return ( - - + + ); } From 371c4c35f918df24461155044e37279e63ceb3da Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sun, 5 Oct 2025 10:41:43 +0530 Subject: [PATCH 101/730] Add vertical divider between RefreshResetGroup and UndoRedoGroup in DataMapperHeader --- .../components/DataMapper/Header/DataMapperHeader.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx index 6a2d1a24f21..d9e4b30a9f2 100644 --- a/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx +++ b/workspaces/ballerina/data-mapper/src/components/DataMapper/Header/DataMapperHeader.tsx @@ -56,6 +56,7 @@ export function DataMapperHeader(props: DataMapperHeaderProps) { {undoRedoGroup && undoRedoGroup()} + Data Mapper @@ -109,11 +110,17 @@ const Title = styled.h2` color: var(--vscode-foreground); `; +const VerticalDivider = styled.div` + height: 20px; + width: 1px; + background-color: var(--dropdown-border); +`; + const RightContainer = styled.div<{ isClickable: boolean }>` display: flex; align-items: center; gap: 12px; - pointer-events: ${({ isClickable }) => (isClickable ? 'auto' : 'none')}; + pointer-events: ${({ isClickable }) => (isClickable ? "auto" : "none")}; opacity: ${({ isClickable }) => (isClickable ? 1 : 0.5)}; `; From 5c680ba4133fe1b791f781dd958e6b82d8eb76b3 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 7 Oct 2025 10:22:34 +0530 Subject: [PATCH 102/730] Add parentIdentifier check in resource retrieval logic in VisualizerRpcManager --- .../src/rpc-managers/visualizer/rpc-manager.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index b2056d551eb..4737de22e26 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -215,6 +215,7 @@ export class VisualizerRpcManager implements VisualizerAPI { // Get the updated component and update the location const currentIdentifier = StateMachine.context().identifier; const currentType = StateMachine.context().type; + const parentIdentifier = StateMachine.context().parentIdentifier; // Find the correct artifact by currentIdentifier (id) let currentArtifact = undefined; @@ -235,8 +236,8 @@ export class VisualizerRpcManager implements VisualizerAPI { currentArtifact = artifact; } - // Check if artifact has resources and find within those - if (artifact.resources && artifact.resources.length > 0) { + // Check if parent artifact is matched and has resources and find within those + if (parentIdentifier && artifact.name === parentIdentifier && artifact.resources && artifact.resources.length > 0) { const resource = artifact.resources.find( (resource) => resource.id === currentIdentifier || resource.name === currentIdentifier ); From 1d0d53b3b1a455e05bb784464618def37d6484e3 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 7 Oct 2025 11:00:53 +0530 Subject: [PATCH 103/730] Update action buttons in DiagramWrapper to use 'settings-gear' icon and change label to 'Configure' --- .../src/views/BI/DiagramWrapper/index.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index ceb4c35b0f0..0b47f3fc512 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -383,8 +383,8 @@ export function DiagramWrapper(param: DiagramWrapperProps) { return ( <> getFunctionModel()}> - - Edit + + Configure handleEdit(fileName)}> - - Edit + + Configure ); } From 9e2779d70afcb52265f9401ad84d08926be4fa4d Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Tue, 30 Sep 2025 17:43:28 +0530 Subject: [PATCH 104/730] Update the code generation implementation to support claude text editing tool --- .../src/features/ai/service/code/code.ts | 279 ++++++++++++++++-- .../views/AIPanel/components/AIChat/index.tsx | 2 +- 2 files changed, 252 insertions(+), 29 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 06e569b4638..8c486df41f4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -18,6 +18,7 @@ import { ModelMessage, generateText, streamText, stepCountIs } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4, getProviderCacheControl, ProviderCacheOptions } from "../connection"; import { GenerationType, getAllLibraries } from "../libs/libs"; import { getLibraryProviderTool } from "../libs/libraryProviderTool"; +import { anthropic } from "@ai-sdk/anthropic"; import { getRewrittenPrompt, populateHistory, @@ -39,11 +40,143 @@ import { SourceFiles, Command, } from "@wso2/ballerina-core"; -import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; +import { getProjectFromResponse, getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; +async function handleTextEditorCommands( + updatedSourceFiles: SourceFiles[], + updatedFileNames: string[], + { command, path: filePath, file_text, insert_line, new_str, old_str, view_range, +}: ExecuteArgs): Promise<{ success: boolean; message: string; content?: string }> { + try { + console.log(`[Text Editor Tool] Received command: '${command}' for file: '${filePath}'`); + switch (command) { + case TextEditorCommand.VIEW: { + const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); + const content = sourceFile == undefined ? "" : sourceFile.content; + if (view_range && view_range.length === 2 && content != undefined) { + const [start, end] = view_range; + const lines = content.split('\n'); + + const rangedContent = lines.slice(start - 1, end).join('\n'); + return { success: true, message: `Viewing lines ${start}-${end} of file ${filePath}.`, content: rangedContent }; + } + return { success: true, message: `Viewing entire file ${filePath}.`, content }; + } + + case TextEditorCommand.CREATE: { + if (file_text === undefined) { + throw new Error("The 'file_text' parameter is required for the 'create' command."); + } + + updatedSourceFiles.push({ filePath, content: file_text }); + updatedFileNames.push(filePath); + return { success: true, message: `Successfully created file ${filePath}.` }; + } + + case TextEditorCommand.STR_REPLACE: { + if (old_str === undefined || new_str === undefined) { + throw new Error("The 'old_str' and 'new_str' parameters are required for the 'str_replace' command."); + } + updatedFileNames.push(filePath); + await saveToHistory(updatedSourceFiles, filePath); + const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); + const content = sourceFile == undefined ? "" : sourceFile.content; + const newContent = content.replace(`${old_str}`, new_str); + + if (content === newContent) { + return { success: true, message: `String to replace was not found in ${filePath}. No changes made.` }; + } + + // updatedSourceFiles = updatedSourceFiles.filter(f => f.filePath != filePath); + // updatedSourceFiles.push({ filePath, content: newContent }); + + const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); + if (index !== -1) { + updatedSourceFiles[index].content = newContent; + } else { + // If the file doesn't exist(Can't happen), create a new entry + updatedSourceFiles.push({ filePath, content: newContent }); + } + + return { success: true, message: `Successfully replaced all occurrences of '${old_str}' in ${filePath}.` }; + } + + case TextEditorCommand.INSERT: { + if (insert_line === undefined || new_str === undefined) { + throw new Error("The 'insert_line' and 'new_str' parameters are required for the 'insert' command."); + } + updatedFileNames.push(filePath); + await saveToHistory(updatedSourceFiles, filePath); + const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); + const content = sourceFile == undefined ? "" : sourceFile.content; + const lines = content.split('\n'); + + const clampedLine = Math.max(0, Math.min(lines.length, insert_line)); + + lines.splice(clampedLine, 0, new_str); + const newContent = lines.join('\n'); + // updatedSourceFiles.push({ filePath, content: newContent }); + const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); + if (index !== -1) { + updatedSourceFiles[index].content = newContent; + } else { + // If the file doesn't exist(Can't happen), create a new entry + updatedSourceFiles.push({ filePath, content: newContent }); + } + return { success: true, message: `Successfully inserted text into ${filePath} at line ${insert_line}.` }; + } + + case TextEditorCommand.DELETE: { + if (old_str === undefined) { + throw new Error("The 'old_str' parameter is required for the 'delete' command."); + } + + updatedFileNames.push(filePath); + await saveToHistory(updatedSourceFiles, filePath); + const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); + const content = sourceFile == undefined ? "" : sourceFile.content; + const newContent = content.replaceAll(old_str, ''); + + if (content === newContent) { + return { success: true, message: `String to delete was not found in ${filePath}. No changes made.` }; + } + + updatedSourceFiles.push({ filePath, content: newContent }); + return { success: true, message: `Successfully deleted all occurrences of '${old_str}' from ${filePath}.` }; + } + + case TextEditorCommand.UNDO_EDIT: { + const history = editHistory.get(filePath); + if (!history || history.length === 0) { + throw new Error(`No edit history found for '${filePath}' to undo.`); + } + updatedFileNames.push(filePath); + const lastState = history.pop()!; + // updatedSourceFiles = updatedSourceFiles.filter(f => f.filePath != filePath); + // updatedSourceFiles.push({ filePath, content: lastState ? lastState : "" }); + const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); + if (index !== -1) { + updatedSourceFiles[index].content = lastState ? lastState : ""; + } else { + // If the file doesn't exist(Can't happen), create a new entry + updatedSourceFiles.push({ filePath, content: lastState ? lastState : "" }); + } + return { success: true, message: `Successfully undid the last edit on ${filePath}.` }; + } + + default: + throw new Error(`The command '${command}' is not a valid command.`); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : "An unknown error occurred."; + console.error(`[Text Editor Tool] Failed to execute command '${command}':`, errorMessage); + return { success: false, message: errorMessage }; + } +} + function appendFinalMessages( history: ModelMessage[], finalMessages: ModelMessage[], @@ -65,6 +198,8 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const project: ProjectSource = await getProjectSource(params.operationType); const packageName = project.projectName; const sourceFiles: SourceFiles[] = transformProjectSource(project); + let updatedSourceFiles: SourceFiles[] = [...sourceFiles]; + let updatedFileNames: string[] = []; const prompt = getRewrittenPrompt(params, sourceFiles); const historyMessages = populateHistory(params.chatHistory); const cacheOptions = await getProviderCacheControl(); @@ -103,7 +238,13 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - }; + str_replace_editor: anthropic.tools.textEditor_20250124({ + async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { + handleTextEditorCommands(updatedSourceFiles, updatedFileNames, + { command, path, old_str, new_str, file_text, insert_line, view_range }); + } + }) + } const { fullStream, response } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), @@ -125,22 +266,34 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const toolName = part.toolName; console.log(`[Tool Call] Tool call started: ${toolName}`); eventHandler({ type: "tool_call", toolName }); - assistantResponse += `\n\nAnalyzing request & selecting libraries...`; + if (toolName == "LibraryProviderTool") { + assistantResponse += `\n\nAnalyzing request & selecting libraries...`; + } else { + assistantResponse += `\n\nApplying code changes to the project files...`; + } break; } case "tool-result": { const toolName = part.toolName; - console.log(`[Tool Call] Tool call finished: ${toolName}`); - console.log( - "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", - part.output as Library[] - ); - const libraryNames = (part.output as Library[]).map((lib) => lib.name); - assistantResponse = assistantResponse.replace( - `Analyzing request & selecting libraries...`, - `Fetched libraries: [${libraryNames.join(", ")}]` - ); - eventHandler({ type: "tool_result", toolName, libraryNames }); + let toolResult: string[] = []; + if (toolName == "LibraryProviderTool") { + console.log(`[Tool Call] Tool call finished: ${toolName}`); + console.log(`[Tool Call] Tool call finished: ${toolName}`); + console.log( + "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", + part.output as Library[] + ); + const libraryNames = (part.output as Library[]).map((lib) => lib.name); + assistantResponse = assistantResponse.replace( + `Analyzing request & selecting libraries...`, + `Fetched libraries: [${libraryNames.join(", ")}]` + ); + toolResult = libraryNames + } else if (toolName == "str_replace_editor") { + console.log(`[Tool Call] Tool call finished: ${toolName}`); + toolResult = [updatedFileNames[updatedFileNames.length - 1]]; + } + eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); break; } case "text-delta": { @@ -180,9 +333,11 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ? (lastAssistantMessage.content as any[]).find((c) => c.type === "text")?.text || finalResponse : finalResponse; + finalResponse = updateFinalResponseWithCodeBlocks(finalResponse, updatedSourceFiles, updatedFileNames); const postProcessedResp: PostProcessResponse = await postProcess({ - assistant_response: finalResponse, + assistant_response: finalResponse }); + finalResponse = postProcessedResp.assistant_response; let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; @@ -232,6 +387,30 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler } } +function updateFinalResponseWithCodeBlocks(finalResponse: string, updatedSourceFiles: SourceFiles[], updatedFileNames: string[]): string { + const codeBlocks: string[] = []; + + for (const fileName of updatedFileNames) { + const sourceFile = updatedSourceFiles.find(sf => sf.filePath === fileName); + + if (sourceFile) { + const formattedBlock = +` +\`\`\`ballerina +${sourceFile.content} +\`\`\` +`; + codeBlocks.push(formattedBlock); + } + } + + if (codeBlocks.length > 0) { + return finalResponse + '\n\n' + codeBlocks.join('\n\n'); + } + + return finalResponse; +} + // Main public function that uses the default event handler export async function generateCode(params: GenerateCodeRequest): Promise { const eventHandler = createWebviewEventHandler(Command.Code); @@ -335,20 +514,20 @@ Important reminders: - In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. -Begin your response with the explanation, once the entire explanation is finished only, include codeblock segments (if any) at the end of the response. -The explanation should explain the control flow decided in step 2, along with the selected libraries and their functions. - -Each file that needs modifications should have a codeblock segment, and it MUST contain the complete file content with the proposed change. The codeblock segments should only contain .bal contents and should not generate or modify any other file types. Politely decline if the query requests such cases. +Begin your response with the explanation. Once the explanation is finished, you must only use the **text_editor_20250124** tool to apply the necessary code changes. +The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. +Instead of generating complete files in code blocks, you must apply surgical edits to the existing source code using the **text_editor_20250124** tool. For each file that requires changes: +Analyze and Locate: Carefully examine the existing code to pinpoint the exact start_line and end_line for each required modification (e.g., insertion, replacement, or deletion). +Generate Tool Calls: For each distinct edit, generate a precise call to the **text_editor_20250124** tool. +To insert code, set the start_line and end_line to the same line number. +To replace a block of code, specify the correct start_line and end_line for the targeted block. +To delete code, specify the start_line and end_line of the block to be removed and provide an empty string for the code parameter. +To create a new file, provide the new file path and the complete code for that file. +Your goal is to modify only the relevant parts of the code to address the user's query. +Do not generate or modify any file types other than .bal. Politely decline if the query requests such cases. - DO NOT mention if libraries are not required for the user query or task. - Format responses using professional markdown with proper headings, lists, and styling - -Example Codeblock segment: - -\`\`\`ballerina -//code goes here -\`\`\` - `; } @@ -436,8 +615,17 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri }, ]; + let updatedSourceFiles: SourceFiles[] = getProjectFromResponse(params.assistantResponse).sourceFiles; + let updatedFileNames: string[] = []; + const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), + str_replace_editor: anthropic.tools.textEditor_20250124({ + async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { + handleTextEditorCommands(updatedSourceFiles, updatedFileNames, + { command, path, old_str, new_str, file_text, insert_line, view_range }); + } + }) }; const { text, usage, providerMetadata } = await generateText({ @@ -449,10 +637,11 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri abortSignal: AIPanelAbortController.getInstance().signal, }); + const responseText = updateFinalResponseWithCodeBlocks(text, updatedSourceFiles, updatedFileNames); // replace original response with new code blocks - let diagnosticFixResp = replaceCodeBlocks(params.assistantResponse, text); + let diagnosticFixResp = replaceCodeBlocks(params.assistantResponse, responseText); const postProcessResp: PostProcessResponse = await postProcess({ - assistant_response: diagnosticFixResp, + assistant_response: diagnosticFixResp }); diagnosticFixResp = postProcessResp.assistant_response; console.log("After auto repair, Diagnostics : ", postProcessResp.diagnostics.diagnostics); @@ -516,3 +705,37 @@ export function replaceCodeBlocks(originalResp: string, newResp: string): string return finalResp; } + +enum TextEditorCommand { + VIEW = 'view', + CREATE = 'create', + STR_REPLACE = 'str_replace', + INSERT = 'insert', + DELETE = 'delete', + UNDO_EDIT = 'undo_edit' +} + +interface ExecuteArgs { + command: string; + path: string; + file_text?: string; + insert_line?: number; + new_str?: string; + old_str?: string; + view_range?: number[]; +} + +const editHistory: Map = new Map(); + +async function saveToHistory(sourceFiles: SourceFiles[], filePath: string): Promise { + try { + const sourceFile: SourceFiles = sourceFiles.find(f => f.filePath == filePath); + const content = sourceFile == undefined ? "" : sourceFile.content; + if (!editHistory.has(filePath)) { + editHistory.set(filePath, []); + } + editHistory.get(filePath)?.push(content); + } catch (error) { + console.error(`[History] Failed to save state for ${filePath}:`, error); + } +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 7eb01fb0170..f27b4f2ac8d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -1944,7 +1944,7 @@ const AIChat: React.FC = () => { nextSegment && (nextSegment.type === SegmentType.Code || (nextSegment.type === SegmentType.Text && - nextSegment.text.trim() === "")) + (nextSegment.text != "\n" && nextSegment.text.trim() === ""))) ) { return; } else { From b5b3a019e9440127f520e40d9c6ecaf899e290cb Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Wed, 1 Oct 2025 14:03:53 +0530 Subject: [PATCH 105/730] Refactor the code ts file --- .../ballerina-extension/src/features/ai/service/code/code.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 8c486df41f4..0843ad6ce68 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -89,9 +89,6 @@ async function handleTextEditorCommands( if (content === newContent) { return { success: true, message: `String to replace was not found in ${filePath}. No changes made.` }; } - - // updatedSourceFiles = updatedSourceFiles.filter(f => f.filePath != filePath); - // updatedSourceFiles.push({ filePath, content: newContent }); const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); if (index !== -1) { @@ -244,7 +241,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler { command, path, old_str, new_str, file_text, insert_line, view_range }); } }) - } + }; const { fullStream, response } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), From 85c1e74b7aa23c3ff87bc9a1bab815d30a0831d8 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Thu, 2 Oct 2025 00:18:10 +0530 Subject: [PATCH 106/730] Add basic LLM evaluation config for test suite --- .../test/ai/evals/code/code.test.ts | 10 +- .../result-management/result-conversion.ts | 8 +- .../result-management/result-persistence.ts | 3 +- .../test/ai/evals/code/types/result-types.ts | 5 + .../test/ai/evals/code/types/test-types.ts | 3 + .../ai/evals/code/utils/evaluator-utils.ts | 173 ++++++++++++++++++ .../ai/evals/code/utils/test-execution.ts | 7 +- .../ai/evals/code/utils/test-validation.ts | 8 +- 8 files changed, 208 insertions(+), 9 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index 7e23451eedb..3de5c8f5c89 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -22,7 +22,7 @@ import * as vscode from "vscode"; import * as dotenv from "dotenv"; import { testCases } from "./test-cases"; -import { TestUseCase, Summary, TestConfiguration } from "./types"; +import { TestUseCase, Summary } from "./types"; import { DEFAULT_TEST_CONFIG, TIMING, @@ -41,12 +41,17 @@ import { logExecutionCompletion } from "./result-management"; + +const PROJECT_ROOT = path.resolve(__dirname, PATHS.PROJECT_ROOT_RELATIVE); + // Convert imported test cases to TestUseCase format const TEST_USE_CASES: readonly TestUseCase[] = testCases.map((testCase, index) => ({ id: `usecase_${index + 1}`, description: testCase.prompt.substring(0, 50) + "...", usecase: testCase.prompt, - operationType: "CODE_GENERATION" as const + operationType: "CODE_GENERATION" as const, + // projectPath: path.join(PROJECT_ROOT, testCase.projectPath) + projectPath: path.join(PROJECT_ROOT) })); /** @@ -125,7 +130,6 @@ async function setupTestEnvironment(): Promise { await commands.executeCommand(VSCODE_COMMANDS.CLOSE_ALL_EDITORS); // Add the Ballerina workspace to trigger workspaceContains activation event - const PROJECT_ROOT = path.resolve(__dirname, PATHS.PROJECT_ROOT_RELATIVE); const currentFolderCount = workspace.workspaceFolders?.length || 0; workspace.updateWorkspaceFolders(currentFolderCount, 0, { uri: Uri.file(PROJECT_ROOT), diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index 6f8afdbaf33..23972465c1e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -42,6 +42,7 @@ export function convertTestResultToUsecaseResult(testResult: TestCaseResult): Us compiled: testResult.passed && diagnostics.length === 0, duration: testResult.result.duration, timestamp: testResult.result.startTime, + evaluationResult: testResult.evaluationResult, errorEvents: errorEvents.length > 0 ? errorEvents : undefined }; } @@ -58,7 +59,8 @@ export function createFailedUsecaseResult(useCase: TestUseCase, reason: unknown) files: [{ fileName: FILES.ERROR_TXT, content: errorMessage }], compiled: false, duration: undefined, - timestamp: Date.now() + timestamp: Date.now(), + evaluationResult: { is_correct: false, reasoning: 'Error occurred', rating: 0 } }; } @@ -74,6 +76,7 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[]): const durations = results.filter(r => r.duration).map(r => r.duration!); const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + const evaluationSummary = results.reduce((sum, r) => sum + (r.evaluationResult.rating || 0), 0); return { results: results, @@ -83,6 +86,7 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[]): accuracy: Math.round(accuracy * 100) / 100, totalDuration, averageDuration: Math.round(averageDuration), - timestamp: Date.now() + timestamp: Date.now(), + evaluationSummary }; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts index 02eb4ec077e..c5acd8263e6 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -33,7 +33,8 @@ export async function persistUsecaseResult( const compactResult: UsecaseCompact = { usecase: usecaseResult.usecase, compiled: usecaseResult.compiled, - duration: usecaseResult.duration + duration: usecaseResult.duration, + evaluationResult: usecaseResult.evaluationResult }; await fs.promises.writeFile( diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index 39cb5b01b04..c59c4da17d8 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -1,5 +1,7 @@ // Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. +import { LLMEvaluationResult } from "../utils/evaluator-utils"; + // 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. @@ -47,6 +49,7 @@ export interface UsecaseResult { readonly duration?: number; readonly timestamp?: number; readonly errorEvents?: readonly string[]; + readonly evaluationResult: LLMEvaluationResult; } /** @@ -61,6 +64,7 @@ export interface Summary { readonly totalDuration: number; readonly averageDuration: number; readonly timestamp: number; + readonly evaluationSummary: number } /** @@ -80,4 +84,5 @@ export interface UsecaseCompact { readonly usecase: string; readonly compiled: boolean; readonly duration?: number; + readonly evaluationResult: LLMEvaluationResult; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts index 45fbfbde213..a47fed03fa7 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts @@ -15,6 +15,7 @@ // under the License. import { ChatNotify } from "@wso2/ballerina-core"; +import { LLMEvaluationResult } from "../utils/evaluator-utils"; /** * Test use case definition @@ -23,6 +24,7 @@ export interface TestUseCase { readonly id: string; readonly description: string; readonly usecase: string; + readonly projectPath: string; readonly operationType: "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; readonly fileAttachments?: readonly { fileName: string; content: string; }[]; } @@ -56,4 +58,5 @@ export interface TestCaseResult { readonly noErrorCheck: boolean; readonly noDiagnosticsCheck: boolean; }; + readonly evaluationResult?: LLMEvaluationResult; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts new file mode 100644 index 00000000000..3aad9a6ddbb --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts @@ -0,0 +1,173 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { generateText } from "ai"; +import { ProjectModule, ProjectSource, SourceFile, SourceFiles } from "@wso2/ballerina-core"; +import { createAnthropic } from "@ai-sdk/anthropic"; +import path from "path"; +import fs from "fs"; + +export interface LLMEvaluationResult { + is_correct: boolean; + reasoning: string; + rating: number; +} + +const anthropic = createAnthropic({ + apiKey: process.env.ANTHROPIC_API_KEY +}); + +/** + * Uses an LLM to evaluate if the final code correctly implements the user query, + * given an initial state. + * + * @param userQuery The original request from the user. + * @param initialSource The source code before any changes were made. + * @param finalSource The final, syntactically correct source code after generation/repair. + * @returns A promise that resolves to an evaluation result. + */ +export async function evaluateCodeWithLLM( + userQuery: string, + initialSource: SourceFiles[], + finalSource: SourceFiles[] +): Promise { + console.log("🤖 Starting LLM-based semantic evaluation..."); + // console.log("🤖 Starting LLM-based semantic evaluation..." + `${JSON.stringify(initialSource)}` + `\n\n ${JSON.stringify(finalSource)} ` + ` ${userQuery}`); + + const stringifySources = (sources: SourceFiles[]): string => { + if (sources.length === 0) return "No files in the project."; + return sources.map(file => `--- File: ${file.filePath} ---\n${file.content}`).join("\n\n"); + }; + + const initialCodeString = stringifySources(initialSource); + const finalCodeString = stringifySources(finalSource); + + const systemPrompt = `You are an expert Ballerina developer and an meticulous code reviewer. Your task is to evaluate if the 'Final Code' correctly and completely implements the 'User Query', using the 'Initial Code' as the starting point. + +Respond ONLY with a valid JSON object with two fields: +1. "is_correct": A boolean value. 'true' if the final code is a correct implementation of the query, 'false' otherwise. +2. "reasoning": A string explaining your decision. Be concise. If it's incorrect, clearly state what is wrong or missing. +3. "rating": A numer rating the quality and the accuracy based on the user query of the final code on a scale from 0 to 10, where 10 is perfect. + +Do NOT provide any other text, greetings, or explanations outside of the JSON object.`; + + const userPrompt = ` +# User Query +\`\`\` +${userQuery} +\`\`\` + +# Initial Code +\`\`\`ballerina +${initialCodeString} +\`\`\` + +# Final Code +\`\`\`ballerina +${finalCodeString} +\`\`\` +`; + + try { + const { text } = await generateText({ + // model: await getAnthropicClient(ANTHROPIC_SONNET_4), + model: anthropic('claude-sonnet-4-20250514'), + system: systemPrompt, + prompt: userPrompt, + temperature: 0.1, + maxTokens: 1024, + }); + + const result: LLMEvaluationResult = JSON.parse(text); + console.log(`✅ LLM Evaluation Complete. Correct: ${result.is_correct}. Reason: ${result.reasoning}, Rating: ${result.rating}`); + return result; + + } catch (error) { + console.error("Error during LLM evaluation:", error); + return { + is_correct: false, + reasoning: `Failed to evaluate due to an error: ${error instanceof Error ? error.message : "Unknown error"}`, + rating: 0 + }; + } +} + +export function getProjectFromResponse(req: string): SourceFiles[] { + const sourceFiles: SourceFile[] = []; + const regex = /\s*```ballerina([\s\S]*?)```\s*<\/code>/g; + let match; + + while ((match = regex.exec(req)) !== null) { + const filePath = match[1]; + const fileContent = match[2].trim(); + sourceFiles.push({ filePath, content: fileContent }); + } + + return sourceFiles; +} + +export async function getProjectSource(dirPath: string): Promise { + const projectRoot = dirPath; + + if (!projectRoot) { + return null; + } + + const projectSource: ProjectSource = { + sourceFiles: [], + projectTests: [], + projectModules: [], + projectName: "" + }; + + // Read root-level .bal files + const rootFiles = fs.readdirSync(projectRoot); + for (const file of rootFiles) { + if (file.endsWith('.bal')) { + const filePath = path.join(projectRoot, file); + const content = await fs.promises.readFile(filePath, 'utf-8'); + projectSource.sourceFiles.push({ filePath, content }); + } + } + + // Read modules + const modulesDir = path.join(projectRoot, 'modules'); + if (fs.existsSync(modulesDir)) { + const modules = fs.readdirSync(modulesDir, { withFileTypes: true }); + for (const moduleDir of modules) { + if (moduleDir.isDirectory()) { + const projectModule: ProjectModule = { + moduleName: moduleDir.name, + sourceFiles: [], + isGenerated: false, + }; + + const moduleFiles = fs.readdirSync(path.join(modulesDir, moduleDir.name)); + for (const file of moduleFiles) { + if (file.endsWith('.bal')) { + const filePath = path.join(modulesDir, moduleDir.name, file); + const content = await fs.promises.readFile(filePath, 'utf-8'); + projectModule.sourceFiles.push({ filePath, content }); + } + } + + projectSource.projectModules.push(projectModule); + } + } + } + + return projectSource; +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts index 3b234d2f635..90de09e3283 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts @@ -20,6 +20,8 @@ import { TestUseCase, TestCaseResult } from '../types'; import { createTestEventHandler } from './test-event-handler'; import { validateTestResult } from './test-validation'; import { VSCODE_COMMANDS } from './constants'; +import { getProjectFromResponse, getProjectSource } from "./evaluator-utils"; +import { SourceFiles } from "@wso2/ballerina-core"; /** * Executes a single test case and returns the result @@ -36,11 +38,14 @@ export async function executeSingleTestCase(useCase: TestUseCase): Promise { const validationDetails = { noErrorCheck: true, noDiagnosticsCheck: true @@ -39,12 +41,14 @@ export function validateTestResult(result: TestEventResult, useCase: TestUseCase passed = false; failureReason += `${failureReason ? '; ' : ''}Diagnostics received: ${result.diagnostics.length} diagnostic(s)`; } + const evaluation: LLMEvaluationResult = await evaluateCodeWithLLM(useCase.usecase, initialSources, finalSources); return { useCase, result, passed, failureReason: failureReason || undefined, - validationDetails + validationDetails, + evaluationResult: evaluation }; } From 49084c237c92c2d7ce55ed644fe894e7de8cc9df Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Thu, 2 Oct 2025 00:47:35 +0530 Subject: [PATCH 107/730] Add tool calling for LLM evaluator --- .../ai/evals/code/utils/evaluator-utils.ts | 108 +++++++++++++----- 1 file changed, 78 insertions(+), 30 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts index 3aad9a6ddbb..52d0b0456eb 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts @@ -19,6 +19,7 @@ import { ProjectModule, ProjectSource, SourceFile, SourceFiles } from "@wso2/bal import { createAnthropic } from "@ai-sdk/anthropic"; import path from "path"; import fs from "fs"; +import { z } from 'zod'; export interface LLMEvaluationResult { is_correct: boolean; @@ -30,6 +31,25 @@ const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); +// Define the schema using Zod +const evaluationSchema = z.object({ + is_correct: z.boolean().describe( + 'Boolean indicating whether the final code correctly and completely implements the user query. ' + + 'True means the implementation is correct, false means it has errors, missing functionality, or does not meet the requirements.' + ), + reasoning: z.string().describe( + 'A clear and concise explanation of your evaluation decision. ' + + 'If the code is correct, briefly explain what was implemented successfully. ' + + 'If incorrect, specifically identify what is wrong, missing, or does not match the requirements. ' + + 'Focus on functional correctness, completeness, and alignment with the user query.' + ), + rating: z.number().min(0).max(10).describe( + 'A numerical rating from 0 to 10 evaluating the overall quality and accuracy of the final code. ' + + '0 = completely incorrect or broken, 5 = partially correct with significant issues, 10 = perfect implementation. ' + + 'Consider correctness, completeness, code quality, and how well it fulfills the user query.' + ) +}); + /** * Uses an LLM to evaluate if the final code correctly implements the user query, * given an initial state. @@ -45,7 +65,6 @@ export async function evaluateCodeWithLLM( finalSource: SourceFiles[] ): Promise { console.log("🤖 Starting LLM-based semantic evaluation..."); - // console.log("🤖 Starting LLM-based semantic evaluation..." + `${JSON.stringify(initialSource)}` + `\n\n ${JSON.stringify(finalSource)} ` + ` ${userQuery}`); const stringifySources = (sources: SourceFiles[]): string => { if (sources.length === 0) return "No files in the project."; @@ -55,45 +74,74 @@ export async function evaluateCodeWithLLM( const initialCodeString = stringifySources(initialSource); const finalCodeString = stringifySources(finalSource); - const systemPrompt = `You are an expert Ballerina developer and an meticulous code reviewer. Your task is to evaluate if the 'Final Code' correctly and completely implements the 'User Query', using the 'Initial Code' as the starting point. + const systemPrompt = `You are an expert Ballerina developer and a meticulous code reviewer specializing in evaluating code changes. -Respond ONLY with a valid JSON object with two fields: -1. "is_correct": A boolean value. 'true' if the final code is a correct implementation of the query, 'false' otherwise. -2. "reasoning": A string explaining your decision. Be concise. If it's incorrect, clearly state what is wrong or missing. -3. "rating": A numer rating the quality and the accuracy based on the user query of the final code on a scale from 0 to 10, where 10 is perfect. +Your role is to: +1. Compare the initial code state with the final code state +2. Determine if the final code correctly implements the user's requested changes +3. Assess completeness, correctness, and quality of the implementation +4. Provide specific, actionable feedback -Do NOT provide any other text, greetings, or explanations outside of the JSON object.`; +Be thorough but concise. Focus on functional correctness and whether the user's requirements are met.`; const userPrompt = ` # User Query +The user requested the following change: \`\`\` ${userQuery} \`\`\` -# Initial Code +# Initial Code (Before Changes) \`\`\`ballerina ${initialCodeString} \`\`\` -# Final Code +# Final Code (After Changes) \`\`\`ballerina ${finalCodeString} \`\`\` -`; + +--- + +Evaluate whether the Final Code correctly implements the User Query. Consider: +- Does it fulfill all requirements in the user query? +- Are there any bugs or logical errors? +- Is any functionality missing or incomplete? +- Does it maintain or improve code quality? + +Use the submit_evaluation tool to provide your assessment.`; try { - const { text } = await generateText({ - // model: await getAnthropicClient(ANTHROPIC_SONNET_4), + const result = await generateText({ model: anthropic('claude-sonnet-4-20250514'), system: systemPrompt, prompt: userPrompt, temperature: 0.1, - maxTokens: 1024, + tools: { + submit_evaluation: { + description: + 'Submit a comprehensive evaluation of whether the final code correctly implements the user query.', + parameters: evaluationSchema, + } + }, + toolChoice: { + type: 'tool', + toolName: 'submit_evaluation' + }, + maxSteps: 1, }); - const result: LLMEvaluationResult = JSON.parse(text); - console.log(`✅ LLM Evaluation Complete. Correct: ${result.is_correct}. Reason: ${result.reasoning}, Rating: ${result.rating}`); - return result; + // Extract the tool call result + const toolCall = result.toolCalls[0]; + + if (!toolCall || toolCall.toolName !== 'submit_evaluation') { + throw new Error("Expected submit_evaluation tool call but received none"); + } + + const evaluationResult = toolCall.args as LLMEvaluationResult; + + console.log(`✅ LLM Evaluation Complete. Correct: ${evaluationResult.is_correct}. Reason: ${evaluationResult.reasoning}, Rating: ${evaluationResult.rating}`); + return evaluationResult; } catch (error) { console.error("Error during LLM evaluation:", error); @@ -105,20 +153,6 @@ ${finalCodeString} } } -export function getProjectFromResponse(req: string): SourceFiles[] { - const sourceFiles: SourceFile[] = []; - const regex = /\s*```ballerina([\s\S]*?)```\s*<\/code>/g; - let match; - - while ((match = regex.exec(req)) !== null) { - const filePath = match[1]; - const fileContent = match[2].trim(); - sourceFiles.push({ filePath, content: fileContent }); - } - - return sourceFiles; -} - export async function getProjectSource(dirPath: string): Promise { const projectRoot = dirPath; @@ -171,3 +205,17 @@ export async function getProjectSource(dirPath: string): Promise\s*```ballerina([\s\S]*?)```\s*<\/code>/g; + let match; + + while ((match = regex.exec(req)) !== null) { + const filePath = match[1]; + const fileContent = match[2].trim(); + sourceFiles.push({ filePath, content: fileContent }); + } + + return sourceFiles; +} From 9bc73d113842a6756deec190240e7a9287f85556 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Fri, 3 Oct 2025 00:15:31 +0530 Subject: [PATCH 108/730] Update system prompt and the text editor toolm impl --- .../src/features/ai/service/code/code.ts | 432 ++++++++++++++---- .../src/rpc-managers/ai-panel/rpc-manager.ts | 8 +- .../result-management/result-conversion.ts | 2 +- .../result-management/result-persistence.ts | 3 +- .../test/ai/evals/code/types/result-types.ts | 1 + 5 files changed, 349 insertions(+), 97 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 0843ad6ce68..b4a6d8cebf2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -45,132 +45,311 @@ import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; -async function handleTextEditorCommands( +interface TextEditorResult { + success: boolean; + message: string; + content?: string; + error?: string; +} + +function handleTextEditorCommands( updatedSourceFiles: SourceFiles[], updatedFileNames: string[], - { command, path: filePath, file_text, insert_line, new_str, old_str, view_range, -}: ExecuteArgs): Promise<{ success: boolean; message: string; content?: string }> { + args: ExecuteArgs +): TextEditorResult { + const { command, path: filePath, file_text, insert_line, new_str, old_str, view_range } = args; + try { - console.log(`[Text Editor Tool] Received command: '${command}' for file: '${filePath}'`); + console.log(`[Text Editor] Command: '${command}', File: '${filePath}'`); + + // Validate file path for all commands + const pathValidation = validateFilePath(filePath); + if (!pathValidation.valid) { + return { + success: false, + message: `Invalid file path: ${pathValidation.error}`, + error: 'Error: INVALID_PATH' + }; + } + switch (command) { case TextEditorCommand.VIEW: { - const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); - const content = sourceFile == undefined ? "" : sourceFile.content; - if (view_range && view_range.length === 2 && content != undefined) { + const content = getFileContent(updatedSourceFiles, filePath); + + // File not found error + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Please create it first or double check the file path.`, + error: 'Error: FILE_NOT_FOUND' + }; + } + + if (view_range && view_range.length === 2) { const [start, end] = view_range; const lines = content.split('\n'); - - const rangedContent = lines.slice(start - 1, end).join('\n'); - return { success: true, message: `Viewing lines ${start}-${end} of file ${filePath}.`, content: rangedContent }; + + // Validate line range + if (start < 1 || end < start || start > lines.length) { + return { + success: false, + message: `Invalid line range [${start}, ${end}]. File has ${lines.length} lines. Please double check the range.`, + error: 'Error: INVALID_RANGE' + }; + } + + const rangedContent = lines.slice(start - 1, Math.min(end, lines.length)).join('\n'); + return { + success: true, + message: `Viewing lines ${start}-${Math.min(end, lines.length)} of ${filePath}.`, + content: rangedContent + }; } - return { success: true, message: `Viewing entire file ${filePath}.`, content }; + + return { + success: true, + message: `Viewing entire file ${filePath}).`, + content + }; } case TextEditorCommand.CREATE: { if (file_text === undefined) { - throw new Error("The 'file_text' parameter is required for the 'create' command."); + return { + success: false, + message: "The 'file_text' parameter is required for the 'create' command.", + error: 'Error: MISSING_PARAMETER' + }; } - - updatedSourceFiles.push({ filePath, content: file_text }); - updatedFileNames.push(filePath); - return { success: true, message: `Successfully created file ${filePath}.` }; + + // Check if file already exists + const existingFile = getFileContent(updatedSourceFiles, filePath); + if (existingFile !== null) { + return { + success: false, + message: `File '${filePath}' already exists. Use 'str_replace' command to modify it or double check the filepath.`, + error: 'Error: FILE_ALREADY_EXISTS' + }; + } + + updateOrCreateFile(updatedSourceFiles, filePath, file_text); + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); + } + + return { + success: true, + message: `Successfully created file '${filePath}' with ${file_text.split('\n').length} lines.` + }; } case TextEditorCommand.STR_REPLACE: { if (old_str === undefined || new_str === undefined) { - throw new Error("The 'old_str' and 'new_str' parameters are required for the 'str_replace' command."); + return { + success: false, + message: "Both 'old_str' and 'new_str' parameters are required for 'str_replace' command.", + error: 'Error: MISSING_PARAMETER' + }; } - updatedFileNames.push(filePath); - await saveToHistory(updatedSourceFiles, filePath); - const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); - const content = sourceFile == undefined ? "" : sourceFile.content; - const newContent = content.replace(`${old_str}`, new_str); + + const content = getFileContent(updatedSourceFiles, filePath); - if (content === newContent) { - return { success: true, message: `String to replace was not found in ${filePath}. No changes made.` }; + // File not found error + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Cannot perform replacement. double check the file path.`, + error: 'Error: FILE_NOT_FOUND' + }; + } + + // Count occurrences for validation + const occurrenceCount = countOccurrences(content, old_str); + + // No matches for replacement + if (occurrenceCount === 0) { + return { + success: false, + message: `String to replace was not found in '${filePath}'. Please verify the exact text to replace, including whitespace and line breaks.`, + error: 'Error: NO_MATCH_FOUND', + content: content.substring(0, 500) + '...' + }; + } + + // Multiple matches for replacement + if (occurrenceCount > 1) { + return { + success: false, + message: `Found ${occurrenceCount} occurrences of the text in '${filePath}'. The 'str_replace' command requires exactly one unique match. Please make 'old_str' more specific..`, + error: 'Error: MULTIPLE_MATCHES', + content: `Occurrences: ${occurrenceCount}` + }; } + + // Save to history before making changes + saveToHistory(updatedSourceFiles, filePath); - const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); - if (index !== -1) { - updatedSourceFiles[index].content = newContent; - } else { - // If the file doesn't exist(Can't happen), create a new entry - updatedSourceFiles.push({ filePath, content: newContent }); + // Perform replacement (exactly one occurrence) + const newContent = content.replace(`${old_str}`, new_str); + updateOrCreateFile(updatedSourceFiles, filePath, newContent); + + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); } - return { success: true, message: `Successfully replaced all occurrences of '${old_str}' in ${filePath}.` }; + return { + success: true, + message: `Successfully replaced text in '${filePath}'. Changed ${old_str.split('\n').length} line(s).` + }; } case TextEditorCommand.INSERT: { if (insert_line === undefined || new_str === undefined) { - throw new Error("The 'insert_line' and 'new_str' parameters are required for the 'insert' command."); + return { + success: false, + message: "Both 'insert_line' and 'new_str' parameters are required for 'insert' command.", + error: 'Error: MISSING_PARAMETER' + }; } - updatedFileNames.push(filePath); - await saveToHistory(updatedSourceFiles, filePath); - const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); - const content = sourceFile == undefined ? "" : sourceFile.content; + + const content = getFileContent(updatedSourceFiles, filePath); + + // File not found error + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Cannot insert text.`, + error: 'Error: FILE_NOT_FOUND' + }; + } + const lines = content.split('\n'); - - const clampedLine = Math.max(0, Math.min(lines.length, insert_line)); + + // Validate insert line + if (insert_line < 0 || insert_line > lines.length) { + return { + success: false, + message: `Invalid insert line ${insert_line}. File has ${lines.length} lines. Use line 0-${lines.length}.`, + error: 'Error: INVALID_LINE_NUMBER' + }; + } + // Save to history before making changes + saveToHistory(updatedSourceFiles, filePath); + + const clampedLine = Math.max(0, Math.min(lines.length, insert_line)); lines.splice(clampedLine, 0, new_str); const newContent = lines.join('\n'); - // updatedSourceFiles.push({ filePath, content: newContent }); - const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); - if (index !== -1) { - updatedSourceFiles[index].content = newContent; - } else { - // If the file doesn't exist(Can't happen), create a new entry - updatedSourceFiles.push({ filePath, content: newContent }); + + updateOrCreateFile(updatedSourceFiles, filePath, newContent); + + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); } - return { success: true, message: `Successfully inserted text into ${filePath} at line ${insert_line}.` }; + + return { + success: true, + message: `Successfully inserted ${new_str.split('\n').length} line(s) at line ${insert_line} in '${filePath}'.` + }; } case TextEditorCommand.DELETE: { if (old_str === undefined) { - throw new Error("The 'old_str' parameter is required for the 'delete' command."); + return { + success: false, + message: "The 'old_str' parameter is required for 'delete' command.", + error: 'Error: MISSING_PARAMETER' + }; } - updatedFileNames.push(filePath); - await saveToHistory(updatedSourceFiles, filePath); - const sourceFile: SourceFiles = updatedSourceFiles.find(f => f.filePath == filePath); - const content = sourceFile == undefined ? "" : sourceFile.content; - const newContent = content.replaceAll(old_str, ''); + const content = getFileContent(updatedSourceFiles, filePath); + + // File not found error + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Cannot delete text.`, + error: 'Error: FILE_NOT_FOUND' + }; + } + + const occurrenceCount = countOccurrences(content, old_str); - if (content === newContent) { - return { success: true, message: `String to delete was not found in ${filePath}. No changes made.` }; + // No matches found + if (occurrenceCount === 0) { + return { + success: false, + message: `String to delete was not found in '${filePath}'. No changes made. Double check the text to delete, including whitespace and line breaks.`, + error: 'Error: NO_MATCH_FOUND' + }; } - updatedSourceFiles.push({ filePath, content: newContent }); - return { success: true, message: `Successfully deleted all occurrences of '${old_str}' from ${filePath}.` }; + // Save to history before making changes + saveToHistory(updatedSourceFiles, filePath); + + const newContent = content.replaceAll(old_str, ''); + updateOrCreateFile(updatedSourceFiles, filePath, newContent); + + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); + } + + return { + success: true, + message: `Successfully deleted ${occurrenceCount} occurrence(s) of text from '${filePath}'.` + }; } case TextEditorCommand.UNDO_EDIT: { const history = editHistory.get(filePath); + if (!history || history.length === 0) { - throw new Error(`No edit history found for '${filePath}' to undo.`); + return { + success: false, + message: `No edit history found for '${filePath}'. Cannot undo.`, + error: 'NO_HISTORY' + }; } - updatedFileNames.push(filePath); + const lastState = history.pop()!; - // updatedSourceFiles = updatedSourceFiles.filter(f => f.filePath != filePath); - // updatedSourceFiles.push({ filePath, content: lastState ? lastState : "" }); - const index = updatedSourceFiles.findIndex(f => f.filePath == filePath); - if (index !== -1) { - updatedSourceFiles[index].content = lastState ? lastState : ""; - } else { - // If the file doesn't exist(Can't happen), create a new entry - updatedSourceFiles.push({ filePath, content: lastState ? lastState : "" }); + updateOrCreateFile(updatedSourceFiles, filePath, lastState); + + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); } - return { success: true, message: `Successfully undid the last edit on ${filePath}.` }; + + return { + success: true, + message: `Successfully undid last edit on '${filePath}'. ${history.length} undo(s) remaining.` + }; } default: - throw new Error(`The command '${command}' is not a valid command.`); + return { + success: false, + message: `Unknown command '${command}'. Valid commands: view, create, str_replace, insert, delete, undo_edit.`, + error: 'INVALID_COMMAND' + }; } } catch (error) { - const errorMessage = error instanceof Error ? error.message : "An unknown error occurred."; - console.error(`[Text Editor Tool] Failed to execute command '${command}':`, errorMessage); - return { success: false, message: errorMessage }; + // Catch any unexpected errors + const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.'; + console.error(`[Text Editor] Failed to execute '${command}':`, error); + + // Check for permission errors (if you have file system access) + if (errorMessage.includes('EACCES') || errorMessage.includes('EPERM')) { + return { + success: false, + message: `Permission denied: Cannot access '${filePath}'. Check file permissions.`, + error: 'PERMISSION_DENIED' + }; + } + + return { + success: false, + message: `Error executing '${command}': ${errorMessage}`, + error: 'EXECUTION_ERROR' + }; } } @@ -237,8 +416,9 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), str_replace_editor: anthropic.tools.textEditor_20250124({ async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { - handleTextEditorCommands(updatedSourceFiles, updatedFileNames, + const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); + return result; } }) }; @@ -266,7 +446,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler if (toolName == "LibraryProviderTool") { assistantResponse += `\n\nAnalyzing request & selecting libraries...`; } else { - assistantResponse += `\n\nApplying code changes to the project files...`; + // assistantResponse += `\n\nApplying code changes to the project files...`; } break; } @@ -511,15 +691,12 @@ Important reminders: - In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. -Begin your response with the explanation. Once the explanation is finished, you must only use the **text_editor_20250124** tool to apply the necessary code changes. -The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. -Instead of generating complete files in code blocks, you must apply surgical edits to the existing source code using the **text_editor_20250124** tool. For each file that requires changes: -Analyze and Locate: Carefully examine the existing code to pinpoint the exact start_line and end_line for each required modification (e.g., insertion, replacement, or deletion). -Generate Tool Calls: For each distinct edit, generate a precise call to the **text_editor_20250124** tool. -To insert code, set the start_line and end_line to the same line number. -To replace a block of code, specify the correct start_line and end_line for the targeted block. -To delete code, specify the start_line and end_line of the block to be removed and provide an empty string for the code parameter. -To create a new file, provide the new file path and the complete code for that file. +Begin your response with the explanation. The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. +Once the explanation is finished, you must apply surgical edits to the existing source code using the **text_editor_20250124** tool. +The complete source code will be provided in the section of the user prompt. +If the file is already shown in the user prompt, do **not** try to create it again. +When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. + Your goal is to modify only the relevant parts of the code to address the user's query. Do not generate or modify any file types other than .bal. Politely decline if the query requests such cases. @@ -619,8 +796,9 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), str_replace_editor: anthropic.tools.textEditor_20250124({ async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { - handleTextEditorCommands(updatedSourceFiles, updatedFileNames, + const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); + return result; } }) }; @@ -722,17 +900,85 @@ interface ExecuteArgs { view_range?: number[]; } -const editHistory: Map = new Map(); +const editHistory = new Map(); +const MAX_HISTORY_SIZE = 50; -async function saveToHistory(sourceFiles: SourceFiles[], filePath: string): Promise { - try { - const sourceFile: SourceFiles = sourceFiles.find(f => f.filePath == filePath); - const content = sourceFile == undefined ? "" : sourceFile.content; - if (!editHistory.has(filePath)) { - editHistory.set(filePath, []); +function saveToHistory( + updatedSourceFiles: SourceFiles[], + filePath: string +): void { + const sourceFile = updatedSourceFiles.find(f => f.filePath === filePath); + if (!sourceFile) { return; } + + if (!editHistory.has(filePath)) { + editHistory.set(filePath, []); + } + + const history = editHistory.get(filePath)!; + history.push(sourceFile.content); + + if (history.length > MAX_HISTORY_SIZE) { + history.shift(); + } +} + +function validateFilePath(filePath: string): { valid: boolean; error?: string } { + if (!filePath || typeof filePath !== 'string') { + return { valid: false, error: 'File path is required and must be a string.' }; + } + + if (filePath.includes('..') || filePath.includes('~')) { + return { valid: false, error: 'File path contains invalid characters (.., ~).' }; + } + + const validExtensions = ['.bal', '.toml', '.md']; + const hasValidExtension = validExtensions.some(ext => filePath.endsWith(ext)); + + if (!hasValidExtension) { + return { valid: false, error: `File must have a valid extension: ${validExtensions.join(', ')}` }; + } + + return { valid: true }; +} + +function findFileIndex(files: SourceFiles[], filePath: string): number { + return files.findIndex(f => f.filePath === filePath); +} + +function getFileContent(files: SourceFiles[], filePath: string): string { + const file = files.find(f => f.filePath === filePath); + return file?.content ?? null; +} + +function countOccurrences(text: string, searchString: string): number { + if (searchString.trim().length == 0 && text.trim().length == 0) { + return 1; // Edge case: empty string occurs once in an empty string + } + + if (!searchString) { return 0; } + let count = 0; + let position = 0; + + while ((position = text.indexOf(`${searchString}`, position)) !== -1) { + count++; + if (count > 1) { + break; } - editHistory.get(filePath)?.push(content); - } catch (error) { - console.error(`[History] Failed to save state for ${filePath}:`, error); + position += searchString.length; + } + + return count; +} + +function updateOrCreateFile( + files: SourceFiles[], + filePath: string, + content: string +): void { + const index = findFileIndex(files, filePath); + if (index !== -1) { + files[index].content = content; + } else { + files.push({ filePath, content }); } } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts index 72b14d15476..f74490e5f92 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts @@ -1044,8 +1044,12 @@ export class AiPanelRpcManager implements AIPanelAPI { function getModifiedAssistantResponse(originalAssistantResponse: string, tempDir: string, project: ProjectSource): string { const newSourceFiles = []; for (const sourceFile of project.sourceFiles) { - const newContent = path.join(tempDir, sourceFile.filePath); - newSourceFiles.push({ filePath: sourceFile.filePath, content: fs.readFileSync(newContent, 'utf-8') }); + const newContentPath = path.join(tempDir, sourceFile.filePath); + if (!fs.existsSync(newContentPath) && !(sourceFile.filePath.endsWith('.bal'))) { + newSourceFiles.push({ filePath: sourceFile.filePath, content: sourceFile.content }); + continue; + } + newSourceFiles.push({ filePath: sourceFile.filePath, content: fs.readFileSync(newContentPath, 'utf-8') }); } // Build a map from filenames to their new content diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index 23972465c1e..4edcd04ac23 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -87,6 +87,6 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[]): totalDuration, averageDuration: Math.round(averageDuration), timestamp: Date.now(), - evaluationSummary + evaluationSummary: (evaluationSummary / totalUsecases) }; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts index c5acd8263e6..d5d84c12dea 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -76,7 +76,8 @@ export async function persistSummary(summary: Summary, resultsDir: string): Prom totalUsecases: summary.totalUsecases, totalCompiled: summary.totalCompiled, totalFailed: summary.totalFailed, - accuracy: summary.accuracy + accuracy: summary.accuracy, + evaluationSummary: summary.evaluationSummary }; await fs.promises.writeFile( diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index c59c4da17d8..5009387510d 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -75,6 +75,7 @@ export interface SummaryCompact { readonly totalCompiled: number; readonly totalFailed: number; readonly accuracy: number; + readonly evaluationSummary: number } /** From 4ba8a558f27c55441c2168f9edd7f41057759f1d Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Fri, 3 Oct 2025 10:39:06 +0530 Subject: [PATCH 109/730] Update the response of text editor tools --- .../src/features/ai/service/code/code.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index b4a6d8cebf2..f34202e715f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -86,8 +86,11 @@ function handleTextEditorCommands( } if (view_range && view_range.length === 2) { - const [start, end] = view_range; + let [start, end] = view_range; const lines = content.split('\n'); + if (end == -1) { + end = lines.length; + } // Validate line range if (start < 1 || end < start || start > lines.length) { @@ -418,7 +421,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); - return result; + return result.message; } }) }; @@ -798,7 +801,7 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); - return result; + return result.message; } }) }; From bda1bc4d93d8aadd19459abefdeaf63a3282b4a9 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Mon, 6 Oct 2025 14:03:24 +0530 Subject: [PATCH 110/730] Add more tests to evals --- .../src/features/ai/service/code/code.ts | 15 ++++ .../src/rpc-managers/ai-panel/repair-utils.ts | 4 + .../result-management/result-conversion.ts | 2 +- .../test/ai/evals/code/test-cases.ts | 79 ++++++++++++++++++- 4 files changed, 98 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index f34202e715f..8ef45853496 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -128,6 +128,21 @@ function handleTextEditorCommands( // Check if file already exists const existingFile = getFileContent(updatedSourceFiles, filePath); if (existingFile !== null) { + if (existingFile.trim() == "") { + // Overwrite empty file + console.warn(`[Text Editor] Overwriting empty file '${filePath}'.`); + updateOrCreateFile(updatedSourceFiles, filePath, file_text); + + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); + } + + return { + success: true, + message: `Successfully created file '${filePath}'.).` + }; + } + return { success: false, message: `File '${filePath}' already exists. Use 'str_replace' command to modify it or double check the filepath.`, diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts index 4dd24747114..4b3c29ad7d8 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts @@ -213,6 +213,10 @@ export async function removeUnusedImports(diagnosticsResult: Diagnostics[], lang // Update file content const { source } = syntaxTree as SyntaxTree; + if (!source) { + // Handle the case where source is undefined, when compiler issue occurs + return false; + } const absolutePath = fileURLToPath(fielUri); writeBallerinaFileDidOpenTemp(absolutePath, source); projectModified = true; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index 4edcd04ac23..c6fc120f0f5 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -76,7 +76,7 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[]): const durations = results.filter(r => r.duration).map(r => r.duration!); const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; - const evaluationSummary = results.reduce((sum, r) => sum + (r.evaluationResult.rating || 0), 0); + const evaluationSummary = results.reduce((sum, r) => sum + (r.evaluationResult == undefined ? 0 : (r.evaluationResult.rating == undefined ? 0 : r.evaluationResult.rating)), 0); return { results: results, diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index e27788f5ca3..fea609f78d7 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -export const testCases = [ +export const initialTestCases = [ { prompt: "write an integration to get emails of the Users from a mysql table and send an email using gmail connector saying that you for buying the product", projectPath: "fresh_bi_package" @@ -94,5 +94,82 @@ export const testCases = [ { prompt: "Generate a CSV report from Google Sheets data and send the report to a Slack channel.", projectPath: "fresh_bi_package" + }, +]; + +export const textEditSpecializedTestCases = [ + { + // Covers: 1 (Look into files), 3 (Create new file) + // This prompt requires the copilot to understand where to place specific configurations (`connections.bal`, `config.bal`), + // handle data mapping logic (`data_mappings.bal`), and also create a completely new file (`salesforce_listener.bal`) for the service logic. + prompt: "Create an integration that listens for new 'Account' objects in Salesforce. When a new account is created, transform its data and create a 'Business Partner' in an SAP S/4HANA system. The SAP connection details should go into `connections.bal`, Salesforce credentials into `config.bal`, and the data transformation logic into `data_mappings.bal`. The main listener service must be in a new file named `salesforce_listener.bal`.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 2 (Delete/Replace file content) + // This prompt forces the copilot to replace the entire content of specific files (`data_mappings.bal`, `types.bal`) + // by explicitly telling it they are not needed, while correctly populating others (`schedule.bal`, `connections.bal`). + prompt: "I need a program to sync events from my primary Google Calendar to my Outlook Calendar for the upcoming week. This should be a scheduled job defined in `schedule.bal`. Initialize the necessary Google Calendar and Outlook clients in `connections.bal`. For this task, please ensure the `data_mappings.bal` and `types.bal` files are completely empty, as no complex transformations are required.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 4 (Delete a specific part of code) + // This prompt tests the ability to generate a standard workflow but intentionally omit a critical part (database logic). + // The copilot must understand the context and remove what would normally be an essential step in an order processing API. + prompt: "Develop an HTTP API for processing e-commerce orders. The API in `main.bal` should accept a POST request with order data, validate its structure using a definition from `types.bal`, and send a confirmation email via SendGrid using a function in `functions.bal`. However, for this initial version, please implement the full flow but specifically omit the database insertion step.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 3 (Create new file), 4 (Delete a specific part of code) + // This is a multi-faceted prompt that involves creating a new file (`logging.bal`) and also omitting standard code (error handling), + // testing the copilot's ability to follow precise negative constraints. + prompt: "Write a service that polls for new tickets in Zendesk every 5 minutes. For each ticket, create a corresponding issue in a Jira project. Put the Zendesk and Jira client configs in `connections.bal` and the ticket-to-issue mapping in `data_mappings.bal`. Create a new file `logging.bal` for a function that logs the ID of the created Jira issue. Importantly, the main polling logic in `main.bal` should not include any error handling for the Jira API call.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 3 (Create new file) + // This test case involves a different protocol (MQTT) and database type (InfluxDB), testing the breadth of the copilot's knowledge. + // It requires creating a new file for the listener and correctly segregating connection configurations. + prompt: "Develop an application that listens to an MQTT topic for temperature sensor data. This listener logic should be in a new file named `mqtt_listener.bal`. When a message arrives with a temperature reading above 35°C, insert a record into an InfluxDB database. All MQTT and InfluxDB connection details must be managed in the `connections.bal` file.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files) + // A practical healthcare integration use case that heavily relies on placing complex type definitions in the correct file (`types.bal`) + // and separating database logic (`connections.bal`) from the service logic (`main.bal`). + prompt: "Build an HTTP service to receive patient data compliant with the FHIR standard. The service in `main.bal` should expect a POST request. Define the complex FHIR Patient resource structure in `types.bal`. The service must parse the incoming JSON and insert the patient's name and birthdate into a PostgreSQL database, with connection details isolated in `connections.bal`.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 3 (Create new file), 4 (Delete a specific part of code) + // This prompt tests integration with AWS services and requires the copilot to create a new file for the trigger logic. + // It also includes a negative constraint to skip data validation, testing the 'delete a specific part' capability. + prompt: "Create an integration that triggers when a new JSON file containing customer data is uploaded to an AWS S3 bucket. The trigger logic should reside in a new file `s3_service.bal`. Read the customer data from the JSON and add the customer to a Mailchimp audience using a function in `functions.bal`. AWS and Mailchimp credentials must go into `config.bal`. Ensure you skip any validation of the incoming JSON data and process it directly.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 2 (Delete/Replace file content) + // This prompt tests if the copilot can follow an instruction to consolidate all logic into one file, + // which implicitly requires it to ensure other specified files (`functions.bal`, `types.bal`) are empty or cleared. + prompt: "Generate a simple stock price checker. It should be a single HTTP service in `main.bal` that accepts a stock ticker via a query parameter. It must call an external API like Alpha Vantage to get the latest price and return it. Place the API key in `config.bal`. For this simple tool, ensure that `functions.bal` and `types.bal` are left completely empty.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files) + // A real-world financial integration scenario. This prompt requires the copilot to correctly identify where to put different pieces of logic: + // the HTTP listener, type definitions for financial data, and the QuickBooks client configuration. + prompt: "Write an HTTP service that acts as a webhook for Stripe. When a 'charge.succeeded' event is received, extract the charge amount and customer ID. Then, create a new sales receipt in QuickBooks Online. The webhook service should be in `main.bal`, the Stripe event structure in `types.bal`, and the QuickBooks client initialization in `connections.bal`.", + projectPath: "fresh_bi_package" + }, + { + // Covers: 1 (Look into files), 2 (Delete/Replace file content), 3 (Create new file) + // This prompt combines multiple requirements: create a new file, populate specific files with configurations, + // and explicitly clear another file (`main.bal`) because the logic is agent-based, not a service. + prompt: "Set up a daily scheduled task in `schedule.bal` to fetch the top 10 'help wanted' posts from the Hacker News API. For each post, summarize its title and URL and send the summary to a Discord channel via a webhook. Create a new file `utils.bal` containing a function to format the Discord message. The webhook URL should be in `config.bal`. Ensure the `main.bal` file remains empty as this is not an HTTP service.", + projectPath: "fresh_bi_package" } ]; + +export let testCases = []; +testCases.push(...initialTestCases); +testCases.push(...textEditSpecializedTestCases); From 6aa5836e5a370f2e9fd592ea6ff39e18b74ec29a Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 7 Oct 2025 14:14:30 +0530 Subject: [PATCH 111/730] Refactor ResourceForm to support new resource creation and editing --- .../Forms/ResourceForm/NewResource.tsx | 367 ++++++++++++++++++ .../ResourceForm/Parameters/ParamEditor.tsx | 9 +- .../ResourceForm/Parameters/Parameters.tsx | 3 +- .../ResourceForm/Parameters/ParametersNew.tsx | 349 +++++++++++++++++ .../ResourcePath/ResourcePath.tsx | 43 +- .../Forms/ResourceForm/index.tsx | 52 ++- .../src/views/BI/ServiceDesigner/index.tsx | 23 +- 7 files changed, 799 insertions(+), 47 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParametersNew.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx new file mode 100644 index 00000000000..40582fbf576 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx @@ -0,0 +1,367 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useState } from 'react'; +import { ActionButtons, Divider, SidePanelBody, Typography, ProgressIndicator, ThemeColors, Button, Icon } from '@wso2/ui-toolkit'; +import { ResourcePath } from './ResourcePath/ResourcePath'; +import { ResourceResponse } from './ResourceResponse/ResourceResponse'; +import styled from '@emotion/styled'; +import { HTTP_METHOD } from '../../utils'; +import { FunctionModel, LogIcon, ParameterModel, PropertyModel, ReturnTypeModel } from '@wso2/ballerina-core'; +import { verbs } from './ResourcePath/ResourcePath'; +import { PanelContainer } from '@wso2/ballerina-side-panel'; +import { ParametersNew } from './Parameters/ParametersNew'; + +const AdvancedParamTitleWrapper = styled.div` + display: flex; + flex-direction: row; +`; + +namespace S { + export const Container = styled.div<{}>` + width: 100%; + `; + + export const HeaderContainer = styled.div<{}>` + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + padding: 16px; + `; + + export const PanelBody = styled(SidePanelBody)` + height: calc(100vh - 100px); + padding-top: 0; + `; + + export const CategoryRow = styled.div<{ showBorder?: boolean }>` + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + margin-top: 0; + margin-bottom: 0; + padding-bottom: 0; + border-bottom: none; + `; + + export const Row = styled.div<{}>` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + gap: 8px; + margin-top: 4px; + margin-bottom: 4px; + width: 100%; + `; + + export const LeftAlignRow = styled(Row)` + justify-content: flex-start; + `; + + export const Grid = styled.div<{ columns: number }>` + display: grid; + grid-template-columns: repeat(${({ columns }: { columns: number }) => columns}, minmax(0, 1fr)); + gap: 8px; + width: 100%; + margin-top: 8px; + margin-bottom: 12px; + `; + + export const Title = styled.div<{}>` + font-size: 14px; + font-family: GilmerBold; + white-space: nowrap; + &:first { + margin-top: 0; + } + `; + + export const SubTitle = styled.div<{}>` + font-size: 12px; + opacity: 0.9; + `; + + export const BodyText = styled.div<{}>` + font-size: 11px; + opacity: 0.5; + `; + + export const Component = styled.div<{ enabled?: boolean }>` + display: flex; + flex-direction: row; + align-items: center; + gap: 5px; + padding: 5px; + border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + border-radius: 5px; + height: 36px; + cursor: ${({ enabled }: { enabled?: boolean }) => (enabled ? "pointer" : "not-allowed")}; + font-size: 14px; + min-width: 160px; + max-width: 100%; + ${({ enabled }: { enabled?: boolean }) => !enabled && "opacity: 0.5;"} + &:hover { + ${({ enabled }: { enabled?: boolean }) => + enabled && + ` + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + border: 1px solid ${ThemeColors.HIGHLIGHT}; + `} + } + `; + + export const ComponentTitle = styled.div` + white-space: nowrap; + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + display: block; + word-break: break-word; + `; + + export const IconContainer = styled.div` + padding: 0 4px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + & svg { + height: 16px; + width: 16px; + } + `; + + export const HorizontalLine = styled.hr` + width: 100%; + border: 0; + border-top: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + `; + + export const BackButton = styled(Button)` + /* position: absolute; + right: 10px; */ + border-radius: 5px; + `; + + export const CloseButton = styled(Button)` + position: absolute; + right: 10px; + border-radius: 5px; + `; + + export const HighlightedButton = styled.div` + margin-top: 10px; + margin-bottom: 12px; + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 8px; + padding: 6px 2px; + color: ${ThemeColors.PRIMARY}; + border: 1px dashed ${ThemeColors.PRIMARY}; + border-radius: 5px; + cursor: pointer; + &:hover { + border: 1px solid ${ThemeColors.PRIMARY}; + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + } + `; + + export const AiContainer = styled.div` + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 10px; + width: 100%; + margin-top: 20px; + `; + + export const AdvancedSubcategoryContainer = styled.div` + display: flex; + flex-direction: column; + width: 100%; + margin-top: 8px; + `; + + export const AdvancedSubcategoryHeader = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 4px 12px; + border-radius: 5px; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid transparent; + + &:hover { + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + } + + &:hover > div:first-of-type { + opacity: 1; + color: ${ThemeColors.PRIMARY}; + } + `; + + export const AdvancedSubTitle = styled.div` + font-size: 12px; + opacity: 0.7; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + transition: all 0.2s ease; + `; + + + export const CategorySeparator = styled.div` + width: 100%; + height: 1px; + background-color: ${ThemeColors.OUTLINE_VARIANT}; + margin: 16px 0; + `; +} + +export interface NewResourceProps { + model: FunctionModel; + isSaving: boolean; + onSave: (functionModel: FunctionModel) => void; + onClose: () => void; +} + +export function NewResource(props: NewResourceProps) { + const { model, isSaving, onSave, onClose } = props; + + const [functionModel, setFunctionModel] = useState(model); + const [isPathValid, setIsPathValid] = useState(false); + + const [method, setMethod] = useState(""); + + + const closeMethod = () => { + setMethod(""); + } + + const setResourceMethod = (method: string) => { + setMethod(method); + const updatedFunctionModel = { + ...functionModel, + accessor: { ...functionModel.accessor, value: method } + }; + setFunctionModel(updatedFunctionModel); + } + + useEffect(() => { + console.log("New Resource Model", model); + }, []); + + const onPathChange = (method: PropertyModel, path: PropertyModel) => { + const updatedFunctionModel = { + ...functionModel, + accessor: method, + name: path, + }; + setFunctionModel(updatedFunctionModel); + console.log("Path,Method Change: ", updatedFunctionModel); + } + + const onResourcePathError = (hasErros: boolean) => { + setIsPathValid(!hasErros); + } + + const handleParamChange = (params: ParameterModel[]) => { + const updatedFunctionModel = { + ...functionModel, + parameters: params + }; + setFunctionModel(updatedFunctionModel); + console.log("Parameter Change: ", updatedFunctionModel); + }; + + const handleResponseChange = (response: ReturnTypeModel) => { + response.value = ""; + const updatedFunctionModel = { + ...functionModel, + returnType: response + }; + setFunctionModel(updatedFunctionModel); + console.log("Response Change: ", updatedFunctionModel); + }; + + const handleSave = () => { + console.log("Saved Resource", functionModel); + onSave(functionModel); + } + + return ( + <> + {isSaving && } + + {/* Render HTTP Methods as components using S.Component and S.Grid */} +
+
HTTP Methods
+ + {verbs.map((method: PropertyModel, idx: number) => ( + setResourceMethod(method.value)} + > + {} + + {method.value} + + + ))} + +
+
+ {/* This is for adding a http resource */} + + <> + {isSaving && } + + + + + Responses + + + + + + + ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx index 234999c07c1..bf900175134 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx @@ -37,10 +37,11 @@ export interface ParamProps { onChange: (param: ParameterModel) => void; onSave?: (param: ParameterModel) => void; onCancel?: (param?: ParameterModel) => void; + isNewResource?: boolean; } export function ParamEditor(props: ParamProps) { - const { param, hideType = false, onChange, onSave, onCancel } = props; + const { param, hideType = false, onChange, onSave, onCancel, isNewResource } = props; const { rpcClient } = useRpcContext(); const [currentFields, setCurrentFields] = useState([]); @@ -143,10 +144,10 @@ export function ParamEditor(props: ParamProps) { enabled: !!dataValues['defaultValue'] } }; - + // Update the parent component's state first onChange(updatedParam); - + // Then call onSave if provided if (onSave) { onSave(updatedParam); @@ -172,7 +173,7 @@ export function ParamEditor(props: ParamProps) { {param.httpParamType && {param.httpParamType === "PAYLOAD" ? "Payload" : "Parameter"} Configuration} {!param.httpParamType && {param.metadata.label} Configuration} - {param.httpParamType !== "PAYLOAD" && + {param.httpParamType !== "PAYLOAD" && !isNewResource && {param.httpParamType && ( void, + schemas: ConfigProperties; + readonly?: boolean; + showPayload: boolean; + isNewResource?: boolean; +} + +const AddButtonWrapper = styled.div` + margin: 8px 0; +`; + +const AdvancedParamTitleWrapper = styled.div` + display: flex; + flex-direction: row; +`; + +const OptionalConfigRow = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + margin-bottom: 8px; +`; + +const OptionalConfigButtonContainer = styled.div` + display: flex; + flex-direction: row; + flex-grow: 1; + justify-content: flex-end; +`; + +const OptionalConfigContent = styled.div` + margin-top: 16px; + padding-left: 24px; +`; + +export function ParametersNew(props: ParametersNewProps) { + const { parameters, readonly, onChange, schemas, showPayload, isNewResource } = props; + + const queryModel = schemas["query"] as ParameterModel; + const headerModel = schemas["header"] as ParameterModel; + const payloadModel = schemas["payload"] as ParameterModel; + + const normalParameters = parameters.filter(param => param.httpParamType && param.httpParamType !== "PAYLOAD"); + const payloadParameters = parameters.filter(param => param.httpParamType && param.httpParamType === "PAYLOAD"); + const advancedDisabledParameters = parameters.filter(param => !param.httpParamType && !param.enabled); + const advancedEnabledParameters = parameters.filter(param => !param.httpParamType && param.enabled); + const advancedAllParameters = parameters.filter(param => !param.httpParamType).sort((a, b) => b.metadata.label.localeCompare(a.metadata.label)); + + const [showOptionalConfigurations, setShowOptionalConfigurations] = useState(advancedEnabledParameters.length > 0); + + const handleShowOptionalConfigurations = () => { + setShowOptionalConfigurations(true); + }; + + const handleHideOptionalConfigurations = () => { + setShowOptionalConfigurations(false); + }; + + + const [editModel, setEditModel] = useState(undefined); + const [isNew, setIsNew] = useState(false); + const [editingIndex, setEditingIndex] = useState(-1); + + const [showAdvanced, setShowAdvanced] = useState(advancedEnabledParameters.length > 0); + + + const handleAdvanceParamToggle = () => { + setShowAdvanced(!showAdvanced); + }; + + const onEdit = (parameter: ParameterModel) => { + setIsNew(false); + setEditModel(parameter); + // Find and store the index of the parameter being edited + const index = parameters.findIndex(p => + p.metadata?.label === parameter.metadata?.label && + p.name?.value === parameter.name?.value && + p.httpParamType === parameter.httpParamType + ); + setEditingIndex(index); + }; + + const onAddParamClick = () => { + queryModel.name.value = ""; + queryModel.type.value = ""; + setIsNew(true); + setEditModel(queryModel); + setEditingIndex(-1); + }; + + const onAddPayloadClick = () => { + payloadModel.name.value = "payload"; + payloadModel.type.value = ""; + setIsNew(true); + setEditModel(payloadModel); + setEditingIndex(-1); + }; + + const onDelete = (param: ParameterModel) => { + const updatedParameters = parameters.filter(p => p.metadata.label !== param.metadata.label || p.name.value !== param.name.value); + onChange(updatedParameters); + setEditModel(undefined); + setEditingIndex(-1); + }; + + const onAdvanceDelete = (param: ParameterModel) => { + parameters.forEach(p => { + if (p.metadata.label === param.metadata.label) { + param.enabled = false; + } + }) + onChange([...parameters]); + setEditModel(undefined); + setEditingIndex(-1); + }; + + const onAdvanceSaveParam = (param: ParameterModel) => { + param.enabled = true; + onChange(parameters.map(p => p.metadata.label === param.metadata.label ? param : p)); + setEditModel(undefined); + setEditingIndex(-1); + }; + + const onAdvancedChecked = (param: ParameterModel, checked: boolean) => { + param.enabled = checked; + param.name.value = param.metadata.label.toLowerCase().replace(/ /g, "_"); + onChange(parameters.map(p => p.metadata.label === param.metadata.label ? param : p)); + setEditModel(undefined); + setEditingIndex(-1); + }; + + const onChangeParam = (param: ParameterModel) => { + setEditModel(param); + // Update the parameters array in real-time for existing parameters + if (!isNew && editingIndex >= 0) { + const updatedParameters = [...parameters]; + updatedParameters[editingIndex] = param; + onChange(updatedParameters); + } + }; + + const onSaveParam = (param: ParameterModel) => { + param.enabled = true; + if (isNew) { + onChange([...parameters, param]); + setIsNew(false); + } else { + // Use the editingIndex for more reliable updates + if (editingIndex >= 0) { + const updatedParameters = [...parameters]; + updatedParameters[editingIndex] = param; + onChange(updatedParameters); + } else { + // Fallback to the original logic if index is not available + onChange(parameters.map(p => p.metadata.label === param.metadata.label && p.name.value === param.name.value ? param : p)); + } + } + setEditModel(undefined); + setEditingIndex(-1); + }; + + const onParamEditCancel = () => { + setEditModel(undefined); + setEditingIndex(-1); + }; + + return ( +
+ {/* <---------------- Normal Parameters Start Query|Header ----------------> */} + Query Parameters + {normalParameters.map((param: ParameterModel, index) => ( + + ))} + {editModel && (editModel.httpParamType === "QUERY" || editModel.httpParamType === "Header") && + + } + + + + + <>Query Parameter + + + + {/* <---------------- Normal Parameters End Query|Header ----------------> */} + + {/* <-------------------- Payload Parameters Start --------------------> */} + {showPayload && ( + <> + Payload + {payloadParameters.map((param: ParameterModel, index) => ( + + ))} + + )} + + {editModel && editModel.httpParamType === "PAYLOAD" && + + } + + {showPayload && payloadParameters.length === 0 && + + + + <>Add Payload + + + } + {/* <-------------------- Payload Parameters End --------------------> */} + + {/* <-------------------- Advanced Parameters Start --------------------> */} + + {/* TODO: REMOVE THE OLD ADVANCED PARAMETERS */} + {/* + Advanced Parameters + {showAdvanced ? "Hide" : "Show"} + + {showAdvanced && + advancedDisabledParameters.map((param: ParameterModel, index) => ( + + onEdit(param)}> + + <>{param.metadata.label} + + + )) + } + {showAdvanced && + advancedEnabledParameters.map((param: ParameterModel, index) => ( + + )) + } + {editModel && !editModel.httpParamType && + + } + */} + {/* <-------------------- Advanced Parameters End --------------------> */} + + {/* <-------------------- Advanced Parameters Checkbox Start --------------------> */} + {/* <> + + Advanced Parameters + + {!showOptionalConfigurations && ( + + + Expand + + )} + {showOptionalConfigurations && ( + + + Collapse + + )} + + + {showOptionalConfigurations && ( + + + { + advancedAllParameters.map((param: ParameterModel, index) => ( + onAdvancedChecked(param, checked)} + /> + )) + } + + + )} + + */} + {/* <-------------------- Advanced Parameters Checkbox End --------------------> */} + +
+ ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx index 5f871d249dd..dbccab6f7ca 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx @@ -23,7 +23,7 @@ import { PropertyModel } from '@wso2/ballerina-core'; import { SegmentParam } from '@wso2/ballerina-side-panel'; import { parseResourcePath } from '../Utils/ResourcePathParser'; -const verbs = [ +export const verbs = [ { content: 'GET', id: 'GET', @@ -72,10 +72,11 @@ export interface ResourcePathProps { method: PropertyModel; onChange: (method: PropertyModel, path: PropertyModel) => void; onError: (hasErros: boolean) => void; + isNew?: boolean; } export function ResourcePath(props: ResourcePathProps) { - const { method, path, onChange, onError } = props; + const { method, path, onChange, onError, isNew } = props; const [inputValue, setInputValue] = useState(''); const [resourcePathErrors, setResourcePathErrors] = useState(""); @@ -131,25 +132,27 @@ export function ResourcePath(props: ResourcePathProps) { return ( <> -
- -
+ {!isNew && ( +
+ +
+ )} void; onClose: () => void; + isNew?: boolean; } export function ResourceForm(props: ResourceFormProps) { - const { model, isSaving, onSave, onClose } = props; + const { model, isSaving, onSave, onClose, isNew } = props; const [functionModel, setFunctionModel] = useState(model); const [isPathValid, setIsPathValid] = useState(false); @@ -86,22 +88,34 @@ export function ResourceForm(props: ResourceFormProps) { onSave(functionModel); } - return ( - <> - {isSaving && } - - - - - Responses - - - - - ); + const editForm = () => { + return ( + <> + {isSaving && } + + + + + Responses + + + + + ) + } + + const newForm = () => { + return ( + <> + + + ) + } + + return isNew ? newForm() : editForm(); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 7457bc183ac..77ac1daa5b1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -455,7 +455,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { }; const handleNewFunctionClose = () => { - setIsNew(false); setShowForm(false); }; @@ -851,8 +850,26 @@ export function ServiceDesigner(props: ServiceDesignerProps) { ))} - {/* This is for adding or editing a http resource */} - {functionModel && isHttpService && functionModel.kind === "RESOURCE" && ( + {/* This is for adding a http resource */} + {functionModel && isHttpService && functionModel.kind === "RESOURCE" && isNew && ( + + + + )} + + {/* This is for editing a http resource */} + {functionModel && isHttpService && functionModel.kind === "RESOURCE" && !isNew && ( Date: Tue, 7 Oct 2025 12:11:59 +0530 Subject: [PATCH 112/730] Add new tests for existing projects --- .vscode/launch.json | 4 +- .../src/features/ai/service/code/code.ts | 458 +------------- .../ai/service/libs/text_editor_tool.ts | 575 ++++++++++++++++++ .../src/rpc-managers/ai-panel/repair-utils.ts | 5 + .../test/ai/evals/code/code.test.ts | 32 +- .../test/ai/evals/code/test-cases.ts | 100 ++- .../ai/evals/code/utils/batch-processing.ts | 80 ++- .../test/ai/evals/code/utils/constants.ts | 2 +- .../ai/evals/code/utils/test-execution.ts | 3 + .../ballerina-extension/test/data/bi_empty | 1 - .../test/data/bi_empty_project/Ballerina.toml | 4 + .../test/data/bi_init/Ballerina.toml | 4 + .../test/data/bi_init/agents.bal | 0 .../test/data/bi_init/automation.bal | 0 .../test/data/bi_init/config.bal | 0 .../test/data/bi_init/connections.bal | 0 .../test/data/bi_init/functions.bal | 0 .../test/data/bi_init/main.bal | 0 .../test/data/bi_init/service.bal | 0 19 files changed, 753 insertions(+), 515 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts delete mode 160000 workspaces/ballerina/ballerina-extension/test/data/bi_empty create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_empty_project/Ballerina.toml create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/Ballerina.toml create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/agents.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/automation.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/config.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/connections.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/functions.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/main.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/bi_init/service.bal diff --git a/.vscode/launch.json b/.vscode/launch.json index 0e45b297521..6e859a2559e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -242,7 +242,9 @@ "args": [ "--extensionDevelopmentPath=${workspaceFolder}/workspaces/ballerina/ballerina-extension", "--extensionTestsPath=${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test", - "${workspaceFolder}/workspaces/ballerina/ballerina-extension/test/data/bi_empty" + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/test/data/bi_empty_project", + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/test/data/bi_init", + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system" ], "env": { "LS_EXTENSIONS_PATH": "", diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 8ef45853496..2dcee7b0009 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { ModelMessage, generateText, streamText, stepCountIs } from "ai"; +import { ModelMessage, generateText, streamText, stepCountIs, AssistantModelMessage } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4, getProviderCacheControl, ProviderCacheOptions } from "../connection"; import { GenerationType, getAllLibraries } from "../libs/libs"; import { getLibraryProviderTool } from "../libs/libraryProviderTool"; @@ -44,332 +44,7 @@ import { getProjectFromResponse, getProjectSource, postProcess } from "../../../ import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; - -interface TextEditorResult { - success: boolean; - message: string; - content?: string; - error?: string; -} - -function handleTextEditorCommands( - updatedSourceFiles: SourceFiles[], - updatedFileNames: string[], - args: ExecuteArgs -): TextEditorResult { - const { command, path: filePath, file_text, insert_line, new_str, old_str, view_range } = args; - - try { - console.log(`[Text Editor] Command: '${command}', File: '${filePath}'`); - - // Validate file path for all commands - const pathValidation = validateFilePath(filePath); - if (!pathValidation.valid) { - return { - success: false, - message: `Invalid file path: ${pathValidation.error}`, - error: 'Error: INVALID_PATH' - }; - } - - switch (command) { - case TextEditorCommand.VIEW: { - const content = getFileContent(updatedSourceFiles, filePath); - - // File not found error - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Please create it first or double check the file path.`, - error: 'Error: FILE_NOT_FOUND' - }; - } - - if (view_range && view_range.length === 2) { - let [start, end] = view_range; - const lines = content.split('\n'); - if (end == -1) { - end = lines.length; - } - - // Validate line range - if (start < 1 || end < start || start > lines.length) { - return { - success: false, - message: `Invalid line range [${start}, ${end}]. File has ${lines.length} lines. Please double check the range.`, - error: 'Error: INVALID_RANGE' - }; - } - - const rangedContent = lines.slice(start - 1, Math.min(end, lines.length)).join('\n'); - return { - success: true, - message: `Viewing lines ${start}-${Math.min(end, lines.length)} of ${filePath}.`, - content: rangedContent - }; - } - - return { - success: true, - message: `Viewing entire file ${filePath}).`, - content - }; - } - - case TextEditorCommand.CREATE: { - if (file_text === undefined) { - return { - success: false, - message: "The 'file_text' parameter is required for the 'create' command.", - error: 'Error: MISSING_PARAMETER' - }; - } - - // Check if file already exists - const existingFile = getFileContent(updatedSourceFiles, filePath); - if (existingFile !== null) { - if (existingFile.trim() == "") { - // Overwrite empty file - console.warn(`[Text Editor] Overwriting empty file '${filePath}'.`); - updateOrCreateFile(updatedSourceFiles, filePath, file_text); - - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } - - return { - success: true, - message: `Successfully created file '${filePath}'.).` - }; - } - - return { - success: false, - message: `File '${filePath}' already exists. Use 'str_replace' command to modify it or double check the filepath.`, - error: 'Error: FILE_ALREADY_EXISTS' - }; - } - - updateOrCreateFile(updatedSourceFiles, filePath, file_text); - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } - - return { - success: true, - message: `Successfully created file '${filePath}' with ${file_text.split('\n').length} lines.` - }; - } - - case TextEditorCommand.STR_REPLACE: { - if (old_str === undefined || new_str === undefined) { - return { - success: false, - message: "Both 'old_str' and 'new_str' parameters are required for 'str_replace' command.", - error: 'Error: MISSING_PARAMETER' - }; - } - - const content = getFileContent(updatedSourceFiles, filePath); - - // File not found error - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Cannot perform replacement. double check the file path.`, - error: 'Error: FILE_NOT_FOUND' - }; - } - - // Count occurrences for validation - const occurrenceCount = countOccurrences(content, old_str); - - // No matches for replacement - if (occurrenceCount === 0) { - return { - success: false, - message: `String to replace was not found in '${filePath}'. Please verify the exact text to replace, including whitespace and line breaks.`, - error: 'Error: NO_MATCH_FOUND', - content: content.substring(0, 500) + '...' - }; - } - - // Multiple matches for replacement - if (occurrenceCount > 1) { - return { - success: false, - message: `Found ${occurrenceCount} occurrences of the text in '${filePath}'. The 'str_replace' command requires exactly one unique match. Please make 'old_str' more specific..`, - error: 'Error: MULTIPLE_MATCHES', - content: `Occurrences: ${occurrenceCount}` - }; - } - - // Save to history before making changes - saveToHistory(updatedSourceFiles, filePath); - - // Perform replacement (exactly one occurrence) - const newContent = content.replace(`${old_str}`, new_str); - updateOrCreateFile(updatedSourceFiles, filePath, newContent); - - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } - - return { - success: true, - message: `Successfully replaced text in '${filePath}'. Changed ${old_str.split('\n').length} line(s).` - }; - } - - case TextEditorCommand.INSERT: { - if (insert_line === undefined || new_str === undefined) { - return { - success: false, - message: "Both 'insert_line' and 'new_str' parameters are required for 'insert' command.", - error: 'Error: MISSING_PARAMETER' - }; - } - - const content = getFileContent(updatedSourceFiles, filePath); - - // File not found error - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Cannot insert text.`, - error: 'Error: FILE_NOT_FOUND' - }; - } - - const lines = content.split('\n'); - - // Validate insert line - if (insert_line < 0 || insert_line > lines.length) { - return { - success: false, - message: `Invalid insert line ${insert_line}. File has ${lines.length} lines. Use line 0-${lines.length}.`, - error: 'Error: INVALID_LINE_NUMBER' - }; - } - - // Save to history before making changes - saveToHistory(updatedSourceFiles, filePath); - - const clampedLine = Math.max(0, Math.min(lines.length, insert_line)); - lines.splice(clampedLine, 0, new_str); - const newContent = lines.join('\n'); - - updateOrCreateFile(updatedSourceFiles, filePath, newContent); - - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } - - return { - success: true, - message: `Successfully inserted ${new_str.split('\n').length} line(s) at line ${insert_line} in '${filePath}'.` - }; - } - - case TextEditorCommand.DELETE: { - if (old_str === undefined) { - return { - success: false, - message: "The 'old_str' parameter is required for 'delete' command.", - error: 'Error: MISSING_PARAMETER' - }; - } - - const content = getFileContent(updatedSourceFiles, filePath); - - // File not found error - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Cannot delete text.`, - error: 'Error: FILE_NOT_FOUND' - }; - } - - const occurrenceCount = countOccurrences(content, old_str); - - // No matches found - if (occurrenceCount === 0) { - return { - success: false, - message: `String to delete was not found in '${filePath}'. No changes made. Double check the text to delete, including whitespace and line breaks.`, - error: 'Error: NO_MATCH_FOUND' - }; - } - - // Save to history before making changes - saveToHistory(updatedSourceFiles, filePath); - - const newContent = content.replaceAll(old_str, ''); - updateOrCreateFile(updatedSourceFiles, filePath, newContent); - - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } - - return { - success: true, - message: `Successfully deleted ${occurrenceCount} occurrence(s) of text from '${filePath}'.` - }; - } - - case TextEditorCommand.UNDO_EDIT: { - const history = editHistory.get(filePath); - - if (!history || history.length === 0) { - return { - success: false, - message: `No edit history found for '${filePath}'. Cannot undo.`, - error: 'NO_HISTORY' - }; - } - - const lastState = history.pop()!; - updateOrCreateFile(updatedSourceFiles, filePath, lastState); - - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } - - return { - success: true, - message: `Successfully undid last edit on '${filePath}'. ${history.length} undo(s) remaining.` - }; - } - - default: - return { - success: false, - message: `Unknown command '${command}'. Valid commands: view, create, str_replace, insert, delete, undo_edit.`, - error: 'INVALID_COMMAND' - }; - } - } catch (error) { - // Catch any unexpected errors - const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.'; - console.error(`[Text Editor] Failed to execute '${command}':`, error); - - // Check for permission errors (if you have file system access) - if (errorMessage.includes('EACCES') || errorMessage.includes('EPERM')) { - return { - success: false, - message: `Permission denied: Cannot access '${filePath}'. Check file permissions.`, - error: 'PERMISSION_DENIED' - }; - } - - return { - success: false, - message: `Error executing '${command}': ${errorMessage}`, - error: 'EXECUTION_ERROR' - }; - } -} +import { handleTextEditorCommands } from "../libs/text_editor_tool"; function appendFinalMessages( history: ModelMessage[], @@ -793,11 +468,36 @@ export async function repairCodeCore( } export async function repairCode(params: RepairParams, libraryDescriptions: string): Promise { + const messages: ModelMessage[] = [...params.previousMessages]; + const lastMessage = messages[messages.length - 1]; + let isToolCallExistInLastMessage = false; + let lastMessageToolCallInfo = {toolName: "", toolCallId: ""}; + + const lastMessageIsAssistantCall = lastMessage?.role === 'assistant'; + if (lastMessageIsAssistantCall) { + const assistantMessage: AssistantModelMessage = lastMessage as AssistantModelMessage; + if (Array.isArray(assistantMessage.content)) { + const lastToolCall = assistantMessage.content.filter(c => c.type === 'tool-call'); + isToolCallExistInLastMessage = lastToolCall.length > 0; + lastMessageToolCallInfo = lastToolCall[0]; + } + } + const allMessages: ModelMessage[] = [ ...params.previousMessages, - { + !isToolCallExistInLastMessage? { role: "assistant", content: params.assistantResponse, + }: { + role: "tool", + content: [ + { + type: "tool-result", + toolName: lastMessageToolCallInfo?.toolName as string || "PreviousAssistantMessageCall", + result: params.assistantResponse, + toolCallId: lastMessageToolCallInfo?.toolCallId as string || "PreviousAssistantMessageCallId" + } + ] }, { role: "user", @@ -898,105 +598,3 @@ export function replaceCodeBlocks(originalResp: string, newResp: string): string return finalResp; } - -enum TextEditorCommand { - VIEW = 'view', - CREATE = 'create', - STR_REPLACE = 'str_replace', - INSERT = 'insert', - DELETE = 'delete', - UNDO_EDIT = 'undo_edit' -} - -interface ExecuteArgs { - command: string; - path: string; - file_text?: string; - insert_line?: number; - new_str?: string; - old_str?: string; - view_range?: number[]; -} - -const editHistory = new Map(); -const MAX_HISTORY_SIZE = 50; - -function saveToHistory( - updatedSourceFiles: SourceFiles[], - filePath: string -): void { - const sourceFile = updatedSourceFiles.find(f => f.filePath === filePath); - if (!sourceFile) { return; } - - if (!editHistory.has(filePath)) { - editHistory.set(filePath, []); - } - - const history = editHistory.get(filePath)!; - history.push(sourceFile.content); - - if (history.length > MAX_HISTORY_SIZE) { - history.shift(); - } -} - -function validateFilePath(filePath: string): { valid: boolean; error?: string } { - if (!filePath || typeof filePath !== 'string') { - return { valid: false, error: 'File path is required and must be a string.' }; - } - - if (filePath.includes('..') || filePath.includes('~')) { - return { valid: false, error: 'File path contains invalid characters (.., ~).' }; - } - - const validExtensions = ['.bal', '.toml', '.md']; - const hasValidExtension = validExtensions.some(ext => filePath.endsWith(ext)); - - if (!hasValidExtension) { - return { valid: false, error: `File must have a valid extension: ${validExtensions.join(', ')}` }; - } - - return { valid: true }; -} - -function findFileIndex(files: SourceFiles[], filePath: string): number { - return files.findIndex(f => f.filePath === filePath); -} - -function getFileContent(files: SourceFiles[], filePath: string): string { - const file = files.find(f => f.filePath === filePath); - return file?.content ?? null; -} - -function countOccurrences(text: string, searchString: string): number { - if (searchString.trim().length == 0 && text.trim().length == 0) { - return 1; // Edge case: empty string occurs once in an empty string - } - - if (!searchString) { return 0; } - let count = 0; - let position = 0; - - while ((position = text.indexOf(`${searchString}`, position)) !== -1) { - count++; - if (count > 1) { - break; - } - position += searchString.length; - } - - return count; -} - -function updateOrCreateFile( - files: SourceFiles[], - filePath: string, - content: string -): void { - const index = findFileIndex(files, filePath); - if (index !== -1) { - files[index].content = content; - } else { - files.push({ filePath, content }); - } -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts new file mode 100644 index 00000000000..5c3ac7e62fa --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -0,0 +1,575 @@ +import { SourceFiles } from "@wso2/ballerina-core"; + +// ============================================================================ +// Types & Interfaces +// ============================================================================ + +interface TextEditorResult { + success: boolean; + message: string; + content?: string; + error?: string; +} + +enum TextEditorCommand { + VIEW = 'view', + CREATE = 'create', + STR_REPLACE = 'str_replace', + INSERT = 'insert', + DELETE = 'delete', + UNDO_EDIT = 'undo_edit' +} + +interface ExecuteArgs { + command: string; + path: string; + file_text?: string; + insert_line?: number; + new_str?: string; + old_str?: string; + view_range?: number[]; +} + +interface PathValidation { + valid: boolean; + error?: string; +} + +// ============================================================================ +// Constants +// ============================================================================ + +const MAX_HISTORY_SIZE = 50; +const VALID_FILE_EXTENSIONS = ['.bal', '.toml', '.md']; +const PREVIEW_CONTENT_LENGTH = 500; + +// ============================================================================ +// State Management +// ============================================================================ + +const editHistory = new Map(); + +// ============================================================================ +// Error Messages +// ============================================================================ + +const ErrorMessages = { + INVALID_PATH: 'Invalid file path', + FILE_NOT_FOUND: 'File not found', + INVALID_RANGE: 'Invalid line range', + MISSING_PARAMETER: 'Missing required parameter', + FILE_ALREADY_EXISTS: 'File already exists', + NO_MATCH_FOUND: 'String not found', + MULTIPLE_MATCHES: 'Multiple matches found', + INVALID_LINE_NUMBER: 'Invalid line number', + NO_HISTORY: 'No edit history', + INVALID_COMMAND: 'Unknown command', + PERMISSION_DENIED: 'Permission denied', + EXECUTION_ERROR: 'Execution error' +} as const; + +// ============================================================================ +// Validation Functions +// ============================================================================ + +function validateFilePath(filePath: string): PathValidation { + if (!filePath || typeof filePath !== 'string') { + return { + valid: false, + error: 'File path is required and must be a string.' + }; + } + + if (filePath.includes('..') || filePath.includes('~')) { + return { + valid: false, + error: 'File path contains invalid characters (.., ~).' + }; + } + + const hasValidExtension = VALID_FILE_EXTENSIONS.some(ext => + filePath.endsWith(ext) + ); + + if (!hasValidExtension) { + return { + valid: false, + error: `File must have a valid extension: ${VALID_FILE_EXTENSIONS.join(', ')}` + }; + } + + return { valid: true }; +} + +function validateLineRange( + start: number, + end: number, + totalLines: number +): PathValidation { + if (start < 1 || end < start || start > totalLines) { + return { + valid: false, + error: `Invalid line range [${start}, ${end}]. File has ${totalLines} lines. Please double check the range.` + }; + } + return { valid: true }; +} + +// ============================================================================ +// File Operations +// ============================================================================ + +function findFileIndex(files: SourceFiles[], filePath: string): number { + return files.findIndex(f => f.filePath === filePath); +} + +function getFileContent(files: SourceFiles[], filePath: string): string | null { + const file = files.find(f => f.filePath === filePath); + return file?.content ?? null; +} + +function updateOrCreateFile( + files: SourceFiles[], + filePath: string, + content: string +): void { + const index = findFileIndex(files, filePath); + if (index !== -1) { + files[index].content = content; + } else { + files.push({ filePath, content }); + } +} + +function addFileToUpdatedList( + updatedFileNames: string[], + filePath: string +): void { + if (!updatedFileNames.includes(filePath)) { + updatedFileNames.push(filePath); + } +} + +// ============================================================================ +// History Management +// ============================================================================ + +function saveToHistory( + updatedSourceFiles: SourceFiles[], + filePath: string +): void { + const sourceFile = updatedSourceFiles.find(f => f.filePath === filePath); + if (!sourceFile) return; + + if (!editHistory.has(filePath)) { + editHistory.set(filePath, []); + } + + const history = editHistory.get(filePath)!; + history.push(sourceFile.content); + + if (history.length > MAX_HISTORY_SIZE) { + history.shift(); + } +} + +// ============================================================================ +// String Utilities +// ============================================================================ + +function countOccurrences(text: string, searchString: string): number { + if (searchString.trim().length === 0 && text.trim().length === 0) { + return 1; + } + + if (!searchString) return 0; + + let count = 0; + let position = 0; + + while ((position = text.indexOf(searchString, position)) !== -1) { + count++; + if (count > 1) break; + position += searchString.length; + } + + return count; +} + +// ============================================================================ +// Command Handlers +// ============================================================================ + +function handleViewCommand( + files: SourceFiles[], + filePath: string, + viewRange?: number[] +): TextEditorResult { + const content = getFileContent(files, filePath); + + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Please create it first or double check the file path.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; + } + + if (viewRange && viewRange.length === 2) { + return handleRangedView(filePath, content, viewRange); + } + + return { + success: true, + message: `Viewing entire file ${filePath}).`, + content + }; +} + +function handleRangedView( + filePath: string, + content: string, + viewRange: number[] +): TextEditorResult { + let [start, end] = viewRange; + const lines = content.split('\n'); + + if (end === -1) { + end = lines.length; + } + + const validation = validateLineRange(start, end, lines.length); + if (!validation.valid) { + return { + success: false, + message: validation.error!, + error: `Error: ${ErrorMessages.INVALID_RANGE}` + }; + } + + const actualEnd = Math.min(end, lines.length); + const rangedContent = lines.slice(start - 1, actualEnd).join('\n'); + + return { + success: true, + message: `Viewing lines ${start}-${actualEnd} of ${filePath}.`, + content: rangedContent + }; +} + +function handleCreateCommand( + files: SourceFiles[], + updatedFileNames: string[], + filePath: string, + fileText?: string +): TextEditorResult { + if (fileText === undefined) { + return { + success: false, + message: "The 'file_text' parameter is required for the 'create' command.", + error: `Error: ${ErrorMessages.MISSING_PARAMETER}` + }; + } + + const existingFile = getFileContent(files, filePath); + + if (existingFile !== null) { + if (existingFile.trim() === "") { + console.warn(`[Text Editor] Overwriting empty file '${filePath}'.`); + updateOrCreateFile(files, filePath, fileText); + addFileToUpdatedList(updatedFileNames, filePath); + + return { + success: true, + message: `Successfully created file '${filePath}'.).` + }; + } + + return { + success: false, + message: `File '${filePath}' already exists. Use 'str_replace' command to modify it or double check the filepath.`, + error: `Error: ${ErrorMessages.FILE_ALREADY_EXISTS}` + }; + } + + updateOrCreateFile(files, filePath, fileText); + addFileToUpdatedList(updatedFileNames, filePath); + + return { + success: true, + message: `Successfully created file '${filePath}' with ${fileText.split('\n').length} lines.` + }; +} + +function handleStrReplaceCommand( + files: SourceFiles[], + updatedFileNames: string[], + filePath: string, + oldStr?: string, + newStr?: string +): TextEditorResult { + if (oldStr === undefined || newStr === undefined) { + return { + success: false, + message: "Both 'old_str' and 'new_str' parameters are required for 'str_replace' command.", + error: `Error: ${ErrorMessages.MISSING_PARAMETER}` + }; + } + + const content = getFileContent(files, filePath); + + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Cannot perform replacement. double check the file path.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; + } + + const occurrenceCount = countOccurrences(content, oldStr); + + if (occurrenceCount === 0) { + return { + success: false, + message: `String to replace was not found in '${filePath}'. Please verify the exact text to replace, including whitespace and line breaks.`, + error: `Error: ${ErrorMessages.NO_MATCH_FOUND}`, + content: content.substring(0, PREVIEW_CONTENT_LENGTH) + '...' + }; + } + + if (occurrenceCount > 1) { + return { + success: false, + message: `Found ${occurrenceCount} occurrences of the text in '${filePath}'. The 'str_replace' command requires exactly one unique match. Please make 'old_str' more specific..`, + error: `Error: ${ErrorMessages.MULTIPLE_MATCHES}`, + content: `Occurrences: ${occurrenceCount}` + }; + } + + saveToHistory(files, filePath); + + const newContent = content.replace(oldStr, newStr); + updateOrCreateFile(files, filePath, newContent); + addFileToUpdatedList(updatedFileNames, filePath); + + return { + success: true, + message: `Successfully replaced text in '${filePath}'. Changed ${oldStr.split('\n').length} line(s).` + }; +} + +function handleInsertCommand( + files: SourceFiles[], + updatedFileNames: string[], + filePath: string, + insertLine?: number, + newStr?: string +): TextEditorResult { + if (insertLine === undefined || newStr === undefined) { + return { + success: false, + message: "Both 'insert_line' and 'new_str' parameters are required for 'insert' command.", + error: `Error: ${ErrorMessages.MISSING_PARAMETER}` + }; + } + + const content = getFileContent(files, filePath); + + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Cannot insert text.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; + } + + const lines = content.split('\n'); + + if (insertLine < 0 || insertLine > lines.length) { + return { + success: false, + message: `Invalid insert line ${insertLine}. File has ${lines.length} lines. Use line 0-${lines.length}.`, + error: `Error: ${ErrorMessages.INVALID_LINE_NUMBER}` + }; + } + + saveToHistory(files, filePath); + + const clampedLine = Math.max(0, Math.min(lines.length, insertLine)); + lines.splice(clampedLine, 0, newStr); + const newContent = lines.join('\n'); + + updateOrCreateFile(files, filePath, newContent); + addFileToUpdatedList(updatedFileNames, filePath); + + return { + success: true, + message: `Successfully inserted ${newStr.split('\n').length} line(s) at line ${insertLine} in '${filePath}'.` + }; +} + +function handleDeleteCommand( + files: SourceFiles[], + updatedFileNames: string[], + filePath: string, + oldStr?: string +): TextEditorResult { + if (oldStr === undefined) { + return { + success: false, + message: "The 'old_str' parameter is required for 'delete' command.", + error: `Error: ${ErrorMessages.MISSING_PARAMETER}` + }; + } + + const content = getFileContent(files, filePath); + + if (content === null) { + return { + success: false, + message: `File '${filePath}' not found. Cannot delete text.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; + } + + const occurrenceCount = countOccurrences(content, oldStr); + + if (occurrenceCount === 0) { + return { + success: false, + message: `String to delete was not found in '${filePath}'. No changes made. Double check the text to delete, including whitespace and line breaks.`, + error: `Error: ${ErrorMessages.NO_MATCH_FOUND}` + }; + } + + saveToHistory(files, filePath); + + const newContent = content.replaceAll(oldStr, ''); + updateOrCreateFile(files, filePath, newContent); + addFileToUpdatedList(updatedFileNames, filePath); + + return { + success: true, + message: `Successfully deleted ${occurrenceCount} occurrence(s) of text from '${filePath}'.` + }; +} + +function handleUndoEditCommand( + files: SourceFiles[], + updatedFileNames: string[], + filePath: string +): TextEditorResult { + const history = editHistory.get(filePath); + + if (!history || history.length === 0) { + return { + success: false, + message: `No edit history found for '${filePath}'. Cannot undo.`, + error: ErrorMessages.NO_HISTORY + }; + } + + const lastState = history.pop()!; + updateOrCreateFile(files, filePath, lastState); + addFileToUpdatedList(updatedFileNames, filePath); + + return { + success: true, + message: `Successfully undid last edit on '${filePath}'. ${history.length} undo(s) remaining.` + }; +} + +// ============================================================================ +// Command Router +// ============================================================================ + +function executeCommand( + files: SourceFiles[], + updatedFileNames: string[], + args: ExecuteArgs +): TextEditorResult { + const { command, path: filePath, file_text, insert_line, new_str, old_str, view_range } = args; + + switch (command) { + case TextEditorCommand.VIEW: + return handleViewCommand(files, filePath, view_range); + + case TextEditorCommand.CREATE: + return handleCreateCommand(files, updatedFileNames, filePath, file_text); + + case TextEditorCommand.STR_REPLACE: + return handleStrReplaceCommand(files, updatedFileNames, filePath, old_str, new_str); + + case TextEditorCommand.INSERT: + return handleInsertCommand(files, updatedFileNames, filePath, insert_line, new_str); + + case TextEditorCommand.DELETE: + return handleDeleteCommand(files, updatedFileNames, filePath, old_str); + + case TextEditorCommand.UNDO_EDIT: + return handleUndoEditCommand(files, updatedFileNames, filePath); + + default: + return { + success: false, + message: `Unknown command '${command}'. Valid commands: view, create, str_replace, insert, delete, undo_edit.`, + error: ErrorMessages.INVALID_COMMAND + }; + } +} + +// ============================================================================ +// Error Handling +// ============================================================================ + +function handleExecutionError( + error: unknown, + command: string, + filePath: string +): TextEditorResult { + const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.'; + console.error(`[Text Editor] Failed to execute '${command}':`, error); + + if (errorMessage.includes('EACCES') || errorMessage.includes('EPERM')) { + return { + success: false, + message: `Permission denied: Cannot access '${filePath}'. Check file permissions.`, + error: ErrorMessages.PERMISSION_DENIED + }; + } + + return { + success: false, + message: `Error executing '${command}': ${errorMessage}`, + error: ErrorMessages.EXECUTION_ERROR + }; +} + +// ============================================================================ +// Main Entry Point +// ============================================================================ + +export function handleTextEditorCommands( + updatedSourceFiles: SourceFiles[], + updatedFileNames: string[], + args: ExecuteArgs +): TextEditorResult { + const { command, path: filePath } = args; + + try { + console.log(`[Text Editor] Command: '${command}', File: '${filePath}'`); + + const pathValidation = validateFilePath(filePath); + if (!pathValidation.valid) { + return { + success: false, + message: `Invalid file path: ${pathValidation.error}`, + error: `Error: ${ErrorMessages.INVALID_PATH}` + }; + } + + return executeCommand(updatedSourceFiles, updatedFileNames, args); + } catch (error) { + return handleExecutionError(error, command, filePath); + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts index 4b3c29ad7d8..b34f95b5f01 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts @@ -105,6 +105,7 @@ export async function isModuleNotFoundDiagsExist(diagnosticsResult: Diagnostics[ }); projectModified = true; } else { + console.log("Module resolving failed for uri: " + uri + " with response: " + JSON.stringify(response) + "\n" + uniqueDiagnosticMap + "\n"); throw Error("Module resolving failed"); } } @@ -165,6 +166,10 @@ export async function addMissingImports(diagnosticsResult: Diagnostics[], langCl // Update file content const { source } = syntaxTree as SyntaxTree; + if (!source) { + // Handle the case where source is undefined, when compiler issue occurs + return false; + } const absolutePath = fileURLToPath(fielUri); writeBallerinaFileDidOpenTemp(absolutePath, source); if (astModifications.length > 0) { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index 3de5c8f5c89..6f3accd1a06 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -17,7 +17,6 @@ import * as path from "path"; import * as assert from "assert"; import * as fs from "fs"; -import { commands, Uri, workspace } from "vscode"; import * as vscode from "vscode"; import * as dotenv from "dotenv"; @@ -27,7 +26,6 @@ import { DEFAULT_TEST_CONFIG, TIMING, PATHS, - FILES, VSCODE_COMMANDS, processSingleBatch, handleBatchDelay, @@ -51,7 +49,7 @@ const TEST_USE_CASES: readonly TestUseCase[] = testCases.map((testCase, index) = usecase: testCase.prompt, operationType: "CODE_GENERATION" as const, // projectPath: path.join(PROJECT_ROOT, testCase.projectPath) - projectPath: path.join(PROJECT_ROOT) + projectPath: path.join(PROJECT_ROOT, testCase.projectPath) })); /** @@ -124,34 +122,6 @@ async function setupTestEnvironment(): Promise { console.log("Loaded .env file for AI tests"); } - // Wait for VSCode startup to complete - await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETUP_DELAY)); - - await commands.executeCommand(VSCODE_COMMANDS.CLOSE_ALL_EDITORS); - - // Add the Ballerina workspace to trigger workspaceContains activation event - const currentFolderCount = workspace.workspaceFolders?.length || 0; - workspace.updateWorkspaceFolders(currentFolderCount, 0, { - uri: Uri.file(PROJECT_ROOT), - }); - - // Give VSCode time to detect the workspace and trigger activation - await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETTLE_DELAY)); - - // Force extension activation by opening a Ballerina file - try { - const testBalFile = Uri.file(path.join(PROJECT_ROOT, FILES.MAIN_BAL)); - await commands.executeCommand(VSCODE_COMMANDS.OPEN, testBalFile); - await new Promise(resolve => setTimeout(resolve, TIMING.FILE_OPEN_DELAY)); - } catch (error) { - // Fallback: try to execute a ballerina command to force activation - try { - await commands.executeCommand(VSCODE_COMMANDS.SHOW_EXAMPLES); - } catch (cmdError) { - // Extension might still be loading - } - } - // Poll for AI test command availability let attempts = 0; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index fea609f78d7..fd38bb76ed0 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -17,83 +17,83 @@ export const initialTestCases = [ { prompt: "write an integration to get emails of the Users from a mysql table and send an email using gmail connector saying that you for buying the product", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "write an integration to Sync a folder in google drive to microsoft one drive", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Write an http service to read a specified csv file and add it to google sheet.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Write an application to read open github issues in a given repo and send those as a message to a slack channel.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Write an application to todos from a csv file and create github issues for each todo.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Read a CSV file from the local system and upload its content to a Google Sheets document.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Fetch the latest issues from a GitHub repository and send a summary to a Slack channel.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Download a file from a specific GitHub repository and save it to a local directory.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Read data from a Google Sheets document and convert it into a CSV file stored locally.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Monitor a Google Sheets document for changes and send an alert to a Slack channel whenever an update is detected.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Export the data from a Slack channel conversation to a Google Sheets document.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Read a list of users from a CSV file and add them to a specific Slack channel.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Fetch pull requests from a GitHub repository and log the details into a local CSV file.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Sync a Google Sheets document with a CSV file on the local system, ensuring both have the same content.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Extract user information from a Slack workspace and store it in a Google Sheets document.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Send notifications to a Slack channel whenever a new file is added to a specific GitHub repository.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Read data from a local CSV file and update corresponding rows in a Google Sheets document.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Automatically post updates to a Slack channel and google sheets whenever a new issue is created in a GitHub repository.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Upload a local CSV file to a specific Google Sheets document, appending the data to the existing sheet.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, { prompt: "Generate a CSV report from Google Sheets data and send the report to a Slack channel.", - projectPath: "fresh_bi_package" + projectPath: "bi_init" }, ]; @@ -103,73 +103,113 @@ export const textEditSpecializedTestCases = [ // This prompt requires the copilot to understand where to place specific configurations (`connections.bal`, `config.bal`), // handle data mapping logic (`data_mappings.bal`), and also create a completely new file (`salesforce_listener.bal`) for the service logic. prompt: "Create an integration that listens for new 'Account' objects in Salesforce. When a new account is created, transform its data and create a 'Business Partner' in an SAP S/4HANA system. The SAP connection details should go into `connections.bal`, Salesforce credentials into `config.bal`, and the data transformation logic into `data_mappings.bal`. The main listener service must be in a new file named `salesforce_listener.bal`.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 2 (Delete/Replace file content) // This prompt forces the copilot to replace the entire content of specific files (`data_mappings.bal`, `types.bal`) // by explicitly telling it they are not needed, while correctly populating others (`schedule.bal`, `connections.bal`). prompt: "I need a program to sync events from my primary Google Calendar to my Outlook Calendar for the upcoming week. This should be a scheduled job defined in `schedule.bal`. Initialize the necessary Google Calendar and Outlook clients in `connections.bal`. For this task, please ensure the `data_mappings.bal` and `types.bal` files are completely empty, as no complex transformations are required.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 4 (Delete a specific part of code) // This prompt tests the ability to generate a standard workflow but intentionally omit a critical part (database logic). // The copilot must understand the context and remove what would normally be an essential step in an order processing API. prompt: "Develop an HTTP API for processing e-commerce orders. The API in `main.bal` should accept a POST request with order data, validate its structure using a definition from `types.bal`, and send a confirmation email via SendGrid using a function in `functions.bal`. However, for this initial version, please implement the full flow but specifically omit the database insertion step.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 3 (Create new file), 4 (Delete a specific part of code) // This is a multi-faceted prompt that involves creating a new file (`logging.bal`) and also omitting standard code (error handling), // testing the copilot's ability to follow precise negative constraints. prompt: "Write a service that polls for new tickets in Zendesk every 5 minutes. For each ticket, create a corresponding issue in a Jira project. Put the Zendesk and Jira client configs in `connections.bal` and the ticket-to-issue mapping in `data_mappings.bal`. Create a new file `logging.bal` for a function that logs the ID of the created Jira issue. Importantly, the main polling logic in `main.bal` should not include any error handling for the Jira API call.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 3 (Create new file) // This test case involves a different protocol (MQTT) and database type (InfluxDB), testing the breadth of the copilot's knowledge. // It requires creating a new file for the listener and correctly segregating connection configurations. prompt: "Develop an application that listens to an MQTT topic for temperature sensor data. This listener logic should be in a new file named `mqtt_listener.bal`. When a message arrives with a temperature reading above 35°C, insert a record into an InfluxDB database. All MQTT and InfluxDB connection details must be managed in the `connections.bal` file.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files) // A practical healthcare integration use case that heavily relies on placing complex type definitions in the correct file (`types.bal`) // and separating database logic (`connections.bal`) from the service logic (`main.bal`). prompt: "Build an HTTP service to receive patient data compliant with the FHIR standard. The service in `main.bal` should expect a POST request. Define the complex FHIR Patient resource structure in `types.bal`. The service must parse the incoming JSON and insert the patient's name and birthdate into a PostgreSQL database, with connection details isolated in `connections.bal`.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 3 (Create new file), 4 (Delete a specific part of code) // This prompt tests integration with AWS services and requires the copilot to create a new file for the trigger logic. // It also includes a negative constraint to skip data validation, testing the 'delete a specific part' capability. prompt: "Create an integration that triggers when a new JSON file containing customer data is uploaded to an AWS S3 bucket. The trigger logic should reside in a new file `s3_service.bal`. Read the customer data from the JSON and add the customer to a Mailchimp audience using a function in `functions.bal`. AWS and Mailchimp credentials must go into `config.bal`. Ensure you skip any validation of the incoming JSON data and process it directly.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 2 (Delete/Replace file content) // This prompt tests if the copilot can follow an instruction to consolidate all logic into one file, // which implicitly requires it to ensure other specified files (`functions.bal`, `types.bal`) are empty or cleared. prompt: "Generate a simple stock price checker. It should be a single HTTP service in `main.bal` that accepts a stock ticker via a query parameter. It must call an external API like Alpha Vantage to get the latest price and return it. Place the API key in `config.bal`. For this simple tool, ensure that `functions.bal` and `types.bal` are left completely empty.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files) // A real-world financial integration scenario. This prompt requires the copilot to correctly identify where to put different pieces of logic: // the HTTP listener, type definitions for financial data, and the QuickBooks client configuration. prompt: "Write an HTTP service that acts as a webhook for Stripe. When a 'charge.succeeded' event is received, extract the charge amount and customer ID. Then, create a new sales receipt in QuickBooks Online. The webhook service should be in `main.bal`, the Stripe event structure in `types.bal`, and the QuickBooks client initialization in `connections.bal`.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" }, { // Covers: 1 (Look into files), 2 (Delete/Replace file content), 3 (Create new file) // This prompt combines multiple requirements: create a new file, populate specific files with configurations, // and explicitly clear another file (`main.bal`) because the logic is agent-based, not a service. prompt: "Set up a daily scheduled task in `schedule.bal` to fetch the top 10 'help wanted' posts from the Hacker News API. For each post, summarize its title and URL and send the summary to a Discord channel via a webhook. Create a new file `utils.bal` containing a function to format the Discord message. The webhook URL should be in `config.bal`. Ensure the `main.bal` file remains empty as this is not an HTTP service.", - projectPath: "fresh_bi_package" + projectPath: "bi_empty_project" + } +]; + +export const testCasesForExistingProject = [ + { + // Covers: 1 (Look into files), 3 (Create new file) + // This prompt requires the copilot to understand distributed tracing implementation across microservices, + // handle OpenTelemetry integration, and create new files for tracing configuration and correlation management. + prompt: "How can I implement distributed tracing with OpenTelemetry across the order service saga, ensuring that trace contexts are properly propagated through Kafka events and database transactions while maintaining correlation IDs for debugging payment and fulfillment failures?", + projectPath: "simple_order_management_system" + }, + { + // Covers: 1 (Look into files), 2 (Delete/Replace file content) + // This prompt forces the copilot to replace synchronous processing with asynchronous batch processing, + // implementing circuit breaker patterns and retry mechanisms while restructuring the existing order flow. + prompt: "I need to refactor the current synchronous order creation flow to support asynchronous batch processing with dead letter queues for failed orders, implementing circuit breaker patterns for the pricing service calls and adding retry mechanisms with exponential backoff for Kafka publishing failures.", + projectPath: "simple_order_management_system" + }, + { + // Covers: 1 (Look into files), 4 (Delete a specific part of code) + // This prompt tests the ability to add comprehensive audit capabilities while specifically removing + // the current simple logging and replacing it with sophisticated audit trail system. + prompt: "Can you help me implement a comprehensive audit trail system that captures all order state transitions in a separate audit table, with event versioning for schema evolution and integration with a time-series database for real-time monitoring dashboards and alerting on order processing anomalies?", + projectPath: "simple_order_management_system" + }, + { + // Covers: 1 (Look into files), 3 (Create new file), 4 (Delete a specific part of code) + // This is a multi-faceted prompt that involves creating new files for gRPC integration and caching, + // while removing the existing mock pricing calculation and replacing it with proper service integration. + prompt: "I want to replace the current mock pricing calculation with a proper integration to an external pricing microservice using gRPC, implementing request/response caching with Redis, connection pooling with health checks, and graceful degradation when the pricing service is unavailable.", + projectPath: "simple_order_management_system" + }, + { + // Covers: 1 (Look into files), 2 (Delete/Replace file content), 3 (Create new file) + // This prompt combines implementing saga pattern compensating transactions, creating new files for transaction management, + // and replacing the current simple event publishing with sophisticated saga orchestration and recovery mechanisms. + prompt: "How do I implement proper compensating transactions for the order saga pattern, including automatic rollback mechanisms when payment fails, inventory reservation cancellation, and notification service integration with idempotent operations to handle duplicate events during saga recovery?", + projectPath: "simple_order_management_system" } ]; export let testCases = []; testCases.push(...initialTestCases); testCases.push(...textEditSpecializedTestCases); +testCases.push(...testCasesForExistingProject); // Duplicate to increase total count for testing + diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts index 7649b9cce24..d6dce0db026 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts @@ -17,7 +17,9 @@ import { TestUseCase, UsecaseResult } from '../types'; import { executeSingleTestCase } from './test-execution'; import { convertTestResultToUsecaseResult, createFailedUsecaseResult } from '../result-management/result-conversion'; -import { TIMING } from './constants'; +import { FILES, PATHS, TIMING, VSCODE_COMMANDS } from './constants'; +import path from 'path'; +import { commands, Uri, workspace } from 'vscode'; /** * Processes a single batch of test cases in parallel @@ -26,32 +28,38 @@ export async function processSingleBatch( batch: readonly TestUseCase[], batchNumber: number ): Promise { - console.log(`\n📋 Processing batch ${batchNumber}: ${batch.map(uc => uc.id).join(', ')}`); + try { + console.log(`\n📋 Processing batch ${batchNumber}: ${batch.map(uc => uc.id).join(', ')}`); - const batchPromises = batch.map(useCase => - executeSingleTestCase(useCase) - ); - - const batchResults = await Promise.allSettled(batchPromises); - const usecaseResults: UsecaseResult[] = []; - - for (let j = 0; j < batchResults.length; j++) { - const settledResult = batchResults[j]; - const useCase = batch[j]; + // All test cases in the batch SHOULD share the same project path + await setupTestEnvironmentForBatch(batch[0].projectPath); + const batchPromises = batch.map(useCase => + executeSingleTestCase(useCase) + ); - let usecaseResult: UsecaseResult; + const batchResults = await Promise.allSettled(batchPromises); + const usecaseResults: UsecaseResult[] = []; - if (settledResult.status === 'fulfilled') { - usecaseResult = convertTestResultToUsecaseResult(settledResult.value); - } else { - console.error(`❌ Test case ${useCase.id} failed:`, settledResult.reason); - usecaseResult = createFailedUsecaseResult(useCase, settledResult.reason); + for (let j = 0; j < batchResults.length; j++) { + const settledResult = batchResults[j]; + const useCase = batch[j]; + + let usecaseResult: UsecaseResult; + + if (settledResult.status === 'fulfilled') { + usecaseResult = convertTestResultToUsecaseResult(settledResult.value); + } else { + console.error(`❌ Test case ${useCase.id} failed:`, settledResult.reason); + usecaseResult = createFailedUsecaseResult(useCase, settledResult.reason); + } + + usecaseResults.push(usecaseResult); } - usecaseResults.push(usecaseResult); + return usecaseResults; + } catch (error) { + console.error(`❌ Batch ${batchNumber} processing failed:`, (error as Error).message); } - - return usecaseResults; } /** @@ -74,3 +82,33 @@ export async function handleBatchDelay( export function wait(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); } + +async function setupTestEnvironmentForBatch(projectPath: string): Promise { + // Wait for VSCode startup to complete + await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETUP_DELAY)); + + await commands.executeCommand(VSCODE_COMMANDS.CLOSE_ALL_EDITORS); + + // Add the Ballerina workspace to trigger workspaceContains activation event + const currentFolderCount = workspace.workspaceFolders?.length || 0; + workspace.updateWorkspaceFolders(0, currentFolderCount, { + uri: Uri.file(projectPath), + }); + + // Give VSCode time to detect the workspace and trigger activation + await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETTLE_DELAY)); + + // Force extension activation by opening a Ballerina file + try { + const testBalFile = Uri.file(path.join(projectPath, FILES.MAIN_BAL)); + await commands.executeCommand(VSCODE_COMMANDS.OPEN, testBalFile); + await new Promise(resolve => setTimeout(resolve, TIMING.FILE_OPEN_DELAY)); + } catch (error) { + // Fallback: try to execute a ballerina command to force activation + try { + await commands.executeCommand(VSCODE_COMMANDS.SHOW_EXAMPLES); + } catch (cmdError) { + // Extension might still be loading + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts index e89f4fb2ab4..4059c526b40 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -41,7 +41,7 @@ export const TIMING = { * Path constants */ export const PATHS = { - PROJECT_ROOT_RELATIVE: "../../../../../test/data/bi_empty", + PROJECT_ROOT_RELATIVE: "../../../../../test/data", ENV_FILE_RELATIVE: "../../../../.env", DEFAULT_RESULTS_DIR: "../../../../../../test/ai/evals/code/results" } as const; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts index 90de09e3283..b2dad4af818 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts @@ -50,6 +50,9 @@ export async function executeSingleTestCase(useCase: TestUseCase): Promise Date: Tue, 7 Oct 2025 14:42:03 +0530 Subject: [PATCH 113/730] Add empty state for resources in ServiceDesigner with a prompt to create a new resource --- .../src/views/BI/ServiceDesigner/index.tsx | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 77ac1daa5b1..2856552ff8f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -161,6 +161,19 @@ const PropertyLabel = styled.div` margin-bottom: 4px; `; +const EmptyReadmeContainer = styled.div` + display: flex; + margin: 80px 0px; + flex-direction: column; + align-items: center; + gap: 8px; + height: 100%; +`; + +const Description = styled(Typography)` + color: var(--vscode-descriptionForeground); +`; + const PropertyValue = styled.div` display: flex; align-items: center; @@ -628,6 +641,16 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const haveServiceTypeName = serviceModel?.properties["serviceTypeName"]?.value; + + const resourcesCount = resources + .filter((resource) => { + const search = searchValue.toLowerCase(); + const nameMatch = resource.name && resource.name.toLowerCase().includes(search); + const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); + return nameMatch || iconMatch; + }) + .length; + const ListenerList = () => { const listenerLabel = listeners.length > 1 ? "Listeners" : "Listener"; return ( @@ -758,7 +781,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { {resources.length > 10 && ( )} - {!haveServiceTypeName && ( + {!haveServiceTypeName && resourcesCount > 0 && ( @@ -784,6 +807,20 @@ export function ServiceDesigner(props: ServiceDesignerProps) { /> ))} + + {resourcesCount === 0 && ( + + + No resources found. Add a new resource. + + + + )} )} {/* Listing service type bound functions */} From 8eb9a22951890140c3971c3fbe052f6e7bb7ea66 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 7 Oct 2025 14:59:42 +0530 Subject: [PATCH 114/730] Update subtitle in ServiceDesigner to conditionally display prompt based on resources count --- .../ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 2856552ff8f..e38bb71752c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -775,7 +775,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { <>
{resources.length > 10 && ( From 5a8bac368821014d10ed4d00e32809f28cce327b Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Tue, 7 Oct 2025 15:12:33 +0530 Subject: [PATCH 115/730] Add existing code for sinmple order service into eval --- .../src/features/ai/service/code/code.ts | 9 +- .../ai/service/libs/text_editor_tool.ts | 6 +- .../ai/evals/code/utils/evaluator-utils.ts | 6 +- .../Ballerina.toml | 4 + .../configurations.bal | 13 ++ .../functions.bal | 147 ++++++++++++++++++ .../simple_order_management_system/main.bal | 34 ++++ .../service.bal | 51 ++++++ .../simple_order_management_system/types.bal | 100 ++++++++++++ 9 files changed, 362 insertions(+), 8 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/Ballerina.toml create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/configurations.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/functions.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/main.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/service.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/types.bal diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 2dcee7b0009..67fcfb425af 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -158,7 +158,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler `Analyzing request & selecting libraries...`, `Fetched libraries: [${libraryNames.join(", ")}]` ); - toolResult = libraryNames + toolResult = libraryNames; } else if (toolName == "str_replace_editor") { console.log(`[Tool Call] Tool call finished: ${toolName}`); toolResult = [updatedFileNames[updatedFileNames.length - 1]]; @@ -487,7 +487,12 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri ...params.previousMessages, !isToolCallExistInLastMessage? { role: "assistant", - content: params.assistantResponse, + content: [ + { + type: "text", + text: params.assistantResponse + } + ] }: { role: "tool", content: [ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index 5c3ac7e62fa..e18d6f58c5b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -159,7 +159,7 @@ function saveToHistory( filePath: string ): void { const sourceFile = updatedSourceFiles.find(f => f.filePath === filePath); - if (!sourceFile) return; + if (!sourceFile) { return; } if (!editHistory.has(filePath)) { editHistory.set(filePath, []); @@ -182,14 +182,14 @@ function countOccurrences(text: string, searchString: string): number { return 1; } - if (!searchString) return 0; + if (!searchString) { return 0; } let count = 0; let position = 0; while ((position = text.indexOf(searchString, position)) !== -1) { count++; - if (count > 1) break; + if (count > 1) { break; } position += searchString.length; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts index 52d0b0456eb..18cd396aab9 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/evaluator-utils.ts @@ -121,14 +121,14 @@ Use the submit_evaluation tool to provide your assessment.`; submit_evaluation: { description: 'Submit a comprehensive evaluation of whether the final code correctly implements the user query.', - parameters: evaluationSchema, + inputSchema: evaluationSchema, } }, toolChoice: { type: 'tool', toolName: 'submit_evaluation' }, - maxSteps: 1, + maxRetries: 1, }); // Extract the tool call result @@ -138,7 +138,7 @@ Use the submit_evaluation tool to provide your assessment.`; throw new Error("Expected submit_evaluation tool call but received none"); } - const evaluationResult = toolCall.args as LLMEvaluationResult; + const evaluationResult = toolCall.input as LLMEvaluationResult; console.log(`✅ LLM Evaluation Complete. Correct: ${evaluationResult.is_correct}. Reason: ${evaluationResult.reasoning}, Rating: ${evaluationResult.rating}`); return evaluationResult; diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/Ballerina.toml new file mode 100644 index 00000000000..cdfe34ee006 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/Ballerina.toml @@ -0,0 +1,4 @@ +[package] +org = "wso2" +name = "bi_empty" +version = "0.1.0" diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/configurations.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/configurations.bal new file mode 100644 index 00000000000..981785a5736 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/configurations.bal @@ -0,0 +1,13 @@ +// Database Configurations +configurable string DB_HOST = "localhost"; +configurable int DB_PORT = 5432; +configurable string DB_USER = "user"; +configurable string DB_PASSWORD = "password"; +configurable string DB_NAME = "order_db"; + +// Kafka Producer Configurations +configurable string KAFKA_BROKER_URL = "localhost:9092"; +configurable string KAFKA_ORDER_EVENTS_TOPIC = "order.events"; + +// Service Port +configurable int SERVICE_PORT = 9090; diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/functions.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/functions.bal new file mode 100644 index 00000000000..00c77ab2a63 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/functions.bal @@ -0,0 +1,147 @@ +// functions.bal +import ballerina/sql; +import ballerina/time; +import ballerina/uuid; +import ballerina/log; +import ballerina/lang.value as value; + +// --- Business Logic Functions --- + +// Orchestrates the creation of a new order. +public function createNewOrder(OrderCreatePayload payload) returns OrderCreationResponse|error { + // 1. Generate a unique order ID + string orderId = uuid:createType4AsString(); + + // 2. TODO: Call Catalog/Pricing service to get prices and calculate total. + // This would be a synchronous blocking call. For now, we mock it. + decimal totalAmount = calculateTotal(payload.orderLines); + + // 3. Persist the initial order record to the database in 'PENDING' state + sql:ExecutionResult|sql:Error dbResult = insertInitialOrder(orderId, payload, totalAmount); + + if dbResult is sql:Error { + log:printError("Database error on initial order insert", dbResult); + return dbResult; + } + + // 4. Create the OrderCreated event payload + OrderCreatedEvent eventPayload = { + eventId: uuid:createType4AsString(), + timestamp: time:utcToString(time:utcNow()), + data: { + orderId: orderId, + customerId: payload.customerId, + currency: payload.currency, + totalAmount: totalAmount, + orderLines: payload.orderLines, + paymentInfo: payload.paymentInfo + } + }; + + // 5. Publish the event to Kafka to kick off the saga + error? kafkaResult = publishOrderEvent(eventPayload); + + if kafkaResult is error { + log:printError("Kafka publish error", kafkaResult); + // CRITICAL: Handle this failure. Maybe move to a DLQ or retry. + // For now, we return an error. A compensating transaction to cancel the DB entry would be needed here. + return kafkaResult; + } + + return {orderId: orderId}; +} + +// Retrieves an order by its ID from the database. +public function getOrderById(string orderId) returns Order|OrderNotFoundError|error { + sql:ParameterizedQuery query = `SELECT orderId, customerId, status, createdAt, totalAmount, currency, shippingAddress, billingAddress, orderLines FROM orders WHERE orderId = ${orderId};`; + + stream resultStream = dbClient->query(query); + + record {|OrderModel value;|}? row = check resultStream.next(); + check resultStream.close(); + + if row is () { + return error OrderNotFoundError("Order not found: " + orderId); + } + + OrderModel dbOrder = row.value; + + // Convert JSON fields back to proper types + Address shippingAddress = check value:cloneWithType(dbOrder.shippingAddress, Address); + Address billingAddress = check value:cloneWithType(dbOrder.billingAddress, Address); + OrderLine[] orderLines = check value:cloneWithType(dbOrder.orderLines); + + // Convert status string to OrderStatus + OrderStatus orderStatus = check value:ensureType(dbOrder.status, OrderStatus); + + // The data is stored as JSON in the DB, so we need to convert it back to Ballerina records. + Order finalOrder = { + orderId: dbOrder.orderId, + customerId: dbOrder.customerId, + status: orderStatus, + createdAt: dbOrder.createdAt, + totalAmount: dbOrder.totalAmount, + currency: dbOrder.currency, + shippingAddress: shippingAddress, + billingAddress: billingAddress, + orderLines: orderLines, + payments: [], // TODO: Fetch from payment service or join table + shipments: [] // TODO: Fetch from shipment service or join table + }; + + return finalOrder; +} + +// --- Database Helper Functions --- + +function insertInitialOrder(string orderId, OrderCreatePayload payload, decimal totalAmount) returns sql:ExecutionResult|sql:Error { + // NOTE: In a real system, prices would come from a pricing service. + OrderLine[] linesWithPrices = from var line in payload.orderLines + select { + lineId: uuid:createType4AsString(), + sku: line.sku, + quantity: line.quantity, + unitPrice: 99.99, // Mock price + lineTotal: 99.99 * line.quantity + }; + + json shippingAddressJson = value:toJson(payload.shippingAddress); + json billingAddressJson = value:toJson(payload.billingAddress); + json orderLinesJson = value:toJson(linesWithPrices); + + string shippingAddressStr = value:toJsonString(shippingAddressJson); + string billingAddressStr = value:toJsonString(billingAddressJson); + string orderLinesStr = value:toJsonString(orderLinesJson); + + sql:ParameterizedQuery insertQuery = `INSERT INTO orders (orderId, customerId, status, createdAt, totalAmount, currency, shippingAddress, billingAddress, orderLines) VALUES (${orderId}, ${payload.customerId}, ${"PENDING"}, ${time:utcToString(time:utcNow())}, ${totalAmount}, ${payload.currency}, ${shippingAddressStr}, ${billingAddressStr}, ${orderLinesStr});`; + + return dbClient->execute(insertQuery); +} + +// --- Kafka Helper Functions --- + +function publishOrderEvent(OrderCreatedEvent eventPayload) returns error? { + json eventJson = value:toJson(eventPayload); + string eventString = value:toJsonString(eventJson); + + // The Kafka producer sends the message asynchronously. + // The `flush()` call ensures it's sent before the function returns. + check kafkaProducer->send({ + topic: KAFKA_ORDER_EVENTS_TOPIC, + key: eventPayload.data.orderId, + value: eventString.toBytes() + }); + + check kafkaProducer->'flush(); + log:printInfo("Published OrderCreated event to Kafka", orderId = eventPayload.data.orderId); +} + +// --- Utility and Error Types --- + +function calculateTotal(OrderLinePayload[] lines) returns decimal { + decimal total = 0.0; + foreach var line in lines { + total += 99.99 * line.quantity; // Use mocked price + } + return total; +} diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/main.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/main.bal new file mode 100644 index 00000000000..c4142e96aea --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/main.bal @@ -0,0 +1,34 @@ +// main.bal +import ballerinax/postgresql; +import ballerinax/kafka; +import ballerina/log; +import ballerina/lang.runtime as runtime; + +// Initialize the PostgreSQL client globally. +// This client manages a connection pool for efficiency. +public final postgresql:Client dbClient = check new ( + host = DB_HOST, + port = DB_PORT, + username = DB_USER, + password = DB_PASSWORD, + database = DB_NAME +); + +// Initialize the Kafka producer globally. +public final kafka:Producer kafkaProducer = check new ( + bootstrapServers = [KAFKA_BROKER_URL] +); + +public function main() { + // The service is defined in service.bal and will start automatically + // as it's attached to a listener. We just log that the service is starting. + log:printInfo("Order Service starting up...", port = SERVICE_PORT, db = DB_HOST, kafka = KAFKA_BROKER_URL); + + // Graceful shutdown hook + runtime:onGracefulStop(function () { + log:printInfo("Shutting down Order Service..."); + checkpanic kafkaProducer->close(); + checkpanic dbClient.close(); + log:printInfo("Shutdown complete."); + }); +} diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/service.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/service.bal new file mode 100644 index 00000000000..ee109a745b0 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/service.bal @@ -0,0 +1,51 @@ +// service.bal +import ballerina/http; +import ballerina/log; + +// The service is attached to a listener on the configured port. +@http:ServiceConfig { + cors: { + allowOrigins: ["https://grc.com"], + allowMethods: ["GET", "POST"] + } +} +service /v1 on new http:Listener(SERVICE_PORT) { + + // POST /v1/orders + // Creates a new order and initiates the order creation saga. + resource function post orders(@http:Payload OrderCreatePayload payload) returns OrderCreationResponse|http:InternalServerError|http:BadRequest { + // Basic validation + if payload.orderLines.length() == 0 { + log:printWarn("Create order attempt with no order lines", customerId = payload.customerId); + return {body: {message: "Order must contain at least one line item."}}; + } + + // Delegate to the business logic function + var result = createNewOrder(payload); + + if result is OrderCreationResponse { + log:printInfo("Order creation process initiated", orderId = result.orderId); + return result; + } else { + log:printError("Failed to initiate order creation", result); + return {body: {message: "An internal error occurred while creating the order."}}; + } + } + + resource function get orders/[string orderId]() returns Order|http:NotFound|http:InternalServerError { + var 'order = getOrderById(orderId); + + if 'order is Order { + return 'order; + } else if 'order is OrderNotFoundError { + log:printWarn("Order not found", orderId = orderId); + return {body: {message: string `Order with ID ${orderId} not found.`}}; + } + } +} + +public type OrderCreationResponse record {| + string orderId; + string status = "PENDING"; + string message = "Order received and is being processed."; +|}; diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/types.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/types.bal new file mode 100644 index 00000000000..67991f5fc29 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system/types.bal @@ -0,0 +1,100 @@ +// types.bal + +// Represents the public-facing Order resource. +public type Order record { + string orderId; + string customerId; + OrderStatus status; + string createdAt; + decimal totalAmount; + string currency; + Address shippingAddress; + Address billingAddress; + OrderLine[] orderLines; + Payment[] payments; + Shipment[] shipments; +}; + +// Represents an order as stored in the database, including internal fields. +public type OrderModel record {| + string orderId; + string customerId; + OrderStatus status; + string createdAt; + decimal totalAmount; + string currency; + json shippingAddress; + json billingAddress; + json orderLines; +|}; + +// Input payload for creating a new order. +public type OrderCreatePayload record {| + string customerId; + string currency; + Address shippingAddress; + Address billingAddress; + OrderLinePayload[] orderLines; + PaymentInfo paymentInfo; +|}; + +public type OrderLinePayload record {| + string sku; + int quantity; +|}; + +public type OrderLine record {| + string lineId; + string sku; + int quantity; + decimal unitPrice; + decimal lineTotal; +|}; + +public type Address record {| + string line1; + string? line2; + string city; + string state; + string zipCode; + string country; +|}; + +public type Payment record {| + string paymentId; + string status; + decimal amount; +|}; + +public type PaymentInfo record {| + string paymentMethodToken; + decimal amount; +|}; + +public type Shipment record {| + string shipmentId; + string trackingNumber; + string carrier; + string status; +|}; + +public type OrderStatus "PENDING"|"CONFIRMED"|"AWAITING_PAYMENT"|"FULFILLING"|"SHIPPED"|"DELIVERED"|"CANCELLED"|"RETURNED"|"FAILED"; + +// Event payloads for Kafka +public type OrderCreatedEvent record {| + string eventId; + string eventType = "OrderCreated"; + string timestamp; + OrderCreatedEventData data; +|}; + +public type OrderCreatedEventData record {| + string orderId; + string customerId; + string currency; + decimal totalAmount; + OrderLinePayload[] orderLines; + PaymentInfo paymentInfo; +|}; + +type OrderNotFoundError error; From 8a677ae1f04738da134c5be9e10714c6ff6ae3cb Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Tue, 7 Oct 2025 15:47:29 +0530 Subject: [PATCH 116/730] Add license headers for eval files --- .../src/features/ai/service/code/code.ts | 2 +- .../features/ai/service/libs/text_editor_tool.ts | 16 ++++++++++++++++ .../test/ai/evals/code/utils/test-execution.ts | 5 +---- .../configurations.bal | 16 ++++++++++++++++ .../simple_order_management_system/functions.bal | 16 +++++++++++++++- .../data/simple_order_management_system/main.bal | 16 +++++++++++++++- .../simple_order_management_system/service.bal | 16 +++++++++++++++- .../simple_order_management_system/types.bal | 16 +++++++++++++++- 8 files changed, 94 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 67fcfb425af..ae30723e2b8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -161,7 +161,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler toolResult = libraryNames; } else if (toolName == "str_replace_editor") { console.log(`[Tool Call] Tool call finished: ${toolName}`); - toolResult = [updatedFileNames[updatedFileNames.length - 1]]; + break; } eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); break; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index e18d6f58c5b..712ee82bea2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -1,3 +1,19 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + import { SourceFiles } from "@wso2/ballerina-core"; // ============================================================================ diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts index b2dad4af818..028b2e89c20 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts @@ -49,10 +49,7 @@ export async function executeSingleTestCase(useCase: TestUseCase): Promise Date: Tue, 7 Oct 2025 16:50:12 +0530 Subject: [PATCH 117/730] Update the text edit tool version --- .../src/features/ai/service/code/code.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index ae30723e2b8..2b60d098e09 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -107,7 +107,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - str_replace_editor: anthropic.tools.textEditor_20250124({ + str_replace_editor: anthropic.tools.textEditor_20250728({ async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); @@ -138,8 +138,6 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "tool_call", toolName }); if (toolName == "LibraryProviderTool") { assistantResponse += `\n\nAnalyzing request & selecting libraries...`; - } else { - // assistantResponse += `\n\nApplying code changes to the project files...`; } break; } @@ -385,7 +383,7 @@ Important reminders: - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. Begin your response with the explanation. The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. -Once the explanation is finished, you must apply surgical edits to the existing source code using the **text_editor_20250124** tool. +Once the explanation is finished, you must apply surgical edits to the existing source code using the **textEditor_20250728** tool. The complete source code will be provided in the section of the user prompt. If the file is already shown in the user prompt, do **not** try to create it again. When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. @@ -517,7 +515,7 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - str_replace_editor: anthropic.tools.textEditor_20250124({ + str_replace_editor: anthropic.tools.textEditor_20250728({ async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); From 98ad83b81669fc886d14c0385eb5f6f60f280cae Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Tue, 7 Oct 2025 17:55:18 +0530 Subject: [PATCH 118/730] Update the system prompt to support the text edit tool version `20250728` --- .../src/features/ai/service/code/code.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 2b60d098e09..85bed7fced1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -107,7 +107,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - str_replace_editor: anthropic.tools.textEditor_20250728({ + str_replace_based_edit_tool: anthropic.tools.textEditor_20250728({ async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); @@ -157,7 +157,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler `Fetched libraries: [${libraryNames.join(", ")}]` ); toolResult = libraryNames; - } else if (toolName == "str_replace_editor") { + } else if (toolName == "str_replace_based_edit_tool") { console.log(`[Tool Call] Tool call finished: ${toolName}`); break; } @@ -383,9 +383,8 @@ Important reminders: - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. Begin your response with the explanation. The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. -Once the explanation is finished, you must apply surgical edits to the existing source code using the **textEditor_20250728** tool. +Once the explanation is finished, you must apply surgical edits to the existing source code using the **str_replace_based_edit_tool** tool. The complete source code will be provided in the section of the user prompt. -If the file is already shown in the user prompt, do **not** try to create it again. When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. Your goal is to modify only the relevant parts of the code to address the user's query. @@ -505,7 +504,8 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri { role: "user", content: - "Generated code returns the following compiler errors. Using the library details from the LibraryProviderTool results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the LibraryProviderTool if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy. Fix the compiler errors and return the corrected response. \n Errors: \n " + + "Generated code returns the following compiler errors. Using the library details from the LibraryProviderTool results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + + "Fix the compiler errors using the `str_replace_based_edit_tool` tool to make surgical, targeted edits to the existing code. Use the tool's edit operations to precisely replace only the erroneous sections rather than regenerating entire code blocks.. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), }, ]; @@ -515,7 +515,7 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - str_replace_editor: anthropic.tools.textEditor_20250728({ + str_replace_based_edit_tool: anthropic.tools.textEditor_20250728({ async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, { command, path, old_str, new_str, file_text, insert_line, view_range }); @@ -524,7 +524,7 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri }) }; - const { text, usage, providerMetadata } = await generateText({ + const { text } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxOutputTokens: 4096 * 4, temperature: 0, From 01827f00b0dd88f0633bde39f8fdb42b930dc35d Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 8 Oct 2025 08:48:11 +0530 Subject: [PATCH 119/730] Add graphql based type suggestions --- .../src/interfaces/extended-lang-client.ts | 6 +- .../service-designer/rpc-manager.ts | 3 +- .../views/BI/Forms/FormGeneratorNew/index.tsx | 1 + .../ResourceResponse/ResponseEditor.tsx | 12 ++- .../src/views/BI/TypeEditor/utils.tsx | 4 + .../src/views/BI/TypeHelper/index.tsx | 99 ++++++++++--------- 6 files changed, 66 insertions(+), 59 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index bdf84cae7b8..2edb8795188 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1634,11 +1634,7 @@ export interface ResponseCode { statusCode: string; hasBody?: boolean; } -export interface ResourceReturnTypesResponse { - completions: ResponseCode[]; -} - - +export type ResourceReturnTypesResponse = VisibleTypeItem[]; // <-------- Service Designer Related -------> export interface FunctionFromSourceRequest { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts index c180b7d875a..69dc6a70fe7 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts @@ -391,8 +391,7 @@ export class ServiceDesignerRpcManager implements ServiceDesignerAPI { async getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { return new Promise(async (resolve) => { const context = StateMachine.context(); - params.filePath = StateMachine.context().projectUri; - params.context = "HTTP_STATUS_CODE"; + params.filePath = params.filePath || context.projectUri; try { const res: ResourceReturnTypesResponse = await context.langClient.getResourceReturnTypes(params); resolve(res); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx index 80d64beda71..fd161616ada 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx @@ -671,6 +671,7 @@ export function FormGeneratorNew(props: FormProps) { onTypeCreate: handleCreateNewType, onCloseCompletions: handleCloseCompletions, exprRef: exprRef, + typeHelperContext: (isGraphqlEditor ? (fieldKey === 'returnType' ? "GRAPHQL_FIELD_TYPE" : "GRAPHQL_INPUT_TYPE") : "HTTP_STATUS_CODE"), }); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx index 0257ad0eea8..42861713b08 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx @@ -57,9 +57,15 @@ export function ResponseEditor(props: ParamProps) { const [newFields, setNewFields] = useState([]); useEffect(() => { - rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ filePath: undefined, context: undefined }).then((res) => { - console.log("Resource Return Types: ", res); - setResponseCodes(res.completions); + rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ filePath: undefined, context: "HTTP_STATUS_CODE" }).then((res) => { + const mappedResponseCodes: ResponseCode[] = res.map((item: any) => ({ + category: item.labelDetails?.description || "", + label: item.label || "", + type: item.detail || "", + statusCode: item.labelDetails?.detail || "", + hasBody: !["http:Response", "http:NoContent", "error"].includes(item.detail) + })); + setResponseCodes(mappedResponseCodes); rpcClient.getVisualizerRpcClient().joinProjectPath('main.bal').then((filePath) => { setFilePath(filePath); }); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/utils.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/utils.tsx index abdfe41213e..fa776ca5412 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/utils.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/utils.tsx @@ -31,6 +31,10 @@ const TYPE_CATEGORY_ORDER = [ { label: "Behaviour Types", sortText: "5"}, { label: "Other Types", sortText: "6"}, { label: "Used Variable Types", sortText: "7"}, + + // GraphQL Specific + { label: "Scalar Types", sortText: "1"}, + { label: "Enum Types", sortText: "2"}, ] as const; /** diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx index da0a40bd9a4..e1d630acefa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx @@ -62,6 +62,7 @@ type TypeHelperProps = { updateImports: (key: string, imports: {[key: string]: string}, codedata?: CodeData) => void; onTypeCreate: (typeName: string) => void; onCloseCompletions?: () => void; + typeHelperContext?: "GRAPHQL_FIELD_TYPE" | "GRAPHQL_INPUT_TYPE" | "HTTP_STATUS_CODE"; }; const TypeHelperEl = (props: TypeHelperProps) => { @@ -80,7 +81,8 @@ const TypeHelperEl = (props: TypeHelperProps) => { updateImports, onTypeCreate, onCloseCompletions, - exprRef + exprRef, + typeHelperContext } = props; const { rpcClient } = useRpcContext(); @@ -97,57 +99,55 @@ const TypeHelperEl = (props: TypeHelperProps) => { const fetchedInitialTypes = useRef(false); const debouncedSearchTypeHelper = useCallback( - debounce((searchText: string, isType: boolean) => { + debounce(async (searchText: string, isType: boolean) => { + if (!rpcClient) return; + if (isType && !fetchedInitialTypes.current) { - if (rpcClient) { - rpcClient - .getBIDiagramRpcClient() - .getVisibleTypes({ + try { + const isFetchingTypesForDM = valueTypeConstraint === "json"; + + const types = (typeHelperContext === "GRAPHQL_FIELD_TYPE" || typeHelperContext === "GRAPHQL_INPUT_TYPE") + ? await rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ + filePath: filePath, + context: typeHelperContext, + }) + : await rpcClient.getBIDiagramRpcClient().getVisibleTypes({ filePath: filePath, position: { line: targetLineRange.startLine.line, offset: targetLineRange.startLine.offset }, ...(valueTypeConstraint && { typeConstraint: valueTypeConstraint }) - }) - .then((types) => { - const isFetchingTypesForDM = valueTypeConstraint === "json"; - const basicTypes = getTypes(types, isFetchingTypesForDM); - setBasicTypes(basicTypes); - setFilteredBasicTypes(basicTypes); - fetchedInitialTypes.current = true; - - /* Get imported types */ - rpcClient - .getBIDiagramRpcClient() - .search({ - filePath: filePath, - position: targetLineRange, - queryMap: { - q: '', - offset: 0, - limit: 1000 - }, - searchKind: 'TYPE' - }) - .then((response) => { - const importedTypes = getImportedTypes(response.categories); - setImportedTypes(importedTypes); - }) - .finally(() => { - setLoading(false); - }); - }) - .catch((error) => { - console.error(error); - setLoading(false); }); + + const basicTypes = getTypes(types, isFetchingTypesForDM); + setBasicTypes(basicTypes); + setFilteredBasicTypes(basicTypes); + fetchedInitialTypes.current = true; + + const searchResponse = await rpcClient.getBIDiagramRpcClient().search({ + filePath: filePath, + position: targetLineRange, + queryMap: { + q: '', + offset: 0, + limit: 1000 + }, + searchKind: 'TYPE' + }); + + const importedTypes = getImportedTypes(searchResponse.categories); + setImportedTypes(importedTypes); + } catch (error) { + console.error(error); + } finally { + setLoading(false); } } else if (isType) { setFilteredBasicTypes(filterTypes(basicTypes, searchText)); - rpcClient - .getBIDiagramRpcClient() - .search({ + + try { + const response = await rpcClient.getBIDiagramRpcClient().search({ filePath: filePath, position: targetLineRange, queryMap: { @@ -156,20 +156,21 @@ const TypeHelperEl = (props: TypeHelperProps) => { limit: 1000 }, searchKind: 'TYPE' - }) - .then((response) => { - const importedTypes = getImportedTypes(response.categories); - setImportedTypes(importedTypes); - }) - .finally(() => { - setLoading(false); }); + + const importedTypes = getImportedTypes(response.categories); + setImportedTypes(importedTypes); + } catch (error) { + console.error(error); + } finally { + setLoading(false); + } } else { setFilteredOperators(filterOperators(TYPE_HELPER_OPERATORS, searchText)); setLoading(false); } }, 150), - [basicTypes, filePath, targetLineRange] + [basicTypes, filePath, targetLineRange, valueTypeConstraint, typeHelperContext, rpcClient] ); const handleSearchTypeHelper = useCallback( From e3dfd3ca8aae3318cf70921b5ee0a37b9f0ea564 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 8 Oct 2025 08:59:37 +0530 Subject: [PATCH 120/730] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/views/BI/AIChatAgent/AIChatAgentWizard.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index f8e0be31cf4..edb5ae7e818 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -163,6 +163,12 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const newServiceArtifact = serviceSourceCodeResult.artifacts.find(artifact => artifact.isNew); + if (!newServiceArtifact) { + // Handle the error gracefully. You can show a message, log, or return early. + // For now, we simply return early. + console.error("No new service artifact found."); + return; + } rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { From 028c47a1012424de42fdc50448edac40ca88ce48 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Wed, 8 Oct 2025 09:42:04 +0530 Subject: [PATCH 121/730] Add legacy expression handling in FormGenerator component --- .../src/components/Form/FormGenerator.tsx | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx b/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx index 67979feb0fe..95781252ccb 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx @@ -1112,6 +1112,24 @@ export function FormGenerator(props: FormGeneratorProps) { ); case 'expressionTextArea': + const isValLegacyExpression = isLegacyExpression(element.expressionType, isLegacyExpressionEnabled, field); + if (isValLegacyExpression) { + return ( + { + field.onChange(e.target.value); + }} + /> + ) + } return (
{generatedFormDetails && visibleDetails[element.name] && generatedFormDetails[element.name] !== getValues(element.name) && ( - { - if (generatedFormDetails) { - field.onChange(generatedFormDetails[element.name]); - setVisibleDetails((prev) => ({ ...prev, [element.name]: false })); - setNumberOfDifferent(numberOfDifferent - 1); - } - }} - handleOnClickClose={() => { - setIsClickedDropDown(false); - setIsGenerating(false); + { + if (generatedFormDetails) { + field.onChange(generatedFormDetails[element.name]); setVisibleDetails((prev) => ({ ...prev, [element.name]: false })); setNumberOfDifferent(numberOfDifferent - 1); - }} - /> - )} + } + }} + handleOnClickClose={() => { + setIsClickedDropDown(false); + setIsGenerating(false); + setVisibleDetails((prev) => ({ ...prev, [element.name]: false })); + setNumberOfDifferent(numberOfDifferent - 1); + }} + /> + )}
); case 'popUp': From 7e9c11c1eceffd1be0bf9ad4d81436c017fb28cd Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Wed, 8 Oct 2025 10:33:08 +0530 Subject: [PATCH 122/730] Refactor state machine types: replace ModuleInfo with ArtifactInfo and clean up formatting --- .../ballerina-core/src/state-machine-types.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 4c301133f41..851a503f6d1 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -22,7 +22,6 @@ import { Command } from "./interfaces/ai-panel"; import { LinePosition } from "./interfaces/common"; import { Type } from "./interfaces/extended-lang-client"; import { CodeData, DIRECTORY_MAP, ProjectStructureArtifactResponse, ProjectStructureResponse } from "./interfaces/bi"; -import { ModuleInfo } from "./interfaces/data-mapper"; import { DiagnosticEntry, TestGeneratorIntermediaryState, DocumentationGeneratorIntermediaryState } from "./rpc-types/ai-panel/interfaces"; export type MachineStateValue = @@ -141,7 +140,14 @@ export interface VisualizerLocation { moduleName?: string; version?: string; dataMapperMetadata?: DataMapperMetadata; - artifactInfo?: ModuleInfo; + artifactInfo?: ArtifactInfo; +} + +export interface ArtifactInfo { + org?: string; + packageName?: string; + moduleName?: string; + version?: string; } export interface ArtifactData { @@ -276,11 +282,11 @@ export type AIMachineEventMap = { [AIMachineEventType.AUTH_WITH_API_KEY]: undefined; [AIMachineEventType.SUBMIT_API_KEY]: { apiKey: string }; [AIMachineEventType.AUTH_WITH_AWS_BEDROCK]: undefined; - [AIMachineEventType.SUBMIT_AWS_CREDENTIALS]: { - accessKeyId: string; - secretAccessKey: string; - region: string; - sessionToken?: string; + [AIMachineEventType.SUBMIT_AWS_CREDENTIALS]: { + accessKeyId: string; + secretAccessKey: string; + region: string; + sessionToken?: string; }; [AIMachineEventType.LOGOUT]: undefined; [AIMachineEventType.SILENT_LOGOUT]: undefined; From 042f11e34920ee34f4c1249a0d5467c9f357e10b Mon Sep 17 00:00:00 2001 From: Tharindu Jayathilake Date: Wed, 8 Oct 2025 10:51:00 +0530 Subject: [PATCH 123/730] Update workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx b/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx index 95781252ccb..84741675b74 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/FormGenerator.tsx @@ -1128,7 +1128,7 @@ export function FormGenerator(props: FormGeneratorProps) { field.onChange(e.target.value); }} /> - ) + ); } return (
From 08e09c9353616cd820610c07e871f07ee8cc223f Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Wed, 8 Oct 2025 11:18:08 +0530 Subject: [PATCH 124/730] Refactor ServiceDesigner component: streamline styling and improve layout for service metadata display --- .../src/views/BI/ServiceDesigner/index.tsx | 238 ++++++------------ 1 file changed, 83 insertions(+), 155 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index e38bb71752c..3062bcd8657 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -79,86 +79,72 @@ const HeaderContainer = styled.div` justify-content: space-between; `; -const ServiceMetadataContainer = styled.div` - padding: 15px; - border-bottom: 1px solid var(--vscode-editorIndentGuide-background); +const ActionGroup = styled.div` display: flex; - gap: 20px; + gap: 12px; + align-items: center; `; -const ListenerSection = styled.div` +const ServiceMetadataContainer = styled.div` + padding: 12px 15px; + border-bottom: 1px solid var(--vscode-editorWidget-border); display: flex; flex-direction: column; - gap: 10px; - flex: 3; + gap: 8px; + background: var(--vscode-editor-background); `; -const ListenerHeader = styled.div` +const MetadataRow = styled.div` display: flex; - flex-direction: column; - gap: 4px; + align-items: center; + gap: 16px; + flex-wrap: wrap; `; -const ListenerContent = styled.div` - display: flex; - align-items: center; - gap: 15px; - margin-top: 10px; +const MetadataLabel = styled.span` + font-size: 12px; + color: var(--vscode-descriptionForeground); + font-weight: 500; + min-width: 60px; `; -const ListenerItem = styled.div` - display: flex; +const ListenerBadge = styled.div` + display: inline-flex; align-items: center; - gap: 10px; - padding: 8px 12px; - background-color: var(--vscode-editor-background); - transition: all 0.2s ease; - - &:hover .listener-icon { - border-color: var(--vscode-focusBorder); - } - - &:hover .listener-text { - color: var(--vscode-focusBorder); + gap: 4px; + padding: 2px 7px; + background: var(--vscode-editorWidget-background, #f3f3f3); + color: var(--vscode-descriptionForeground, #888); + border-radius: 10px; + font-weight: 400; + cursor: pointer; + transition: background 0.12s; + + &:hover { + background: var(--vscode-editorWidget-border, #e0e0e0); + transform: none; } `; -const ListenerIcon = styled.div` - width: 48px; - height: 48px; - background-color: var(--vscode-editor-background); - display: flex; +const PropertyInline = styled.div` + display: inline-flex; align-items: center; - justify-content: center; - border-radius: 50%; - border: 1px solid var(--vscode-editorIndentGuide-background); - transition: border-color 0.2s ease; -`; - -const PropertiesSection = styled.div` - display: flex; - flex-direction: column; - gap: 12px; - flex: 2; - padding-left: 20px; - border-left: 1px solid var(--vscode-editorIndentGuide-background); -`; - -const PropertyItem = styled.div` - display: flex; - flex-direction: column; gap: 6px; - padding: 12px 16px; - background-color: var(--vscode-input-background); + padding: 3px 8px; + background: var(--vscode-input-background); border: 1px solid var(--vscode-editorWidget-border); - border-radius: 6px; + border-radius: 4px; + font-size: 11px; `; -const PropertyLabel = styled.div` - display: flex; - align-items: center; - gap: 8px; - margin-bottom: 4px; +const PropertyKey = styled.span` + color: var(--vscode-descriptionForeground); + font-weight: 500; +`; + +const PropertyValue = styled.span` + color: var(--vscode-input-foreground); + font-family: var(--vscode-editor-font-family); `; const EmptyReadmeContainer = styled.div` @@ -174,17 +160,6 @@ const Description = styled(Typography)` color: var(--vscode-descriptionForeground); `; -const PropertyValue = styled.div` - display: flex; - align-items: center; - padding: 4px 8px; - background-color: var(--vscode-editor-background); - border-radius: 4px; - border: 1px solid var(--vscode-editorIndentGuide-background); - font-family: var(--vscode-editor-font-family); - font-size: 13px; -`; - interface ServiceDesignerProps { filePath: string; position: NodePosition; @@ -324,14 +299,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { }); } - if (service.moduleName === "http" && !service.properties.hasOwnProperty('serviceTypeName')) { - options.push({ - title: "Add Resource", - description: "Add a new resource endpoint to the service", - value: ADD_HTTP_RESOURCE - }); - } - if (!hasInitMethod) { options.push({ title: "Add Init Function", @@ -651,45 +618,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { }) .length; - const ListenerList = () => { - const listenerLabel = listeners.length > 1 ? "Listeners" : "Listener"; - return ( - <> - - - {listenerLabel} - - - {listenerLabel} connected to the service - - - - { - listeners.map((listener, index) => ( - handleOpenListener(listener)} - style={{ cursor: 'pointer' }} - > - - - - - {listener} - - - - )) - } - - - ); - } - return ( @@ -702,7 +630,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { serviceModel && ( <> @@ -715,16 +643,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { - {/* */} - {/* { - !haveServiceTypeName && ( - - ) - } */} ) } @@ -742,33 +660,43 @@ export function ServiceDesigner(props: ServiceDesignerProps) { /> - {/* Listing Listener and Service Configurations */} - - - - - {readonlyProperties.size > 0 && ( - - { - Array.from(readonlyProperties).map(prop => ( - - - - - {prop.label} - - + {/* Service Metadata - Compact View */} + {(listeners.length > 0 || readonlyProperties.size > 0) && ( + + {listeners.length > 0 && ( + + Listeners: + {listeners.map((listener, index) => ( + handleOpenListener(listener)} + > + + {listener} + + ))} + + )} + {readonlyProperties.size > 0 && ( + + Service Details: + {Array.from(readonlyProperties).map(prop => ( + + + {prop.label}: - - {Array.isArray(prop.value) ? prop.value.join(", ") : prop.value} - + {Array.isArray(prop.value) ? prop.value.join(", ") : prop.value} - - )) - } - - )} - + + ))} + + )} + + )} {/* Listing Resources in HTTP */} {isHttpService && ( @@ -777,7 +705,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { title="Resources" subtitle={`${resourcesCount === 0 ? `` : 'Define how the service responds to HTTP requests'}`} > -
+ {resources.length > 10 && ( )} @@ -786,7 +714,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { Resource )} -
+ {resources From f61991f2e89ec5d0e59e4ccb4cf2d2604c1b60c7 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Wed, 8 Oct 2025 11:19:26 +0530 Subject: [PATCH 125/730] Update the assitant messages according to the newest vercel SDK --- .../src/features/ai/service/code/code.ts | 53 +++++++++++-------- .../ai/service/libs/text_editor_tool.ts | 8 +-- .../views/AIPanel/components/AIChat/index.tsx | 22 ++++---- 3 files changed, 46 insertions(+), 37 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 85bed7fced1..92f2b093ce6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -465,8 +465,8 @@ export async function repairCodeCore( } export async function repairCode(params: RepairParams, libraryDescriptions: string): Promise { - const messages: ModelMessage[] = [...params.previousMessages]; - const lastMessage = messages[messages.length - 1]; + const allMessages: ModelMessage[] = [...params.previousMessages]; + const lastMessage = allMessages[allMessages.length - 1]; let isToolCallExistInLastMessage = false; let lastMessageToolCallInfo = {toolName: "", toolCallId: ""}; @@ -480,35 +480,42 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri } } - const allMessages: ModelMessage[] = [ - ...params.previousMessages, - !isToolCallExistInLastMessage? { - role: "assistant", - content: [ - { - type: "text", - text: params.assistantResponse - } - ] - }: { + const userRepairMessage: ModelMessage = { + role: "user", + content: + "Generated code returns the following compiler errors. Using the library details from the `LibraryProviderTool` results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + + "Fix the compiler errors using the `str_replace_based_edit_tool` tool to make surgical, targeted edits to the existing code. Use the tool's edit operations to precisely replace only the erroneous sections rather than regenerating entire code blocks.. \n Errors: \n " + + params.diagnostics.map((d) => d.message).join("\n"), + } + + if (isToolCallExistInLastMessage) { + allMessages.push({ role: "tool", content: [ { type: "tool-result", toolName: lastMessageToolCallInfo?.toolName as string || "PreviousAssistantMessageCall", - result: params.assistantResponse, + output: { + type: "text", + value: "Tool call executed successfully" + }, toolCallId: lastMessageToolCallInfo?.toolCallId as string || "PreviousAssistantMessageCallId" } ] - }, - { - role: "user", - content: - "Generated code returns the following compiler errors. Using the library details from the LibraryProviderTool results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + - "Fix the compiler errors using the `str_replace_based_edit_tool` tool to make surgical, targeted edits to the existing code. Use the tool's edit operations to precisely replace only the erroneous sections rather than regenerating entire code blocks.. \n Errors: \n " + - params.diagnostics.map((d) => d.message).join("\n"), - }, - ]; + }); + } + + allMessages.push({ + role: "assistant", + content: [ + { + type: "text", + text: params.assistantResponse + } + ] + }); + + allMessages.push(userRepairMessage); let updatedSourceFiles: SourceFiles[] = getProjectFromResponse(params.assistantResponse).sourceFiles; let updatedFileNames: string[] = []; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index 712ee82bea2..3f24b744d9f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -237,7 +237,7 @@ function handleViewCommand( return { success: true, - message: `Viewing entire file ${filePath}).`, + message: `Viewing entire file ${filePath}).\n Content: ${content}`, content }; } @@ -268,7 +268,7 @@ function handleRangedView( return { success: true, - message: `Viewing lines ${start}-${actualEnd} of ${filePath}.`, + message: `Viewing lines ${start}-${actualEnd} of ${filePath}.\n Content: ${rangedContent}`, content: rangedContent }; } @@ -297,7 +297,7 @@ function handleCreateCommand( return { success: true, - message: `Successfully created file '${filePath}'.).` + message: `Successfully created file '${filePath}' with ${fileText.split('\n').length} lines.` }; } @@ -579,7 +579,7 @@ export function handleTextEditorCommands( if (!pathValidation.valid) { return { success: false, - message: `Invalid file path: ${pathValidation.error}`, + message: `Invalid file path: ${pathValidation.error}, Please provide a valid filepath within the workspace.`, error: `Error: ${ErrorMessages.INVALID_PATH}` }; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index f27b4f2ac8d..f5dd498f5dc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -300,17 +300,19 @@ const AIChat: React.FC = () => { return newMessages; }); } else if (type === "tool_result") { + if (response.toolName == "LibraryProviderTool") { const libraryNames = response.libraryNames; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content = newMessages[newMessages.length - 1].content.replace( - `Analyzing request & selecting libraries...`, - `Fetched libraries: [${libraryNames.join(", ")}]` - ); - } - return newMessages; - }); + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content = newMessages[newMessages.length - 1].content.replace( + `Analyzing request & selecting libraries...`, + `Fetched libraries: [${libraryNames.join(", ")}]` + ); + } + return newMessages; + }); + } } else if (type === "intermediary_state") { const state = response.state; // Check if it's a documentation state by looking for specific properties From 621ff14a209f5419fc71b54761e0c7e397ca579c Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Wed, 8 Oct 2025 11:25:10 +0530 Subject: [PATCH 126/730] Fix windows powershell constraints --- .../resources/maven-wrapper/mvnw.cmd | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/workspaces/mi/mi-extension/resources/maven-wrapper/mvnw.cmd b/workspaces/mi/mi-extension/resources/maven-wrapper/mvnw.cmd index 1204076a90a..c518fe9faa8 100644 --- a/workspaces/mi/mi-extension/resources/maven-wrapper/mvnw.cmd +++ b/workspaces/mi/mi-extension/resources/maven-wrapper/mvnw.cmd @@ -140,13 +140,36 @@ if exist %WRAPPER_JAR% ( echo Downloading from: %WRAPPER_URL% ) - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" + @setlocal EnableDelayedExpansion + + @REM Check whether Constraint Language Mode is enabled + for /f "usebackq delims=" %%A in (`powershell -Command + "if ($ExecutionContext.SessionState.LanguageMode -eq 'ConstrainedLanguage') { Write-Output 'true' } else { Write-Output 'false' }"`) do ( + set "IS_CONSTRAINED=%%A" + ) + if /i "!IS_CONSTRAINED!"=="true" ( + echo [WARN] PowerShell download failed, trying curl... + IF NOT "%MVNW_USERNAME%"=="" ( + curl -L -u "%MVNW_USERNAME%:%MVNW_PASSWORD%" -o "%WRAPPER_JAR%" "%WRAPPER_URL%" + ) ELSE ( + curl -L -o "%WRAPPER_JAR%" "%WRAPPER_URL%" + ) + IF %ERRORLEVEL% NEQ 0 ( + echo [ERROR] Failed to download %WRAPPER_JAR% using curl. + exit /b 1 + ) + ) else ( + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + ) + + @endlocal + if "%MVNW_VERBOSE%" == "true" ( echo Finished downloading %WRAPPER_JAR% ) @@ -204,3 +227,4 @@ if "%MAVEN_BATCH_PAUSE%"=="on" pause if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% cmd /C exit /B %ERROR_CODE% + From 032dd1f2d63eb86167dfbd0c625c36c270b5e001 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Wed, 8 Oct 2025 13:44:30 +0530 Subject: [PATCH 127/730] Update user prompt for error handling --- .../src/features/ai/service/code/code.ts | 21 ++- .../test/ai/evals/code/test-cases.ts | 27 ++- .../Ballerina.toml | 4 + .../configurations.bal | 29 ++++ .../functions.bal | 161 ++++++++++++++++++ .../main.bal | 48 ++++++ .../service.bal | 65 +++++++ .../types.bal | 114 +++++++++++++ 8 files changed, 463 insertions(+), 6 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/Ballerina.toml create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/configurations.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/functions.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/main.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/service.bal create mode 100644 workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/types.bal diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 92f2b093ce6..85e9dd84f1f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -482,10 +482,23 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri const userRepairMessage: ModelMessage = { role: "user", - content: - "Generated code returns the following compiler errors. Using the library details from the `LibraryProviderTool` results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + - "Fix the compiler errors using the `str_replace_based_edit_tool` tool to make surgical, targeted edits to the existing code. Use the tool's edit operations to precisely replace only the erroneous sections rather than regenerating entire code blocks.. \n Errors: \n " + - params.diagnostics.map((d) => d.message).join("\n"), + content: `The generated code has the following compiler errors. Follow this systematic approach to fix all issues: + + 1. **Analyze All Errors**: First, carefully review all compiler errors listed below to understand the full scope of issues across all files. + 2. **Identify Affected Files**: Determine which files contain errors by examining the error messages for file paths and locations. + 3. **Gather File Contents**: For each file that needs changes: + - First, check if the file content exists in the conversation history + - If not found in history, use **str_replace_based_edit_tool** with the 'view' operation to read the current file content + + 4. **Verify Library Information**: Before making fixes, check the context and API documentation already provided in the conversation history. Only use the **LibraryProviderTool** if additional library information is needed that wasn't covered in previous tool responses. + + 5. **Fix Each File Systematically**: Use **str_replace_based_edit_tool** to make surgical, targeted edits for the determined files: + - Process one file at a time + - For each file, make ALL necessary corrections before moving to the next file + - Use precise **str_replace** operations that target only the erroneous sections + - Double-check all functions, types, and record field access for accuracy + - Do NOT regenerate entire code blocks; only replace the specific lines that need changes + **Compiler Errors:** ${params.diagnostics.map((d) => d.message).join("\n")}`, } if (isToolCallExistInLastMessage) { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index fd38bb76ed0..4d7c5265574 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -208,8 +208,31 @@ export const testCasesForExistingProject = [ } ]; +export const testCasesForExistingSemanticErrors = [ + { + prompt: "Change the Kafka broker Url into port 8080", + projectPath: "simple_order_management_system_with_compile_errors" + }, + { + prompt: "I need to store the customer address details inside the order record", + projectPath: "simple_order_management_system_with_compile_errors" + }, + { + prompt: "I need to send an email for the customer when the order is created", + projectPath: "simple_order_management_system_with_compile_errors" + }, + { + prompt: "Please change the database as MsSQL", + projectPath: "simple_order_management_system_with_compile_errors" + }, + { + prompt: "Please add logs for the `getOrderById` function", + projectPath: "simple_order_management_system_with_compile_errors" + } +]; + export let testCases = []; testCases.push(...initialTestCases); testCases.push(...textEditSpecializedTestCases); -testCases.push(...testCasesForExistingProject); // Duplicate to increase total count for testing - +testCases.push(...testCasesForExistingProject); +testCases.push(...testCasesForExistingSemanticErrors); diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/Ballerina.toml new file mode 100644 index 00000000000..cdfe34ee006 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/Ballerina.toml @@ -0,0 +1,4 @@ +[package] +org = "wso2" +name = "bi_empty" +version = "0.1.0" diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/configurations.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/configurations.bal new file mode 100644 index 00000000000..5c02280feed --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/configurations.bal @@ -0,0 +1,29 @@ +// 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. + +// Database Configurations +configurable string DB_HOST = "localhost"; +configurable int DB_PORT = 5432; +configurable string DB_USER = "user"; +configurable string DB_PASSWORD = "password"; +configurable string DB_NAME = "order_db"; + +// Kafka Producer Configurations +configurable string KAFKA_BROKER_URL = "localhost:9092"; +configurable string KAFKA_ORDER_EVENTS_TOPIC = "order.events"; + +// Service Port +configurable int SERVICE_PORT = 9090; diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/functions.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/functions.bal new file mode 100644 index 00000000000..e0234c04288 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/functions.bal @@ -0,0 +1,161 @@ +// 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 ballerina/sql; +import ballerina/time; +import ballerina/uuid; +import ballerina/log; +import ballerina/lang.value as value; + +// --- Business Logic Functions --- + +// Orchestrates the creation of a new order. +public function createNewOrder(OrderCreatePayload payload) returns OrderCreationResponse|error { + // 1. Generate a unique order ID + string orderId = uuid:createType4AsString(); + + // 2. TODO: Call Catalog/Pricing service to get prices and calculate total. + // This would be a synchronous blocking call. For now, we mock it. + decimal totalAmount = calculateTotal(payload.orderLines); + + // 3. Persist the initial order record to the database in 'PENDING' state + sql:ExecutionResult|sql:Error dbResult = insertInitialOrder(orderId, payload, totalAmount); + + if dbResult is sql:Error { + log:println("Database error on initial order insert", dbResult); + return dbResult; + } + + // 4. Create the OrderCreated event payload + OrderCreatedEvent eventPayload = { + eventId: uuid:createType4AsString(), + timestamp: time:utcToString(time:utcNow()), + data: { + orderId: orderId, + customerId: payload.customerId, + currency: payload.currency, + totalAmount: totalAmount, + orderLines: payload.orderLines, + paymentInfo: payload.paymentInfo + } + }; + + // 5. Publish the event to Kafka to kick off the saga + error kafkaResult = publishOrderEvent(eventPayload); + + if kafkaResult is error { + log:printError("Kafka publish error", kafkaResult); + // CRITICAL: Handle this failure. Maybe move to a DLQ or retry. + // For now, we return an error. A compensating transaction to cancel the DB entry would be needed here. + return kafkaResult; + } + + return {orderId: orderId}; +} + +// Retrieves an order by its ID from the database. +public function getOrderById(string orderId) returns Order|OrderNotFoundError|error { + int query = `SELECT orderId, customerId, status, createdAt, totalAmount, currency, shippingAddress, billingAddress, orderLines FROM orders WHERE orderId = ${orderId};`; + + stream resultStream = dbClient->query(query); + + record {|OrderModel value;|}? row = check resultStream.next(); + check resultStream.close(); + + if row is () { + return error OrderNotFoundError("Order not found: " + orderId); + } + + OrderModel dbOrder = row.value; + + // Convert JSON fields back to proper types + Address shippingAddress = check value:cloneWithType(dbOrder.shippingAddress, Address); + Address billingAddress = check value:cloneWithType(dbOrder.billingAddress, Address); + OrderLine[] orderLines = check value:cloneWithType(dbOrder.orderLines); + + // Convert status string to OrderStatus + OrderStatus orderStatus = check value:ensureType(dbOrder.status, OrderStatus); + + // The data is stored as JSON in the DB, so we need to convert it back to Ballerina records. + Order finalOrder = { + orderId: dbOrder.orderId, + customerId: dbOrder.customerId, + status: orderStatus, + createdAt: dbOrder.createdAt, + totalAmount: dbOrder.totalAmount, + currency: dbOrder.currency, + shippingAddress: shippingAddress, + billingAddress: billingAddress, + orderLines: orderLines, + payments: [], // TODO: Fetch from payment service or join table + shipments: [] // TODO: Fetch from shipment service or join table + }; + + return finalOrder; +} + +// --- Database Helper Functions --- + +function insertInitialOrder(string orderId, OrderCreatePayload payload, decimal totalAmount) returns sql:ExecutionResult|sql:Error { + // NOTE: In a real system, prices would come from a pricing service. + OrderLine[] linesWithPrices = from var line in payload.orderLines + select { + lineId: uuid:createType4AsString(), + sku: line.sku, + quantity: line.quantity, + unitPrice: 99.99, // Mock price + lineTotal: 99.99 * line.quantity + }; + + json shippingAddressJson = value:toJson(payload.shippingAddress); + json billingAddressJson = value:toJson(payload.billingAddress); + json orderLinesJson = value:toJson(linesWithPrices); + + string shippingAddressStr = value:toJsonString(shippingAddressJson); + string billingAddressStr = value:toJsonString(billingAddressJson); + string orderLinesStr = value:toJsonString(orderLinesJson); + + sql:ParameterizedQuery insertQuery = `INSERT INTO orders (orderId, customerId, status, createdAt, totalAmount, currency, shippingAddress, billingAddress, orderLines) VALUES (${orderId}, ${payload.customerId}, ${"PENDING"}, ${time:utcToString(time:utcNow())}, ${totalAmount}, ${payload.currency}, ${shippingAddressStr}, ${billingAddressStr}, ${orderLinesStr});`; + + return dbClient->execute(insertQuery); +} + +// --- Kafka Helper Functions --- + +private function publishOrderEvent(OrderCreatedEvent eventPayload) returns error? { + json eventJson = value:toJson(eventPayload); + string eventString = value:toJsonString(eventJson); + + // The Kafka producer sends the message asynchronously. + // The `flush()` call ensures it's sent before the function returns. + check kafkaProducer->send({ + topic: KAFKA_ORDER_EVENTS_TOPIC, + key: eventPayload.data.orderId, + value: eventString.toBytes() + }); + + check kafkaProducer->'flush(); + log:printInfo("Published OrderCreated event to Kafka", orderId = eventPayload.data.orderId); +} + +// --- Utility and Error Types --- + +function calculateTotal(OrderLinePayload[] lines) returns decimal { + decimal total = 0.0; + foreach var line in lines { + total += 99.99 * line.quantity; // Use mocked price + } + return total; +} diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/main.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/main.bal new file mode 100644 index 00000000000..e7bee96f961 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/main.bal @@ -0,0 +1,48 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +import ballerinax/postgresql; +import ballerinax/kafka; +import ballerina/log; +import ballerina/lang.runtime as runtime; + +// Initialize the PostgreSQL client globally. +// This client manages a connection pool for efficiency. +public final postgresql:Client dbClient = check new ( + host = DB_HOST, + port = DB_PORT, + username = DB_USER, + password = DB_PASSWORD, + database = DB_NAME +); + +// Initialize the Kafka producer globally. +public final kafka:Producer kafkaProducer = check new ( + bootstrapServers = [KAFKA_BROKER_URL] +); + +public function main() { + // The service is defined in service.bal and will start automatically + // as it's attached to a listener. We just log that the service is starting. + log:printInfo("Order Service starting up...", port = SERVICE_PORT, db = DB_HOST, kafka = KAFKA_BROKER_URL); + + // Graceful shutdown hook + runtime:onGracefulStop(function () { + log:printInfo("Shutting down Order Service..."); + checkpanic kafkaProducer->close(); + checkpanic dbClient.close(); + log:printInfo("Shutdown complete."); + }); +} diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/service.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/service.bal new file mode 100644 index 00000000000..c7f82769941 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/service.bal @@ -0,0 +1,65 @@ +// 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 ballerina/http; +import ballerina/log; + +// The service is attached to a listener on the configured port. +@http:ServiceConfig { + cors: { + allowOrigins: ["https://grc.com"], + allowMethods: ["GET", "POST"] + } +} +service /v1 on new http:Listener(SERVICE_PORT) { + + // POST /v1/orders + // Creates a new order and initiates the order creation saga. + resource function post orders(@http:Payload OrderCreatePayload payload) returns OrderCreationResponse|http:InternalServerError|http:BadRequest { + // Basic validation + if payload.orderLines.length() == 0 { + log:printWarn("Create order attempt with no order lines", customerId = payload.customerId); + return {body: {message: "Order must contain at least one line item."}}; + } + + // Delegate to the business logic function + var result = createNewOrder(payload); + + if result is OrderCreationResponse { + log:printInfo("Order creation process initiated", orderId = result.orderId); + return result; + } else { + log:printError("Failed to initiate order creation", result); + return {body: {message: "An internal error occurred while creating the order."}}; + } + } + + resource function get orders/[string orderId]() returns Order|http:NotFound|http:InternalServerError { + var 'order = getOrderById(orderId); + + if 'order is Order { + return 'order; + } else if 'order is OrderNotFoundError { + log:printWarn("Order not found", orderId = orderId); + return {body: {message: string `Order with ID ${orderId} not found.`}}; + } + } +} + +public type OrderCreationResponse record {| + string orderId; + string status = "PENDING"; + string message = "Order received and is being processed."; +|}; diff --git a/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/types.bal b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/types.bal new file mode 100644 index 00000000000..8451d7afa28 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/simple_order_management_system_with_compile_errors/types.bal @@ -0,0 +1,114 @@ +// 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. + +// Represents the public-facing Order resource. +public type Order record { + string orderId; + string customerId; + OrderStatus status; + string createdAt; + decimal totalAmount; + string currency; + Address shippingAddress; + Address billingAddress; + OrderLine[] orderLines; + Payment[] payments; + var shipments; +}; + +// Represents an order as stored in the database, including internal fields. +public type OrderModel record {| + string orderId; + string customerId; + OrderStatus status; + string createdAt; + decimal totalAmount; + string currency; + json shippingAddress; + json billingAddress; + json orderLines; +|}; + +// Input payload for creating a new order. +public type OrderCreatePayload record {| + string customerId; + string currency; + Address shippingAddress; + Address billingAddress; + OrderLinePayload[] orderLines; + PaymentInfo paymentInfo; +|}; + +public type OrderLinePayload record {| + string sku; + int quantity; +|}; + +public type OrderLine record {| + string lineId; + string sku; + int quantity; + decimal unitPrice; + decimal lineTotal; +|}; + +public type Address record {| + string line1; + string? line2; + string city; + string state; + string zipCode; + string country; +|}; + +public type Payment record {| + string paymentId; + string status; + decimal amount; +|}; + +public type PaymentInfo record {| + string paymentMethodToken; + decimal amount; +|}; + +public type Shipment record {| + string shipmentId; + string trackingNumber; + string carrier; + string status; +|}; + +public type OrderStatus "PENDING"|"CONFIRMED"|"AWAITING_PAYMENT"|"FULFILLING"|"SHIPPED"|"DELIVERED"|"CANCELLED"|"RETURNED"|"FAILED"; + +// Event payloads for Kafka +public type OrderCreatedEvent record {| + string eventId; + string eventType = "OrderCreated"; + string timestamp; + OrderCreatedEventData data; +|}; + +public type OrderCreatedEventData record {| + string orderId; + string customerId; + string currency; + decimal totalAmount; + OrderLinePayload[] orderLines; + PaymentInfo paymentInfo; +|}; + +type OrderNotFoundError{}; From 1eee485bf0b2ab01ad034098e7896a3f1e2ca66f Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:15:50 +0530 Subject: [PATCH 128/730] Add triggerRefresh property to data models and update related hooks for refresh logic --- .../src/interfaces/data-mapper.ts | 2 ++ .../src/rpc-managers/data-mapper/utils.ts | 3 ++- .../ballerina-visualizer/src/Hooks.tsx | 19 ++++++++++++++++--- .../src/views/DataMapper/DataMapperView.tsx | 14 ++++++++------ .../Diagram/hooks/useDiagramModel.ts | 11 +++++++++-- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts index c19d7eb2f41..2ca3ad7339d 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts @@ -121,6 +121,7 @@ export interface ExpandedDMModel { rootViewId: string; query?: Query; mapping_fields?: Record; + triggerRefresh?: boolean; } export interface DMModel { @@ -133,6 +134,7 @@ export interface DMModel { query?: Query; focusInputs?: Record; mapping_fields?: Record; + triggerRefresh?: boolean; } export interface ModelState { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index d389d81e456..a2a9d928b6c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -517,7 +517,8 @@ export function expandDMModel( mappings: model.mappings, query: model.query, source: "", - rootViewId + rootViewId, + triggerRefresh: model.triggerRefresh }; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx index 49933195e92..45106316992 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx @@ -18,6 +18,7 @@ import { useQuery } from '@tanstack/react-query'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; import { DMViewState, LinePosition } from '@wso2/ballerina-core'; +import { useRef } from 'react'; export const useDataMapperModel = ( filePath: string, @@ -28,6 +29,8 @@ export const useDataMapperModel = ( const viewId = viewState?.viewId; const codedata = viewState?.codedata; + const triggerRefresh = useRef(false); + const getDMModel = async () => { try { const modelParams = { @@ -43,6 +46,11 @@ export const useDataMapperModel = ( .getDataMapperRpcClient() .getDataMapperModel(modelParams); + if (triggerRefresh.current) { + res.mappingsModel.triggerRefresh = true; + triggerRefresh.current = false; + } + console.log('>>> [Data Mapper] Model:', res); return res.mappingsModel; } catch (error) { @@ -57,10 +65,15 @@ export const useDataMapperModel = ( isError, refetch } = useQuery({ - queryKey: ['getDMModel', { codedata, viewId }], - queryFn: () => getDMModel(), + queryKey: ['getDMModel', codedata, viewId], + queryFn: getDMModel, networkMode: 'always' }); - return {model, isFetching, isError, refetch}; + const refreshDMModel = async () => { + triggerRefresh.current = true; + await refetch(); + }; + + return {model, isFetching, isError, refreshDMModel}; }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index c1dc9b02502..5c5e460c019 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -93,7 +93,7 @@ export function DataMapperView(props: DataMapperProps) { model, isFetching, isError, - refetch + refreshDMModel } = useDataMapperModel(filePath, viewState, position); const prevPositionRef = useRef(position); @@ -120,10 +120,12 @@ export function DataMapperView(props: DataMapperProps) { const currentSignature = JSON.stringify(getModelSignature(model)); const prevSignature = prevSignatureRef.current; - const hasInputsChanged = hasSignatureChanged(currentSignature, prevSignature, 'inputs'); - const hasOutputChanged = hasSignatureChanged(currentSignature, prevSignature, 'output'); - const hasSubMappingsChanged = hasSignatureChanged(currentSignature, prevSignature, 'subMappings'); - const hasRefsChanged = hasSignatureChanged(currentSignature, prevSignature, 'refs'); + const triggerRefresh = model.triggerRefresh; + + const hasInputsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'inputs'); + const hasOutputChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'output'); + const hasSubMappingsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'subMappings'); + const hasRefsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'refs'); // Check if it's already an ExpandedDMModel const isExpandedModel = !('refs' in model); @@ -538,7 +540,7 @@ export function DataMapperView(props: DataMapperProps) { } catch (error) { console.error(error); } - await refetch(); + await refreshDMModel(); }; const onDMReset = async () => { diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts index 7473744a1d0..bd55c1c72ab 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/hooks/useDiagramModel.ts @@ -26,12 +26,13 @@ import { useDMSearchStore } from "../../../store/store"; import { InputNode } from "../Node"; import { getErrorKind } from "../utils/common-utils"; import { OverlayLayerModel } from "../OverlayLayer/OverlayLayerModel"; +import { useEffect } from "react"; export const useDiagramModel = ( nodes: DataMapperNodeModel[], diagramModel: DiagramModel, onError:(kind: ErrorNodeKind) => void, - zoomLevel: number, + zoomLevel: number ): { updatedModel: DiagramModel; isFetching: boolean; @@ -86,7 +87,7 @@ export const useDiagramModel = ( data: updatedModel, isFetching, isError, - refetch, + refetch } = useQuery({ queryKey: [ 'diagramModel', @@ -103,5 +104,11 @@ export const useDiagramModel = ( networkMode: 'always', }); + useEffect(() => { + if (model?.triggerRefresh) { + refetch(); + } + }, [model, refetch]); + return { updatedModel, isFetching, isError, refetch }; }; From 7c21a91e97b4dbcbe9fc27f350cd84b6fddc71c2 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:25:39 +0530 Subject: [PATCH 129/730] Change initPorts method signature to return a Promise for asynchronous initialization --- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index d409fef383e..d25ed83eae0 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -93,7 +93,7 @@ export abstract class DataMapperNodeModel extends NodeModel; abstract initLinks(): void; protected async addPortsForInputField(attributes: InputPortAttributes): Promise { From ca498d2b2baf497b876e3cc71768e8b7f56834f5 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:34:55 +0530 Subject: [PATCH 130/730] Refactor code formatting for consistency in Hooks and DataMapperView components --- workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx | 2 +- .../src/views/DataMapper/DataMapperView.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx index 45106316992..e05b886b71d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/Hooks.tsx @@ -75,5 +75,5 @@ export const useDataMapperModel = ( await refetch(); }; - return {model, isFetching, isError, refreshDMModel}; + return { model, isFetching, isError, refreshDMModel }; }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx index 5c5e460c019..2e8709072a7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/DataMapperView.tsx @@ -122,7 +122,7 @@ export function DataMapperView(props: DataMapperProps) { const triggerRefresh = model.triggerRefresh; - const hasInputsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'inputs'); + const hasInputsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'inputs'); const hasOutputChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'output'); const hasSubMappingsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'subMappings'); const hasRefsChanged = triggerRefresh || hasSignatureChanged(currentSignature, prevSignature, 'refs'); From 6fd9ba46dfc38c3252c204db3a8774acb61e0d43 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Wed, 8 Oct 2025 14:38:58 +0530 Subject: [PATCH 131/730] Update initPorts method signature to allow both Promise and void return types --- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index d25ed83eae0..4912f5006b3 100644 --- a/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -93,7 +93,7 @@ export abstract class DataMapperNodeModel extends NodeModel; + abstract initPorts(): Promise | void; abstract initLinks(): void; protected async addPortsForInputField(attributes: InputPortAttributes): Promise { From 08914d325b771a8a8b26bd36711e6559349e82d3 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Wed, 8 Oct 2025 14:55:18 +0530 Subject: [PATCH 132/730] Add ServiceConfigureView component --- .../ballerina-visualizer/src/MainPanel.tsx | 3 +- .../BI/ServiceDesigner/ListenerEditView.tsx | 4 +- .../ServiceDesigner/ServiceConfigureView.tsx | 357 ++++++++++++++++++ .../BI/ServiceDesigner/ServiceEditView.tsx | 4 +- .../src/views/BI/ServiceDesigner/index.tsx | 18 +- 5 files changed, 372 insertions(+), 14 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 85b53f591f1..6acd9238362 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -78,6 +78,7 @@ import { DataMapper } from "./views/DataMapper"; import { ImportIntegration } from "./views/BI/ImportIntegration"; import { ServiceCreationView } from "./views/BI/ServiceDesigner/ServiceCreationView"; import Popup from "./components/Popup"; +import ServiceConfigureView from "./views/BI/ServiceDesigner/ServiceConfigureView"; const globalStyles = css` *, @@ -466,7 +467,7 @@ const MainPanel = () => { ); break; case MACHINE_VIEW.BIServiceConfigView: - setViewComponent(); + setViewComponent(); break; case MACHINE_VIEW.BIServiceClassConfigView: setViewComponent( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ListenerEditView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ListenerEditView.tsx index 9c99d7e6727..b1eac621568 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ListenerEditView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ListenerEditView.tsx @@ -108,8 +108,8 @@ export function ListenerEditView(props: ListenerEditViewProps) { return ( - - + {/* + */} {!listenerModel && diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx new file mode 100644 index 00000000000..b0ff33299ff --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx @@ -0,0 +1,357 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useState, useCallback, useMemo, useRef } from "react"; +import styled from "@emotion/styled"; +import { ConfigVariable, DIRECTORY_MAP, FunctionModel, getConfigVariables, LineRange, NodePosition, ProjectStructureArtifactResponse, ServiceModel } from "@wso2/ballerina-core"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { Button, Codicon, ErrorBanner, Icon, SplitView, TextField, Tooltip, TreeView, TreeViewItem, Typography, View, ViewContent } from "@wso2/ui-toolkit"; +import { TopNavigationBar } from "../../../components/TopNavigationBar"; +import { TitleBar } from "../../../components/TitleBar"; +import { DropdownOptionProps } from "./components/AddServiceElementDropdown"; +import ServiceConfigForm from "./Forms/ServiceConfigForm"; +import ListenerConfigForm from "./Forms/ListenerConfigForm"; +import { ListenerEditView } from "./ListenerEditView"; +import { ServiceEditView } from "./ServiceEditView"; +import { LoadingContainer } from "../../styles"; +import { LoadingRing } from "../../../components/Loader"; + +const Container = styled.div` + width: 100%; + padding: 10px 0px 10px 8px; + height: calc(100vh - 220px); + overflow-y: auto; +`; + +const SearchStyle = { + width: '100%', + + '& > vscode-text-field': { + width: '100%', + borderRadius: '5px' + }, +}; + +const EmptyReadmeContainer = styled.div` + display: flex; + margin: 80px 0px; + flex-direction: column; + align-items: center; + gap: 8px; + height: 100%; +`; + +const Description = styled(Typography)` + color: var(--vscode-descriptionForeground); +`; + +const TitleBoxShadow = styled.div` + box-shadow: var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset; + height: 3px; +`; + +const TitleContent = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +`; + +const SearchContainer = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; + gap: 40px; +`; + +const searchIcon = (); + +export interface ServiceConfigureProps { + filePath: string; + position: NodePosition; + listenerName?: string; +} + +interface CategoryWithModules { + name: string; + modules: string[]; +} + +type ConfigVariablesState = { + [category: string]: { + [module: string]: ConfigVariable[]; + }; +}; + +interface ReadonlyProperty { + label: string; + value: string | string[]; +} + +const Overlay = styled.div` + position: fixed; + width: 100vw; + height: 100vh; + background: var(--vscode-settings-rowHoverBackground); + z-index: 1000; +`; + +export function ServiceConfigureView(props: ServiceConfigureProps) { + + const { rpcClient } = useRpcContext(); + const [serviceModel, setServiceModel] = useState(undefined); + + const [listenerPosition, setListenerPosition] = useState<{ filePath: string, position: NodePosition }>(undefined); + const [projectListeners, setProjectListeners] = useState([]); + + const [listeners, setListeners] = useState([]); + + const [selectedListener, setSelectedListener] = useState(props.listenerName || ""); + + const [tabView, setTabView] = useState<"service" | "listener">(props.listenerName ? "listener" : "service"); + + useEffect(() => { + fetchService(props.position); + }, []); + + useEffect(() => { + if (props.listenerName) { + handleListenerSelect(props.listenerName); + } + }, [projectListeners]); + + + const handleListenerSelect = (listener: string) => { + setSelectedListener(listener); + setTabView("listener"); + + const selectedListener = projectListeners.find(l => l.name === listener); + if (selectedListener) { + setListenerPosition({ filePath: selectedListener.path, position: selectedListener.position }); + } + }; + const handleOnServiceSelect = () => { + setTabView("service"); + }; + + const fetchService = (targetPosition: NodePosition) => { + const lineRange: LineRange = { + startLine: { line: targetPosition.startLine, offset: targetPosition.startColumn }, + endLine: { line: targetPosition.endLine, offset: targetPosition.endColumn }, + }; + try { + rpcClient + .getServiceDesignerRpcClient() + .getServiceModelFromCode({ filePath: props.filePath, codedata: { lineRange } }) + .then((res) => { + console.log("Service Model: ", res.service); + setServiceModel(res.service); + setServiceMetaInfo(res.service); + getProjectListeners(); + }); + } catch (error) { + console.log("Error fetching service model: ", error); + } + }; + + const setServiceMetaInfo = (service: ServiceModel) => { + if (service?.properties?.listener) { + const listenerProperty = service.properties.listener; + if (listenerProperty.values && listenerProperty.values.length > 0) { + setListeners(listenerProperty.values); + } else if (listenerProperty.value) { + setListeners([listenerProperty.value]); + } + } + } + + const getProjectListeners = () => { + rpcClient + .getBIDiagramRpcClient() + .getProjectStructure() + .then((res) => { + const listeners = res.directoryMap[DIRECTORY_MAP.LISTENER]; + if (listeners.length > 0) { + setProjectListeners(listeners); + } + }); + }; + + return ( + + + {!serviceModel && ( + + + + )} + { + serviceModel && ( + <> + + +
+
+ + {/* Left side tree view */} +
+ + {serviceModel.name} + + + {/* Group all the listeners under "Service listeners" */} + {listeners.length > 0 && ( + + + Service listeners + +
+ } + > + {/* Map all the listeners */} + {listeners + .map((listener, index) => ( + +
{ + e.stopPropagation(); + handleListenerSelect(listener); + }} + > + + {listener} + +
+
+ ))} + + )} +
+ {/* Right side view */} +
+ <> +
+ + + {tabView === "service" ? serviceModel.name : selectedListener} + + + +
+ + <> + {tabView === "service" && !serviceModel && ( + + + + )} + {tabView === "listener" && !listenerPosition && ( + + + + )} + {tabView === "service" && serviceModel && ( + + )} + {tabView === "listener" && listenerPosition && ( + + )} + + + +
+ +
+
+ + + + )} + + ); +} + +export default ServiceConfigureView; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceEditView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceEditView.tsx index c298f68871e..c36bdb2eac6 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceEditView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceEditView.tsx @@ -143,8 +143,8 @@ export function ServiceEditView(props: ServiceEditViewProps) { return ( - - + {/* + */} {!serviceModel && diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 3062bcd8657..0d63d86a8a1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -340,13 +340,13 @@ export function ServiceDesigner(props: ServiceDesignerProps) { }; const handleOpenListener = (value: string) => { - const listenerValue = projectListeners.find((listener) => listener.name === value); rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { - view: MACHINE_VIEW.BIListenerConfigView, - position: listenerValue.position, - documentUri: listenerValue.path, + view: MACHINE_VIEW.BIServiceConfigView, + position: position, + documentUri: filePath, + identifier: value, }, }); }; @@ -667,7 +667,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { Listeners: {listeners.map((listener, index) => ( - handleOpenListener(listener)} > @@ -682,10 +682,10 @@ export function ServiceDesigner(props: ServiceDesignerProps) { Service Details: {Array.from(readonlyProperties).map(prop => ( - {prop.label}: From ff8bce8a99ef2f0f1ffbe1c5dfbba3859f3c2373 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 8 Oct 2025 15:15:56 +0530 Subject: [PATCH 133/730] Change the sugggestions plane RPC call and remove imported types from graphql --- .../src/components/Form/types.ts | 3 +- .../src/components/editors/TypeEditor.tsx | 5 +- .../ballerina-visualizer/src/constants.ts | 6 +++ .../views/BI/Forms/FormGeneratorNew/index.tsx | 53 +++++++++++++------ .../ResourceResponse/ResponseEditor.tsx | 4 +- .../src/views/BI/TypeHelper/index.tsx | 32 ++++++----- 6 files changed, 69 insertions(+), 34 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts index e2222fe028f..0845184c69a 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/types.ts @@ -136,7 +136,8 @@ type FormTypeConditionalProps = { value: string, cursorPosition: number, fetchReferenceTypes: boolean, - valueTypeConstraint: string + valueTypeConstraint: string, + fieldKey?: string ) => Promise; getTypeHelper: ( fieldKey: string, diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx index 435546ea077..bf32e20c35b 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx @@ -122,7 +122,7 @@ export function TypeEditor(props: TypeEditorProps) { setFocused(true); // Trigger actions on focus await onFocus?.(); - await retrieveVisibleTypes(value, value.length, true, field.valueTypeConstraint as string); + await retrieveVisibleTypes(value, value.length, true, field.valueTypeConstraint as string, field.key); handleOnFieldFocus?.(field.key); }; @@ -282,7 +282,8 @@ export function TypeEditor(props: TypeEditorProps) { updatedValue, updatedCursorPosition, false, - field.valueTypeConstraint as string + field.valueTypeConstraint as string, + field.key ); }} onCompletionSelect={handleCompletionSelect} diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index e1a7a4bf755..bd6cf27a057 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -29,6 +29,12 @@ export const BALLERINAX = "ballerinax"; export const AI = "ai"; +export enum TypeHelperContext { + GRAPHQL_FIELD_TYPE = 'GRAPHQL_FIELD_TYPE', + GRAPHQL_INPUT_TYPE = 'GRAPHQL_INPUT_TYPE', + HTTP_STATUS_CODE = 'HTTP_STATUS_CODE', +} + export const GET_DEFAULT_MODEL_PROVIDER = "getDefaultModelProvider"; export const WSO2_MODEL_PROVIDER = "Default Model Provider (WSO2)"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx index fd161616ada..fe7833ea251 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx @@ -61,13 +61,12 @@ import { import { debounce } from "lodash"; import { FormTypeEditor } from "../../TypeEditor"; import { getTypeHelper } from "../../TypeHelper"; -import { EXPRESSION_EXTRACTION_REGEX } from "../../../../constants"; +import { EXPRESSION_EXTRACTION_REGEX, TypeHelperContext } from "../../../../constants"; import { getHelperPaneNew } from "../../HelperPaneNew"; import React from "react"; import { BreadcrumbContainer, BreadcrumbItem, BreadcrumbSeparator } from "../FormGenerator"; import { EditorContext, StackItem } from "@wso2/type-editor"; import DynamicModal from "../../../../components/Modal"; - interface TypeEditorState { isOpen: boolean; field?: FormField; // Optional, to store the field being edited @@ -148,6 +147,7 @@ export function FormGeneratorNew(props: FormProps) { const prevCompletionFetchText = useRef(""); const [completions, setCompletions] = useState([]); const [filteredCompletions, setFilteredCompletions] = useState([]); + const typesCache = useRef>(new Map()); const [types, setTypes] = useState([]); const [filteredTypes, setFilteredTypes] = useState([]); const expressionOffsetRef = useRef(0); // To track the expression offset on adding import statements @@ -462,26 +462,44 @@ export function FormGeneratorNew(props: FormProps) { } }, [debouncedRetrieveCompletions]); + /** + * Debounced function that fetches and filters visible types based on user input, with caching support and special handling for GraphQL contexts. + */ const debouncedGetVisibleTypes = useCallback( debounce( async ( value: string, cursorPosition: number, fetchReferenceTypes?: boolean, - valueTypeConstraint?: string + valueTypeConstraint?: string, + fieldKey?: string ) => { - let visibleTypes: CompletionItem[] = types; - if (!types.length) { - const types = await rpcClient.getBIDiagramRpcClient().getVisibleTypes({ - filePath: fileName, - position: getAdjustedStartLine(targetLineRange, expressionOffsetRef.current), - ...(valueTypeConstraint && { typeConstraint: valueTypeConstraint }) - }); + let context: TypeHelperContext | undefined; + if (isGraphqlEditor) { + context = fieldKey === 'returnType' ? TypeHelperContext.GRAPHQL_FIELD_TYPE : TypeHelperContext.GRAPHQL_INPUT_TYPE; + } + let visibleTypes = typesCache.current.get(fieldKey); + + if (!visibleTypes) { + let types; + if (isGraphqlEditor && fieldKey && context) { + types = await rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ + filePath: fileName, + context: context, + }); + } else { + types = await rpcClient.getBIDiagramRpcClient().getVisibleTypes({ + filePath: fileName, + position: getAdjustedStartLine(targetLineRange, expressionOffsetRef.current), + ...(valueTypeConstraint && { typeConstraint: valueTypeConstraint }) + }); + } const isFetchingTypesForDM = valueTypeConstraint === "json"; visibleTypes = convertToVisibleTypes(types, isFetchingTypesForDM); - setTypes(visibleTypes); + typesCache.current.set(fieldKey, visibleTypes); } + setTypes(visibleTypes); if (!fetchReferenceTypes) { const effectiveText = value.slice(0, cursorPosition); @@ -496,12 +514,12 @@ export function FormGeneratorNew(props: FormProps) { }, 250 ), - [rpcClient, types, fileName, targetLineRange] + [rpcClient, fileName, targetLineRange, isGraphqlEditor] ); const handleGetVisibleTypes = useCallback( - async (value: string, cursorPosition: number, fetchReferenceTypes?: boolean, valueTypeConstraint?: string) => { - await debouncedGetVisibleTypes(value, cursorPosition, fetchReferenceTypes, valueTypeConstraint); + async (value: string, cursorPosition: number, fetchReferenceTypes?: boolean, valueTypeConstraint?: string, fieldKey?: string) => { + await debouncedGetVisibleTypes(value, cursorPosition, fetchReferenceTypes, valueTypeConstraint, fieldKey); }, [debouncedGetVisibleTypes] ); @@ -655,6 +673,11 @@ export function FormGeneratorNew(props: FormProps) { handleExpressionEditorCancel(); } + const typeHelperContext = isGraphqlEditor ? + (fieldKey === 'returnType' ? TypeHelperContext.GRAPHQL_FIELD_TYPE + : TypeHelperContext.GRAPHQL_INPUT_TYPE) + : TypeHelperContext.HTTP_STATUS_CODE; + return getTypeHelper({ fieldKey: fieldKey, valueTypeConstraint: valueTypeConstraint, @@ -671,7 +694,7 @@ export function FormGeneratorNew(props: FormProps) { onTypeCreate: handleCreateNewType, onCloseCompletions: handleCloseCompletions, exprRef: exprRef, - typeHelperContext: (isGraphqlEditor ? (fieldKey === 'returnType' ? "GRAPHQL_FIELD_TYPE" : "GRAPHQL_INPUT_TYPE") : "HTTP_STATUS_CODE"), + typeHelperContext: typeHelperContext, }); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx index 42861713b08..72493f68679 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx @@ -22,6 +22,7 @@ import { useEffect, useState } from 'react'; import { Divider, OptionProps, Typography } from '@wso2/ui-toolkit'; import { EditorContainer, EditorContent } from '../../../styles'; import { LineRange, PropertyModel, ResponseCode, StatusCodeResponse } from '@wso2/ballerina-core'; +import { TypeHelperContext } from '../../../../../../constants'; import { getDefaultResponse, getTitleFromStatusCodeAndType, HTTP_METHOD } from '../../../utils'; import { FormField, FormImports, FormValues } from '@wso2/ballerina-side-panel'; import FormGeneratorNew from '../../../../Forms/FormGeneratorNew'; @@ -57,13 +58,12 @@ export function ResponseEditor(props: ParamProps) { const [newFields, setNewFields] = useState([]); useEffect(() => { - rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ filePath: undefined, context: "HTTP_STATUS_CODE" }).then((res) => { + rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ filePath: undefined, context: TypeHelperContext.HTTP_STATUS_CODE }).then((res) => { const mappedResponseCodes: ResponseCode[] = res.map((item: any) => ({ category: item.labelDetails?.description || "", label: item.label || "", type: item.detail || "", statusCode: item.labelDetails?.detail || "", - hasBody: !["http:Response", "http:NoContent", "error"].includes(item.detail) })); setResponseCodes(mappedResponseCodes); rpcClient.getVisualizerRpcClient().joinProjectPath('main.bal').then((filePath) => { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx index e1d630acefa..607142e1b63 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeHelper/index.tsx @@ -35,6 +35,7 @@ import { TYPE_HELPER_OPERATORS } from '../TypeEditor/constants'; import { useMutation } from "@tanstack/react-query"; import { createPortal } from "react-dom"; import { LoadingRing } from "../../../components/Loader"; +import { TypeHelperContext } from "../../../constants"; import styled from "@emotion/styled"; const LoadingContainer = styled.div` @@ -62,7 +63,7 @@ type TypeHelperProps = { updateImports: (key: string, imports: {[key: string]: string}, codedata?: CodeData) => void; onTypeCreate: (typeName: string) => void; onCloseCompletions?: () => void; - typeHelperContext?: "GRAPHQL_FIELD_TYPE" | "GRAPHQL_INPUT_TYPE" | "HTTP_STATUS_CODE"; + typeHelperContext?: TypeHelperContext; }; const TypeHelperEl = (props: TypeHelperProps) => { @@ -106,7 +107,7 @@ const TypeHelperEl = (props: TypeHelperProps) => { try { const isFetchingTypesForDM = valueTypeConstraint === "json"; - const types = (typeHelperContext === "GRAPHQL_FIELD_TYPE" || typeHelperContext === "GRAPHQL_INPUT_TYPE") + const types = (typeHelperContext === TypeHelperContext.GRAPHQL_FIELD_TYPE || typeHelperContext === TypeHelperContext.GRAPHQL_INPUT_TYPE) ? await rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ filePath: filePath, context: typeHelperContext, @@ -125,19 +126,22 @@ const TypeHelperEl = (props: TypeHelperProps) => { setFilteredBasicTypes(basicTypes); fetchedInitialTypes.current = true; - const searchResponse = await rpcClient.getBIDiagramRpcClient().search({ - filePath: filePath, - position: targetLineRange, - queryMap: { - q: '', - offset: 0, - limit: 1000 - }, - searchKind: 'TYPE' - }); + if (typeHelperContext === TypeHelperContext.HTTP_STATUS_CODE) { + const searchResponse = await rpcClient.getBIDiagramRpcClient().search({ + filePath: filePath, + position: targetLineRange, + queryMap: { + q: '', + offset: 0, + limit: 1000 + }, + searchKind: 'TYPE' + }); + + const importedTypes = getImportedTypes(searchResponse.categories); + setImportedTypes(importedTypes); + } - const importedTypes = getImportedTypes(searchResponse.categories); - setImportedTypes(importedTypes); } catch (error) { console.error(error); } finally { From 9c61afa9d09de6e2fae4c3854a355588b95da716 Mon Sep 17 00:00:00 2001 From: DimuthuMadushan Date: Wed, 8 Oct 2025 14:21:40 +0530 Subject: [PATCH 134/730] Remove union type from graphql input kind selection --- .../type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx | 8 +++++++- .../ballerina/type-editor/src/TypeEditor/TypeEditor.tsx | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx index c09f6538a6c..d38434e3951 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx @@ -224,6 +224,12 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) { } else { selectedKind = value as TypeKind; } + + // If the selected kind is the same as current, do nothing + if (selectedKind === selectedTypeKind) { + return; + } + setSelectedTypeKind(selectedKind); // Reset validation error state when changing type kinds @@ -263,7 +269,7 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) { if (isGraphql) { // For GraphQL mode, filter options based on current type if (initialTypeKind === "RECORD") { - return [TypeKind.RECORD, TypeKind.ENUM, TypeKind.UNION]; + return [TypeKind.RECORD, TypeKind.ENUM]; } else if (initialTypeKind === "CLASS") { return [TypeKind.CLASS, TypeKind.ENUM, TypeKind.UNION]; } diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/TypeEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/TypeEditor.tsx index a629a20e35b..26b19a26761 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/TypeEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/TypeEditor.tsx @@ -64,7 +64,9 @@ interface TypeEditorProps { export function TypeEditor(props: TypeEditorProps) { const { isGraphql, newType, isPopupTypeForm } = props; - let initialTypeKind = props.type?.codedata?.node ?? "RECORD" as TypeNodeKind; + const [initialTypeKind] = useState(() => + (props.type?.codedata?.node ?? "RECORD") as TypeNodeKind + ); const [isSaving, setIsSaving] = useState(false); const type: Type = (() => { From 95da59295dd57ad368db507f4212f14092e590f6 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Wed, 8 Oct 2025 16:42:42 +0530 Subject: [PATCH 135/730] Refactor parameter handling in ServiceDesigner --- .../ballerina-core/src/interfaces/service.ts | 2 +- .../FunctionForm/Parameters/ParamEditor.tsx | 4 +- .../Forms/ResourceForm/NewResource.tsx | 23 +- .../ResourceForm/Parameters/ParamEditor.tsx | 13 +- .../ResourceForm/Parameters/Parameters.tsx | 155 +++++--- .../ResourceForm/Parameters/ParametersNew.tsx | 349 ------------------ .../ResourcePath/ResourcePath.tsx | 14 +- .../ResourceResponse/ResourceResponse.tsx | 2 +- .../src/views/BI/ServiceDesigner/styles.tsx | 8 +- 9 files changed, 130 insertions(+), 440 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParametersNew.tsx diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/service.ts b/workspaces/ballerina/ballerina-core/src/interfaces/service.ts index f1a6d8aee2e..70827d34647 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/service.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/service.ts @@ -144,7 +144,7 @@ export interface PropertyModel { properties?: ConfigProperties; addNewButton?: boolean; typeMembers?: PropertyTypeMemberInfo[]; - httpParamType?: "QUERY" | "Header" | "PAYLOAD"; + httpParamType?: "QUERY" | "HEADER" | "PAYLOAD"; diagnostics?: DiagnosticMessage[]; imports?: Imports; hidden?: boolean; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/Parameters/ParamEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/Parameters/ParamEditor.tsx index 10c1c4ad2b9..91ce2ee0b95 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/Parameters/ParamEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/Parameters/ParamEditor.tsx @@ -26,7 +26,7 @@ import { TypeBrowser } from '../../../components/TypeBrowser/TypeBrowser'; import { PARAM_TYPES } from '../../../definitions'; import { ParameterModel, PropertyModel } from '@wso2/ballerina-core'; -const options = [{ id: "0", value: "QUERY" }, { id: "1", value: "Header" }]; +const options = [{ id: "0", value: "QUERY" }, { id: "1", value: "HEADER" }]; export interface ParamProps { param: ParameterModel; @@ -40,7 +40,7 @@ export function ParamEditor(props: ParamProps) { const { param, hideType = false, onChange, onSave, onCancel } = props; const handleOnSelect = (value: string) => { - onChange({ ...param, httpParamType: value as "QUERY" | "Header" | "PAYLOAD" }); + onChange({ ...param, httpParamType: value as "QUERY" | "HEADER" | "PAYLOAD" }); }; const handleTypeChange = (value: string) => { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx index 40582fbf576..28c89ba9b82 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/NewResource.tsx @@ -26,7 +26,8 @@ import { HTTP_METHOD } from '../../utils'; import { FunctionModel, LogIcon, ParameterModel, PropertyModel, ReturnTypeModel } from '@wso2/ballerina-core'; import { verbs } from './ResourcePath/ResourcePath'; import { PanelContainer } from '@wso2/ballerina-side-panel'; -import { ParametersNew } from './Parameters/ParametersNew'; +import { getColorByMethod } from '../../../../../utils/utils'; +import { Parameters } from './Parameters/Parameters'; const AdvancedParamTitleWrapper = styled.div` display: flex; @@ -340,7 +341,7 @@ export function NewResource(props: NewResourceProps) { {/* This is for adding a http resource */} {isSaving && } + + HTTP Method: {method} + + - + Responses - + (); const handleOnSelect = (value: string) => { - onChange({ ...param, httpParamType: value as "QUERY" | "Header" | "PAYLOAD" }); + onChange({ ...param, httpParamType: value as "QUERY" | "HEADER" | "PAYLOAD" }); }; const handleReqFieldChange = () => { @@ -175,17 +175,6 @@ export function ParamEditor(props: ParamProps) { {param.httpParamType !== "PAYLOAD" && !isNewResource && - {param.httpParamType && ( - - )} {param.httpParamType === "QUERY" && ( Is Required? diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/Parameters.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/Parameters.tsx index d47c815d4a7..6d53db7ca0d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/Parameters.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/Parameters.tsx @@ -65,7 +65,7 @@ const OptionalConfigContent = styled.div` `; export function Parameters(props: ParametersProps) { - const { parameters, readonly, onChange, schemas, showPayload, isNewResource } = props; + const { parameters, readonly, onChange, schemas, showPayload, isNewResource = false } = props; const queryModel = schemas["query"] as ParameterModel; const headerModel = schemas["header"] as ParameterModel; @@ -111,9 +111,10 @@ export function Parameters(props: ParametersProps) { setEditingIndex(index); }; - const onAddParamClick = () => { + const onAddParamClick = (httpParamType: "QUERY" | "HEADER") => { queryModel.name.value = ""; queryModel.type.value = ""; + queryModel.httpParamType = httpParamType; setIsNew(true); setEditModel(queryModel); setEditingIndex(-1); @@ -197,17 +198,19 @@ export function Parameters(props: ParametersProps) { return (
- {/* <---------------- Normal Parameters Start Query|Header ----------------> */} - Parameters - {normalParameters.map((param: ParameterModel, index) => ( - - ))} - {editModel && (editModel.httpParamType === "QUERY" || editModel.httpParamType === "Header") && + {/* <---------------- Query Parameters Start ----------------> */} + Query Parameters + {normalParameters + .filter((param: ParameterModel) => param.httpParamType === "QUERY") + .map((param: ParameterModel, index) => ( + + ))} + {editModel && editModel.httpParamType === "QUERY" && } - - + (!readonly && onAddParamClick("QUERY"))}> - <>Add Parameter + <>Query Parameter - {/* <---------------- Normal Parameters End Query|Header ----------------> */} + {/* <---------------- Header Parameters Start ----------------> */} + {!isNewResource && ( + <> + Header Parameters + {normalParameters + .filter((param: ParameterModel) => param.httpParamType === "HEADER") + .map((param: ParameterModel, index) => ( + + ))} + {editModel && editModel.httpParamType === "HEADER" && + + } + + (!readonly && onAddParamClick("HEADER"))}> + + <>Header Parameter + + + + )} + + {/* <---------------- Normal Parameters End Query|HEADER ----------------> */} {/* <-------------------- Payload Parameters Start --------------------> */} {showPayload && ( @@ -253,7 +286,7 @@ export function Parameters(props: ParametersProps) { - <>Add Payload + <>Payload } @@ -299,48 +332,50 @@ export function Parameters(props: ParametersProps) { {/* <-------------------- Advanced Parameters End --------------------> */} {/* <-------------------- Advanced Parameters Checkbox Start --------------------> */} - <> - - Advanced Parameters - - {!showOptionalConfigurations && ( - - - Expand - - )} - {showOptionalConfigurations && ( - - - Collapse - - )} - - - {showOptionalConfigurations && ( - - - { - advancedAllParameters.map((param: ParameterModel, index) => ( - onAdvancedChecked(param, checked)} - /> - )) - } - - - )} - - + {!isNewResource && ( + <> + + Advanced Parameters + + {!showOptionalConfigurations && ( + + + Expand + + )} + {showOptionalConfigurations && ( + + + Collapse + + )} + + + {showOptionalConfigurations && ( + + + { + advancedAllParameters.map((param: ParameterModel, index) => ( + onAdvancedChecked(param, checked)} + /> + )) + } + + + )} + + + )} {/* <-------------------- Advanced Parameters Checkbox End --------------------> */}
diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParametersNew.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParametersNew.tsx deleted file mode 100644 index b9060c148ea..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParametersNew.tsx +++ /dev/null @@ -1,349 +0,0 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -// tslint:disable: jsx-no-multiline-js - -import React, { useState } from 'react'; - -import { Codicon, Divider, LinkButton, Typography, CheckBox, CheckBoxGroup, ThemeColors } from '@wso2/ui-toolkit'; -import styled from '@emotion/styled'; -import { ParamEditor } from './ParamEditor'; -import { ParamItem } from './ParamItem'; -import { ConfigProperties, ParameterModel } from '@wso2/ballerina-core'; - -export interface ParametersNewProps { - parameters: ParameterModel[]; - onChange: (parameters: ParameterModel[]) => void, - schemas: ConfigProperties; - readonly?: boolean; - showPayload: boolean; - isNewResource?: boolean; -} - -const AddButtonWrapper = styled.div` - margin: 8px 0; -`; - -const AdvancedParamTitleWrapper = styled.div` - display: flex; - flex-direction: row; -`; - -const OptionalConfigRow = styled.div` - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - margin-bottom: 8px; -`; - -const OptionalConfigButtonContainer = styled.div` - display: flex; - flex-direction: row; - flex-grow: 1; - justify-content: flex-end; -`; - -const OptionalConfigContent = styled.div` - margin-top: 16px; - padding-left: 24px; -`; - -export function ParametersNew(props: ParametersNewProps) { - const { parameters, readonly, onChange, schemas, showPayload, isNewResource } = props; - - const queryModel = schemas["query"] as ParameterModel; - const headerModel = schemas["header"] as ParameterModel; - const payloadModel = schemas["payload"] as ParameterModel; - - const normalParameters = parameters.filter(param => param.httpParamType && param.httpParamType !== "PAYLOAD"); - const payloadParameters = parameters.filter(param => param.httpParamType && param.httpParamType === "PAYLOAD"); - const advancedDisabledParameters = parameters.filter(param => !param.httpParamType && !param.enabled); - const advancedEnabledParameters = parameters.filter(param => !param.httpParamType && param.enabled); - const advancedAllParameters = parameters.filter(param => !param.httpParamType).sort((a, b) => b.metadata.label.localeCompare(a.metadata.label)); - - const [showOptionalConfigurations, setShowOptionalConfigurations] = useState(advancedEnabledParameters.length > 0); - - const handleShowOptionalConfigurations = () => { - setShowOptionalConfigurations(true); - }; - - const handleHideOptionalConfigurations = () => { - setShowOptionalConfigurations(false); - }; - - - const [editModel, setEditModel] = useState(undefined); - const [isNew, setIsNew] = useState(false); - const [editingIndex, setEditingIndex] = useState(-1); - - const [showAdvanced, setShowAdvanced] = useState(advancedEnabledParameters.length > 0); - - - const handleAdvanceParamToggle = () => { - setShowAdvanced(!showAdvanced); - }; - - const onEdit = (parameter: ParameterModel) => { - setIsNew(false); - setEditModel(parameter); - // Find and store the index of the parameter being edited - const index = parameters.findIndex(p => - p.metadata?.label === parameter.metadata?.label && - p.name?.value === parameter.name?.value && - p.httpParamType === parameter.httpParamType - ); - setEditingIndex(index); - }; - - const onAddParamClick = () => { - queryModel.name.value = ""; - queryModel.type.value = ""; - setIsNew(true); - setEditModel(queryModel); - setEditingIndex(-1); - }; - - const onAddPayloadClick = () => { - payloadModel.name.value = "payload"; - payloadModel.type.value = ""; - setIsNew(true); - setEditModel(payloadModel); - setEditingIndex(-1); - }; - - const onDelete = (param: ParameterModel) => { - const updatedParameters = parameters.filter(p => p.metadata.label !== param.metadata.label || p.name.value !== param.name.value); - onChange(updatedParameters); - setEditModel(undefined); - setEditingIndex(-1); - }; - - const onAdvanceDelete = (param: ParameterModel) => { - parameters.forEach(p => { - if (p.metadata.label === param.metadata.label) { - param.enabled = false; - } - }) - onChange([...parameters]); - setEditModel(undefined); - setEditingIndex(-1); - }; - - const onAdvanceSaveParam = (param: ParameterModel) => { - param.enabled = true; - onChange(parameters.map(p => p.metadata.label === param.metadata.label ? param : p)); - setEditModel(undefined); - setEditingIndex(-1); - }; - - const onAdvancedChecked = (param: ParameterModel, checked: boolean) => { - param.enabled = checked; - param.name.value = param.metadata.label.toLowerCase().replace(/ /g, "_"); - onChange(parameters.map(p => p.metadata.label === param.metadata.label ? param : p)); - setEditModel(undefined); - setEditingIndex(-1); - }; - - const onChangeParam = (param: ParameterModel) => { - setEditModel(param); - // Update the parameters array in real-time for existing parameters - if (!isNew && editingIndex >= 0) { - const updatedParameters = [...parameters]; - updatedParameters[editingIndex] = param; - onChange(updatedParameters); - } - }; - - const onSaveParam = (param: ParameterModel) => { - param.enabled = true; - if (isNew) { - onChange([...parameters, param]); - setIsNew(false); - } else { - // Use the editingIndex for more reliable updates - if (editingIndex >= 0) { - const updatedParameters = [...parameters]; - updatedParameters[editingIndex] = param; - onChange(updatedParameters); - } else { - // Fallback to the original logic if index is not available - onChange(parameters.map(p => p.metadata.label === param.metadata.label && p.name.value === param.name.value ? param : p)); - } - } - setEditModel(undefined); - setEditingIndex(-1); - }; - - const onParamEditCancel = () => { - setEditModel(undefined); - setEditingIndex(-1); - }; - - return ( -
- {/* <---------------- Normal Parameters Start Query|Header ----------------> */} - Query Parameters - {normalParameters.map((param: ParameterModel, index) => ( - - ))} - {editModel && (editModel.httpParamType === "QUERY" || editModel.httpParamType === "Header") && - - } - - - - - <>Query Parameter - - - - {/* <---------------- Normal Parameters End Query|Header ----------------> */} - - {/* <-------------------- Payload Parameters Start --------------------> */} - {showPayload && ( - <> - Payload - {payloadParameters.map((param: ParameterModel, index) => ( - - ))} - - )} - - {editModel && editModel.httpParamType === "PAYLOAD" && - - } - - {showPayload && payloadParameters.length === 0 && - - - - <>Add Payload - - - } - {/* <-------------------- Payload Parameters End --------------------> */} - - {/* <-------------------- Advanced Parameters Start --------------------> */} - - {/* TODO: REMOVE THE OLD ADVANCED PARAMETERS */} - {/* - Advanced Parameters - {showAdvanced ? "Hide" : "Show"} - - {showAdvanced && - advancedDisabledParameters.map((param: ParameterModel, index) => ( - - onEdit(param)}> - - <>{param.metadata.label} - - - )) - } - {showAdvanced && - advancedEnabledParameters.map((param: ParameterModel, index) => ( - - )) - } - {editModel && !editModel.httpParamType && - - } - */} - {/* <-------------------- Advanced Parameters End --------------------> */} - - {/* <-------------------- Advanced Parameters Checkbox Start --------------------> */} - {/* <> - - Advanced Parameters - - {!showOptionalConfigurations && ( - - - Expand - - )} - {showOptionalConfigurations && ( - - - Collapse - - )} - - - {showOptionalConfigurations && ( - - - { - advancedAllParameters.map((param: ParameterModel, index) => ( - onAdvancedChecked(param, checked)} - /> - )) - } - - - )} - - */} - {/* <-------------------- Advanced Parameters Checkbox End --------------------> */} - -
- ); -} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx index dbccab6f7ca..51e45fbf851 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx @@ -168,12 +168,14 @@ export function ResourcePath(props: ResourcePathProps) { onFocus={(e) => e.target.select()} /> - - - - <>Add Path Param - - + {!isNew && + + + + <>Path Param + + + } ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResourceResponse.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResourceResponse.tsx index 6270a56959e..ced8b6aa6aa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResourceResponse.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResourceResponse.tsx @@ -112,7 +112,7 @@ export function ResourceResponse(props: ResourceParamProps) { /> ) })} - {!editModel && ( + {!editModel && !readonly && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/styles.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/styles.tsx index 3143351dce9..5df4fd63c35 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/styles.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/styles.tsx @@ -50,8 +50,9 @@ export const ContentSection = styled.div` display: flex; flex-direction: row; width: 100%; + justify-content: space-between; ${(props: any) => props.justifyEnd && ` - justify-content: space-between; + justify-content: flex-end; margin-right: 20px; `} `; @@ -62,7 +63,6 @@ export const EditIconWrapper = styled.div` width: 14px; margin-top: 16px; margin-bottom: 13px; - margin-left: 10px; color: var(--vscode-statusBarItem-remoteBackground); `; @@ -100,7 +100,6 @@ export const IconTextWrapper = styled.div` export const headerLabelStyles = cx(css` display: flex; align-items: center; - width: 320px; cursor: pointer; margin-left: 12px; line-height: 14px; @@ -116,7 +115,6 @@ export const OptionLabel = styled.div` export const disabledHeaderLabel = cx(css` display: flex; align-items: center; - width: 320px; margin-left: 12px; line-height: 14px; `); @@ -137,7 +135,7 @@ export const ActionIconWrapper = styled.div` align-items: center; cursor: pointer; height: 14px; - width: 14px; + margin-right: 10px; `; export const ParamContainer = styled.div` From e362779197386ae7f322fab2365efe58cf1865d8 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Wed, 8 Oct 2025 16:55:10 +0530 Subject: [PATCH 136/730] Update step counts --- .../src/features/ai/service/code/code.ts | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 85e9dd84f1f..e0fe8ae61c3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -121,7 +121,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler maxOutputTokens: 4096 * 4, temperature: 0, messages: allMessages, - stopWhen: stepCountIs(10), + stopWhen: stepCountIs(50), tools, abortSignal: AIPanelAbortController.getInstance().signal, }); @@ -383,7 +383,7 @@ Important reminders: - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. Begin your response with the explanation. The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. -Once the explanation is finished, you must apply surgical edits to the existing source code using the **str_replace_based_edit_tool** tool. +Once the explanation is finished, you must apply precise targeted edits to the existing source code using the **str_replace_based_edit_tool** tool. The complete source code will be provided in the section of the user prompt. When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. @@ -482,23 +482,10 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri const userRepairMessage: ModelMessage = { role: "user", - content: `The generated code has the following compiler errors. Follow this systematic approach to fix all issues: - - 1. **Analyze All Errors**: First, carefully review all compiler errors listed below to understand the full scope of issues across all files. - 2. **Identify Affected Files**: Determine which files contain errors by examining the error messages for file paths and locations. - 3. **Gather File Contents**: For each file that needs changes: - - First, check if the file content exists in the conversation history - - If not found in history, use **str_replace_based_edit_tool** with the 'view' operation to read the current file content - - 4. **Verify Library Information**: Before making fixes, check the context and API documentation already provided in the conversation history. Only use the **LibraryProviderTool** if additional library information is needed that wasn't covered in previous tool responses. - - 5. **Fix Each File Systematically**: Use **str_replace_based_edit_tool** to make surgical, targeted edits for the determined files: - - Process one file at a time - - For each file, make ALL necessary corrections before moving to the next file - - Use precise **str_replace** operations that target only the erroneous sections - - Double-check all functions, types, and record field access for accuracy - - Do NOT regenerate entire code blocks; only replace the specific lines that need changes - **Compiler Errors:** ${params.diagnostics.map((d) => d.message).join("\n")}`, + content: + "Generated code returns the following compiler errors. Using the library details from the `LibraryProviderTool` results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + + "Do not create any new files. Just update the existing code to fix the errors. \n Errors: \n " + + params.diagnostics.map((d) => d.message).join("\n"), } if (isToolCallExistInLastMessage) { @@ -550,6 +537,7 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri temperature: 0, tools, messages: allMessages, + stopWhen: stepCountIs(50), abortSignal: AIPanelAbortController.getInstance().signal, }); From b259c3d397a56cec8d584b0402f3a1a0046065ce Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Wed, 8 Oct 2025 20:03:35 +0530 Subject: [PATCH 137/730] Add usage metrics tracking and cache validation in AI evaluation framework - Added UsageMetrics and AggregatedUsageMetrics interfaces for detailed usage tracking. - Implemented cache usage validation logic in cache-analysis utility. - Updated report generation to include cache usage metrics. - Enhanced event handler to capture and process usage metrics during tests. - Refactored result conversion and persistence to accommodate new usage data. --- .../ballerina-core/src/state-machine-types.ts | 14 +- .../src/features/ai/service/code/code.ts | 46 ++++- .../result-management/report-generator.ts | 101 ++++++++++- .../result-management/result-conversion.ts | 166 +++++++++++++++++- .../result-management/result-persistence.ts | 16 +- .../test/ai/evals/code/types/result-types.ts | 64 +++++++ .../test/ai/evals/code/types/test-types.ts | 58 ++++++ .../ai/evals/code/utils/cache-analysis.ts | 140 +++++++++++++++ .../test/ai/evals/code/utils/index.ts | 1 + .../ai/evals/code/utils/test-event-handler.ts | 73 ++++++-- 10 files changed, 644 insertions(+), 35 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/cache-analysis.ts diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 4a49995ce89..4f91f8a20cd 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -188,7 +188,8 @@ export type ChatNotify = | ChatError | ToolCall | ToolResult - | EvalsToolResult; + | EvalsToolResult + | UsageMetricsEvent; export interface ChatStart { type: "start"; @@ -243,6 +244,17 @@ export interface EvalsToolResult { output: any; } +export interface UsageMetricsEvent { + type: "usage_metrics"; + isRepair?: boolean; + usage: { + inputTokens: number; + cacheCreationInputTokens: number; + cacheReadInputTokens: number; + outputTokens: number; + }; +} + export const stateChanged: NotificationType = { method: 'stateChanged' }; export const onDownloadProgress: NotificationType = { method: 'onDownloadProgress' }; export const onChatNotify: NotificationType = { method: 'onChatNotify' }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 73834c60c9d..dd8667db3df 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -114,7 +114,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), }; - const { fullStream, response } = streamText({ + const { fullStream, response, providerMetadata } = streamText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxOutputTokens: 4096 * 4, temperature: 0, @@ -203,6 +203,21 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const postProcessedResp: PostProcessResponse = await postProcess({ assistant_response: finalResponse }); + const finalProviderMetadata = await providerMetadata; + // Emit usage metrics event for test tracking + if (finalProviderMetadata?.anthropic?.usage) { + const anthropicUsage = finalProviderMetadata.anthropic.usage as any; + eventHandler({ + type: "usage_metrics", + isRepair: false, + usage: { + inputTokens: anthropicUsage.input_tokens || 0, + cacheCreationInputTokens: anthropicUsage.cache_creation_input_tokens || 0, + cacheReadInputTokens: anthropicUsage.cache_read_input_tokens || 0, + outputTokens: anthropicUsage.output_tokens || 0, + } + }); + } finalResponse = postProcessedResp.assistant_response; let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; @@ -225,7 +240,8 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler diagnostics: diagnostics }, libraryDescriptions, - updatedSourceFiles + updatedSourceFiles, + eventHandler ); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; @@ -433,7 +449,7 @@ export async function repairCodeCore( eventHandler: CopilotEventHandler ): Promise { eventHandler({ type: "start" }); - const resp = await repairCode(params, libraryDescriptions, []); + const resp = await repairCode(params, libraryDescriptions, [], eventHandler); eventHandler({ type: "content_replace", content: resp.repairResponse }); console.log("Manual Repair Diagnostics left: ", resp.diagnostics); eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); @@ -442,7 +458,7 @@ export async function repairCodeCore( } export async function repairCode(params: RepairParams, - libraryDescriptions: string, sourceFiles: SourceFiles[] = []): Promise { + libraryDescriptions: string, sourceFiles: SourceFiles[] = [], eventHandler?: CopilotEventHandler): Promise { const allMessages: ModelMessage[] = [...params.previousMessages]; const lastMessage = allMessages[allMessages.length - 1]; let isToolCallExistInLastMessage = false; @@ -461,7 +477,7 @@ export async function repairCode(params: RepairParams, const userRepairMessage: ModelMessage = { role: "user", content: - "Generated code returns the following compiler errors that uses the library details from the `LibraryProviderTool` results in previous messages. First check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + + "Generated code returns the following compiler errors that uses the library details from the `LibraryProviderTool` results in previous messages. First check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + "And also do not create any new files. Just carefully analyze the error descriptions and update the existing code to fix the errors. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), }; @@ -495,7 +511,7 @@ export async function repairCode(params: RepairParams, allMessages.push(userRepairMessage); - let updatedSourceFiles: SourceFiles[] = sourceFiles.length == 0 ? + let updatedSourceFiles: SourceFiles[] = sourceFiles.length == 0 ? getProjectFromResponse(params.assistantResponse).sourceFiles : sourceFiles; let updatedFileNames: string[] = []; @@ -507,7 +523,7 @@ export async function repairCode(params: RepairParams, [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), }; - const { text } = await generateText({ + const { text, providerMetadata } = await generateText({ model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxOutputTokens: 4096 * 4, temperature: 0, @@ -516,7 +532,21 @@ export async function repairCode(params: RepairParams, stopWhen: stepCountIs(50), abortSignal: AIPanelAbortController.getInstance().signal, }); - + const repairProviderMetadata = await providerMetadata; + // Emit repair usage metrics event if event handler is provided + if (eventHandler && repairProviderMetadata?.anthropic?.usage) { + const anthropicUsage = repairProviderMetadata.anthropic.usage as any; + eventHandler({ + type: "usage_metrics", + isRepair: true, + usage: { + inputTokens: anthropicUsage.input_tokens || 0, + cacheCreationInputTokens: anthropicUsage.cache_creation_input_tokens || 0, + cacheReadInputTokens: anthropicUsage.cache_read_input_tokens || 0, + outputTokens: anthropicUsage.output_tokens || 0, + }, + }); + } const responseText = updateFinalResponseWithCodeBlocks(text, updatedSourceFiles, updatedFileNames); // replace original response with new code blocks let diagnosticFixResp = replaceCodeBlocks(params.assistantResponse, responseText); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts index fc886ffa48e..979230674bc 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts @@ -41,6 +41,63 @@ export function generateComprehensiveReport(summary: Summary): void { logPerTestCaseAccuracy(summary.perTestCaseAccuracy); } + // Add cache usage metrics section + if (summary.aggregatedUsage) { + console.log(`\n🗃️ CACHE USAGE ANALYSIS: `); + console.log(` Total Use Cases: ${summary.aggregatedUsage.totalUseCases}`); + + // Initial generation stats + const initial = summary.aggregatedUsage.initialGeneration; + console.log(` Initial: hits ${initial.hits}/${summary.aggregatedUsage.totalUseCases}, creation ${initial.creation}/${summary.aggregatedUsage.totalUseCases}`); + + // Repair iteration stats + const repairKeys = Object.keys(summary.aggregatedUsage.repairs).sort((a, b) => { + const aNum = parseInt(a.replace('repair', '')); + const bNum = parseInt(b.replace('repair', '')); + return aNum - bNum; + }); + + repairKeys.forEach(repairKey => { + const repairStats = summary.aggregatedUsage.repairs[repairKey]; + const repairNum = repairKey.replace('repair', ''); + + // Use the count field to get the actual number of use cases that reached this repair iteration + const totalWithThisRepair = repairStats.count; + if (totalWithThisRepair > 0) { + console.log(` Repair ${repairNum}: hits ${repairStats.hits}/${totalWithThisRepair}, creation ${repairStats.creation}/${totalWithThisRepair}`); + } + }); + } + + // Add enhanced overall cache validation + if (summary.overallCacheValidation) { + console.log(`\n🎯 OVERALL CACHE PERFORMANCE VALIDATION:`); + const validation = summary.overallCacheValidation; + + const overallIcon = validation.overallStatus === 'pass' ? '✅' : '❌'; + console.log(` ${overallIcon} Overall Status: ${validation.overallStatus.toUpperCase()}`); + + const initialIcon = validation.initialCacheEfficiency === 'pass' ? '✅' : '❌'; + console.log(` ${initialIcon} Initial Cache Efficiency: ${validation.initialCacheEfficiency} (${validation.InitialGenCacheCreation} fresh creations)`); + + if (validation.firstRepairAllReads !== 'not_applicable') { + const firstRepairIcon = validation.firstRepairAllReads === 'pass' ? '✅' : '❌'; + console.log(` ${firstRepairIcon} First Repair All Reads: ${validation.firstRepairAllReads}`); + } + + if (validation.subsequentRepairsNoWrites !== 'not_applicable') { + const subsequentIcon = validation.subsequentRepairsNoWrites === 'pass' ? '✅' : '❌'; + console.log(` ${subsequentIcon} Subsequent Repairs No Writes: ${validation.subsequentRepairsNoWrites}`); + } + + if (validation.validationIssues.length > 0) { + console.log(`\n 🚨 Validation Issues:`); + validation.validationIssues.forEach((issue, index) => { + console.log(` ${index + 1}. ${issue}`); + }); + } + } + logSuccessfulCompilations(summary.results); if (summary.totalFailed > 0) { @@ -48,6 +105,42 @@ export function generateComprehensiveReport(summary: Summary): void { } } +/** + * Logs cache validation for an individual use case result + */ +function logIndividualCacheValidation(result: UsecaseResult): void { + const validation = result.usage?.overallCachePerformanceValidation; + if (!validation) { + return; // No validation data available + } + + console.log(` Cache Validation:`); + + // Initial generation check + const initialIcon = validation.initialGenerationCheck === 'pass' ? '✅' : '⚠️'; + console.log(` Initial Generation: ${initialIcon} ${validation.initialGenerationCheck}`); + + // First repair check (if applicable) + if (validation.firstRepairCheck !== 'not_applicable') { + const firstRepairIcon = validation.firstRepairCheck === 'pass' ? '✅' : (validation.firstRepairCheck === 'fail' ? '❌' : '⚠️'); + console.log(` First Repair: ${firstRepairIcon} ${validation.firstRepairCheck}`); + } + + // Subsequent repairs check (if applicable) + if (validation.subsequentRepairsCheck !== 'not_applicable') { + const subsequentIcon = validation.subsequentRepairsCheck === 'pass' ? '✅' : '⚠️'; + console.log(` Subsequent Repairs: ${subsequentIcon} ${validation.subsequentRepairsCheck}`); + } + + // Show issues if any + if (validation.issues && validation.issues.length > 0) { + console.log(` Issues:`); + validation.issues.forEach((issue, index) => { + console.log(` ${index + 1}. ${issue}`); + }); + } +} + /** * Logs successful compilations section */ @@ -65,6 +158,7 @@ function logSuccessfulCompilations(results: readonly UsecaseResult[]): void { if (result.files.length > 0) { console.log(` Files: ${result.files.map(f => f.fileName).join(', ')}`); } + logIndividualCacheValidation(result); }); } @@ -83,7 +177,7 @@ function logFailedCompilations(results: readonly UsecaseResult[]): void { console.log(` LLM Rating: ${result.evaluationResult.rating.toFixed(1)}/10`); console.log(` LLM Reasoning: ${result.evaluationResult.reasoning.substring(0, 100)}${result.evaluationResult.reasoning.length > 100 ? '...' : ''}`); } - + if (result.errorEvents && result.errorEvents.length > 0) { console.log(` Key Errors:`); result.errorEvents.slice(0, 2).forEach((error, errorIndex) => { @@ -93,7 +187,7 @@ function logFailedCompilations(results: readonly UsecaseResult[]): void { console.log(` ... and ${result.errorEvents.length - 2} more errors`); } } - + if (result.diagnostics.length > 0) { console.log(` Key Diagnostics:`); result.diagnostics.slice(0, 3).forEach((diag, diagIndex) => { @@ -103,9 +197,12 @@ function logFailedCompilations(results: readonly UsecaseResult[]): void { console.log(` ... and ${result.diagnostics.length - 3} more`); } } + + logIndividualCacheValidation(result); }); } + /** * Logs iteration-specific summaries */ diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index 307ec9831b4..3efff803c36 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { TestCaseResult, TestUseCase, UsecaseResult, DiagnosticMessage, Summary, ToolEvent, ToolCallEvent, ToolResultEvent, EvalsToolResultEvent, IterationSummary, TestCaseAccuracy } from '../types'; +import { TestCaseResult, TestUseCase, UsecaseResult, DiagnosticMessage, Summary, ToolEvent, ToolCallEvent, ToolResultEvent, EvalsToolResultEvent, IterationSummary, TestCaseAccuracy, AggregatedUsageMetrics } from '../types'; import { extractSourceFilesFromContent } from '../utils/content-parser'; import { FILES } from '../utils/constants'; @@ -70,7 +70,8 @@ export function convertTestResultToUsecaseResult(testResult: TestCaseResult, ite evaluationResult: testResult.evaluationResult, errorEvents: errorEvents.length > 0 ? errorEvents : undefined, toolEvents: toolEvents.length > 0 ? toolEvents : undefined, - iteration + iteration, + usage: testResult.result.usageMetrics?.usage }; } @@ -79,7 +80,7 @@ export function convertTestResultToUsecaseResult(testResult: TestCaseResult, ite */ export function createFailedUsecaseResult(useCase: TestUseCase, reason: unknown): UsecaseResult { const errorMessage = (reason as { message?: string })?.message || 'Unknown error'; - + return { usecase: useCase.usecase, diagnostics: [{ message: errorMessage }], @@ -117,6 +118,10 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[], perTestCaseAccuracy = calculatePerTestCaseAccuracy(results, totalIterations); } + + const aggregatedUsage = calculateAggregatedUsage(results); + const overallCacheValidation = calculateOverallCacheValidation(results, aggregatedUsage); + return { results: results, totalUsecases, @@ -129,7 +134,9 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[], evaluationSummary: averageRating, iterations: totalIterations, iterationResults, - perTestCaseAccuracy + perTestCaseAccuracy, + aggregatedUsage, + overallCacheValidation }; } @@ -234,3 +241,154 @@ function calculatePerTestCaseAccuracy(results: readonly UsecaseResult[], totalIt return Array.from(accuracyMap.values()); } + + +/** + * Calculates aggregated usage metrics from all results + */ +function calculateAggregatedUsage(results: readonly UsecaseResult[]): AggregatedUsageMetrics | undefined { + const resultsWithUsage = results.filter(r => r.usage); + + if (resultsWithUsage.length === 0) { + return undefined; + } + + const totalUseCases = resultsWithUsage.length; + + // Track initial generation cache stats + let initialHits = 0; + let initialCreations = 0; + + // Track repair stats by iteration + const repairStats: { [iteration: number]: { count: number; hits: number; creation: number } } = {}; + const repairCounts: { [iteration: number]: Set } = {}; // Track which use cases reached each repair + + for (const result of resultsWithUsage) { + if (result.usage) { + // Count initial generation cache usage + if (result.usage.initial.cacheReadInputTokens > 0) { + initialHits++; + } + if (result.usage.initial.cacheCreationInputTokens > 0) { + initialCreations++; + } + + // Count repair cache usage by iteration + result.usage.repairs.forEach((repair) => { + const iteration = repair.iteration; + const useCaseKey = result.usecase; // Use usecase as unique identifier + + if (!repairStats[iteration]) { + repairStats[iteration] = { count: 0, hits: 0, creation: 0 }; + } + if (!repairCounts[iteration]) { + repairCounts[iteration] = new Set(); + } + + // Track which use cases reached this repair iteration + repairCounts[iteration].add(useCaseKey); + + if (repair.cacheReadInputTokens > 0) { + repairStats[iteration].hits++; + } + if (repair.cacheCreationInputTokens > 0) { + repairStats[iteration].creation++; + } + }); + } + } + + // Update count based on unique use cases that reached each repair iteration + Object.keys(repairStats).forEach(iteration => { + const iterationNum = parseInt(iteration); + repairStats[iterationNum].count = repairCounts[iterationNum]?.size || 0; + }); + + // Build the repairs object with dynamic repair keys + const repairs: { [repairIteration: string]: { count: number; hits: number; creation: number } } = {}; + Object.keys(repairStats).forEach(iteration => { + const repairKey = `repair${iteration}`; + repairs[repairKey] = repairStats[parseInt(iteration)]; + }); + + return { + totalUseCases, + initialGeneration: { + hits: initialHits, + creation: initialCreations + }, + repairs + }; +} + +/** + * Calculate comprehensive cache validation across all use cases + */ +function calculateOverallCacheValidation(results: readonly UsecaseResult[], aggregatedUsage?: AggregatedUsageMetrics) { + if (!aggregatedUsage) { + return undefined; + } + + // 1. Initial generation validation: No more than 1 use case should create fresh cache + const InitialGenCacheCreation = aggregatedUsage.initialGeneration.creation; + const initialGenerationValidation: "pass" | "fail" = InitialGenCacheCreation > 1 ? "fail" : "pass"; + + // 2. First repair validation: All use cases should have cache reads (can have writes) + const firstRepairStats = aggregatedUsage.repairs.repair1; + let firstRepairValidation: "pass" | "fail" | "not_applicable" = "not_applicable"; + if (firstRepairStats) { + firstRepairValidation = firstRepairStats.hits === firstRepairStats.count ? "pass" : "fail"; + } + // 3. Subsequent repairs validation: Should not have any cache writes + let subsequentRepairsValidation: "pass" | "fail" | "not_applicable" = "not_applicable"; + const subsequentRepairKeys = Object.keys(aggregatedUsage.repairs) + .filter(key => key !== 'repair1') + .sort((a, b) => { + const aNum = parseInt(a.replace('repair', '')); + const bNum = parseInt(b.replace('repair', '')); + return aNum - bNum; + }); + + if (subsequentRepairKeys.length > 0) { + const hasSubsequentWrites = subsequentRepairKeys.some(key => + aggregatedUsage.repairs[key].creation > 0 + ); + subsequentRepairsValidation = hasSubsequentWrites ? "fail" : "pass"; + } + + // Build repair iteration counts + const repairIterationCounts: { [repairIteration: string]: number } = {}; + Object.entries(aggregatedUsage.repairs).forEach(([repairKey, repairData]) => { + repairIterationCounts[repairKey] = repairData.count; + }); + + // Collect validation issues + const validationIssues: string[] = []; + if (initialGenerationValidation === "fail") { + validationIssues.push(`Multiple use cases (${InitialGenCacheCreation}) creating fresh cache in initial generation - indicates poor cache pre-warming`); + } + if (firstRepairValidation === "fail") { + validationIssues.push(`First repair iteration has cache reads less than use cases that reached it (${firstRepairStats?.hits}/${firstRepairStats?.count}) - all should have reads`); + } + if (subsequentRepairsValidation === "fail") { + const writeCounts = subsequentRepairKeys.map(key => + `${key}: ${aggregatedUsage.repairs[key].creation}` + ).filter(count => !count.endsWith(': 0')); + validationIssues.push(`Subsequent repairs have cache writes - ${writeCounts.join(', ')}`); + } + + // Overall status + const overallStatus: "pass" | "fail" = (initialGenerationValidation === "fail" || + firstRepairValidation === "fail" || + subsequentRepairsValidation === "fail") ? "fail" : "pass"; + + return { + initialCacheEfficiency: initialGenerationValidation, + firstRepairAllReads: firstRepairValidation, + subsequentRepairsNoWrites: subsequentRepairsValidation, + overallStatus, + InitialGenCacheCreation, + repairIterationCounts, + validationIssues + }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts index 63dcbb4ece3..4837027dfca 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -45,7 +45,17 @@ export async function persistUsecaseResult( duration: usecaseResult.duration, iteration: usecaseResult.iteration, toolEvents: usecaseResult.toolEvents, - evaluationResult: usecaseResult.evaluationResult + evaluationResult: usecaseResult.evaluationResult, + usage: usecaseResult.usage ? { + totalTokens: usecaseResult.usage.initial.inputTokens + usecaseResult.usage.initial.outputTokens + + usecaseResult.usage.repairs.reduce((sum, repair) => sum + repair.inputTokens + repair.outputTokens, 0), + cacheHits: usecaseResult.usage.initial.cacheReadInputTokens + + usecaseResult.usage.repairs.reduce((sum, repair) => sum + repair.cacheReadInputTokens, 0), + cacheCreations: usecaseResult.usage.initial.cacheCreationInputTokens + + usecaseResult.usage.repairs.reduce((sum, repair) => sum + repair.cacheCreationInputTokens, 0), + repairCount: usecaseResult.usage.repairs.length, + cacheValidationStatus: usecaseResult.usage.overallCachePerformanceValidation?.initialGenerationCheck || 'unknown' + } : undefined }; await fs.promises.writeFile( @@ -96,7 +106,9 @@ export async function persistSummary(summary: Summary, resultsDir: string): Prom totalCompiled: summary.totalCompiled, totalFailed: summary.totalFailed, accuracy: summary.accuracy, - evaluationSummary: summary.evaluationSummary + evaluationSummary: summary.evaluationSummary, + aggregatedUsage: summary.aggregatedUsage, + overallCacheValidation: summary.overallCacheValidation }; await fs.promises.writeFile( diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index 477bb492e49..3d0d4e8d8bf 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -85,8 +85,61 @@ export interface UsecaseResult { readonly toolEvents?: readonly ToolEvent[]; readonly iteration?: number; readonly evaluationResult: LLMEvaluationResult; + readonly usage?: { + readonly initial: { + readonly inputTokens: number; + readonly cacheCreationInputTokens: number; + readonly cacheReadInputTokens: number; + readonly outputTokens: number; + }; + readonly repairs: readonly { + readonly inputTokens: number; + readonly cacheCreationInputTokens: number; + readonly cacheReadInputTokens: number; + readonly outputTokens: number; + readonly iteration: number; + }[]; + readonly overallCachePerformanceValidation?: { + readonly initialGenerationCheck: "pass" | "warning"; + readonly firstRepairCheck: "pass" | "fail" | "not_applicable"; + readonly subsequentRepairsCheck: "pass" | "warning" | "not_applicable"; + readonly issues: readonly string[]; + }; + }; +} + + +/** + * Aggregated usage metrics across all test cases + */ +export interface AggregatedUsageMetrics { + readonly totalUseCases: number; + readonly initialGeneration: { hits: number; creation: number }; + readonly repairs: { + readonly [repairIteration: string]: { + count: number; + hits: number; + creation: number; + }; + }; } +/** + * Overall cache validation results with performance analysis + */ +export interface OverallCacheValidation { + readonly initialCacheEfficiency: "pass" | "fail"; + readonly firstRepairAllReads: "pass" | "fail" | "not_applicable"; + readonly subsequentRepairsNoWrites: "pass" | "fail" | "not_applicable"; + readonly overallStatus: "pass" | "fail"; + readonly InitialGenCacheCreation: number; + readonly repairIterationCounts: { + readonly [repairIteration: string]: number; + }; + readonly validationIssues: readonly string[]; +} + + /** * Per-test-case accuracy across iterations */ @@ -130,6 +183,8 @@ export interface Summary { readonly iterationResults?: readonly IterationSummary[]; readonly perTestCaseAccuracy?: readonly TestCaseAccuracy[]; readonly evaluationSummary: number + readonly aggregatedUsage?: AggregatedUsageMetrics; + readonly overallCacheValidation?: OverallCacheValidation; } /** @@ -141,6 +196,8 @@ export interface SummaryCompact { readonly totalFailed: number; readonly accuracy: number; readonly evaluationSummary: number + readonly aggregatedUsage?: AggregatedUsageMetrics; + readonly overallCacheValidation?: OverallCacheValidation; } /** @@ -153,4 +210,11 @@ export interface UsecaseCompact { readonly iteration?: number; readonly toolEvents?: readonly ToolEvent[]; readonly evaluationResult: LLMEvaluationResult; + readonly usage?: { + readonly totalTokens: number; + readonly cacheHits: number; + readonly cacheCreations: number; + readonly repairCount: number; + readonly cacheValidationStatus: "pass" | "warning" | "fail" | "unknown"; + }; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts index a47fed03fa7..55329bd725e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts @@ -29,6 +29,63 @@ export interface TestUseCase { readonly fileAttachments?: readonly { fileName: string; content: string; }[]; } +/** + * Normalized token usage record (using camelCase for consistency) + */ +export interface TokenUsageRecord { + readonly inputTokens: number; + readonly cacheCreationInputTokens: number; + readonly cacheReadInputTokens: number; + readonly outputTokens: number; +} + +/** + * Enhanced repair tracking with iteration context + */ +export interface RepairUsageRecord extends TokenUsageRecord { + readonly iteration: number; +} + +/** + * Complete usage tracking for a test case with cache analysis + */ +export interface UsageTracking { + readonly initial: TokenUsageRecord; + readonly repairs: readonly RepairUsageRecord[]; + readonly overallCachePerformanceValidation: { + readonly initialGenerationCheck: "pass" | "warning"; + readonly firstRepairCheck: "pass" | "fail" | "not_applicable"; + readonly subsequentRepairsCheck: "pass" | "warning" | "not_applicable"; + readonly issues: readonly string[]; + }; +} + +/** + * Usage metrics for AI operations + */ +export interface UsageMetrics { + readonly usage?: UsageTracking; +} + +/** + * Cache operation counts for a specific phase + */ +export interface CacheOperationCounts { + readonly hits: number; + readonly creation: number; +} + +/** + * Aggregated cache usage summary across multiple use cases + */ +export interface AggregatedCacheUsageSummary { + readonly totalUseCases: number; + readonly initialGeneration: CacheOperationCounts; + readonly repairs: { + readonly [repairIteration: string]: CacheOperationCounts; + }; +} + /** * Test event result containing all information captured during test execution */ @@ -44,6 +101,7 @@ export interface TestEventResult { readonly startTime?: number; readonly endTime?: number; readonly duration?: number; + readonly usageMetrics?: UsageMetrics; } /** diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/cache-analysis.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/cache-analysis.ts new file mode 100644 index 00000000000..91e9cafb40e --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/cache-analysis.ts @@ -0,0 +1,140 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +/** + * Utility functions for mapping provider usage data to our normalized structure + * and analyzing cache performance patterns + */ + +import { TokenUsageRecord, AggregatedCacheUsageSummary } from '../types'; + +/** + * Validates cache usage patterns for a test case + */ +export function validateCacheUsage( + initial: TokenUsageRecord, + repairs: TokenUsageRecord[] +): { + initialGenerationCheck: "pass" | "warning"; + firstRepairCheck: "pass" | "fail" | "not_applicable"; + subsequentRepairsCheck: "pass" | "warning" | "not_applicable"; + issues: string[]; +} { + const issues: string[] = []; + + // Individual use case validation for initial generation + // If initial generation has cache creation → warning, if cache read → pass + const initialGenerationCheck = initial.cacheCreationInputTokens > 0 ? "warning" : "pass"; + if (initialGenerationCheck === "warning") { + issues.push("Initial generation created fresh cache instead of reusing existing cache"); + } + + // Validate repair patterns (existing logic) + let firstRepairCheck: "pass" | "fail" | "not_applicable" = "not_applicable"; + let subsequentRepairsCheck: "pass" | "warning" | "not_applicable" = "not_applicable"; + + if (repairs.length > 0) { + // First repair validation: cache creation is allowed (mixed strategy) + const firstRepair = repairs[0]; + firstRepairCheck = firstRepair.cacheReadInputTokens > 0 ? "pass" : "fail"; // First repair must have cache reads + if (firstRepairCheck === "fail") { + issues.push("First repair iteration has no cache reads (cache read is mandatory)"); + } + + // Subsequent repairs validation: should be cache-only (no creation) + if (repairs.length > 1) { + const subsequentRepairs = repairs.slice(1); + const hasCreationRepairs = subsequentRepairs.filter(repair => repair.cacheCreationInputTokens > 0); + + if (hasCreationRepairs.length > 0) { + subsequentRepairsCheck = "warning"; + issues.push(`${hasCreationRepairs.length} subsequent repair(s) have cache creation (should be cache-only)`); + } else { + subsequentRepairsCheck = "pass"; + } + } + } + + return { + initialGenerationCheck, + firstRepairCheck, + subsequentRepairsCheck, + issues + }; +} + + + +/** + * Creates aggregated cache usage summary across multiple test results + */ +export function createAggregatedCacheUsageSummary(testResults: any[]): AggregatedCacheUsageSummary { + const totalUseCases = testResults.length; + + // Track initial generation cache stats + let initialHits = 0; + let initialCreations = 0; + + // Track repair stats by iteration + const repairStats: { [iteration: number]: { hits: number; creation: number } } = {}; + + testResults.forEach(result => { + if (result.usageMetrics?.usage) { + const usage = result.usageMetrics.usage; + + // Count initial generation cache usage (no cachePerformance object, use raw data) + if (usage.initial) { + if (usage.initial.cacheReadInputTokens > 0) { + initialHits++; + } + if (usage.initial.cacheCreationInputTokens > 0) { + initialCreations++; + } + } + + // Count repair cache usage by iteration (no cachePerformance object, use raw data) + usage.repairs?.forEach((repair: any) => { + const iteration = repair.iteration; + if (!repairStats[iteration]) { + repairStats[iteration] = { hits: 0, creation: 0 }; + } + + if (repair.cacheReadInputTokens > 0) { + repairStats[iteration].hits++; + } + if (repair.cacheCreationInputTokens > 0) { + repairStats[iteration].creation++; + } + }); + } + }); + + // Build the repairs object with dynamic repair keys + const repairs: { [repairIteration: string]: { hits: number; creation: number } } = {}; + Object.keys(repairStats).forEach(iteration => { + const repairKey = `repair${iteration}`; + repairs[repairKey] = repairStats[parseInt(iteration)]; + }); + + return { + totalUseCases, + initialGeneration: { + hits: initialHits, + creation: initialCreations + }, + repairs + }; +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts index f01f72a8031..71f3568e646 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/index.ts @@ -18,5 +18,6 @@ export * from './constants'; export * from './test-event-handler'; export * from './test-validation'; export * from './test-execution'; +export * from './cache-analysis'; export * from './batch-processing'; export * from './content-parser'; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts index 7c9d7d3161f..d44bee10433 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts @@ -16,14 +16,15 @@ import { ChatNotify } from "@wso2/ballerina-core"; export type CopilotEventHandler = (event: ChatNotify) => void; -import { TestUseCase, TestEventResult } from '../types'; +import { TestUseCase, TestEventResult, RepairUsageRecord, UsageMetrics, TokenUsageRecord } from '../types'; +import { validateCacheUsage } from './cache-analysis'; /** * Creates a test event handler that captures events for testing */ -export function createTestEventHandler(useCase?: TestUseCase): { - handler: CopilotEventHandler; - getResult: () => TestEventResult; +export function createTestEventHandler(useCase?: TestUseCase): { + handler: CopilotEventHandler; + getResult: () => TestEventResult; } { const events: ChatNotify[] = []; let fullContent = ""; @@ -34,7 +35,9 @@ export function createTestEventHandler(useCase?: TestUseCase): { const messages: unknown[] = []; let startTime: number | undefined; let endTime: number | undefined; - + let initialUsage: TokenUsageRecord | null = null; + const repairUsages: RepairUsageRecord[] = []; + let repairCounter = 0; const handler: CopilotEventHandler = (event: ChatNotify): void => { events.push(event); @@ -84,25 +87,59 @@ export function createTestEventHandler(useCase?: TestUseCase): { console.log(`[${useCase?.id || 'unknown'}] [EVALS] Tool result from ${event.toolName}:`); console.log(JSON.stringify(event.output, null, 2)); break; + case "usage_metrics": + console.log(`[${useCase?.id || 'unknown'}] Usage metrics received:`, { + usage: event.usage, + isRepair: event.isRepair + }); + if (event.isRepair) { + repairCounter++; + const repairRecord: RepairUsageRecord = { + ...event.usage, + iteration: repairCounter + }; + repairUsages.push(repairRecord); + } else { + initialUsage = event.usage; + } + break; default: console.warn(`[${useCase?.id || 'unknown'}] Unhandled event type: ${(event as unknown as { type: string }).type}`); break; } }; - const getResult = (): TestEventResult => ({ - events, - fullContent, - hasStarted, - hasCompleted, - errorOccurred, - diagnostics, - messages, - useCase, - startTime, - endTime, - duration: startTime && endTime ? endTime - startTime : undefined, - }); + const getResult = (): TestEventResult => { + let usageMetrics: UsageMetrics | undefined; + + if (initialUsage || repairUsages.length > 0) { + // Calculate cache validation using raw token data + const validationResults = validateCacheUsage(initialUsage, repairUsages); + + usageMetrics = { + usage: { + initial: initialUsage, + repairs: repairUsages, + overallCachePerformanceValidation: validationResults + } + }; + } + + return { + events, + fullContent, + hasStarted, + hasCompleted, + errorOccurred, + diagnostics, + messages, + useCase, + startTime, + endTime, + duration: startTime && endTime ? endTime - startTime : undefined, + usageMetrics, + }; + }; return { handler, getResult }; } From c6df17e4c0c785fd59f40a27b9a2fffdeaadbe12 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Wed, 8 Oct 2025 20:32:00 +0530 Subject: [PATCH 138/730] Add tests for existing code eval --- .../ai/service/libs/text_editor_tool.ts | 16 +++++++++ .../test/ai/evals/code/test-cases.ts | 35 +++++++++++-------- .../test/ai/evals/code/utils/constants.ts | 1 + 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index 3f24b744d9f..e2591296bed 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -114,6 +114,22 @@ function validateFilePath(filePath: string): PathValidation { }; } + const allowedPatterns = [ + /^[^\/]+\.bal$/, // **.bal (root level files) + /^modules\/[^\/]+\/[^\/]+\.bal$/, // modules//**.bal + /^generated\/[^\/]+\.bal$/, // generated/**.bal + /^tests\/[^\/]+\.bal$/ // tests/**.bal + ]; + + const isValidPath = allowedPatterns.some(pattern => pattern.test(filePath)); + + if (!isValidPath) { + return { + valid: false, + error: 'Invalid filepath structure. Please include only the filename in the filepath.' + }; + } + return { valid: true }; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index 4d7c5265574..1a0b771d0ab 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -172,39 +172,44 @@ export const textEditSpecializedTestCases = [ export const testCasesForExistingProject = [ { - // Covers: 1 (Look into files), 3 (Create new file) - // This prompt requires the copilot to understand distributed tracing implementation across microservices, - // handle OpenTelemetry integration, and create new files for tracing configuration and correlation management. prompt: "How can I implement distributed tracing with OpenTelemetry across the order service saga, ensuring that trace contexts are properly propagated through Kafka events and database transactions while maintaining correlation IDs for debugging payment and fulfillment failures?", projectPath: "simple_order_management_system" }, { - // Covers: 1 (Look into files), 2 (Delete/Replace file content) - // This prompt forces the copilot to replace synchronous processing with asynchronous batch processing, - // implementing circuit breaker patterns and retry mechanisms while restructuring the existing order flow. prompt: "I need to refactor the current synchronous order creation flow to support asynchronous batch processing with dead letter queues for failed orders, implementing circuit breaker patterns for the pricing service calls and adding retry mechanisms with exponential backoff for Kafka publishing failures.", projectPath: "simple_order_management_system" }, { - // Covers: 1 (Look into files), 4 (Delete a specific part of code) - // This prompt tests the ability to add comprehensive audit capabilities while specifically removing - // the current simple logging and replacing it with sophisticated audit trail system. prompt: "Can you help me implement a comprehensive audit trail system that captures all order state transitions in a separate audit table, with event versioning for schema evolution and integration with a time-series database for real-time monitoring dashboards and alerting on order processing anomalies?", projectPath: "simple_order_management_system" }, { - // Covers: 1 (Look into files), 3 (Create new file), 4 (Delete a specific part of code) - // This is a multi-faceted prompt that involves creating new files for gRPC integration and caching, - // while removing the existing mock pricing calculation and replacing it with proper service integration. prompt: "I want to replace the current mock pricing calculation with a proper integration to an external pricing microservice using gRPC, implementing request/response caching with Redis, connection pooling with health checks, and graceful degradation when the pricing service is unavailable.", projectPath: "simple_order_management_system" }, { - // Covers: 1 (Look into files), 2 (Delete/Replace file content), 3 (Create new file) - // This prompt combines implementing saga pattern compensating transactions, creating new files for transaction management, - // and replacing the current simple event publishing with sophisticated saga orchestration and recovery mechanisms. prompt: "How do I implement proper compensating transactions for the order saga pattern, including automatic rollback mechanisms when payment fails, inventory reservation cancellation, and notification service integration with idempotent operations to handle duplicate events during saga recovery?", projectPath: "simple_order_management_system" + }, + { + prompt: "Add comprehensive API documentation with examples for all REST endpoints, including request/response schemas and error handling scenarios.", + projectPath: "simple_order_management_system" + }, + { + prompt: "Change the database schema to store order lines in a separate order_lines table with a foreign key relationship instead of storing them as JSON in the orders table.", + projectPath: "simple_order_management_system" + }, + { + prompt: "Fix the bug where the getOrderById function returns an empty response instead of a proper error when the database connection fails.", + projectPath: "simple_order_management_system" + }, + { + prompt: "Add a new REST endpoint to cancel an existing order by updating its status to 'CANCELLED' and publishing a cancellation event to Kafka.", + projectPath: "simple_order_management_system" + }, + { + prompt: "Add validation to ensure the order total amount is greater than zero before creating an order in the system.", + projectPath: "simple_order_management_system" } ]; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts index 4059c526b40..211e2d763c1 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -21,6 +21,7 @@ import * as path from 'path'; * Default test configuration */ export const DEFAULT_TEST_CONFIG: TestConfiguration = { + // should be 1, 5, 10, 15, 20 ... maxConcurrency: 5 } as const; From 669fa22f957d6ef4797c9dfb4035294daa2143f2 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Wed, 8 Oct 2025 23:26:57 +0530 Subject: [PATCH 139/730] Add support to use properties in datamappers --- workspaces/mi/mi-data-mapper-utils/src/dm-utils.ts | 13 +++++++++++++ workspaces/mi/mi-extension/src/util/templates.ts | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-data-mapper-utils/src/dm-utils.ts b/workspaces/mi/mi-data-mapper-utils/src/dm-utils.ts index ee78f2ce33e..8945e661a89 100644 --- a/workspaces/mi/mi-data-mapper-utils/src/dm-utils.ts +++ b/workspaces/mi/mi-data-mapper-utils/src/dm-utils.ts @@ -16,6 +16,8 @@ * under the License. */ +declare var DM_PROPERTIES: any; + // ########################### Arithmetic Operators ########################### /** @@ -229,3 +231,14 @@ export function replaceFirst(str: string, target: string, replacement: string): export function match(str: string, regex: RegExp): boolean { return regex.test(str); } + +/** + * Return expression to access property. + * @param propertyScope - The scope of the property. + * @param propertyName - The name of the property. + * @returns The expression to access the property. + */ +export function getPropertyValue(propertyScope: string, propertyName: string): any { + return DM_PROPERTIES?.[propertyScope.toUpperCase()]?.[propertyName]; +} + diff --git a/workspaces/mi/mi-extension/src/util/templates.ts b/workspaces/mi/mi-extension/src/util/templates.ts index 46a2d0446b2..9cd08299183 100644 --- a/workspaces/mi/mi-extension/src/util/templates.ts +++ b/workspaces/mi/mi-extension/src/util/templates.ts @@ -25,7 +25,7 @@ export function escapeXml(text: string) { .replace(/"/g, '"'); }; -export const LATEST_CAR_PLUGIN_VERSION = "5.4.8"; +export const LATEST_CAR_PLUGIN_VERSION = "5.4.10"; export const rootPomXmlContent = (projectName: string, groupID: string, artifactID: string, projectUuid: string, version: string, miVersion: string, initialDependencies: string) => ` Date: Thu, 9 Oct 2025 00:49:09 +0530 Subject: [PATCH 140/730] Update valid file paths in text editor validation --- .../src/features/ai/service/code/code.ts | 21 +++++++++++-------- .../ai/service/libs/text_editor_tool.ts | 8 +++---- .../views/AIPanel/components/AIChat/index.tsx | 16 +++++++------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index e0fe8ae61c3..4f0738f0fe0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -224,9 +224,10 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler { previousMessages: allMessages, assistantResponse: diagnosticFixResp, - diagnostics: diagnostics, + diagnostics: diagnostics }, - libraryDescriptions + libraryDescriptions, + updatedSourceFiles ); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; @@ -383,7 +384,7 @@ Important reminders: - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. Begin your response with the explanation. The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. -Once the explanation is finished, you must apply precise targeted edits to the existing source code using the **str_replace_based_edit_tool** tool. +Once the explanation is finished, you must apply surgical edits to the existing source code using the **str_replace_based_edit_tool** tool. The complete source code will be provided in the section of the user prompt. When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. @@ -456,7 +457,7 @@ export async function repairCodeCore( eventHandler: CopilotEventHandler ): Promise { eventHandler({ type: "start" }); - const resp = await repairCode(params, libraryDescriptions); + const resp = await repairCode(params, libraryDescriptions, []); eventHandler({ type: "content_replace", content: resp.repairResponse }); console.log("Manual Repair Diagnostics left: ", resp.diagnostics); eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); @@ -464,7 +465,8 @@ export async function repairCodeCore( return resp; } -export async function repairCode(params: RepairParams, libraryDescriptions: string): Promise { +export async function repairCode(params: RepairParams, + libraryDescriptions: string, sourceFiles: SourceFiles[] = []): Promise { const allMessages: ModelMessage[] = [...params.previousMessages]; const lastMessage = allMessages[allMessages.length - 1]; let isToolCallExistInLastMessage = false; @@ -483,10 +485,10 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri const userRepairMessage: ModelMessage = { role: "user", content: - "Generated code returns the following compiler errors. Using the library details from the `LibraryProviderTool` results in previous messages, first check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + - "Do not create any new files. Just update the existing code to fix the errors. \n Errors: \n " + + "Generated code returns the following compiler errors that uses the library details from the `LibraryProviderTool` results in previous messages. First check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + + "And also do not create any new files. Just update the existing code to fix the errors. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), - } + }; if (isToolCallExistInLastMessage) { allMessages.push({ @@ -517,7 +519,8 @@ export async function repairCode(params: RepairParams, libraryDescriptions: stri allMessages.push(userRepairMessage); - let updatedSourceFiles: SourceFiles[] = getProjectFromResponse(params.assistantResponse).sourceFiles; + let updatedSourceFiles: SourceFiles[] = sourceFiles.length == 0 ? + getProjectFromResponse(params.assistantResponse).sourceFiles : sourceFiles; let updatedFileNames: string[] = []; const tools = { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index e2591296bed..88b27317078 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -115,10 +115,10 @@ function validateFilePath(filePath: string): PathValidation { } const allowedPatterns = [ - /^[^\/]+\.bal$/, // **.bal (root level files) - /^modules\/[^\/]+\/[^\/]+\.bal$/, // modules//**.bal - /^generated\/[^\/]+\.bal$/, // generated/**.bal - /^tests\/[^\/]+\.bal$/ // tests/**.bal + /^\/?[^\/]+\.bal$/, + /^\/?modules\/[^\/]+\/[^\/]+\.bal$/, + /^\/?generated\/[^\/]+\.bal$/, + /^\/?tests\/[^\/]+\.bal$/ ]; const isValidPath = allowedPatterns.some(pattern => pattern.test(filePath)); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index f5dd498f5dc..0fce0e7035a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -292,13 +292,15 @@ const AIChat: React.FC = () => { return newMessages; }); } else if (type === "tool_call") { - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content += `\n\nAnalyzing request & selecting libraries...`; - } - return newMessages; - }); + if (response.toolName == "LibraryProviderTool") { + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + if (newMessages.length > 0) { + newMessages[newMessages.length - 1].content += `\n\nAnalyzing request & selecting libraries...`; + } + return newMessages; + }); + } } else if (type === "tool_result") { if (response.toolName == "LibraryProviderTool") { const libraryNames = response.libraryNames; From d72198bb374c8ea012cd98def73322c9dd3e8564 Mon Sep 17 00:00:00 2001 From: Sanoj Punchihewa Date: Tue, 9 Sep 2025 11:53:02 +0530 Subject: [PATCH 141/730] Use descriptor.xml to read project details --- workspaces/mi/mi-extension/src/util/importCapp.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/workspaces/mi/mi-extension/src/util/importCapp.ts b/workspaces/mi/mi-extension/src/util/importCapp.ts index f56974908c1..85704f30573 100644 --- a/workspaces/mi/mi-extension/src/util/importCapp.ts +++ b/workspaces/mi/mi-extension/src/util/importCapp.ts @@ -91,6 +91,19 @@ export async function importCapp(params: ImportProjectRequest): Promise Date: Thu, 9 Oct 2025 08:39:32 +0530 Subject: [PATCH 142/730] Add fallback key for the type-suggestions --- .../src/views/BI/Forms/FormGeneratorNew/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx index fe7833ea251..15ee78aa32e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx @@ -478,7 +478,8 @@ export function FormGeneratorNew(props: FormProps) { if (isGraphqlEditor) { context = fieldKey === 'returnType' ? TypeHelperContext.GRAPHQL_FIELD_TYPE : TypeHelperContext.GRAPHQL_INPUT_TYPE; } - let visibleTypes = typesCache.current.get(fieldKey); + let typesCacheKey = fieldKey || 'default'; + let visibleTypes = typesCache.current.get(typesCacheKey); if (!visibleTypes) { let types; @@ -497,7 +498,7 @@ export function FormGeneratorNew(props: FormProps) { const isFetchingTypesForDM = valueTypeConstraint === "json"; visibleTypes = convertToVisibleTypes(types, isFetchingTypesForDM); - typesCache.current.set(fieldKey, visibleTypes); + typesCache.current.set(typesCacheKey, visibleTypes); } setTypes(visibleTypes); From 80f12e5845aa73321cf51ca6993bf6aaba0ca28c Mon Sep 17 00:00:00 2001 From: Sanoj Punchihewa Date: Thu, 9 Oct 2025 07:23:09 +0530 Subject: [PATCH 143/730] Fix review comments --- .../mi/mi-extension/src/util/importCapp.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/importCapp.ts b/workspaces/mi/mi-extension/src/util/importCapp.ts index 85704f30573..5743f3dee8e 100644 --- a/workspaces/mi/mi-extension/src/util/importCapp.ts +++ b/workspaces/mi/mi-extension/src/util/importCapp.ts @@ -89,19 +89,25 @@ export async function importCapp(params: ImportProjectRequest): Promise Date: Sat, 4 Oct 2025 18:56:10 +0530 Subject: [PATCH 144/730] Add integration ai integraion tests --- .vscode/launch.json | 22 ++++ .../ballerina-extension/.vscode/launch.json | 2 +- .../ballerina-extension/package.json | 2 + .../src/features/ai/activator.ts | 39 +++++- .../test/ai/integration_tests/libs/index.ts | 55 +++++++++ .../ai/integration_tests/libs/libs.test.ts | 112 ++++++++++++++++++ .../test/ai/integration_tests/libs/setup.ts | 90 ++++++++++++++ .../ai/integration_tests/libs/test-helpers.ts | 102 ++++++++++++++++ .../test/runLibsIntegrationTest.ts | 92 ++++++++++++++ 9 files changed, 514 insertions(+), 2 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/index.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 6e859a2559e..4284dd15b04 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -258,6 +258,28 @@ "preLaunchTask": "compile:ballerina-tests", "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" }, + { + "name": "Ballerina Extension AI Integration Tests - Libs", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}/workspaces/ballerina/ballerina-extension", + "--extensionTestsPath=${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test/ai/integration_tests/libs", + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/test/data/bi_empty" + ], + "env": { + "LS_EXTENSIONS_PATH": "", + "LSDEBUG": "false", + "WEB_VIEW_WATCH_MODE": "false", + "AI_TEST_ENV": "true" + }, + "outFiles": [ + "${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test/**/*.js" + ], + "preLaunchTask": "compile:ballerina-tests", + "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" + }, { "name": "APK Extension", "type": "extensionHost", diff --git a/workspaces/ballerina/ballerina-extension/.vscode/launch.json b/workspaces/ballerina/ballerina-extension/.vscode/launch.json index 4b3bbb0e2f1..db7f0a92fa6 100644 --- a/workspaces/ballerina/ballerina-extension/.vscode/launch.json +++ b/workspaces/ballerina/ballerina-extension/.vscode/launch.json @@ -71,6 +71,6 @@ "outFiles": [ "${workspaceFolder}/out/src/debugger/**/*.js" ], - }, + } ] } diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 07c075692b4..c87e953cb83 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1118,6 +1118,8 @@ "watch-ballerina": "webpack --mode none --watch", "test-compile": "tsc -p ./", "test": "pnpm run test-compile && node ./out/test/runTest.js", + "test:ai": "pnpm run test-compile && node ./out/test/runAiTest.js", + "test:libs-integration": "pnpm run test-compile && node ./out/test/runLibsIntegrationTest.js", "e2e-test-setup": "npx extest get-vscode -c 1.83.1 && npx extest get-chromedriver -c 1.83.1 && npx extest install-vsix -f $(ls vsix/*.vsix)", "preui-test": "node -e \"const fs = require('fs'); if (fs.existsSync('test-resou')) { fs.unlinkSync('test-resou'); }\"", "e2e-test": "pnpm run test-compile && npx extest run-tests 'out/ui-test/*.test.js' --mocha_config ui-test/.mocharc.js -o ui-test/settings.json", diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 5d1311cf401..c449d3e495c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -37,11 +37,48 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension activateCopilotLoginCommand(); resetBIAuth(); - // Register a command in test environment to test the AI features + // Register commands in test environment to test the AI features if (process.env.AI_TEST_ENV) { commands.registerCommand('ballerina.test.ai.generateCodeCore', async (params: GenerateCodeRequest, testEventHandler: CopilotEventHandler) => { await generateCodeCore(params, testEventHandler); }); + + // Library integration test commands + const { + getAllLibraries, + getSelectedLibraries, + getRelevantLibrariesAndFunctions, + GenerationType + } = require('./service/libs/libs'); + const { + selectRequiredFunctions, + getMaximizedSelectedLibs, + toMaximizedLibrariesFromLibJson + } = require('./service/libs/funcs'); + + commands.registerCommand('ballerina.test.ai.getAllLibraries', async (generationType: typeof GenerationType) => { + return await getAllLibraries(generationType); + }); + + commands.registerCommand('ballerina.test.ai.getSelectedLibraries', async (prompt: string, generationType: typeof GenerationType) => { + return await getSelectedLibraries(prompt, generationType); + }); + + commands.registerCommand('ballerina.test.ai.getRelevantLibrariesAndFunctions', async (params: any, generationType: typeof GenerationType) => { + return await getRelevantLibrariesAndFunctions(params, generationType); + }); + + commands.registerCommand('ballerina.test.ai.selectRequiredFunctions', async (prompt: string, selectedLibNames: string[], generationType: typeof GenerationType) => { + return await selectRequiredFunctions(prompt, selectedLibNames, generationType); + }); + + commands.registerCommand('ballerina.test.ai.getMaximizedSelectedLibs', async (libNames: string[], generationType: typeof GenerationType) => { + return await getMaximizedSelectedLibs(libNames, generationType); + }); + + commands.registerCommand('ballerina.test.ai.toMaximizedLibrariesFromLibJson', async (functionResponses: any[], originalLibraries: any[]) => { + return await toMaximizedLibrariesFromLibJson(functionResponses, originalLibraries); + }); } const projectPath = StateMachine.context().projectUri; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/index.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/index.ts new file mode 100644 index 00000000000..e2309aace78 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/index.ts @@ -0,0 +1,55 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as path from "path"; +import Mocha = require("mocha"); +import * as glob from "glob"; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + color: true, + timeout: 120000, // 2 minutes default timeout for integration tests + }); + + const testsRoot = path.resolve(__dirname, "."); + + return new Promise((resolve, reject) => { + glob.glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return reject(err); + } + + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + reject(new Error(`${failures} tests failed.`)); + } else { + resolve(); + } + }); + } catch (err) { + console.error(err); + reject(err); + } + }); + }); +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts new file mode 100644 index 00000000000..451d14337c1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts @@ -0,0 +1,112 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as assert from "assert"; +import { commands } from "vscode"; +import { setupTestEnvironment } from "./setup"; +import { + VSCODE_COMMANDS, + transformLibraryToGetFunctionResponse, +} from "./test-helpers"; +import { GenerationType } from "../../../../src/features/ai/service/libs/libs"; + +suite("Library Integration Tests", () => { + suiteSetup(async function (): Promise { + this.timeout(120000); // 2 minutes timeout for setup and extension activation + console.log("🔧 Setting up test environment..."); + try { + await setupTestEnvironment(); + console.log("✓ Test environment setup completed"); + } catch (error) { + console.error("❌ Setup failed:", error); + throw error; + } + }); + + suite("getAllLibraries", () => { + test("should return array of libraries for CODE_GENERATION", async function () { + this.timeout(10000); + console.log("\n📝 Running test: getAllLibraries for CODE_GENERATION"); + try { + const libraries = await commands.executeCommand( + VSCODE_COMMANDS.GET_ALL_LIBRARIES, + GenerationType.CODE_GENERATION + ) as any[]; + console.log(`✓ Received ${libraries.length} libraries`); + + assert.ok(Array.isArray(libraries), "Should return an array"); + assert.ok(libraries.length > 0, "Should return at least one library"); + // validateLibraryListStructure(libraries); + console.log("✓ Test passed: CODE_GENERATION libraries validated"); + } catch (error) { + console.error("❌ Test failed:", error); + throw error; + } + }); + }); + + suite("toMaximizedLibrariesFromLibJson", () => { + test("should maximize all libraries from library JSON", async function () { + this.timeout(30000); + console.log("\n📝 Running test: toMaximizedLibrariesFromLibJson with all libraries"); + try { + // Step 1: Get all libraries to get their names + console.log("Step 1: Getting all library names..."); + const allLibraries = await commands.executeCommand( + VSCODE_COMMANDS.GET_ALL_LIBRARIES, + GenerationType.CODE_GENERATION + ) as any[]; + console.log(`✓ Found ${allLibraries.length} libraries`); + + // Step 2: Get maximized libraries for all library names + console.log("Step 2: Getting maximized libraries..."); + const libNames = allLibraries.map((lib: any) => lib.name); + const maximizedLibs = await commands.executeCommand( + VSCODE_COMMANDS.GET_MAXIMIZED_SELECTED_LIBS, + libNames, + GenerationType.CODE_GENERATION + ) as any[]; + console.log(`✓ Received ${maximizedLibs.length} maximized libraries`); + + // Step 3: Transform libraries to GetFunctionResponse format + console.log("Step 3: Transforming libraries to GetFunctionResponse format..."); + const functionList = maximizedLibs.map((lib: any) => + transformLibraryToGetFunctionResponse(lib) + ); + console.log(`✓ Transformed ${functionList.length} libraries`); + + // Step 4: Call toMaximizedLibrariesFromLibJson + console.log("Step 4: Calling toMaximizedLibrariesFromLibJson..."); + const result = await commands.executeCommand( + VSCODE_COMMANDS.TO_MAXIMIZED_LIBRARIES_FROM_LIB_JSON, + functionList, + maximizedLibs + ) as any[]; + console.log(`✓ Received ${result.length} maximized libraries from function`); + + // Step 5: Validate results + console.log("Step 5: Validating results..."); + assert.ok(Array.isArray(result), "Should return an array"); + assert.ok(result.length > 0, "Should return at least one library"); + + console.log("✓ Test passed: All libraries successfully maximized"); + } catch (error) { + console.error("❌ Test failed:", error); + throw error; + } + }); + }); +}); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts new file mode 100644 index 00000000000..cb3ad27a6e1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts @@ -0,0 +1,90 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as path from "path"; +import * as fs from "fs"; +import * as vscode from "vscode"; +import { commands, Uri, workspace } from "vscode"; +import * as dotenv from "dotenv"; + +const TIMING = { + WORKSPACE_SETUP_DELAY: 10000, + WORKSPACE_SETTLE_DELAY: 3000, + FILE_OPEN_DELAY: 5000, + EXTENSION_ACTIVATION_RETRY_INTERVAL: 2000, + MAX_ACTIVATION_ATTEMPTS: 30, +}; + +const PATHS = { + PROJECT_ROOT_RELATIVE: "../../../../../test/data/bi_empty", + ENV_FILE_RELATIVE: "../../../../.env", +}; + +const VSCODE_COMMANDS = { + CLOSE_ALL_EDITORS: "workbench.action.closeAllEditors", + OPEN: "vscode.open", + SHOW_EXAMPLES: "ballerina.showExamples", +}; + +/** + * Sets up the test environment for library integration tests + */ +export async function setupTestEnvironment(): Promise { + // Load environment variables from .env file if it exists + const envPath = path.resolve(__dirname, PATHS.ENV_FILE_RELATIVE); + if (fs.existsSync(envPath)) { + dotenv.config({ path: envPath }); + console.log("Loaded .env file for library integration tests"); + } + + // Wait for VSCode startup to complete + await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETUP_DELAY)); + + await commands.executeCommand(VSCODE_COMMANDS.CLOSE_ALL_EDITORS); + + // Note: Workspace is already opened by VS Code via launch.json args + // Wait for workspace to settle and extension to activate + await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETTLE_DELAY)); + + // Force extension activation by opening a Ballerina file + try { + const PROJECT_ROOT = path.resolve(__dirname, PATHS.PROJECT_ROOT_RELATIVE); + const testBalFile = Uri.file(path.join(PROJECT_ROOT, "main.bal")); + await commands.executeCommand(VSCODE_COMMANDS.OPEN, testBalFile); + await new Promise(resolve => setTimeout(resolve, TIMING.FILE_OPEN_DELAY)); + } catch (error) { + // Fallback: try to execute a ballerina command to force activation + try { + await commands.executeCommand(VSCODE_COMMANDS.SHOW_EXAMPLES); + } catch (cmdError) { + // Extension might still be loading + } + } + + // Wait for extension to activate (it activates onStartupFinished) + // Give it sufficient time to load language server and initialize + console.log("Waiting for extension activation and language server initialization..."); + await new Promise(resolve => setTimeout(resolve, 20000)); // 20 seconds for full activation including LS + console.log("✓ Extension should be activated"); + + // Log API key availability for test visibility + const anthropicApiKey = process.env.ANTHROPIC_API_KEY; + if (anthropicApiKey && anthropicApiKey.trim() !== "") { + console.log("ANTHROPIC_API_KEY found - tests will use BYOK authentication"); + } else { + console.log("No ANTHROPIC_API_KEY found - tests may fail without authentication"); + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts new file mode 100644 index 00000000000..eb0dd0c6e62 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts @@ -0,0 +1,102 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { Library, Client, RemoteFunction, ResourceFunction } from "../../../../src/features/ai/service/libs/libs_types"; +import { GetFunctionResponse, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "../../../../src/features/ai/service/libs/funcs_inter_types"; + +/** + * Transforms a Library to GetFunctionResponse format for testing + * This mimics the Ballerina test logic in test.bal + */ +export function transformLibraryToGetFunctionResponse(library: Library): GetFunctionResponse { + return { + name: library.name, + clients: filteredClientsForTest(library.clients), + functions: filteredNormalFunctionsForTest(library.functions) + }; +} + +/** + * Filters and transforms clients to minified format + */ +function filteredClientsForTest(clients: Client[]): MinifiedClient[] { + return clients.map((client) => ({ + name: client.name, + description: client.description, + functions: filteredFunctionsForTest(client.functions) + })); +} + +/** + * Filters and transforms client functions to minified format + */ +function filteredFunctionsForTest( + functions: (RemoteFunction | ResourceFunction)[] +): (MinifiedRemoteFunction | MinifiedResourceFunction)[] { + const output: (MinifiedRemoteFunction | MinifiedResourceFunction)[] = []; + + for (const item of functions) { + if ("accessor" in item) { + // ResourceFunction + const res: MinifiedResourceFunction = { + accessor: item.accessor, + paths: item.paths, + parameters: item.parameters.map((param) => param.name), + returnType: item.return.type.name + }; + output.push(res); + } else { + // RemoteFunction (skip Constructor type) + if (item.type !== "Constructor") { + const rem: MinifiedRemoteFunction = { + name: item.name, + parameters: item.parameters.map((param) => param.name), + returnType: item.return.type.name + }; + output.push(rem); + } + } + } + + return output; +} + +/** + * Filters and transforms normal functions to minified format + */ +function filteredNormalFunctionsForTest(functions?: RemoteFunction[]): MinifiedRemoteFunction[] | undefined { + if (!functions) { + return undefined; + } + + return functions.map((item) => ({ + name: item.name, + parameters: item.parameters.map((param) => param.name), + returnType: item.return.type.name + })); +} + +/** + * VS Code test commands for library integration tests + */ +export const VSCODE_COMMANDS = { + GET_ALL_LIBRARIES: "ballerina.test.ai.getAllLibraries", + GET_SELECTED_LIBRARIES: "ballerina.test.ai.getSelectedLibraries", + GET_RELEVANT_LIBRARIES_AND_FUNCTIONS: "ballerina.test.ai.getRelevantLibrariesAndFunctions", + SELECT_REQUIRED_FUNCTIONS: "ballerina.test.ai.selectRequiredFunctions", + GET_MAXIMIZED_SELECTED_LIBS: "ballerina.test.ai.getMaximizedSelectedLibs", + TO_MAXIMIZED_LIBRARIES_FROM_LIB_JSON: "ballerina.test.ai.toMaximizedLibrariesFromLibJson", +} as const; diff --git a/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts b/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts new file mode 100644 index 00000000000..151e3947831 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as path from 'path'; +import * as cp from 'child_process'; +import { downloadAndUnzipVSCode, resolveCliPathFromVSCodeExecutablePath, runTests } from '@vscode/test-electron'; +const dotenv = require('dotenv'); +const packageJson = require('../../package.json'); +const { createEnvDefinePlugin } = require('../../../../../common/scripts/env-webpack-helper'); + +async function main() { + try { + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + const extensionTestsPath = path.resolve(__dirname, './ai/integration_tests/libs'); + + // Load environment variables + const envPath = path.resolve(__dirname, '../../.env'); + const env = dotenv.config({ path: envPath }).parsed; + console.log("Fetching values for environment variables..."); + const { envKeys, missingVars } = createEnvDefinePlugin(env); + + if (missingVars.length > 0) { + console.warn( + '\n⚠️ Environment Variable Configuration Warning:\n' + + `Missing required environment variables: ${missingVars.join(', ')}\n` + + `Please provide values in either .env file or runtime environment.\n` + ); + } + + // Download VS Code and get CLI path + const vscodeExecutablePath = await downloadAndUnzipVSCode(); + const [cli, ...args] = resolveCliPathFromVSCodeExecutablePath(vscodeExecutablePath); + + // Install extension dependencies if they exist + if (packageJson.extensionDependencies && packageJson.extensionDependencies.length > 0) { + console.log(`Installing ${packageJson.extensionDependencies.length} extension dependencies...`); + for (const extensionId of packageJson.extensionDependencies) { + console.log(`Installing extension: ${extensionId}`); + cp.spawnSync(cli, [...args, '--install-extension', extensionId], { + encoding: 'utf-8', + stdio: 'inherit', + }); + } + console.log('Extension dependencies installed successfully'); + } else { + console.log('No extension dependencies to install'); + } + + console.log('\n🧪 Running Library Integration Tests...\n'); + + // Run tests + await runTests({ + vscodeExecutablePath, + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: [ + path.resolve(__dirname, '../../test/data/bi_empty') + ], + extensionTestsEnv: { + ...envKeys, + AI_TEST_ENV: 'true', + LIBS_INTEGRATION_TEST: 'true', + LS_EXTENSIONS_PATH: '', + LSDEBUG: 'false', + WEB_VIEW_WATCH_MODE: 'false' + } + }); + + console.log('\n✅ Library integration tests completed successfully!\n'); + + } catch (err) { + console.error('\n❌ Library integration tests failed:', err); + process.exit(1); + } +} + +main(); From 20a6de55cbbeb107787874ff396b53c0d0781295 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Sun, 5 Oct 2025 23:49:00 +0530 Subject: [PATCH 145/730] Bump to sonnet 4.5 and prompt structure changes --- .../ballerina-extension/package.json | 3 +- .../src/features/ai/service/code/code.ts | 114 ++++++++---------- .../src/features/ai/service/connection.ts | 2 +- .../src/features/ai/service/libs/funcs.ts | 1 + .../ai/service/libs/libraryProviderTool.ts | 56 +++------ .../src/features/ai/service/test/test.ts | 4 +- 6 files changed, 72 insertions(+), 108 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index c87e953cb83..1f6b055e00d 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -32,8 +32,7 @@ "onUri" ], "extensionDependencies": [ - "anweber.httpbook", - "WSO2.wso2-platform" + ], "contributes": { "languages": [ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 4f0738f0fe0..e0ff328a5e2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -46,6 +46,8 @@ import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; import { handleTextEditorCommands } from "../libs/text_editor_tool"; +const SEARCH_LIBRARY_TOOL_NAME = 'LibraryProviderTool'; + function appendFinalMessages( history: ModelMessage[], finalMessages: ModelMessage[], @@ -209,7 +211,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler finalResponse = postProcessedResp.assistant_response; let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; - const MAX_REPAIR_ATTEMPTS = 3; + const MAX_REPAIR_ATTEMPTS = 1; let repair_attempt = 0; let diagnosticFixResp = finalResponse; //TODO: Check if we need this variable while ( @@ -292,14 +294,11 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } function getSystemPromptPrefix(sourceFiles: SourceFiles[], op: OperationType, generationType: GenerationType): string { - const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the API documentation provided by the LibraryProviderTool. + const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your should ONLY answer Ballerina related queries. -# Instructions -- Analyze the user query to determine the required functionality. -- Do not include libraries unless they are explicitly needed for the query. ${ generationType === GenerationType.HEALTHCARE_GENERATION - ? "- For healthcare-related queries, ALWAYS include the following libraries in the LibraryProviderTool call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." + ? "- For healthcare-related queries, ALWAYS include the following libraries in the ${SEARCH_LIBRARY_TOOL_NAME} call in addition to those selected based on the query: ballerinax/health.base, ballerinax/health.fhir.r4, ballerinax/health.fhir.r4.parser, ballerinax/health.fhir.r4utils, ballerinax/health.fhir.r4.international401, ballerinax/health.hl7v2commons, ballerinax/health.hl7v2." : "" }`; @@ -312,65 +311,50 @@ ${ } function getSystemPromptSuffix(langlibs: Library[]) { - return `You will be provided with default langlibs which are already imported in the Ballerina code. + return `If the query requires code, Follow these steps to generate the Ballerina code: +## Langlibs + +${JSON.stringify(langlibs, null, 2)} + -Langlibs - -${JSON.stringify(langlibs)} - +## Steps to generate Ballerina Code -If the query doesn't require code examples, answer the code by utilizing the API documentation (Tool Output). +1. Thoroughly read and understand the given query: + - Identify the main requirements and objectives of the integration. + - Determine the trigger (main or service), connector usage, control flow, and expected outcomes for the query. -If the query requires code, Follow these steps to generate the Ballerina code: +2. Figure the necessary libraries and functions required: + - Determine which libraries are required to fulfill the query and use the ${SEARCH_LIBRARY_TOOL_NAME} tool to get the libraries. + - Plan the control flow of the application based on input and output parameters of each function of the connector according the received API documentation from the tool. -1. Carefully analyze the provided API documentation (Tool Output): - - Identify the available libraries, clients, their functions, and their relevant types. +3. Write the Ballerina Code: + - Write the Ballerina code by strictly adhering to Ballerina Code Constraints mentioned below. -2. Thoroughly read and understand the given query: - - Identify the main requirements and objectives of the integration. - - Determine which libraries, functions, and their relevant records and types from the API documentation which are needed to achieve the query and ignore unused API docs. - - Note the libraries needed to achieve the query and plan the control flow of the application based on input and output parameters of each function of the connector according to the API documentation. - -3. Plan your code structure: - - Decide which libraries need to be imported (Avoid importing lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map langlibs as they are already imported by default). - - Determine the necessary client initialization. - - Define Types needed for the query in the types.bal file. - - Outline the service OR main function for the query. - - Outline the required function usages as noted in Step 2. - - Based on the types of identified functions, plan the data flow. Transform data as necessary. - -4. Generate the Ballerina code: - - Start with the required import statements IN EACH FILE that uses external libraries or types. - - Each .bal file MUST include its own import statements for any external libraries, types, or clients it references. - - Define required configurables for the query. Use only string, int, boolean types in configurable variables. - - Initialize any necessary clients with the correct configuration at the module level (before any function or service declarations), resolving unions explicitly. - - Implement the main function OR service to address the query requirements. - - Use defined connectors based on the query by following the API documentation. - - Use only the functions, types, and clients specified in the API documentation. - - Use dot notation to access a normal function. Use -> to access a remote function or resource function. - - Ensure proper error handling and type checking. - - Do not invoke methods on json access expressions. Always use separate statements. - - Use langlibs ONLY IF REQUIRED. - -5. Review and refine your code: - - Check that all query requirements are met. - - Verify that you're only using elements from the provided API documentation, with unions resolved to avoid compiler errors. - - Ensure the code follows Ballerina best practices and conventions, including type-safe handling of all return types and configurations. - -Provide a brief explanation of how your code addresses the query and then output your generated Ballerina code. - -Important reminders: -- Only use the libraries, functions, types, services, and clients specified in the provided API documentation. -- Always strictly respect the types given in the API Docs. -- Do not introduce any additional libraries or functions not mentioned in the API docs. -- Only use specified fields in records according to the API docs; this applies to array types of that record as well. -- Ensure your code is syntactically correct and follows Ballerina conventions. -- Do not use dynamic listener registrations. -- Do not write code in a way that requires updating/assigning values of function parameters. -- ALWAYS use two-word camel case identifiers (variable, function parameter, resource function parameter, and field names). -- If the library name contains a dot, always use an alias in the import statement (e.g., import org/package.one as one;). +## Ballerina Code Constraints + +### Library Usage and Importing libraries +- Only use the libraries received from user query or the ${SEARCH_LIBRARY_TOOL_NAME} tool or langlibs. +- Examine the library API documentation provided by the ${SEARCH_LIBRARY_TOOL_NAME} carefully. Strictly follow the type definitions, function signatures, and all the other details provided when writing the code. +- Each .bal file must include its own import statements for any external library references. +- Do not import default langlibs (lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map). +- For packages with dots in names, use aliases: \`import org/package.one as one;\` - Treat generated connectors/clients inside the generated folder as submodules. - A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder structure generated/fooApi, the import should be \`import my_pkg.fooApi;\`. +- In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. +- For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. + +### Code Structure +- Define required configurables for the query. Use only string, int, decimal, boolean types in configurable variables. +- Initialize any necessary clients with the correct configuration based on the retrieved libraries at the module level (before any function or service declarations). +- Implement the main function OR service to address the query requirements. + +### Coding Rules +- Use records as canonical representations of data structures. Always define records for data structures instead of using maps or json and navigate using the record fields. +- Do not invoke methods on json access expressions. Always use separate statements. +- Use dot notation to access a normal function. Use -> to access a remote function or resource function. +- Do not use dynamic listener registrations. +- Do not write code in a way that requires updating/assigning values of function parameters. +- ALWAYS use two-word camel case all the identifiers (ex- variables, function parameter, resource function parameter, and field names). - If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. - Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. - When invoking resource functions from a client, use the correct paths with accessor and parameters (e.g., exampleClient->/path1/["param"]/path2.get(key="value")). @@ -378,21 +362,19 @@ Important reminders: - Avoid long comments in the code. Use // for single line comments. - Always use named arguments when providing values to any parameter (e.g., .get(key="value")). - Mention types EXPLICITLY in variable declarations and foreach statements. +- To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. + +### File modifications +- Prefer modifying existing bal files but you can create new bal files if necessary. - Do not modify the README.md file unless explicitly asked to be modified in the query. -- Do not add/modify toml files (Config.toml/Ballerina.toml) unless asked. +- Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml) unless asked. - In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. - For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. -Begin your response with the explanation. The explanation should detail the control flow decided in step 2, along with the selected libraries and their functions. +Begin your response with the explanation. The explanation should detail the control flow decided in step 1, along with the selected libraries and their functions. Once the explanation is finished, you must apply surgical edits to the existing source code using the **str_replace_based_edit_tool** tool. The complete source code will be provided in the section of the user prompt. When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. - -Your goal is to modify only the relevant parts of the code to address the user's query. -Do not generate or modify any file types other than .bal. Politely decline if the query requests such cases. - -- DO NOT mention if libraries are not required for the user query or task. -- Format responses using professional markdown with proper headings, lists, and styling `; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index ca8e56cfd6b..9c90006c062 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -22,7 +22,7 @@ import { BACKEND_URL } from "../utils"; import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; -export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; +export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-5-20250929"; type AnthropicModel = | typeof ANTHROPIC_HAIKU diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index db200e9d2e8..c32b8a96cc2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -343,6 +343,7 @@ export async function toMaximizedLibrariesFromLibJson( const minifiedLibrariesWithoutRecords: Library[] = []; for (const funcResponse of functionResponses) { + console.log(`[toMaximizedLibrariesFromLibJson] Processing library: ${funcResponse.name}`); // Find the original library to get complete information const originalLib = originalLibraries.find((lib) => lib.name === funcResponse.name); if (!originalLib) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index 2826c822d24..924e8061125 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -29,11 +29,11 @@ const LibraryProviderToolSchema = jsonSchema<{ libraryNames: { type: "array", items: { type: "string" }, - description: "List of Ballerina library names to fetch details for", + description: "List of Ballerina libraries to fetch details for. Each library name should be in the format 'organization/libraryName'", }, userPrompt: { type: "string", - description: "User query to determine relevant functions and types", + description: "User query to determine which libraries are needed to fulfill the request", }, }, required: ["libraryNames", "userPrompt"], @@ -60,47 +60,29 @@ export async function LibraryProviderTool( export function getLibraryProviderTool(libraryDescriptions: string, generationType: GenerationType) { return tool({ - description: `Fetches detailed information about Ballerina libraries, including clients, functions, and types. -This tool analyzes a user query and returns **only the relevant** clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. + description: `Fetches detailed information about Ballerina libraries along with their API documentation, including services, clients, functions, and types. +This tool analyzes a user query and returns **only the relevant** services, clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. -To use this tool: -- Analyze the user query provided in the user message to identify the relevant Ballerina libraries needed to fulfill the query. -- Select the minimal set of libraries that can fulfill the query based on their descriptions. Do not assume library contents unless provided by the tool. -- Call this tool with the selected libraryNames and the user query. +Available libraries: + +${libraryDescriptions} + + +Before calling this tool: +- Review all library names and their descriptions. +- Analyze the user query provided in the user message to identify the relevant Ballerina libraries which can be utilized to fulfill the query. +- Select the minimal set of libraries that can fulfill the query based on their descriptions. # Example -**Context** (library descriptions): -${JSON.stringify( - [ - { - name: "ballerinax/azure.openai.chat", - description: "Provides a Ballerina client for the Azure OpenAI Chat API.", - }, - { - name: "ballerinax/github", - description: "Provides a Ballerina client for the GitHub API.", - }, - { - name: "ballerinax/slack", - description: "Provides a Ballerina client for the Slack API.", - }, - { - name: "ballerinax/http", - description: "Allows to interact with HTTP services.", - }, - ], - null, - 2 -)} -**Query**: Write an application to read GitHub issues, summarize them, and post the summary to a Slack channel. +**Query**: Write an integration to read GitHub issues, summarize them, and post the summary to a Slack channel. **Tool Call**: Call with libraryNames: ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] -Before calling this tool: -- **Review all library descriptions** below. -- Select only the libraries that might be needed to fulfill the user query. -Available libraries: -${libraryDescriptions}`, +Tool Response: +Tool responds with the following information about the requested libraries: +name, description, type definitions (records, objects, enums, type aliases), clients(if any), functions and services(if any). + +`, inputSchema: LibraryProviderToolSchema, execute: async (input: { libraryNames: string[]; userPrompt: string }) => { console.log( diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts index 2f9a7f4a58a..1d6bf1d44b6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -16,7 +16,7 @@ import { Command } from "@wso2/ballerina-core"; import { generateText, ModelMessage } from "ai"; -import { getAnthropicClient, getProviderCacheControl } from "../connection"; +import { ANTHROPIC_SONNET_4, getAnthropicClient, getProviderCacheControl } from "../connection"; import { getServiceTestGenerationSystemPrompt, getServiceTestDiagnosticsSystemPrompt, @@ -117,7 +117,7 @@ async function getStreamedTestResponse(request: TestGenerationRequest1): Promise }); const { text } = await generateText({ - model: await getAnthropicClient("claude-sonnet-4-20250514"), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxOutputTokens: 16384, temperature: 0, system: systemPrompt, From 92dd3e579b1e226cf3b10938e5e0d1c3b9e7f177 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Mon, 6 Oct 2025 09:32:15 +0530 Subject: [PATCH 146/730] Add eval improvements --- .../ballerina-core/src/state-machine-types.ts | 9 +- .../src/features/ai/service/code/code.ts | 2 + .../src/features/ai/service/event.ts | 3 + .../test/ai/evals/code/code.test.ts | 92 ++++++++---- .../result-management/report-generator.ts | 66 ++++++++- .../result-management/result-conversion.ts | 139 +++++++++++++++++- .../code/result-management/result-manager.ts | 15 +- .../result-management/result-persistence.ts | 61 +++++++- .../test/ai/evals/code/types/config-types.ts | 1 + .../test/ai/evals/code/types/result-types.ts | 66 +++++++++ .../ai/evals/code/utils/batch-processing.ts | 27 ++-- .../test/ai/evals/code/utils/constants.ts | 3 +- .../ai/evals/code/utils/test-event-handler.ts | 10 ++ .../ballerina-extension/test/index.ts | 4 +- 14 files changed, 429 insertions(+), 69 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 531be5399d2..4a49995ce89 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -187,7 +187,8 @@ export type ChatNotify = | ChatStop | ChatError | ToolCall - | ToolResult; + | ToolResult + | EvalsToolResult; export interface ChatStart { type: "start"; @@ -236,6 +237,12 @@ export interface ToolResult { libraryNames: string[]; } +export interface EvalsToolResult { + type: "evals_tool_result"; + toolName: string; + output: any; +} + export const stateChanged: NotificationType = { method: 'stateChanged' }; export const onDownloadProgress: NotificationType = { method: 'onDownloadProgress' }; export const onChatNotify: NotificationType = { method: 'onChatNotify' }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index e0ff328a5e2..70dbc5f9acf 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -164,6 +164,8 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler break; } eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); + eventHandler({ type: "evals_tool_result", toolName, output: part.output }); + break; } case "text-delta": { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts index 6762e9529ef..deb486dad48 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts @@ -50,6 +50,9 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler case 'tool_result': sendToolResultNotification(event.toolName,event.libraryNames); break; + case 'evals_tool_result': + // Ignore evals-specific events in webview + break; case 'diagnostics': sendDiagnosticMessageNotification(event.diagnostics); break; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index 6f3accd1a06..8f3d803424e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -34,6 +34,7 @@ import { import { ResultManager, generateComprehensiveSummary, + generateIterationSummary, generateComprehensiveReport, logExecutionStart, logExecutionCompletion @@ -62,34 +63,56 @@ async function executeParallelTestsWithResults( await resultManager.initializeResultsDirectory(); const startTime = Date.now(); - logExecutionStart(useCases.length, DEFAULT_TEST_CONFIG.maxConcurrency, resultManager.getResultsDirectory()); + const iterations = DEFAULT_TEST_CONFIG.iterations; + logExecutionStart(useCases.length, DEFAULT_TEST_CONFIG.maxConcurrency, resultManager.getResultsDirectory(), iterations); const allUsecaseResults: import("./types").UsecaseResult[] = []; - let batchCount = 0; - - // Process tests in batches to limit concurrency - for (let i = 0; i < useCases.length; i += DEFAULT_TEST_CONFIG.maxConcurrency) { - batchCount++; - const batch = useCases.slice(i, i + DEFAULT_TEST_CONFIG.maxConcurrency); - - // Execute batch and get results - const batchResults = await processSingleBatch(batch, batchCount); - - // Persist batch results - await persistBatchResults(batchResults, resultManager, i); - - // Add to overall results - allUsecaseResults.push(...batchResults); - - // Handle inter-batch delay and monitoring - await handleBatchDelay(i, useCases.length, DEFAULT_TEST_CONFIG.maxConcurrency); + + // Iterate N times if configured + for (let iteration = 1; iteration <= iterations; iteration++) { + if (iterations > 1) { + console.log(`\n${'='.repeat(80)}`); + console.log(`🔄 STARTING ITERATION ${iteration}/${iterations}`); + console.log('='.repeat(80)); + } + + let batchCount = 0; + + // Process tests in batches to limit concurrency + for (let i = 0; i < useCases.length; i += DEFAULT_TEST_CONFIG.maxConcurrency) { + batchCount++; + const batch = useCases.slice(i, i + DEFAULT_TEST_CONFIG.maxConcurrency); + + // Execute batch and get results + const batchResults = await processSingleBatch(batch, batchCount, iterations > 1 ? iteration : undefined); + + // Persist batch results with iteration info + await persistBatchResults(batchResults, resultManager, i, iterations > 1 ? iteration : undefined); + + // Add to overall results + allUsecaseResults.push(...batchResults); + + // Handle inter-batch delay and monitoring + await handleBatchDelay(i, useCases.length, DEFAULT_TEST_CONFIG.maxConcurrency); + } + + if (iterations > 1) { + const iterationResults = allUsecaseResults.filter(r => r.iteration === iteration); + const iterationCompiled = iterationResults.filter(r => r.compiled).length; + console.log(`\n✅ Iteration ${iteration} completed: ${iterationCompiled}/${useCases.length} passed (${Math.round(iterationCompiled / useCases.length * 100)}%)`); + + // Generate and persist iteration summary + const iterationSummary = generateIterationSummary(iterationResults, iteration); + await resultManager.persistIterationSummary(iterationSummary); + } } - console.log(`\n✅ All batches processed. Total use cases: ${allUsecaseResults.length}`); + + console.log(`\n✅ All ${iterations > 1 ? 'iterations and ' : ''}batches processed. Total use cases: ${allUsecaseResults.length}`); // Generate and persist comprehensive summary - const summary = generateComprehensiveSummary(allUsecaseResults); + const summary = generateComprehensiveSummary(allUsecaseResults, iterations > 1 ? iterations : undefined); await resultManager.persistSummary(summary); - + // Log completion summary logExecutionCompletion(startTime, allUsecaseResults, resultManager.getResultsDirectory()); @@ -100,13 +123,14 @@ async function executeParallelTestsWithResults( * Helper function to persist batch results */ async function persistBatchResults( - usecaseResults: readonly import("./types").UsecaseResult[], - resultManager: ResultManager, - startIndex: number + usecaseResults: readonly import("./types").UsecaseResult[], + resultManager: ResultManager, + startIndex: number, + iteration?: number ): Promise { for (let i = 0; i < usecaseResults.length; i++) { const resultIndex = startIndex + i; - await resultManager.persistUsecaseResult(usecaseResults[i], resultIndex); + await resultManager.persistUsecaseResult(usecaseResults[i], resultIndex, iteration); } } @@ -169,23 +193,29 @@ suite.only("AI Code Generator Tests Suite", () => { } test("Execute all use cases in parallel with comprehensive result management", async function (): Promise { - + console.log(`\n🔧 Test Configuration (Comprehensive Results):`); console.log(` API Key Available: Yes`); - console.log(` Total Use Cases: ${TEST_USE_CASES.length}`); + console.log(` Total Use Cases: ${TEST_USE_CASES.length}`); + console.log(` Iterations: ${DEFAULT_TEST_CONFIG.iterations}`); + console.log(` Max Concurrency: ${DEFAULT_TEST_CONFIG.maxConcurrency}`); await wait(TIMING.TEST_WAIT_TIME); // Wait for workspace to settle - + // Execute all test cases with comprehensive result management const summary = await executeParallelTestsWithResults(TEST_USE_CASES); - + // Generate comprehensive report generateComprehensiveReport(summary); // Assert overall test success console.log(`\n✅ Comprehensive test execution completed:`); console.log(` Success Rate: ${Math.round(summary.accuracy)}%`); - + if (summary.iterations && summary.iterations > 1) { + console.log(` Total Iterations: ${summary.iterations}`); + console.log(` Total Test Runs: ${summary.totalUsecases}`); + } + assert.ok(true); }); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts index d63646ba716..dd7934c6379 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { Summary, UsecaseResult } from '../types'; +import { Summary, UsecaseResult, IterationSummary, TestCaseAccuracy } from '../types'; /** * Generates comprehensive report from test summary @@ -23,13 +23,23 @@ export function generateComprehensiveReport(summary: Summary): void { console.log('\n' + '='.repeat(80)); console.log('📊 COMPREHENSIVE TEST EXECUTION REPORT'); console.log('='.repeat(80)); - - console.log(`\n📈 SUMMARY:`); + + console.log(`\n📈 OVERALL SUMMARY:`); console.log(` Total Use Cases: ${summary.totalUsecases}`); console.log(` Compiled Successfully: ${summary.totalCompiled} (${Math.round(summary.accuracy)}%)`); console.log(` Failed: ${summary.totalFailed} (${Math.round((summary.totalFailed / summary.totalUsecases) * 100)}%)`); console.log(` Overall Accuracy: ${summary.accuracy}%`); + // Display iteration-specific summaries if multiple iterations + if (summary.iterations && summary.iterations > 1 && summary.iterationResults) { + logIterationSummaries(summary.iterationResults); + } + + // Display per-test-case accuracy if multiple iterations + if (summary.iterations && summary.iterations > 1 && summary.perTestCaseAccuracy) { + logPerTestCaseAccuracy(summary.perTestCaseAccuracy); + } + logSuccessfulCompilations(summary.results); if (summary.totalFailed > 0) { @@ -88,13 +98,59 @@ function logFailedCompilations(results: readonly UsecaseResult[]): void { }); } +/** + * Logs iteration-specific summaries + */ +function logIterationSummaries(iterationResults: readonly IterationSummary[]): void { + console.log('\n📊 PER-ITERATION ACCURACY:'); + iterationResults.forEach(iter => { + console.log(` Iteration ${iter.iteration}: ${iter.totalCompiled}/${iter.totalUsecases} passed (${iter.accuracy}%)`); + }); +} + +/** + * Logs per-test-case accuracy across iterations + */ +function logPerTestCaseAccuracy(testCaseAccuracy: readonly TestCaseAccuracy[]): void { + console.log('\n🎯 PER-TEST-CASE ACCURACY (across all iterations):'); + + // Group by accuracy ranges for better readability + const highAccuracy = testCaseAccuracy.filter(tc => tc.accuracy >= 80); + const mediumAccuracy = testCaseAccuracy.filter(tc => tc.accuracy >= 50 && tc.accuracy < 80); + const lowAccuracy = testCaseAccuracy.filter(tc => tc.accuracy < 50); + + if (highAccuracy.length > 0) { + console.log('\n ✅ High Success Rate (≥80%):'); + highAccuracy.forEach(tc => { + console.log(` Test ${tc.testCaseIndex}: ${tc.successCount}/${tc.totalAttempts} (${tc.accuracy}%) - ${tc.usecase.substring(0, 60)}...`); + }); + } + + if (mediumAccuracy.length > 0) { + console.log('\n ⚠️ Medium Success Rate (50-79%):'); + mediumAccuracy.forEach(tc => { + console.log(` Test ${tc.testCaseIndex}: ${tc.successCount}/${tc.totalAttempts} (${tc.accuracy}%) - ${tc.usecase.substring(0, 60)}...`); + }); + } + + if (lowAccuracy.length > 0) { + console.log('\n ❌ Low Success Rate (<50%):'); + lowAccuracy.forEach(tc => { + console.log(` Test ${tc.testCaseIndex}: ${tc.successCount}/${tc.totalAttempts} (${tc.accuracy}%) - ${tc.usecase.substring(0, 60)}...`); + }); + } +} + /** * Logs execution start information */ -export function logExecutionStart(totalCases: number, maxConcurrency: number, resultsDir: string): void { - console.log(`\n🔥 Starting parallel execution of ${totalCases} test cases:`); +export function logExecutionStart(totalCases: number, maxConcurrency: number, resultsDir: string, iterations?: number): void { + console.log(`\n🔥 Starting parallel execution of ${totalCases} test cases${iterations && iterations > 1 ? ` (${iterations} iterations)` : ''}:`); console.log(` Max Concurrency: ${maxConcurrency}`); console.log(` Results Directory: ${resultsDir}`); + if (iterations && iterations > 1) { + console.log(` Total Test Runs: ${totalCases * iterations}`); + } } /** diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index c6fc120f0f5..b66fd46f814 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -14,16 +14,16 @@ // specific language governing permissions and limitations // under the License. -import { TestCaseResult, TestUseCase, UsecaseResult, DiagnosticMessage, Summary } from '../types'; +import { TestCaseResult, TestUseCase, UsecaseResult, DiagnosticMessage, Summary, ToolEvent, ToolCallEvent, ToolResultEvent, EvalsToolResultEvent, IterationSummary, TestCaseAccuracy } from '../types'; import { extractSourceFilesFromContent } from '../utils/content-parser'; import { FILES } from '../utils/constants'; /** * Converts TestCaseResult to UsecaseResult format */ -export function convertTestResultToUsecaseResult(testResult: TestCaseResult): UsecaseResult { +export function convertTestResultToUsecaseResult(testResult: TestCaseResult, iteration?: number): UsecaseResult { const files = extractSourceFilesFromContent(testResult.result.fullContent); - + const diagnostics: DiagnosticMessage[] = testResult.result.diagnostics.map(diag => ({ message: typeof diag === 'string' ? diag : (diag as { message?: string }).message || diag.toString(), severity: (diag as { severity?: string }).severity || 'error', @@ -35,6 +35,31 @@ export function convertTestResultToUsecaseResult(testResult: TestCaseResult): Us .filter(event => event.type === 'error') .map(event => event.content); + // Extract tool events - following the same pattern as production event handler + const toolEvents: ToolEvent[] = testResult.result.events + .filter(event => event.type === 'tool_call' || event.type === 'tool_result' || event.type === 'evals_tool_result') + .map(event => { + if (event.type === 'tool_call') { + return { + type: 'tool_call', + toolName: event.toolName + } as ToolCallEvent; + } else if (event.type === 'tool_result') { + return { + type: 'tool_result', + toolName: event.toolName, + libraryNames: event.libraryNames || [] + } as ToolResultEvent; + } else { + // evals_tool_result + return { + type: 'evals_tool_result', + toolName: event.toolName, + output: event.output + } as EvalsToolResultEvent; + } + }); + return { usecase: testResult.useCase.usecase, diagnostics: diagnostics, @@ -43,7 +68,9 @@ export function convertTestResultToUsecaseResult(testResult: TestCaseResult): Us duration: testResult.result.duration, timestamp: testResult.result.startTime, evaluationResult: testResult.evaluationResult, - errorEvents: errorEvents.length > 0 ? errorEvents : undefined + errorEvents: errorEvents.length > 0 ? errorEvents : undefined, + toolEvents: toolEvents.length > 0 ? toolEvents : undefined, + iteration }; } @@ -67,17 +94,26 @@ export function createFailedUsecaseResult(useCase: TestUseCase, reason: unknown) /** * Generates comprehensive summary from use case results */ -export function generateComprehensiveSummary(results: readonly UsecaseResult[]): Summary { +export function generateComprehensiveSummary(results: readonly UsecaseResult[], totalIterations?: number): Summary { const totalUsecases = results.length; const totalCompiled = results.filter(r => r.compiled).length; const totalFailed = totalUsecases - totalCompiled; const accuracy = totalUsecases > 0 ? (totalCompiled * 100) / totalUsecases : 0; - + const durations = results.filter(r => r.duration).map(r => r.duration!); const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; const evaluationSummary = results.reduce((sum, r) => sum + (r.evaluationResult == undefined ? 0 : (r.evaluationResult.rating == undefined ? 0 : r.evaluationResult.rating)), 0); - + + let iterationResults: IterationSummary[] | undefined; + let perTestCaseAccuracy: TestCaseAccuracy[] | undefined; + + // Calculate iteration-specific summaries if iterations are present + if (totalIterations && totalIterations > 1) { + iterationResults = calculateIterationSummaries(results, totalIterations); + perTestCaseAccuracy = calculatePerTestCaseAccuracy(results, totalIterations); + } + return { results: results, totalUsecases, @@ -87,6 +123,93 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[]): totalDuration, averageDuration: Math.round(averageDuration), timestamp: Date.now(), - evaluationSummary: (evaluationSummary / totalUsecases) + evaluationSummary: (evaluationSummary / totalUsecases), + iterations: totalIterations, + iterationResults, + perTestCaseAccuracy }; } + +/** + * Generates summary for a single iteration + */ +export function generateIterationSummary(iterationResults: readonly UsecaseResult[], iterationNumber: number): IterationSummary { + const totalUsecases = iterationResults.length; + const totalCompiled = iterationResults.filter(r => r.compiled).length; + const totalFailed = totalUsecases - totalCompiled; + const accuracy = totalUsecases > 0 ? (totalCompiled * 100) / totalUsecases : 0; + + const durations = iterationResults.filter(r => r.duration).map(r => r.duration!); + const totalDuration = durations.reduce((sum, d) => sum + d, 0); + const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + + return { + iteration: iterationNumber, + totalUsecases, + totalCompiled, + totalFailed, + accuracy: Math.round(accuracy * 100) / 100, + totalDuration, + averageDuration: Math.round(averageDuration), + timestamp: Date.now(), + results: iterationResults + }; +} + +/** + * Calculates summary for each iteration + */ +function calculateIterationSummaries(results: readonly UsecaseResult[], totalIterations: number): IterationSummary[] { + const summaries: IterationSummary[] = []; + + for (let i = 1; i <= totalIterations; i++) { + const iterationResults = results.filter(r => r.iteration === i); + const totalUsecases = iterationResults.length; + const totalCompiled = iterationResults.filter(r => r.compiled).length; + const totalFailed = totalUsecases - totalCompiled; + const accuracy = totalUsecases > 0 ? (totalCompiled * 100) / totalUsecases : 0; + + const durations = iterationResults.filter(r => r.duration).map(r => r.duration!); + const totalDuration = durations.reduce((sum, d) => sum + d, 0); + const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + + summaries.push({ + iteration: i, + totalUsecases, + totalCompiled, + totalFailed, + accuracy: Math.round(accuracy * 100) / 100, + totalDuration, + averageDuration: Math.round(averageDuration), + timestamp: Date.now(), + results: iterationResults + }); + } + + return summaries; +} + +/** + * Calculates per-test-case accuracy across all iterations + */ +function calculatePerTestCaseAccuracy(results: readonly UsecaseResult[], totalIterations: number): TestCaseAccuracy[] { + // Group results by test case index (assuming results are ordered) + const testCaseCount = results.length / totalIterations; + const accuracyMap: Map = new Map(); + + for (let testIndex = 0; testIndex < testCaseCount; testIndex++) { + const testResults = results.filter((_, idx) => idx % testCaseCount === testIndex); + const successCount = testResults.filter(r => r.compiled).length; + const accuracy = (successCount * 100) / totalIterations; + + accuracyMap.set(testIndex, { + testCaseIndex: testIndex, + usecase: testResults[0]?.usecase || '', + successCount, + totalAttempts: totalIterations, + accuracy: Math.round(accuracy * 100) / 100 + }); + } + + return Array.from(accuracyMap.values()); +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts index 6cba07256e1..cc3b93a970a 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-manager.ts @@ -16,8 +16,8 @@ import * as fs from "fs"; import * as path from "path"; -import { UsecaseResult, Summary } from '../types'; -import { persistUsecaseResult, persistSummary } from './result-persistence'; +import { UsecaseResult, Summary, IterationSummary } from '../types'; +import { persistUsecaseResult, persistSummary, persistIterationSummary } from './result-persistence'; import { PATHS } from '../utils/constants'; /** @@ -47,8 +47,8 @@ export class ResultManager { /** * Persists a single use case result */ - async persistUsecaseResult(usecaseResult: UsecaseResult, index: number): Promise { - await persistUsecaseResult(usecaseResult, index, this.resultsDir); + async persistUsecaseResult(usecaseResult: UsecaseResult, index: number, iteration?: number): Promise { + await persistUsecaseResult(usecaseResult, index, this.resultsDir, iteration); } /** @@ -58,6 +58,13 @@ export class ResultManager { await persistSummary(summary, this.resultsDir); } + /** + * Persists an iteration summary + */ + async persistIterationSummary(iterationSummary: IterationSummary): Promise { + await persistIterationSummary(iterationSummary, this.resultsDir); + } + /** * Returns the results directory path */ diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts index d5d84c12dea..d22c5c0aa29 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -16,24 +16,35 @@ import * as fs from "fs"; import * as path from "path"; -import { UsecaseResult, Summary, SummaryCompact, UsecaseCompact } from '../types'; +import { UsecaseResult, Summary, SummaryCompact, UsecaseCompact, IterationSummary } from '../types'; import { BALLERINA_TOML_TEMPLATE, FILES } from '../utils/constants'; /** * Persists a single use case result to the file system */ export async function persistUsecaseResult( - usecaseResult: UsecaseResult, - index: number, - resultsDir: string + usecaseResult: UsecaseResult, + index: number, + resultsDir: string, + iteration?: number ): Promise { - const resultDir = path.join(resultsDir, index.toString()); + // Create directory structure: results/iteration_X/Y/ or results/Y/ if no iterations + let resultDir: string; + if (iteration !== undefined) { + const iterationDir = path.join(resultsDir, `iteration_${iteration}`); + await fs.promises.mkdir(iterationDir, { recursive: true }); + resultDir = path.join(iterationDir, index.toString()); + } else { + resultDir = path.join(resultsDir, index.toString()); + } await fs.promises.mkdir(resultDir, { recursive: true }); const compactResult: UsecaseCompact = { usecase: usecaseResult.usecase, compiled: usecaseResult.compiled, duration: usecaseResult.duration, + iteration: usecaseResult.iteration, + toolEvents: usecaseResult.toolEvents, evaluationResult: usecaseResult.evaluationResult }; @@ -54,6 +65,14 @@ export async function persistUsecaseResult( ); } + // Persist tool events if present + if (usecaseResult.toolEvents && usecaseResult.toolEvents.length > 0) { + await fs.promises.writeFile( + path.join(resultDir, "tool-events.json"), + JSON.stringify(usecaseResult.toolEvents, null, 2) + ); + } + const codeDir = path.join(resultDir, "code"); await fs.promises.mkdir(codeDir, { recursive: true }); @@ -65,7 +84,7 @@ export async function persistUsecaseResult( await fs.promises.writeFile(filePath, file.content); } - console.log(`Result persisted for index ${index}: ${usecaseResult.usecase}${usecaseResult.errorEvents ? ` (${usecaseResult.errorEvents.length} error events)` : ''}`); + console.log(`Result persisted for index ${index}${iteration !== undefined ? ` (iteration ${iteration})` : ''}: ${usecaseResult.usecase}${usecaseResult.errorEvents ? ` (${usecaseResult.errorEvents.length} error events)` : ''}${usecaseResult.toolEvents ? ` (${usecaseResult.toolEvents.length} tool events)` : ''}`); } /** @@ -92,3 +111,33 @@ export async function persistSummary(summary: Summary, resultsDir: string): Prom console.log("Summary files saved"); } + +/** + * Persists iteration summary information to the file system + */ +export async function persistIterationSummary(iterationSummary: IterationSummary, resultsDir: string): Promise { + const iterationDir = path.join(resultsDir, `iteration_${iterationSummary.iteration}`); + await fs.promises.mkdir(iterationDir, { recursive: true }); + + // Create compact summary (without full results) + const compactSummary: SummaryCompact = { + totalUsecases: iterationSummary.totalUsecases, + totalCompiled: iterationSummary.totalCompiled, + totalFailed: iterationSummary.totalFailed, + accuracy: iterationSummary.accuracy + }; + + // Save compact summary + await fs.promises.writeFile( + path.join(iterationDir, "summary.json"), + JSON.stringify(compactSummary, null, 2) + ); + + // Save detailed summary with all results + await fs.promises.writeFile( + path.join(iterationDir, "summary_detailed.json"), + JSON.stringify(iterationSummary, null, 2) + ); + + console.log(`Iteration ${iterationSummary.iteration} summary saved: ${iterationSummary.totalCompiled}/${iterationSummary.totalUsecases} passed (${iterationSummary.accuracy}%)`); +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts index 61674a3464e..d0124eacbd6 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/config-types.ts @@ -19,4 +19,5 @@ */ export interface TestConfiguration { readonly maxConcurrency: number; + readonly iterations: number; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index 5009387510d..0da9e417aa1 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -38,6 +38,39 @@ export interface DiagnosticMessage { }; } +/** + * Tool call event - matches ChatNotify ToolCall from state-machine-types + */ +export interface ToolCallEvent { + readonly type: "tool_call"; + readonly toolName: string; +} + +/** + * Tool result event - matches ChatNotify ToolResult from state-machine-types + * Contains the library names returned by the LibraryProviderTool + */ +export interface ToolResultEvent { + readonly type: "tool_result"; + readonly toolName: string; + readonly libraryNames: readonly string[]; +} + +/** + * Evals tool result event - matches ChatNotify EvalsToolResult from state-machine-types + * Contains the full JSON output from the LibraryProviderTool for debugging + */ +export interface EvalsToolResultEvent { + readonly type: "evals_tool_result"; + readonly toolName: string; + readonly output: any; +} + +/** + * Union type for all tool events captured during test execution + */ +export type ToolEvent = ToolCallEvent | ToolResultEvent | EvalsToolResultEvent; + /** * Use case execution result */ @@ -49,6 +82,34 @@ export interface UsecaseResult { readonly duration?: number; readonly timestamp?: number; readonly errorEvents?: readonly string[]; + readonly toolEvents?: readonly ToolEvent[]; + readonly iteration?: number; +} + +/** + * Per-test-case accuracy across iterations + */ +export interface TestCaseAccuracy { + readonly testCaseIndex: number; + readonly usecase: string; + readonly successCount: number; + readonly totalAttempts: number; + readonly accuracy: number; +} + +/** + * Iteration-specific summary + */ +export interface IterationSummary { + readonly iteration: number; + readonly totalUsecases: number; + readonly totalCompiled: number; + readonly totalFailed: number; + readonly accuracy: number; + readonly totalDuration: number; + readonly averageDuration: number; + readonly timestamp: number; + readonly results: readonly UsecaseResult[]; readonly evaluationResult: LLMEvaluationResult; } @@ -64,6 +125,9 @@ export interface Summary { readonly totalDuration: number; readonly averageDuration: number; readonly timestamp: number; + readonly iterations?: number; + readonly iterationResults?: readonly IterationSummary[]; + readonly perTestCaseAccuracy?: readonly TestCaseAccuracy[]; readonly evaluationSummary: number } @@ -85,5 +149,7 @@ export interface UsecaseCompact { readonly usecase: string; readonly compiled: boolean; readonly duration?: number; + readonly iteration?: number; + readonly toolEvents?: readonly ToolEvent[]; readonly evaluationResult: LLMEvaluationResult; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts index d6dce0db026..d16eba8e1c7 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts @@ -25,37 +25,42 @@ import { commands, Uri, workspace } from 'vscode'; * Processes a single batch of test cases in parallel */ export async function processSingleBatch( - batch: readonly TestUseCase[], - batchNumber: number + batch: readonly TestUseCase[], + batchNumber: number, + iteration?: number ): Promise { try { - console.log(`\n📋 Processing batch ${batchNumber}: ${batch.map(uc => uc.id).join(', ')}`); + console.log(`\n📋 Processing batch ${batchNumber}${iteration !== undefined ? ` (iteration ${iteration})` : ''}: ${batch.map(uc => uc.id).join(', ')}`); // All test cases in the batch SHOULD share the same project path await setupTestEnvironmentForBatch(batch[0].projectPath); - const batchPromises = batch.map(useCase => + const batchPromises = batch.map(useCase => executeSingleTestCase(useCase) ); - + const batchResults = await Promise.allSettled(batchPromises); const usecaseResults: UsecaseResult[] = []; - + for (let j = 0; j < batchResults.length; j++) { const settledResult = batchResults[j]; const useCase = batch[j]; - + let usecaseResult: UsecaseResult; - + if (settledResult.status === 'fulfilled') { - usecaseResult = convertTestResultToUsecaseResult(settledResult.value); + usecaseResult = convertTestResultToUsecaseResult(settledResult.value, iteration); } else { console.error(`❌ Test case ${useCase.id} failed:`, settledResult.reason); usecaseResult = createFailedUsecaseResult(useCase, settledResult.reason); + // Add iteration to failed result + if (iteration !== undefined) { + usecaseResult = { ...usecaseResult, iteration }; + } } - + usecaseResults.push(usecaseResult); } - + return usecaseResults; } catch (error) { console.error(`❌ Batch ${batchNumber} processing failed:`, (error as Error).message); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts index 211e2d763c1..c938101dea7 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -22,7 +22,8 @@ import * as path from 'path'; */ export const DEFAULT_TEST_CONFIG: TestConfiguration = { // should be 1, 5, 10, 15, 20 ... - maxConcurrency: 5 + maxConcurrency: 5, + iterations: 3 } as const; /** diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts index eec6dd0b531..7c9d7d3161f 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts @@ -74,6 +74,16 @@ export function createTestEventHandler(useCase?: TestUseCase): { console.log(`[${useCase?.id || 'unknown'}] Diagnostics received`); diagnostics.push(...(event.diagnostics || [])); break; + case "tool_call": + console.log(`[${useCase?.id || 'unknown'}] Tool called: ${event.toolName}`); + break; + case "tool_result": + console.log(`[${useCase?.id || 'unknown'}] Tool result from ${event.toolName}: ${event.libraryNames?.join(', ') || 'no libraries'}`); + break; + case "evals_tool_result": + console.log(`[${useCase?.id || 'unknown'}] [EVALS] Tool result from ${event.toolName}:`); + console.log(JSON.stringify(event.output, null, 2)); + break; default: console.warn(`[${useCase?.id || 'unknown'}] Unhandled event type: ${(event as unknown as { type: string }).type}`); break; diff --git a/workspaces/ballerina/ballerina-extension/test/index.ts b/workspaces/ballerina/ballerina-extension/test/index.ts index 8c3d219ecee..7de53cce420 100644 --- a/workspaces/ballerina/ballerina-extension/test/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/index.ts @@ -23,8 +23,8 @@ if (!tty.getWindowSize) { let mocha = new Mocha({ ui: "tdd", useColors: true, - timeout: 1000000, - retries: 3 + timeout: 10000000, + retries: 1 }); function configure(mochaOpts: any): void { From 8fe2826a59019cbea5bbc054c6d914cdf62eebeb Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Tue, 7 Oct 2025 18:46:49 +0530 Subject: [PATCH 147/730] Sync with upstream --- .../ballerina-extension/package.json | 12 ++++---- .../result-management/report-generator.ts | 10 ++++++- .../result-management/result-conversion.ts | 29 ++++++++++++++++--- .../result-management/result-persistence.ts | 3 +- .../test/ai/evals/code/types/result-types.ts | 1 + .../test/ai/integration_tests/libs/setup.ts | 2 +- .../test/runLibsIntegrationTest.ts | 2 +- 7 files changed, 44 insertions(+), 15 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 1f6b055e00d..4f42ec4f666 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -31,9 +31,7 @@ "onNotebook:ballerina-notebook", "onUri" ], - "extensionDependencies": [ - - ], + "extensionDependencies": [], "contributes": { "languages": [ { @@ -965,21 +963,21 @@ "description": "design-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f180" + "fontCharacter": "\\f182" } }, "distro-start": { "description": "start", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1f5" + "fontCharacter": "\\f1f7" } }, "distro-debug": { "description": "debug", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f17b" + "fontCharacter": "\\f17d" } }, "distro-source-view": { @@ -993,7 +991,7 @@ "description": "persist-diagram", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1d0" + "fontCharacter": "\\f1d2" } }, "distro-cached-rounded": { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts index dd7934c6379..fc886ffa48e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/report-generator.ts @@ -29,6 +29,7 @@ export function generateComprehensiveReport(summary: Summary): void { console.log(` Compiled Successfully: ${summary.totalCompiled} (${Math.round(summary.accuracy)}%)`); console.log(` Failed: ${summary.totalFailed} (${Math.round((summary.totalFailed / summary.totalUsecases) * 100)}%)`); console.log(` Overall Accuracy: ${summary.accuracy}%`); + console.log(` Average LLM Evaluation Rating: ${summary.evaluationSummary.toFixed(2)}/10`); // Display iteration-specific summaries if multiple iterations if (summary.iterations && summary.iterations > 1 && summary.iterationResults) { @@ -58,6 +59,9 @@ function logSuccessfulCompilations(results: readonly UsecaseResult[]): void { console.log(` Duration: ${result.duration || 'N/A'}ms`); console.log(` Files Generated: ${result.files.length}`); console.log(` Diagnostics: ${result.diagnostics.length} (${result.diagnostics.length === 0 ? '✅ Clean' : '⚠️ Has Issues'})`); + if (result.evaluationResult) { + console.log(` LLM Rating: ${result.evaluationResult.rating.toFixed(1)}/10 (${result.evaluationResult.is_correct ? '✅' : '❌'})`); + } if (result.files.length > 0) { console.log(` Files: ${result.files.map(f => f.fileName).join(', ')}`); } @@ -75,6 +79,10 @@ function logFailedCompilations(results: readonly UsecaseResult[]): void { console.log(` Duration: ${result.duration || 'N/A'}ms`); console.log(` Diagnostic Issues: ${result.diagnostics.length}`); console.log(` Error Events: ${result.errorEvents ? result.errorEvents.length : 0}`); + if (result.evaluationResult) { + console.log(` LLM Rating: ${result.evaluationResult.rating.toFixed(1)}/10`); + console.log(` LLM Reasoning: ${result.evaluationResult.reasoning.substring(0, 100)}${result.evaluationResult.reasoning.length > 100 ? '...' : ''}`); + } if (result.errorEvents && result.errorEvents.length > 0) { console.log(` Key Errors:`); @@ -104,7 +112,7 @@ function logFailedCompilations(results: readonly UsecaseResult[]): void { function logIterationSummaries(iterationResults: readonly IterationSummary[]): void { console.log('\n📊 PER-ITERATION ACCURACY:'); iterationResults.forEach(iter => { - console.log(` Iteration ${iter.iteration}: ${iter.totalCompiled}/${iter.totalUsecases} passed (${iter.accuracy}%)`); + console.log(` Iteration ${iter.iteration}: ${iter.totalCompiled}/${iter.totalUsecases} passed (${iter.accuracy}%) - Avg Rating: ${iter.evaluationResult.rating.toFixed(2)}/10`); }); } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index b66fd46f814..307ec9831b4 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -103,7 +103,10 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[], const durations = results.filter(r => r.duration).map(r => r.duration!); const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; - const evaluationSummary = results.reduce((sum, r) => sum + (r.evaluationResult == undefined ? 0 : (r.evaluationResult.rating == undefined ? 0 : r.evaluationResult.rating)), 0); + + // Calculate average rating from evaluation results + const totalRating = results.reduce((sum, r) => sum + (r.evaluationResult?.rating ?? 0), 0); + const averageRating = totalUsecases > 0 ? totalRating / totalUsecases : 0; let iterationResults: IterationSummary[] | undefined; let perTestCaseAccuracy: TestCaseAccuracy[] | undefined; @@ -123,7 +126,7 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[], totalDuration, averageDuration: Math.round(averageDuration), timestamp: Date.now(), - evaluationSummary: (evaluationSummary / totalUsecases), + evaluationSummary: averageRating, iterations: totalIterations, iterationResults, perTestCaseAccuracy @@ -143,6 +146,10 @@ export function generateIterationSummary(iterationResults: readonly UsecaseResul const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + // Calculate average rating from evaluation results + const totalRating = iterationResults.reduce((sum, r) => sum + (r.evaluationResult?.rating ?? 0), 0); + const averageRating = totalUsecases > 0 ? totalRating / totalUsecases : 0; + return { iteration: iterationNumber, totalUsecases, @@ -152,7 +159,12 @@ export function generateIterationSummary(iterationResults: readonly UsecaseResul totalDuration, averageDuration: Math.round(averageDuration), timestamp: Date.now(), - results: iterationResults + results: iterationResults, + evaluationResult: { + is_correct: totalCompiled === totalUsecases, + reasoning: `${totalCompiled}/${totalUsecases} tests compiled successfully`, + rating: averageRating + } }; } @@ -173,6 +185,10 @@ function calculateIterationSummaries(results: readonly UsecaseResult[], totalIte const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; + // Calculate average rating from evaluation results + const totalRating = iterationResults.reduce((sum, r) => sum + (r.evaluationResult?.rating ?? 0), 0); + const averageRating = totalUsecases > 0 ? totalRating / totalUsecases : 0; + summaries.push({ iteration: i, totalUsecases, @@ -182,7 +198,12 @@ function calculateIterationSummaries(results: readonly UsecaseResult[], totalIte totalDuration, averageDuration: Math.round(averageDuration), timestamp: Date.now(), - results: iterationResults + results: iterationResults, + evaluationResult: { + is_correct: totalCompiled === totalUsecases, + reasoning: `${totalCompiled}/${totalUsecases} tests compiled successfully`, + rating: averageRating + } }); } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts index d22c5c0aa29..63dcbb4ece3 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-persistence.ts @@ -124,7 +124,8 @@ export async function persistIterationSummary(iterationSummary: IterationSummary totalUsecases: iterationSummary.totalUsecases, totalCompiled: iterationSummary.totalCompiled, totalFailed: iterationSummary.totalFailed, - accuracy: iterationSummary.accuracy + accuracy: iterationSummary.accuracy, + evaluationSummary: iterationSummary.evaluationResult.rating }; // Save compact summary diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index 0da9e417aa1..477bb492e49 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -84,6 +84,7 @@ export interface UsecaseResult { readonly errorEvents?: readonly string[]; readonly toolEvents?: readonly ToolEvent[]; readonly iteration?: number; + readonly evaluationResult: LLMEvaluationResult; } /** diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts index cb3ad27a6e1..2000537bf9a 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/setup.ts @@ -29,7 +29,7 @@ const TIMING = { }; const PATHS = { - PROJECT_ROOT_RELATIVE: "../../../../../test/data/bi_empty", + PROJECT_ROOT_RELATIVE: "../../../../../test/data/bi_empty_project", ENV_FILE_RELATIVE: "../../../../.env", }; diff --git a/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts b/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts index 151e3947831..0b8f155a29f 100644 --- a/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts +++ b/workspaces/ballerina/ballerina-extension/test/runLibsIntegrationTest.ts @@ -69,7 +69,7 @@ async function main() { extensionDevelopmentPath, extensionTestsPath, launchArgs: [ - path.resolve(__dirname, '../../test/data/bi_empty') + path.resolve(__dirname, '../../test/data/bi_empty_project') ], extensionTestsEnv: { ...envKeys, From f20d297c963cb9580b033cc5f6abe82d52b52963 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Wed, 8 Oct 2025 11:21:12 +0530 Subject: [PATCH 148/730] Change the structure of existing code blocks in user prompt --- .../src/features/ai/service/code/code.ts | 14 +++++++------- .../test/ai/evals/code/utils/constants.ts | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 70dbc5f9acf..0132d11abb8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -161,11 +161,9 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler toolResult = libraryNames; } else if (toolName == "str_replace_based_edit_tool") { console.log(`[Tool Call] Tool call finished: ${toolName}`); - break; } eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); eventHandler({ type: "evals_tool_result", toolName, output: part.output }); - break; } case "text-delta": { @@ -369,14 +367,15 @@ ${JSON.stringify(langlibs, null, 2)} ### File modifications - Prefer modifying existing bal files but you can create new bal files if necessary. - Do not modify the README.md file unless explicitly asked to be modified in the query. -- Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml) unless asked. -- In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. -- For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. +- Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). Begin your response with the explanation. The explanation should detail the control flow decided in step 1, along with the selected libraries and their functions. Once the explanation is finished, you must apply surgical edits to the existing source code using the **str_replace_based_edit_tool** tool. The complete source code will be provided in the section of the user prompt. When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. + +Your goal is to modify only the relevant parts of the code to address the user's query. +Do not generate or modify any file types other than .bal. Politely decline if the query qq `; } @@ -548,8 +547,9 @@ export function stringifyExistingCode(existingCode: SourceFiles[], op: Operation continue; } - existingCodeStr = existingCodeStr + "filepath : " + filePath + "\n"; - existingCodeStr = existingCodeStr + file.content + "\n"; + existingCodeStr += `\n`; + existingCodeStr += `\n${file.content}\n\n`; + existingCodeStr += `\n`; } return existingCodeStr; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts index c938101dea7..002872c0b9a 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -23,7 +23,7 @@ import * as path from 'path'; export const DEFAULT_TEST_CONFIG: TestConfiguration = { // should be 1, 5, 10, 15, 20 ... maxConcurrency: 5, - iterations: 3 + iterations: 1 } as const; /** From 236468abedc53b10f20007068b6a6d39766eabc6 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Thu, 9 Oct 2025 12:07:12 +0530 Subject: [PATCH 149/730] Cleanup --- .../ballerina/ballerina-extension/package.json | 13 ++++++++----- .../src/features/ai/service/code/code.ts | 3 +-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 4f42ec4f666..c87e953cb83 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -31,7 +31,10 @@ "onNotebook:ballerina-notebook", "onUri" ], - "extensionDependencies": [], + "extensionDependencies": [ + "anweber.httpbook", + "WSO2.wso2-platform" + ], "contributes": { "languages": [ { @@ -963,21 +966,21 @@ "description": "design-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f182" + "fontCharacter": "\\f180" } }, "distro-start": { "description": "start", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1f7" + "fontCharacter": "\\f1f5" } }, "distro-debug": { "description": "debug", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f17d" + "fontCharacter": "\\f17b" } }, "distro-source-view": { @@ -991,7 +994,7 @@ "description": "persist-diagram", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1d2" + "fontCharacter": "\\f1d0" } }, "distro-cached-rounded": { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 0132d11abb8..30d2b8159c1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -365,7 +365,6 @@ ${JSON.stringify(langlibs, null, 2)} - To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. ### File modifications -- Prefer modifying existing bal files but you can create new bal files if necessary. - Do not modify the README.md file unless explicitly asked to be modified in the query. - Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). @@ -375,7 +374,7 @@ The complete source code will be provided in the section of the When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. Your goal is to modify only the relevant parts of the code to address the user's query. -Do not generate or modify any file types other than .bal. Politely decline if the query qq +Do not generate or modify any file types other than .bal. Politely decline if the query `; } From 5868bba0a0380b75d3ef43905e8c39e48b39673b Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 9 Oct 2025 12:08:05 +0530 Subject: [PATCH 150/730] Resolve review comments --- .../service-class-designer/service-class.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts index a8eff596a71..2326d863479 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/service-class.spec.ts @@ -46,15 +46,15 @@ export default function createTests() { // Create service class const serviceForm = await serviceClassUtils.createServiceClass(sampleName, [ { name: 'name', returnType: 'string', type: 'Resource' }, - { name: 'age', returnType: 'int', type: 'Remote'} + { name: 'age', returnType: 'int', type: 'Remote' } ], [ { name: 'firstName', type: 'string' }, - {name: 'id', type: 'int' } + { name: 'id', type: 'int' } ]); await serviceClassUtils.renameServiceClass(`Service${testAttempt}`); await serviceClassUtils.editMethod('name', 'fullName'); await serviceClassUtils.deleteVariable('id'); - }) + }); }); } From 7df90a7b38beef3765b3b10629f5aba42a155262 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Thu, 9 Oct 2025 14:14:38 +0530 Subject: [PATCH 151/730] Update the system prompt to worl allign with text editor tool --- .../src/features/ai/service/code/code.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 30d2b8159c1..1c39f78b4c2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -328,7 +328,8 @@ ${JSON.stringify(langlibs, null, 2)} - Plan the control flow of the application based on input and output parameters of each function of the connector according the received API documentation from the tool. 3. Write the Ballerina Code: - - Write the Ballerina code by strictly adhering to Ballerina Code Constraints mentioned below. + - First thoroughly read and understand the Ballerina code constraints. + - Then do the file modifications by strictly adhering to file modifications section mentioned in below. ## Ballerina Code Constraints @@ -365,16 +366,13 @@ ${JSON.stringify(langlibs, null, 2)} - To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. ### File modifications +- You must apply changes to the existing source code using the **str_replace_based_edit_tool** tool. The complete existing source code will be provided in the section of the user prompt. +- When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. - Do not modify the README.md file unless explicitly asked to be modified in the query. - Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). Begin your response with the explanation. The explanation should detail the control flow decided in step 1, along with the selected libraries and their functions. -Once the explanation is finished, you must apply surgical edits to the existing source code using the **str_replace_based_edit_tool** tool. -The complete source code will be provided in the section of the user prompt. -When making replacements inside an existing file, provide the **exact old string** and the **exact new string**, including all newlines, spaces, and indentation. - -Your goal is to modify only the relevant parts of the code to address the user's query. -Do not generate or modify any file types other than .bal. Politely decline if the query +Once the explanation is finished, make necessary file edits for the code that needs to generate. `; } From 43c0dee460d4585d8f7df8d03097784539de4e9f Mon Sep 17 00:00:00 2001 From: Ravindu Wegiriya Date: Thu, 9 Oct 2025 14:23:34 +0530 Subject: [PATCH 152/730] Fix Issues found in MI VS Code Release Testing --- .../Form/GenerateComponents/GenerateDiv.tsx | 10 ++++++- .../DataSourceForm/DatasourceRDBMSForm.tsx | 27 ++++++++++++------- .../DataServiceForm/MainPanelForms/index.tsx | 6 +++-- .../src/views/Forms/DataSourceForm/index.tsx | 6 +++-- .../src/views/Forms/MessageProcessorForm.tsx | 9 +++++-- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx b/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx index 9e580aef1ed..8544bd3ab98 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx @@ -89,7 +89,15 @@ const GenerateDiv = (props: GenerateDivProps) => { }}> {!isChecked && !isExpression && isConnection && generatedFormDetails["configKey"]} {!isChecked && isExpression && generatedFormDetails[element.name].value} - {!isChecked && !isExpression && generatedFormDetails[element.name]} + {!isChecked && !isExpression && !isConnection && (() => { + const value = generatedFormDetails[element.name]; + // Handle object with isExpression/value structure + if (value && typeof value === 'object' && 'value' in value) { + return value.value; + } + // Handle primitive values + return value; + })()} {isChecked && !isExpression && (
{ - if (isInitialLoading) { + if (props.isEditDatasource && !hasExtractedUrl && props.watch('rdbms.url')) { + extractValuesFromUrl(props.watch('rdbms.url'), props.watch('rdbms.databaseEngine')); + setHasExtractedUrl(true); setIsInitialLoading(false); + return; + } + + if (isInitialLoading) { if (props.watch('rdbms.driverClassName') === "" && props.watch('rdbms.url') === "") { props.setValue('rdbms.driverClassName', driverMap.get("MySQL").driverClass); props.setValue('rdbms.url', driverMap.get("MySQL").jdbcUrl); } + setIsInitialLoading(false); + return; } - props.isEditDatasource && extractValuesFromUrl(props.watch('rdbms.url'), props.watch('rdbms.databaseEngine')); - const driverUrl = driverMap.get(props.watch("rdbms.databaseEngine")); if (prevDbType !== props.watch('rdbms.databaseEngine')) { setPrevDbType(props.watch('rdbms.databaseEngine')); - props.setValue('rdbms.hostname', "localhost"); - props.setValue('rdbms.port', driverUrl.port); + if (!props.isEditDatasource || prevDbType !== '') { + props.setValue('rdbms.hostname', "localhost"); + props.setValue('rdbms.port', driverUrl.port); + } props.setValue('rdbms.driverClassName', driverUrl.driverClass); } + props.setValue('rdbms.url', replacePlaceholders(driverUrl.jdbcUrl)); }, [props.watch('rdbms.databaseEngine'), props.watch('rdbms.hostname'), props.watch('rdbms.port'), props.watch('rdbms.databaseName'), props.isEditDatasource]); @@ -110,10 +120,9 @@ export function DataSourceRDBMSForm(props: DataSourceRDBMSFormProps) { const match = url.match(regex); if (match && match.groups) { const { host, port, database } = match.groups; - - !props.watch('rdbms.hostname') && props.setValue('rdbms.hostname', host); - !props.watch('rdbms.port') &&props.setValue('rdbms.port', port); - !props.watch('rdbms.databaseName') && props.setValue('rdbms.databaseName', database); + props.setValue('rdbms.hostname', host); + props.setValue('rdbms.port', port); + props.setValue('rdbms.databaseName', database); } } }; diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/DataServiceForm/MainPanelForms/index.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/DataServiceForm/MainPanelForms/index.tsx index b8247cacd3e..df1110cdf23 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/DataServiceForm/MainPanelForms/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/DataServiceForm/MainPanelForms/index.tsx @@ -89,10 +89,10 @@ export function DataServiceWizard(props: DataServiceWizardProps) { .matches(/^[a-zA-Z0-9_-]*$/, "Invalid characters in Data Service name") .test('validateTaskName', 'An artifact with same name already exists', value => { - return !workspaceFileNames.includes(value.toLowerCase()) + return !(workspaceFileNames.includes(value.toLowerCase()) && savedDSName !== value) }).test('validateArtifactName', 'A registry resource with this artifact name already exists', value => { - return !artifactNames.includes(value.toLowerCase()) + return !(artifactNames.includes(value.toLowerCase()) && savedDSName !== value) }), dataServiceNamespace: yup.string().notRequired(), serviceGroup: yup.string().notRequired(), @@ -136,6 +136,7 @@ export function DataServiceWizard(props: DataServiceWizardProps) { const [isNewDataService, setIsNewDataService] = useState(!props.path.endsWith(".xml")); const [artifactNames, setArtifactNames] = useState([]); const [workspaceFileNames, setWorkspaceFileNames] = useState([]); + const [savedDSName, setSavedDSName] = useState(""); useEffect(() => { (async () => { @@ -162,6 +163,7 @@ export function DataServiceWizard(props: DataServiceWizardProps) { existingDatasources.push(currentDatasource); }); setDatasources(existingDatasources); + setSavedDSName(existingDataService.dataServiceName); } else { setIsNewDataService(true); setShowDatasourceComponent(false); diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/DataSourceForm/index.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/DataSourceForm/index.tsx index 6bc9d960ebe..c4761c510f5 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/DataSourceForm/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/DataSourceForm/index.tsx @@ -94,16 +94,17 @@ export function DataSourceWizard(props: DataSourceFormProps) { const [prevDbType, setPrevDbType] = React.useState("MySQL"); const [artifactNames, setArtifactNames] = useState([]); const [workspaceFileNames, setWorkspaceFileNames] = useState([]); + const [savedDSName, setSavedDSName] = useState(""); const schema = yup.object({ name: yup.string().required("Datasource name is required") .matches(/^[a-zA-Z0-9_-]*$/, "Invalid characters in Datasource name") .test('validateTaskName', 'An artifact with same name already exists', value => { - return !workspaceFileNames.includes(value.toLowerCase()) + return !(workspaceFileNames.includes(value.toLowerCase()) && savedDSName !== value) }).test('validateArtifactName', 'A registry resource with this artifact name already exists', value => { - return !artifactNames.includes(value.toLowerCase()) + return !(artifactNames.includes(value.toLowerCase()) && savedDSName !== value) }), description: yup.string().notRequired(), type: yup.string().required("Datasource type is required"), @@ -316,6 +317,7 @@ export function DataSourceWizard(props: DataSourceFormProps) { extractValuesFromUrl(response.url, watch("dbEngine")); } + setSavedDSName(response.name); } else { setIsUpdate(false); reset(newDataSource); diff --git a/workspaces/mi/mi-visualizer/src/views/Forms/MessageProcessorForm.tsx b/workspaces/mi/mi-visualizer/src/views/Forms/MessageProcessorForm.tsx index 14422ad7f2b..b91ba85877b 100644 --- a/workspaces/mi/mi-visualizer/src/views/Forms/MessageProcessorForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Forms/MessageProcessorForm.tsx @@ -192,6 +192,7 @@ export function MessageProcessorWizard(props: MessageProcessorWizardProps) { }] } const [params, setParams] = useState(paramConfigs); + const [areParamsDirty, setAreParamsDirty] = useState(false); useEffect(() => { (async () => { @@ -234,11 +235,13 @@ export function MessageProcessorWizard(props: MessageProcessorWizardProps) { setValue('processorState', existingMessageProcessor.processorState ? "Activate" : "Deactivate"); setHasCustomProperties(existingMessageProcessor.properties.length > 0 ? true : false); setType(existingMessageProcessor.messageProcessorType); + setAreParamsDirty(false); } else { paramConfigs.paramValues = []; setParams(paramConfigs); reset(newMessageProcessor); setIsNewMessageProcessor(true); + setAreParamsDirty(false); } })(); }, [props.path]); @@ -252,6 +255,7 @@ export function MessageProcessorWizard(props: MessageProcessorWizardProps) { if (!event.target.value) { paramConfigs.paramValues = []; setParams(paramConfigs); + setAreParamsDirty(false); } setHasCustomProperties(event.target.value === "Yes" ? true : false); }; @@ -267,12 +271,13 @@ export function MessageProcessorWizard(props: MessageProcessorWizardProps) { }) }; setParams(modifiedParams); + setAreParamsDirty(true); }; const handleCreateMessageProcessor = async (values: any) => { let customProperties: any = []; - if (hasCustomProperties) { + if (hasCustomProperties || type === "Custom Message Processor") { params.paramValues.map((param: any) => { customProperties.push({ key: param.paramValues[0].value, value: param.paramValues[1].value }); }); @@ -540,7 +545,7 @@ export function MessageProcessorWizard(props: MessageProcessorWizardProps) { From bb2857b0ffec11e3e9a4b37d0ba00617df00d819 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Thu, 9 Oct 2025 15:00:08 +0530 Subject: [PATCH 153/730] Add missing license header --- .../serviceEditorUtils.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts index cd9d623e5a7..7ab386807d9 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/service-class-designer/serviceEditorUtils.ts @@ -1,3 +1,20 @@ +/** + * 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 { Frame, Page } from '@playwright/test'; import { Form } from '@wso2/playwright-vscode-tester'; From 45fa5e66bf708330cf23cf1ac082d1eab88d8e67 Mon Sep 17 00:00:00 2001 From: LakshanWeerasinghe Date: Thu, 9 Oct 2025 19:22:07 +0530 Subject: [PATCH 154/730] Fix http response creating type suggestions --- .../src/interfaces/extended-lang-client.ts | 3 +- .../src/rpc-types/service-designer/index.ts | 4 +- .../rpc-types/service-designer/rpc-type.ts | 4 +- .../src/core/extended-language-client.ts | 4 +- .../service-designer/rpc-manager.ts | 7 ++- .../service-designer/rpc-client.ts | 4 +- .../ResourceResponse/ResponseEditor.tsx | 56 +++++++++---------- .../src/views/BI/ServiceDesigner/utils.tsx | 16 +++--- 8 files changed, 50 insertions(+), 48 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index f508225e283..272fd743649 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1150,6 +1150,7 @@ export interface VisibleTypeItem { description: string; detail: string; } + detail?: string; } export type VisibleTypesResponse = VisibleTypeItem[]; @@ -1921,7 +1922,7 @@ export interface BIInterface extends BaseLangClientInterface { getHttpResourceModel: (params: HttpResourceModelRequest) => Promise; addResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; addFunctionSourceCode: (params: FunctionSourceCodeRequest) => Promise; - getResourceReturnTypes: (params: ResourceReturnTypesRequest) => Promise; + getResourceReturnTypes: (params: ResourceReturnTypesRequest) => Promise; getServiceInitModel: (params: ServiceModelRequest) => Promise; createServiceAndListener: (params: ServiceInitSourceRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts index b65025ec94b..4bb12b5b45a 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts @@ -17,7 +17,7 @@ */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse, ServiceInitSourceRequest, SourceEditResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse, ServiceInitSourceRequest, VisibleTypesResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -38,7 +38,7 @@ export interface ServiceDesignerAPI { updateServiceSourceCode: (params: ServiceSourceCodeRequest) => Promise; getServiceModelFromCode: (params: ServiceModelFromCodeRequest) => Promise; getHttpResourceModel: (params: HttpResourceModelRequest) => Promise; - getResourceReturnTypes: (params: ResourceReturnTypesRequest) => Promise; + getResourceReturnTypes: (params: ResourceReturnTypesRequest) => Promise; addResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; addFunctionSourceCode: (params: FunctionSourceCodeRequest) => Promise; updateResourceSourceCode: (params: FunctionSourceCodeRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts index d1687ed5f81..115539e7b01 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts @@ -18,7 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse, ServiceInitSourceRequest, SourceEditResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, FunctionFromSourceRequest, FunctionFromSourceResponse, ServiceModelInitResponse, ServiceInitSourceRequest, VisibleTypesResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -40,7 +40,7 @@ export const addServiceSourceCode: RequestType = { method: `${_preFix}/updateServiceSourceCode` }; export const getServiceModelFromCode: RequestType = { method: `${_preFix}/getServiceModelFromCode` }; export const getHttpResourceModel: RequestType = { method: `${_preFix}/getHttpResourceModel` }; -export const getResourceReturnTypes: RequestType = { method: `${_preFix}/getResourceReturnTypes` }; +export const getResourceReturnTypes: RequestType = { method: `${_preFix}/getResourceReturnTypes` }; export const addResourceSourceCode: RequestType = { method: `${_preFix}/addResourceSourceCode` }; export const addFunctionSourceCode: RequestType = { method: `${_preFix}/addFunctionSourceCode` }; export const updateResourceSourceCode: RequestType = { method: `${_preFix}/updateResourceSourceCode` }; diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index ea34b792bdd..a073d5196eb 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -1216,8 +1216,8 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_RESOURCE, params); } - async getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { - return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_RESOURCE_RETURN_TYPES, params); + async getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_SERVICE_GET_RESOURCE_RETURN_TYPES, params); } async addResourceSourceCode(params: FunctionSourceCodeRequest): Promise { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts index f8f41495e5a..61bd23de38b 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts @@ -51,7 +51,8 @@ import { UpdatedArtifactsResponse, ServiceModelInitResponse, ServiceInitSourceRequest, - SourceEditResponse + SourceEditResponse, + VisibleTypesResponse } from "@wso2/ballerina-core"; import * as fs from 'fs'; import * as yaml from 'js-yaml'; @@ -391,13 +392,13 @@ export class ServiceDesignerRpcManager implements ServiceDesignerAPI { } } - async getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { + async getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { return new Promise(async (resolve) => { const context = StateMachine.context(); params.filePath = StateMachine.context().projectUri; params.context = "HTTP_STATUS_CODE"; try { - const res: ResourceReturnTypesResponse = await context.langClient.getResourceReturnTypes(params); + const res: VisibleTypesResponse = await context.langClient.getResourceReturnTypes(params); resolve(res); } catch (error) { console.log(">>> error fetching resource return types", error); diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts index 2c0cf231666..34daa296610 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts @@ -67,7 +67,7 @@ import { getServiceInitModel, ServiceInitSourceRequest, createServiceAndListener, - SourceEditResponse + VisibleTypesResponse } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -135,7 +135,7 @@ export class ServiceDesignerRpcClient implements ServiceDesignerAPI { return this._messenger.sendRequest(getHttpResourceModel, HOST_EXTENSION, params); } - getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { + getResourceReturnTypes(params: ResourceReturnTypesRequest): Promise { return this._messenger.sendRequest(getResourceReturnTypes, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx index 0257ad0eea8..eebcf6a9b71 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseEditor.tsx @@ -21,7 +21,7 @@ import { useEffect, useState } from 'react'; import { Divider, OptionProps, Typography } from '@wso2/ui-toolkit'; import { EditorContainer, EditorContent } from '../../../styles'; -import { LineRange, PropertyModel, ResponseCode, StatusCodeResponse } from '@wso2/ballerina-core'; +import { LineRange, PropertyModel, ResponseCode, StatusCodeResponse, VisibleTypeItem, VisibleTypesResponse } from '@wso2/ballerina-core'; import { getDefaultResponse, getTitleFromStatusCodeAndType, HTTP_METHOD } from '../../../utils'; import { FormField, FormImports, FormValues } from '@wso2/ballerina-side-panel'; import FormGeneratorNew from '../../../../Forms/FormGeneratorNew'; @@ -50,7 +50,7 @@ export function ResponseEditor(props: ParamProps) { const { rpcClient } = useRpcContext(); const [filePath, setFilePath] = useState(''); - const [responseCodes, setResponseCodes] = useState([]); + const [responseCodes, setResponseCodes] = useState([]); const [targetLineRange, setTargetLineRange] = useState(); @@ -59,7 +59,7 @@ export function ResponseEditor(props: ParamProps) { useEffect(() => { rpcClient.getServiceDesignerRpcClient().getResourceReturnTypes({ filePath: undefined, context: undefined }).then((res) => { console.log("Resource Return Types: ", res); - setResponseCodes(res.completions); + setResponseCodes(res); rpcClient.getVisualizerRpcClient().joinProjectPath('main.bal').then((filePath) => { setFilePath(filePath); }); @@ -117,10 +117,10 @@ export function ResponseEditor(props: ParamProps) { value: getTitleFromStatusCodeAndType(responseCodes, res.statusCode.value, res.type.value), itemOptions: getCategorizedOptions(responseCodes), onValueChange: (value: string) => { - const responseCodeData = responseCodes.find(code => getTitleFromStatusCodeAndType(responseCodes, code.statusCode, code.type) === value); - res.statusCode.value = responseCodeData.statusCode; - res.type.value = responseCodeData.type; - if (NO_BODY_TYPES.includes(responseCodeData.type)) { + const responseCodeData = responseCodes.find(code => getTitleFromStatusCodeAndType(responseCodes, code.labelDetails.detail, code.detail) === value); + res.statusCode.value = responseCodeData.labelDetails.detail; + res.type.value = responseCodeData.detail; + if (NO_BODY_TYPES.includes(responseCodeData.detail)) { updateNewFields(res, false); } else { updateNewFields(res, true); @@ -166,7 +166,7 @@ export function ResponseEditor(props: ParamProps) { if (dataValues['name']) { return true; } - const code = responseCodes.find(code => getTitleFromStatusCodeAndType(responseCodes, code.statusCode, code.type) === dataValues['statusCode']).statusCode; + const code = responseCodes.find(code => getTitleFromStatusCodeAndType(responseCodes, code.labelDetails.detail, code.detail) === dataValues['statusCode']).labelDetails.detail; const defaultCode = getDefaultResponse(method); // Set optional false for the response name @@ -200,7 +200,7 @@ export function ResponseEditor(props: ParamProps) { console.log("Add New Response: ", dataValues); if (isValidResponse(dataValues)) { // Set the values - const code = responseCodes.find(code => getTitleFromStatusCodeAndType(responseCodes, code.statusCode, code.type) === dataValues['statusCode']).statusCode; + const code = responseCodes.find(code => getTitleFromStatusCodeAndType(responseCodes, code.labelDetails.detail, code.detail) === dataValues['statusCode']).labelDetails.detail; response.statusCode.value = String(code); response.body.value = dataValues['body']; response.name.value = dataValues['name']; @@ -235,23 +235,23 @@ export function ResponseEditor(props: ParamProps) { }); // Helper to create a regular option - const createOption = (item: ResponseCode): OptionProps => ({ - id: `${item.statusCode}-${item.type}`, + const createOption = (item: VisibleTypeItem): OptionProps => ({ + id: `${item.labelDetails.detail}-${item.detail}`, content: ( - {item.statusCode !== "Dynamic" ? `${item.statusCode} ` : "Dynamic"} - {item.label} + {item.labelDetails.detail !== "Dynamic" ? `${item.labelDetails.detail} ` : "Dynamic"} - {item.label} ), - value: `${item.statusCode} - ${item.label}`, + value: `${item.labelDetails.detail} - ${item.label}`, }); // Main function to categorize and flatten the list - function getCategorizedOptions(responseCodes: ResponseCode[]): OptionProps[] { - const dynamic = responseCodes.filter(i => i.type === "http:Response"); - const error = responseCodes.filter(i => i.type === "error"); - const userDefined = responseCodes.filter(i => i.category === "User Defined"); + function getCategorizedOptions(responseCodes: VisibleTypesResponse): OptionProps[] { + const dynamic = responseCodes.filter(i => i.detail === "http:Response"); + const error = responseCodes.filter(i => i.detail === "error"); + const userDefined = responseCodes.filter(i => i.labelDetails.description === "User-Defined"); const preBuilt = responseCodes.filter(i => - ["1XX", "2XX", "3XX", "4XX", "5XX"].includes(i.category) + ["1XX", "2XX", "3XX", "4XX", "5XX"].includes(i.labelDetails.description) ); let options: OptionProps[] = []; @@ -259,25 +259,25 @@ export function ResponseEditor(props: ParamProps) { options.push(createHeaderOption("User Defined Responses", 0)); options = options.concat(userDefined.map(createOption)); } - if (preBuilt.filter(i => i.category === "2XX").length > 0) { + if (preBuilt.filter(i => i.labelDetails.description === "2XX").length > 0) { options.push(createHeaderOption("2XX - Success", userDefined.length > 0 ? 3 : 0)); - options = options.concat(preBuilt.filter(i => i.category === "2XX").map(createOption)); + options = options.concat(preBuilt.filter(i => i.labelDetails.description === "2XX").map(createOption)); } - if (preBuilt.filter(i => i.category === "1XX").length > 0) { + if (preBuilt.filter(i => i.labelDetails.description === "1XX").length > 0) { options.push(createHeaderOption("1XX - Informational")); - options = options.concat(preBuilt.filter(i => i.category === "1XX").map(createOption)); + options = options.concat(preBuilt.filter(i => i.labelDetails.description === "1XX").map(createOption)); } - if (preBuilt.filter(i => i.category === "3XX").length > 0) { + if (preBuilt.filter(i => i.labelDetails.description === "3XX").length > 0) { options.push(createHeaderOption("3XX - Redirection")); - options = options.concat(preBuilt.filter(i => i.category === "3XX").map(createOption)); + options = options.concat(preBuilt.filter(i => i.labelDetails.description === "3XX").map(createOption)); } - if (preBuilt.filter(i => i.category === "4XX").length > 0) { + if (preBuilt.filter(i => i.labelDetails.description === "4XX").length > 0) { options.push(createHeaderOption("4XX - Client Error")); - options = options.concat(preBuilt.filter(i => i.category === "4XX").map(createOption)); + options = options.concat(preBuilt.filter(i => i.labelDetails.description === "4XX").map(createOption)); } - if (preBuilt.filter(i => i.category === "5XX").length > 0) { + if (preBuilt.filter(i => i.labelDetails.description === "5XX").length > 0) { options.push(createHeaderOption("5XX - Server Error")); - options = options.concat(preBuilt.filter(i => i.category === "5XX").map(createOption)); + options = options.concat(preBuilt.filter(i => i.labelDetails.description === "5XX").map(createOption)); } if (error.length) { options.push(createHeaderOption("Error Response")); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/utils.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/utils.tsx index 36c351821a2..c4a2aac727b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/utils.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/utils.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { ResponseCode } from '@wso2/ballerina-core'; +import { ResponseCode, VisibleTypeItem, VisibleTypesResponse } from '@wso2/ballerina-core'; export enum HTTP_METHOD { "GET" = "GET", @@ -43,23 +43,23 @@ export function getDefaultResponse(httpMethod: HTTP_METHOD): string { } } -export function getTitleFromStatusCodeAndType(responseCodes: ResponseCode[], statusCode: string, type: string): string { - let responseCode: ResponseCode | undefined; +export function getTitleFromStatusCodeAndType(responseCodes: VisibleTypesResponse, statusCode: string, type: string): string { + let responseCode: VisibleTypeItem | undefined; if (statusCode && type) { // If both statusCode and type are provided, find by both - responseCode = responseCodes.find(res => res.statusCode === statusCode && res.type === type); + responseCode = responseCodes.find(res => res.labelDetails.detail === statusCode && res.detail === type); // If not found with both, fallback to statusCode only if (!responseCode) { - responseCode = responseCodes.find(res => res.statusCode === statusCode); + responseCode = responseCodes.find(res => res.labelDetails.detail === statusCode); } } else if (statusCode) { // If only statusCode is provided, find by statusCode only - responseCode = responseCodes.find(res => res.statusCode === statusCode); + responseCode = responseCodes.find(res => res.labelDetails.detail === statusCode); } else if (type) { // If only type is provided, find by type only - responseCode = responseCodes.find(res => res.type === type); + responseCode = responseCodes.find(res => res.detail === type); } - return responseCode ? `${responseCode.statusCode} - ${responseCode.label}` : ""; + return responseCode ? `${responseCode.labelDetails.detail} - ${responseCode.label}` : ""; } From 53ece1c4c30573a1c6df323a4406f9f6ebb9a847 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Thu, 9 Oct 2025 19:29:54 +0530 Subject: [PATCH 155/730] Update ResourceForm and ServiceDesigner to support new resource creation options --- .../src/views/BI/DiagramWrapper/index.tsx | 2 +- .../Forms/ResourceForm/NewResource.tsx | 32 ++++----- .../ResourceForm/Parameters/ParamEditor.tsx | 68 ++++++++++++++----- .../ResourceForm/Parameters/ParamItem.tsx | 66 ++++++++++++++++-- .../ResourceForm/Parameters/Parameters.tsx | 8 ++- .../ResourcePath/ResourcePath.tsx | 43 +++++++++--- .../ResourceResponse/ResponseEditor.tsx | 2 +- .../Forms/ResourceForm/index.tsx | 2 +- .../src/views/BI/ServiceDesigner/index.tsx | 28 +++++--- .../type-editor/src/TypeEditor/TypeEditor.tsx | 18 ++--- 10 files changed, 196 insertions(+), 73 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 0b47f3fc512..d133ec30f43 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -480,7 +480,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { title={"Resource Configuration"} show={!!functionModel} onClose={handleFunctionClose} - width={600} + width={400} > void; + onSave: (functionModel: FunctionModel, openDiagram?: boolean) => void; onClose: () => void; } @@ -257,6 +257,7 @@ export function NewResource(props: NewResourceProps) { const [functionModel, setFunctionModel] = useState(model); const [isPathValid, setIsPathValid] = useState(false); + const [createMore, setCreateMore] = useState(false); const [method, setMethod] = useState(""); @@ -313,7 +314,10 @@ export function NewResource(props: NewResourceProps) { const handleSave = () => { console.log("Saved Resource", functionModel); - onSave(functionModel); + if (createMore) { + closeMethod(); + } + onSave(functionModel, !createMore); } return ( @@ -349,26 +353,18 @@ export function NewResource(props: NewResourceProps) { <> {isSaving && } - - HTTP Method: {method} - - Responses + + + + setCreateMore(!createMore)} /> + + - + ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx index 5e2d07f6ed2..ccabe6635f8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/Parameters/ParamEditor.tsx @@ -38,10 +38,11 @@ export interface ParamProps { onSave?: (param: ParameterModel) => void; onCancel?: (param?: ParameterModel) => void; isNewResource?: boolean; + type?: "QUERY" | "HEADER" | "PAYLOAD"; } export function ParamEditor(props: ParamProps) { - const { param, hideType = false, onChange, onSave, onCancel, isNewResource } = props; + const { param, hideType = false, onChange, onSave, onCancel, isNewResource, type } = props; const { rpcClient } = useRpcContext(); const [currentFields, setCurrentFields] = useState([]); @@ -91,19 +92,54 @@ export function ParamEditor(props: ParamProps) { valueTypeConstraint: "" }); - // Add type field if not hidden - if (!hideType) { - fields.push({ - key: `type`, - label: 'Type', - type: param.type.valueType, - optional: false, - editable: true, - documentation: '', - enabled: param.type?.enabled, - value: param.type.value, - valueTypeConstraint: "" - }); + // // Add type field if not hidden + // if (!hideType) { + // fields.push({ + // key: `type`, + // label: 'Type', + // type: param.type.valueType, + // optional: false, + // editable: true, + // documentation: '', + // enabled: param.type?.enabled, + // value: param.type.value, + // defaultValue: "json", + // valueTypeConstraint: "" + // }); + // } + + switch (type) { + case "QUERY": + case "HEADER": + fields.push({ + key: `type`, + label: 'Type', + type: "ENUM", + advanced: true, + optional: false, + editable: true, + documentation: '', + enabled: true, + defaultValue: "string", + value: param.type.value, + items: ["string", "int", "float", "decimal", "boolean"], + valueTypeConstraint: "" + }); + break; + case "PAYLOAD": + fields.push({ + key: `type`, + label: 'Type', + type: param.type.valueType, + optional: false, + editable: true, + documentation: '', + enabled: param.type?.enabled, + value: param.type.value || "json", + defaultValue: "json", + valueTypeConstraint: "" + }); + break; } // Add default value field if available @@ -173,7 +209,7 @@ export function ParamEditor(props: ParamProps) { {param.httpParamType && {param.httpParamType === "PAYLOAD" ? "Payload" : "Parameter"} Configuration} {!param.httpParamType && {param.metadata.label} Configuration} - {param.httpParamType !== "PAYLOAD" && !isNewResource && + {/* {param.httpParamType !== "PAYLOAD" && !isNewResource && {param.httpParamType === "QUERY" && ( @@ -181,7 +217,7 @@ export function ParamEditor(props: ParamProps) { )} - } + } */} <> {filePath && targetLineRange && void; } +const ParamLabelContainer = styled.div` + display: flex; + align-items: center; + gap: 12px; + font-family: var(--vscode-font-family); +`; + +const ParamName = styled.span` + color: var(--vscode-editor-foreground, #222); + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-family: var(--vscode-font-family); +`; + +const ParamType = styled.span` + font-size: 13px; + color: var(--vscode-descriptionForeground, #888); + background: var(--vscode-editorWidget-background, #f5f5f5); + border-radius: 4px; + padding: 2px 8px; + letter-spacing: 0.1px; + width: 60px; +`; + +const ParamDefault = styled.span` + font-size: 13px; + color: var(--vscode-editorHint-foreground, #b0b0b0); + margin-left: 8px; + font-style: italic; +`; + export function ParamItem(props: ParamItemProps) { const { param, readonly, onDelete, onEditClick } = props; - const label = param?.type.value - ? `${param.type.value} ${param.name.value}${ - (param.defaultValue as PropertyModel)?.value ? ` = ${(param.defaultValue as PropertyModel).value}` : "" - }` - : `${param.name.value}`; + + + const label = ( + + + {param.type.value} + + {param?.type?.value ? ( + <> + {param.name.value} + {(param.defaultValue as PropertyModel)?.value && ( + + = {(param.defaultValue as PropertyModel).value} + + )} + + ) : ( + + {param.name.value} + + )} + + ); const handleDelete = () => { onDelete(param); @@ -53,14 +105,14 @@ export function ParamItem(props: ParamItemProps) { return ( - + {/* {param?.httpParamType ? param?.httpParamType.toUpperCase() : param?.metadata?.label.toUpperCase()} - + */}
} @@ -228,7 +230,7 @@ export function Parameters(props: ParametersProps) { {/* <---------------- Header Parameters Start ----------------> */} {!isNewResource && ( <> - Header Parameters + Headers {normalParameters .filter((param: ParameterModel) => param.httpParamType === "HEADER") .map((param: ParameterModel, index) => ( @@ -245,12 +247,13 @@ export function Parameters(props: ParametersProps) { onChange={onChangeParam} onSave={onSaveParam} onCancel={onParamEditCancel} + type="HEADER" /> } (!readonly && onAddParamClick("HEADER"))}> - <>Header Parameter + <>Header @@ -279,6 +282,7 @@ export function Parameters(props: ParametersProps) { onChange={onChangeParam} onSave={onSaveParam} onCancel={onParamEditCancel} + type="PAYLOAD" /> } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx index 51e45fbf851..93275170483 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourcePath/ResourcePath.tsx @@ -22,6 +22,24 @@ import styled from '@emotion/styled'; import { PropertyModel } from '@wso2/ballerina-core'; import { SegmentParam } from '@wso2/ballerina-side-panel'; import { parseResourcePath } from '../Utils/ResourcePathParser'; +import { getColorByMethod } from '../../../../../../utils/utils'; + + +const MethodBox = styled.div` + display: flex; + justify-content: center; + height: 25px; + min-width: 70px; + width: auto; + margin-left: 0px; + text-align: center; + padding: 3px 5px 3px 5px; + background-color: ${(p: any) => p.color}; + color: #FFF; + align-items: center; + font-weight: bold; + margin-top: 20px; +`; export const verbs = [ { @@ -132,15 +150,15 @@ export function ResourcePath(props: ResourcePathProps) { return ( <> - {!isNew && ( -
+
+ {!isNew && ( -
- )} + )} + {isNew && ( + + {method.value.toUpperCase()} + + )} +
{ - if (responseCodes.length > 0) { + if (responseCodes?.length > 0) { updateNewFields(response); } }, [response, responseCodes]); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/index.tsx index fb9343073ae..074d26c5fde 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/index.tsx @@ -35,7 +35,7 @@ const AdvancedParamTitleWrapper = styled.div` export interface ResourceFormProps { model: FunctionModel; isSaving: boolean; - onSave: (functionModel: FunctionModel) => void; + onSave: (functionModel: FunctionModel, openDiagram?: boolean) => void; onClose: () => void; isNew?: boolean; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 0d63d86a8a1..4fd5ece0e2e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -212,7 +212,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { }); }, [position]); - const fetchService = (targetPosition: NodePosition) => { + const fetchService = (targetPosition: NodePosition, addMore?: boolean) => { const lineRange: LineRange = { startLine: { line: targetPosition.startLine, offset: targetPosition.startColumn }, endLine: { line: targetPosition.endLine, offset: targetPosition.endColumn }, @@ -223,7 +223,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { .getServiceModelFromCode({ filePath, codedata: { lineRange } }) .then((res) => { console.log("Service Model: ", res.service); - setShowForm(false); + if (addMore) { + handleNewResourceFunction(); + } else { + setShowForm(false); + } setServiceModel(res.service); setServiceMetaInfo(res.service); setIsSaving(false); @@ -465,11 +469,10 @@ export function ServiceDesigner(props: ServiceDesignerProps) { endColumn: targetPosition.endColumn, }; await rpcClient.getBIDiagramRpcClient().deleteByComponentInfo({ filePath, component }); - fetchService(targetPosition); } }; - const handleResourceSubmit = async (value: FunctionModel) => { + const handleResourceSubmit = async (value: FunctionModel, openDiagram: boolean = false) => { setIsSaving(true); const lineRange: LineRange = { startLine: { line: position.startLine, offset: position.startColumn }, @@ -482,8 +485,18 @@ export function ServiceDesigner(props: ServiceDesignerProps) { .addResourceSourceCode({ filePath, codedata: { lineRange }, function: value, service: serviceModel }); const serviceArtifact = res.artifacts.find(res => res.isNew && res.name === serviceIdentifier); if (serviceArtifact) { - fetchService(serviceArtifact.position); - await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { documentUri: serviceArtifact.path, position: serviceArtifact.position } }); + if (openDiagram) { + const accessor = value.accessor.value; + const path = value.name.value; + const resourceIdentifier = `${accessor}#${path}`.toLowerCase(); + const resource = serviceArtifact.resources.find(res => res.id === resourceIdentifier); + if (resource) { + await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: resource.path, position: resource.position } }); + } + } else { + await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { documentUri: serviceArtifact.path, position: serviceArtifact.position } }); + fetchService(serviceArtifact.position, true); + } setIsSaving(false); return; } @@ -499,7 +512,6 @@ export function ServiceDesigner(props: ServiceDesignerProps) { return; } } - setIsNew(false); }; /** @@ -839,7 +851,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { title={"Resource Configuration"} show={showForm} onClose={handleNewFunctionClose} - width={600} + width={400} > ("create-from-scratch"); + const [activeTab, setActiveTab] = useState("import"); const onTypeSave = async (type: Type) => { @@ -139,21 +139,21 @@ export function TypeEditor(props: TypeEditorProps) { }, { - id: 'import', - name: 'Import', + id: 'create-from-scratch', + name: 'Create from scratch', icon: } ]} From 28bf1e1f9879484a729b908584905fdea36e409a Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Thu, 9 Oct 2025 21:25:47 +0530 Subject: [PATCH 156/730] Add draft editing custom tools --- .../src/features/ai/service/code/code.ts | 25 +- .../ai/service/libs/text_editor_tool.ts | 977 +++++++++--------- 2 files changed, 521 insertions(+), 481 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 1c39f78b4c2..7b722e79ad0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -18,7 +18,6 @@ import { ModelMessage, generateText, streamText, stepCountIs, AssistantModelMess import { getAnthropicClient, ANTHROPIC_SONNET_4, getProviderCacheControl, ProviderCacheOptions } from "../connection"; import { GenerationType, getAllLibraries } from "../libs/libs"; import { getLibraryProviderTool } from "../libs/libraryProviderTool"; -import { anthropic } from "@ai-sdk/anthropic"; import { getRewrittenPrompt, populateHistory, @@ -44,7 +43,7 @@ import { getProjectFromResponse, getProjectSource, postProcess } from "../../../ import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; -import { handleTextEditorCommands } from "../libs/text_editor_tool"; +import { createEditExecute, createEditTool, createMultiEditExecute, createMultiEditTool, createReadExecute, createReadTool, createWriteExecute, createWriteTool, FILE_MULTI_EDIT_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from "../libs/text_editor_tool"; const SEARCH_LIBRARY_TOOL_NAME = 'LibraryProviderTool'; @@ -109,13 +108,10 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - str_replace_based_edit_tool: anthropic.tools.textEditor_20250728({ - async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { - const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, - { command, path, old_str, new_str, file_text, insert_line, view_range }); - return result.message; - } - }) + [FILE_WRITE_TOOL_NAME]: createWriteTool(createWriteExecute(updatedSourceFiles, updatedFileNames)), + [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool(createEditExecute(updatedSourceFiles, updatedFileNames)), + [FILE_MULTI_EDIT_TOOL_NAME]: createMultiEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), + [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), }; const { fullStream, response } = streamText({ @@ -505,13 +501,10 @@ export async function repairCode(params: RepairParams, const tools = { LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - str_replace_based_edit_tool: anthropic.tools.textEditor_20250728({ - async execute({ command, path, old_str, new_str, file_text, insert_line, view_range }) { - const result = handleTextEditorCommands(updatedSourceFiles, updatedFileNames, - { command, path, old_str, new_str, file_text, insert_line, view_range }); - return result.message; - } - }) + [FILE_WRITE_TOOL_NAME]: createWriteTool(createWriteExecute(updatedSourceFiles, updatedFileNames)), + [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool(createEditExecute(updatedSourceFiles, updatedFileNames)), + [FILE_MULTI_EDIT_TOOL_NAME]: createMultiEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), + [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), }; const { text } = await generateText({ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index 88b27317078..f790a96de3a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -14,594 +14,641 @@ // specific language governing permissions and limitations // under the License. -import { SourceFiles } from "@wso2/ballerina-core"; +import { SourceFile, SourceFiles } from "@wso2/ballerina-core"; +import { tool } from 'ai'; +import { z } from 'zod'; // ============================================================================ // Types & Interfaces // ============================================================================ -interface TextEditorResult { - success: boolean; - message: string; - content?: string; - error?: string; -} - -enum TextEditorCommand { - VIEW = 'view', - CREATE = 'create', - STR_REPLACE = 'str_replace', - INSERT = 'insert', - DELETE = 'delete', - UNDO_EDIT = 'undo_edit' +interface ValidationResult { + valid: boolean; + error?: string; } -interface ExecuteArgs { - command: string; - path: string; - file_text?: string; - insert_line?: number; - new_str?: string; - old_str?: string; - view_range?: number[]; -} - -interface PathValidation { - valid: boolean; - error?: string; +interface TextEditorResult { + success: boolean; + message: string; + error?: string; } // ============================================================================ // Constants // ============================================================================ -const MAX_HISTORY_SIZE = 50; -const VALID_FILE_EXTENSIONS = ['.bal', '.toml', '.md']; -const PREVIEW_CONTENT_LENGTH = 500; +const VALID_FILE_EXTENSIONS = [ + '.bal', '.toml', '.md' +]; -// ============================================================================ -// State Management -// ============================================================================ - -const editHistory = new Map(); +const MAX_LINE_LENGTH = 2000; +const PREVIEW_LENGTH = 200; // ============================================================================ // Error Messages // ============================================================================ const ErrorMessages = { - INVALID_PATH: 'Invalid file path', - FILE_NOT_FOUND: 'File not found', - INVALID_RANGE: 'Invalid line range', - MISSING_PARAMETER: 'Missing required parameter', - FILE_ALREADY_EXISTS: 'File already exists', - NO_MATCH_FOUND: 'String not found', - MULTIPLE_MATCHES: 'Multiple matches found', - INVALID_LINE_NUMBER: 'Invalid line number', - NO_HISTORY: 'No edit history', - INVALID_COMMAND: 'Unknown command', - PERMISSION_DENIED: 'Permission denied', - EXECUTION_ERROR: 'Execution error' -} as const; + FILE_NOT_FOUND: 'File not found', + FILE_ALREADY_EXISTS: 'File already exists with content', + INVALID_FILE_PATH: 'Invalid file path', + INVALID_EXTENSION: 'Invalid file extension', + EMPTY_CONTENT: 'Content cannot be empty', + NO_MATCH_FOUND: 'No match found for old_string', + MULTIPLE_MATCHES: 'Multiple matches found - old_string must be unique', + IDENTICAL_STRINGS: 'old_string and new_string are identical', + INVALID_LINE_RANGE: 'Invalid line range', + EDIT_FAILED: 'Edit operation failed', + NO_EDITS: 'No edits provided', +}; // ============================================================================ // Validation Functions // ============================================================================ -function validateFilePath(filePath: string): PathValidation { - if (!filePath || typeof filePath !== 'string') { - return { - valid: false, - error: 'File path is required and must be a string.' - }; - } - - if (filePath.includes('..') || filePath.includes('~')) { - return { - valid: false, - error: 'File path contains invalid characters (.., ~).' - }; - } - - const hasValidExtension = VALID_FILE_EXTENSIONS.some(ext => - filePath.endsWith(ext) - ); - - if (!hasValidExtension) { - return { - valid: false, - error: `File must have a valid extension: ${VALID_FILE_EXTENSIONS.join(', ')}` - }; - } +function validateFilePath(filePath: string): ValidationResult { + if (!filePath || typeof filePath !== 'string') { + return { + valid: false, + error: 'File path is required and must be a string.' + }; + } - const allowedPatterns = [ - /^\/?[^\/]+\.bal$/, - /^\/?modules\/[^\/]+\/[^\/]+\.bal$/, - /^\/?generated\/[^\/]+\.bal$/, - /^\/?tests\/[^\/]+\.bal$/ - ]; + if (filePath.includes('..') || filePath.includes('~')) { + return { + valid: false, + error: 'File path contains invalid characters (.., ~).' + }; + } - const isValidPath = allowedPatterns.some(pattern => pattern.test(filePath)); + const hasValidExtension = VALID_FILE_EXTENSIONS.some(ext => + filePath.endsWith(ext) + ); - if (!isValidPath) { - return { - valid: false, - error: 'Invalid filepath structure. Please include only the filename in the filepath.' - }; - } + if (!hasValidExtension) { + return { + valid: false, + error: `File must have a valid extension: ${VALID_FILE_EXTENSIONS.join(', ')}` + }; + } - return { valid: true }; + return { valid: true }; } function validateLineRange( - start: number, - end: number, - totalLines: number -): PathValidation { - if (start < 1 || end < start || start > totalLines) { - return { - valid: false, - error: `Invalid line range [${start}, ${end}]. File has ${totalLines} lines. Please double check the range.` - }; - } - return { valid: true }; + offset: number, + limit: number, + totalLines: number +): ValidationResult { + if (offset < 1 || offset > totalLines) { + return { + valid: false, + error: `Invalid offset ${offset}. File has ${totalLines} lines.` + }; + } + + if (limit < 1) { + return { + valid: false, + error: `Invalid limit ${limit}. Must be at least 1.` + }; + } + + return { valid: true }; } // ============================================================================ -// File Operations +// Utility Functions // ============================================================================ -function findFileIndex(files: SourceFiles[], filePath: string): number { - return files.findIndex(f => f.filePath === filePath); +function findFileIndex(files: SourceFile[], filePath: string): number { + return files.findIndex(f => f.filePath === filePath); } -function getFileContent(files: SourceFiles[], filePath: string): string | null { - const file = files.find(f => f.filePath === filePath); - return file?.content ?? null; +function getFileContent(files: SourceFile[], filePath: string): string | null { + const file = files.find(f => f.filePath === filePath); + return file?.content ?? null; } function updateOrCreateFile( - files: SourceFiles[], - filePath: string, - content: string + files: SourceFile[], + filePath: string, + content: string ): void { - const index = findFileIndex(files, filePath); - if (index !== -1) { - files[index].content = content; - } else { - files.push({ filePath, content }); - } -} - -function addFileToUpdatedList( - updatedFileNames: string[], - filePath: string -): void { - if (!updatedFileNames.includes(filePath)) { - updatedFileNames.push(filePath); - } + const index = findFileIndex(files, filePath); + if (index !== -1) { + files[index].content = content; + } else { + files.push({ filePath, content }); + } } -// ============================================================================ -// History Management -// ============================================================================ - -function saveToHistory( - updatedSourceFiles: SourceFiles[], - filePath: string -): void { - const sourceFile = updatedSourceFiles.find(f => f.filePath === filePath); - if (!sourceFile) { return; } +function countOccurrences(text: string, searchString: string): number { + if (!searchString) { return 0; } + + let count = 0; + let position = 0; - if (!editHistory.has(filePath)) { - editHistory.set(filePath, []); - } + while ((position = text.indexOf(searchString, position)) !== -1) { + count++; + position += searchString.length; + } - const history = editHistory.get(filePath)!; - history.push(sourceFile.content); + return count; +} - if (history.length > MAX_HISTORY_SIZE) { - history.shift(); +function truncateLongLines(content: string, maxLength: number = MAX_LINE_LENGTH): string { + const lines = content.split('\n'); + return lines.map(line => { + if (line.length > maxLength) { + return line.substring(0, maxLength) + '... [truncated]'; } + return line; + }).join('\n'); } // ============================================================================ -// String Utilities +// Write Tool Execute Function // ============================================================================ -function countOccurrences(text: string, searchString: string): number { - if (searchString.trim().length === 0 && text.trim().length === 0) { - return 1; - } - - if (!searchString) { return 0; } - - let count = 0; - let position = 0; - - while ((position = text.indexOf(searchString, position)) !== -1) { - count++; - if (count > 1) { break; } - position += searchString.length; +export function createWriteExecute(files: SourceFile[], updatedFileNames: string[]) { + return async (args: { + file_path: string; + content: string; + }): Promise => { + const { file_path, content } = args; + console.log(`[FileWriteTool] Writing to ${file_path}, content: ${content.substring(0, 50)}${content.length > 100 ? '... [truncated]' : ''}`); + + // Validate file path + const pathValidation = validateFilePath(file_path); + if (!pathValidation.valid) { + console.log(`[FileWriteTool] Invalid file path: ${file_path}`); + return { + success: false, + message: pathValidation.error!, + error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` + }; } - - return count; -} - -// ============================================================================ -// Command Handlers -// ============================================================================ -function handleViewCommand( - files: SourceFiles[], - filePath: string, - viewRange?: number[] -): TextEditorResult { - const content = getFileContent(files, filePath); - - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Please create it first or double check the file path.`, - error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` - }; + // Validate content is not empty + if (!content || content.trim().length === 0) { + console.log(`[FileWriteTool] Empty content provided for file: ${file_path}`); + return { + success: false, + message: 'Content cannot be empty when writing a file.', + error: `Error: ${ErrorMessages.EMPTY_CONTENT}` + }; } - if (viewRange && viewRange.length === 2) { - return handleRangedView(filePath, content, viewRange); + // Check if file exists with non-empty content + const existingContent = getFileContent(files, file_path); + if (existingContent !== null && existingContent.trim().length > 0) { + console.log(`[FileWriteTool] File already exists with content: ${file_path}`); + return { + success: false, + message: `File '${file_path}' already exists with content. Use file_edit or file_multi_edit to modify it instead.`, + error: `Error: ${ErrorMessages.FILE_ALREADY_EXISTS}` + }; } - return { - success: true, - message: `Viewing entire file ${filePath}).\n Content: ${content}`, - content - }; -} + // Create or overwrite the file + updateOrCreateFile(files, file_path, content); -function handleRangedView( - filePath: string, - content: string, - viewRange: number[] -): TextEditorResult { - let [start, end] = viewRange; - const lines = content.split('\n'); - - if (end === -1) { - end = lines.length; - } - - const validation = validateLineRange(start, end, lines.length); - if (!validation.valid) { - return { - success: false, - message: validation.error!, - error: `Error: ${ErrorMessages.INVALID_RANGE}` - }; - } + const lineCount = content.split('\n').length; - const actualEnd = Math.min(end, lines.length); - const rangedContent = lines.slice(start - 1, actualEnd).join('\n'); - + insertIntoUpdateFileNames(updatedFileNames, file_path); + console.log(`[FileWriteTool] Successfully wrote file: ${file_path} with ${lineCount} lines.`); return { - success: true, - message: `Viewing lines ${start}-${actualEnd} of ${filePath}.\n Content: ${rangedContent}`, - content: rangedContent + success: true, + message: `Successfully created file '${file_path}' with ${lineCount} line(s).` }; + }; } -function handleCreateCommand( - files: SourceFiles[], - updatedFileNames: string[], - filePath: string, - fileText?: string -): TextEditorResult { - if (fileText === undefined) { - return { - success: false, - message: "The 'file_text' parameter is required for the 'create' command.", - error: `Error: ${ErrorMessages.MISSING_PARAMETER}` - }; - } - - const existingFile = getFileContent(files, filePath); - - if (existingFile !== null) { - if (existingFile.trim() === "") { - console.warn(`[Text Editor] Overwriting empty file '${filePath}'.`); - updateOrCreateFile(files, filePath, fileText); - addFileToUpdatedList(updatedFileNames, filePath); - - return { - success: true, - message: `Successfully created file '${filePath}' with ${fileText.split('\n').length} lines.` - }; - } +// ============================================================================ +// Edit Tool Execute Function +// ============================================================================ - return { - success: false, - message: `File '${filePath}' already exists. Use 'str_replace' command to modify it or double check the filepath.`, - error: `Error: ${ErrorMessages.FILE_ALREADY_EXISTS}` - }; +export function createEditExecute(files: SourceFile[], updatedFileNames: string[]) { + return async (args: { + file_path: string; + old_string: string; + new_string: string; + replace_all?: boolean; + }): Promise => { + const { file_path, old_string, new_string, replace_all = false } = args; + console.log(`[FileEditTool] Editing ${file_path}, replacing '${old_string.substring(0, 50)}' with '${new_string.substring(0,50)}', replace_all: ${replace_all}`); + + // Validate file path + const pathValidation = validateFilePath(file_path); + if (!pathValidation.valid) { + console.log(`[FileEditTool] Invalid file path: ${file_path}`); + return { + success: false, + message: pathValidation.error!, + error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` + }; } - updateOrCreateFile(files, filePath, fileText); - addFileToUpdatedList(updatedFileNames, filePath); - - return { - success: true, - message: `Successfully created file '${filePath}' with ${fileText.split('\n').length} lines.` - }; -} - -function handleStrReplaceCommand( - files: SourceFiles[], - updatedFileNames: string[], - filePath: string, - oldStr?: string, - newStr?: string -): TextEditorResult { - if (oldStr === undefined || newStr === undefined) { - return { - success: false, - message: "Both 'old_str' and 'new_str' parameters are required for 'str_replace' command.", - error: `Error: ${ErrorMessages.MISSING_PARAMETER}` - }; + // Check if old_string and new_string are identical + if (old_string === new_string) { + console.log(`[FileEditTool] old_string and new_string are identical for file: ${file_path}`); + return { + success: false, + message: 'old_string and new_string are identical. No changes to make.', + error: `Error: ${ErrorMessages.IDENTICAL_STRINGS}` + }; } - const content = getFileContent(files, filePath); - + // Get file content + const content = getFileContent(files, file_path); if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Cannot perform replacement. double check the file path.`, - error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` - }; + console.log(`[FileEditTool] File not found: ${file_path}`); + return { + success: false, + message: `File '${file_path}' not found. Use file_write to create new files.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; } - const occurrenceCount = countOccurrences(content, oldStr); + // Count occurrences + const occurrenceCount = countOccurrences(content, old_string); if (occurrenceCount === 0) { - return { - success: false, - message: `String to replace was not found in '${filePath}'. Please verify the exact text to replace, including whitespace and line breaks.`, - error: `Error: ${ErrorMessages.NO_MATCH_FOUND}`, - content: content.substring(0, PREVIEW_CONTENT_LENGTH) + '...' - }; + const preview = content.substring(0, PREVIEW_LENGTH); + console.log(`[FileEditTool] No occurrences of old_string found in file: ${file_path}`); + return { + success: false, + message: `String to replace was not found in '${file_path}'. Please verify the exact text to replace, including whitespace and indentation. \n File Preview: \n${preview + (content.length > PREVIEW_LENGTH ? '...' : '')}`, + error: `Error: ${ErrorMessages.NO_MATCH_FOUND}`, + }; } - if (occurrenceCount > 1) { - return { - success: false, - message: `Found ${occurrenceCount} occurrences of the text in '${filePath}'. The 'str_replace' command requires exactly one unique match. Please make 'old_str' more specific..`, - error: `Error: ${ErrorMessages.MULTIPLE_MATCHES}`, - content: `Occurrences: ${occurrenceCount}` - }; + // If not replace_all, ensure exactly one match + if (!replace_all && occurrenceCount > 1) { + console.log(`[FileEditTool] Multiple occurrences (${occurrenceCount}) found for old_string in file: ${file_path}`); + return { + success: false, + message: `Found ${occurrenceCount} occurrences of the text in '${file_path}'. Either make old_string more specific to match exactly one occurrence, or set replace_all to true to replace all occurrences.`, + error: `Error: ${ErrorMessages.MULTIPLE_MATCHES}`, + }; + } + + // Perform replacement + let newContent: string; + if (replace_all) { + newContent = content.replaceAll(old_string, new_string); + } else { + newContent = content.replace(old_string, new_string); } - saveToHistory(files, filePath); - - const newContent = content.replace(oldStr, newStr); - updateOrCreateFile(files, filePath, newContent); - addFileToUpdatedList(updatedFileNames, filePath); + updateOrCreateFile(files, file_path, newContent); + const replacedCount = replace_all ? occurrenceCount : 1; + insertIntoUpdateFileNames(updatedFileNames, file_path); + console.log(`[FileEditTool] Successfully replaced ${replacedCount} occurrence(s) in file: ${file_path}`); return { - success: true, - message: `Successfully replaced text in '${filePath}'. Changed ${oldStr.split('\n').length} line(s).` + success: true, + message: `Successfully replaced ${replacedCount} occurrence(s) in '${file_path}'.` }; + }; } -function handleInsertCommand( - files: SourceFiles[], - updatedFileNames: string[], - filePath: string, - insertLine?: number, - newStr?: string -): TextEditorResult { - if (insertLine === undefined || newStr === undefined) { - return { - success: false, - message: "Both 'insert_line' and 'new_str' parameters are required for 'insert' command.", - error: `Error: ${ErrorMessages.MISSING_PARAMETER}` - }; +// ============================================================================ +// Multi Edit Tool Execute Function +// ============================================================================ + +export function createMultiEditExecute(files: SourceFile[], updatedFileNames: string[]) { + return async (args: { + file_path: string; + edits: Array<{ + old_string: string; + new_string: string; + replace_all?: boolean; + }>; + }): Promise => { + const { file_path, edits } = args; + console.log(`[FileMultiEditTool] Editing ${file_path} with ${edits.length} edits.`); + + // Validate file path + const pathValidation = validateFilePath(file_path); + if (!pathValidation.valid) { + console.log(`[FileMultiEditTool] Invalid file path: ${file_path}`); + return { + success: false, + message: pathValidation.error!, + error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` + }; } - const content = getFileContent(files, filePath); - - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Cannot insert text.`, - error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` - }; + // Validate edits array + if (!edits || edits.length === 0) { + console.log(`[FileMultiEditTool] No edits provided for file: ${file_path}`); + return { + success: false, + message: 'No edits provided. At least one edit is required.', + error: `Error: ${ErrorMessages.NO_EDITS}` + }; } - const lines = content.split('\n'); - - if (insertLine < 0 || insertLine > lines.length) { - return { - success: false, - message: `Invalid insert line ${insertLine}. File has ${lines.length} lines. Use line 0-${lines.length}.`, - error: `Error: ${ErrorMessages.INVALID_LINE_NUMBER}` - }; + // Get file content + let content = getFileContent(files, file_path); + if (content === null) { + console.log(`[FileMultiEditTool] File not found: ${file_path}`); + return { + success: false, + message: `File '${file_path}' not found. Use file_write to create new files.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; } - saveToHistory(files, filePath); + // Store original content for rollback + const originalContent = content; - const clampedLine = Math.max(0, Math.min(lines.length, insertLine)); - lines.splice(clampedLine, 0, newStr); - const newContent = lines.join('\n'); + // Validate all edits before applying any + const validationErrors: string[] = []; - updateOrCreateFile(files, filePath, newContent); - addFileToUpdatedList(updatedFileNames, filePath); + for (let i = 0; i < edits.length; i++) { + const edit = edits[i]; - return { - success: true, - message: `Successfully inserted ${newStr.split('\n').length} line(s) at line ${insertLine} in '${filePath}'.` - }; -} + // Check if old_string and new_string are identical + if (edit.old_string === edit.new_string) { + validationErrors.push(`Edit ${i + 1}: old_string and new_string are identical`); + continue; + } -function handleDeleteCommand( - files: SourceFiles[], - updatedFileNames: string[], - filePath: string, - oldStr?: string -): TextEditorResult { - if (oldStr === undefined) { - return { - success: false, - message: "The 'old_str' parameter is required for 'delete' command.", - error: `Error: ${ErrorMessages.MISSING_PARAMETER}` - }; - } + // Count occurrences in current content state + const occurrenceCount = countOccurrences(content, edit.old_string); - const content = getFileContent(files, filePath); - - if (content === null) { - return { - success: false, - message: `File '${filePath}' not found. Cannot delete text.`, - error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` - }; - } + if (occurrenceCount === 0) { + validationErrors.push(`Edit ${i + 1}: old_string not found in file`); + continue; + } - const occurrenceCount = countOccurrences(content, oldStr); + if (!edit.replace_all && occurrenceCount > 1) { + validationErrors.push(`Edit ${i + 1}: Found ${occurrenceCount} occurrences. Set replace_all to true or make old_string more specific`); + continue; + } - if (occurrenceCount === 0) { - return { - success: false, - message: `String to delete was not found in '${filePath}'. No changes made. Double check the text to delete, including whitespace and line breaks.`, - error: `Error: ${ErrorMessages.NO_MATCH_FOUND}` - }; + // Apply the edit to simulate the sequence + if (edit.replace_all) { + content = content.replaceAll(edit.old_string, edit.new_string); + } else { + content = content.replace(edit.old_string, edit.new_string); + } } - saveToHistory(files, filePath); - - const newContent = content.replaceAll(oldStr, ''); - updateOrCreateFile(files, filePath, newContent); - addFileToUpdatedList(updatedFileNames, filePath); - - return { - success: true, - message: `Successfully deleted ${occurrenceCount} occurrence(s) of text from '${filePath}'.` - }; -} - -function handleUndoEditCommand( - files: SourceFiles[], - updatedFileNames: string[], - filePath: string -): TextEditorResult { - const history = editHistory.get(filePath); - - if (!history || history.length === 0) { - return { - success: false, - message: `No edit history found for '${filePath}'. Cannot undo.`, - error: ErrorMessages.NO_HISTORY - }; + // If there were validation errors, return them without applying any edits + if (validationErrors.length > 0) { + console.log(`[FileMultiEditTool] Validation errors:\n${validationErrors.join('\n')}`); + return { + success: false, + message: `Multi-edit validation failed:\n${validationErrors.join('\n')}`, + error: `Error: ${ErrorMessages.EDIT_FAILED}`, + }; } - const lastState = history.pop()!; - updateOrCreateFile(files, filePath, lastState); - addFileToUpdatedList(updatedFileNames, filePath); - + // All validations passed, content already has all edits applied + updateOrCreateFile(files, file_path, content); + insertIntoUpdateFileNames(updatedFileNames, file_path); + console.log(`[FileMultiEditTool] Successfully applied ${edits.length} edits to file: ${file_path}`); return { - success: true, - message: `Successfully undid last edit on '${filePath}'. ${history.length} undo(s) remaining.` + success: true, + message: `Successfully applied ${edits.length} edit(s) to '${file_path}'.` }; + }; } // ============================================================================ -// Command Router +// Read Tool Execute Function // ============================================================================ -function executeCommand( - files: SourceFiles[], - updatedFileNames: string[], - args: ExecuteArgs -): TextEditorResult { - const { command, path: filePath, file_text, insert_line, new_str, old_str, view_range } = args; - - switch (command) { - case TextEditorCommand.VIEW: - return handleViewCommand(files, filePath, view_range); - - case TextEditorCommand.CREATE: - return handleCreateCommand(files, updatedFileNames, filePath, file_text); - - case TextEditorCommand.STR_REPLACE: - return handleStrReplaceCommand(files, updatedFileNames, filePath, old_str, new_str); - - case TextEditorCommand.INSERT: - return handleInsertCommand(files, updatedFileNames, filePath, insert_line, new_str); - - case TextEditorCommand.DELETE: - return handleDeleteCommand(files, updatedFileNames, filePath, old_str); +export function createReadExecute(files: SourceFile[], updatedFileNames: string[]) { + return async (args: { + file_path: string; + offset?: number; + limit?: number; + }): Promise => { + const { file_path, offset, limit } = args; + + // Validate file path + const pathValidation = validateFilePath(file_path); + if (!pathValidation.valid) { + console.log(`[FileReadTool] Invalid file path: ${file_path}`); + return { + success: false, + message: pathValidation.error!, + error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` + }; + } - case TextEditorCommand.UNDO_EDIT: - return handleUndoEditCommand(files, updatedFileNames, filePath); + // Get file content + const content = getFileContent(files, file_path); + if (content === null) { + console.log(`[FileReadTool] File not found: ${file_path}`); + return { + success: false, + message: `File '${file_path}' not found.`, + error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` + }; + } - default: - return { - success: false, - message: `Unknown command '${command}'. Valid commands: view, create, str_replace, insert, delete, undo_edit.`, - error: ErrorMessages.INVALID_COMMAND - }; + // Handle empty file + if (content.trim().length === 0) { + console.log(`[FileReadTool] File is empty: ${file_path}`); + return { + success: true, + message: `File '${file_path}' is empty.`, + }; } -} -// ============================================================================ -// Error Handling -// ============================================================================ + // Split content into lines + const lines = content.split('\n'); + const totalLines = lines.length; -function handleExecutionError( - error: unknown, - command: string, - filePath: string -): TextEditorResult { - const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.'; - console.error(`[Text Editor] Failed to execute '${command}':`, error); - - if (errorMessage.includes('EACCES') || errorMessage.includes('EPERM')) { + // Handle ranged read + if (offset !== undefined && limit !== undefined) { + const validation = validateLineRange(offset, limit, totalLines); + if (!validation.valid) { + console.log(`[FileReadTool] Invalid line range for file: ${file_path}, offset: ${offset}, limit: ${limit}`); return { - success: false, - message: `Permission denied: Cannot access '${filePath}'. Check file permissions.`, - error: ErrorMessages.PERMISSION_DENIED + success: false, + message: validation.error!, + error: `Error: ${ErrorMessages.INVALID_LINE_RANGE}` }; + } + + const startIndex = offset - 1; // Convert to 0-based index + const endIndex = Math.min(startIndex + limit, totalLines); + const rangedLines = lines.slice(startIndex, endIndex); + const rangedContent = truncateLongLines(rangedLines.join('\n')); + + console.log(`[FileReadTool] Read lines ${offset} to ${endIndex} from file: ${file_path}`); + return { + success: true, + message: `Read lines ${offset} to ${endIndex} from '${file_path}' (${endIndex - startIndex} lines). \nContent:${rangedContent}`, + }; } + // Return full content + const truncatedContent = truncateLongLines(content); + + console.log(`[FileReadTool] Read entire file: ${file_path}, total lines: ${totalLines}`); return { - success: false, - message: `Error executing '${command}': ${errorMessage}`, - error: ErrorMessages.EXECUTION_ERROR + success: true, + message: `Read entire file '${file_path}' (${totalLines} lines).\nContent:${truncatedContent}`, }; + }; } -// ============================================================================ -// Main Entry Point // ============================================================================ -export function handleTextEditorCommands( - updatedSourceFiles: SourceFiles[], - updatedFileNames: string[], - args: ExecuteArgs -): TextEditorResult { - const { command, path: filePath } = args; - - try { - console.log(`[Text Editor] Command: '${command}', File: '${filePath}'`); - - const pathValidation = validateFilePath(filePath); - if (!pathValidation.valid) { - return { - success: false, - message: `Invalid file path: ${pathValidation.error}, Please provide a valid filepath within the workspace.`, - error: `Error: ${ErrorMessages.INVALID_PATH}` - }; - } - - return executeCommand(updatedSourceFiles, updatedFileNames, args); - } catch (error) { - return handleExecutionError(error, command, filePath); +export const FILE_MULTI_EDIT_TOOL_NAME = "file_multi_edit"; +export const FILE_SINGLE_EDIT_TOOL_NAME = "file_edit"; +export const FILE_WRITE_TOOL_NAME = "file_write"; +export const FILE_READ_TOOL_NAME = "file_read"; + +const getFilePathDescription = (op: string) => `The path to the file to ${op}. Just use the filename as the path, do not include any directories unless user specifically requests it`; + +// Type definitions for execute functions +type WriteExecute = (args: { + file_path: string; + content: string; +}) => Promise; + +type EditExecute = (args: { + file_path: string; + old_string: string; + new_string: string; + replace_all?: boolean; +}) => Promise; + +type MultiEditExecute = (args: { + file_path: string; + edits: Array<{ + old_string: string; + new_string: string; + replace_all?: boolean; + }>; +}) => Promise; + +type ReadExecute = (args: { + file_path: string; + offset?: number; + limit?: number; +}) => Promise; + +// 1. Write Tool +export function createWriteTool(execute: WriteExecute) { + return tool({ + description: `Writes a file to the local filesystem. + Usage: + - This tool will return an error if there is a file with non-empty content at the provided path. + - ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required. + - If this is an existing file, Use ${FILE_MULTI_EDIT_TOOL_NAME} or ${FILE_SINGLE_EDIT_TOOL_NAME} to modify it instead. + - NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User. + - Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`, + inputSchema: z.object({ + file_path: z.string().describe(getFilePathDescription("write")), + content: z.string().describe("The content to write to the file, This cannot be empty") + }), + execute + }); +} + +// The line number prefix format is: spaces + line number + tab. Everything after that tab is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string. +// ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. + +// 2. Edit Tool +export function createEditTool(execute: EditExecute) { + return tool({ + description: `Performs exact string replacements in files. + Usage: + - You must read the chat history at least once before editing, as the user’s message contains the content of the each source file. This tool will error if you attempt an edit without reading the chat history. + - When editing text content of a file that you obtained from the chat history you read earlier, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. + - Do not create new files using this tool. Only edit existing files. If the file does not exist, Use ${FILE_WRITE_TOOL_NAME} to create new files. + - Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked. + - The edit will FAIL if **old_string** is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use **replace_all** to change every instance of **old_string**. + - Use **replace_all** for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`, + inputSchema: z.object({ + file_path: z.string().describe(getFilePathDescription("edit")), + old_string: z.string().describe("The text to replace (must match the file contents exactly, including all whitespace and indentation)"), + new_string: z.string().describe("The text to replace it with (must be different from old_string)"), + replace_all: z.boolean().default(false).describe("Replace all occurences of old_string (default false), if true will replace all occurences of old_string, otherwise will only replace if there is exactly one match.") + }), + execute + }); +} + +// 3. Multi Edit Tool +export function createMultiEditTool(execute: MultiEditExecute) { + return tool({ + description: `This is a tool for making multiple edits to a single file in one operation. It is built on top of the ${FILE_SINGLE_EDIT_TOOL_NAME} tool and allows you to perform multiple find-and-replace operations efficiently. Prefer this tool over the ${FILE_SINGLE_EDIT_TOOL_NAME} tool when you need to make multiple edits to the same file. + Before using this tool: + 1. You must read the chat history at least once before editing, as the user’s message contains the content of the each source file and the context. + 2. Verify the file path is correct + 3. Do not create new files using this tool. Only edit existing files. If the file does not exist, Use ${FILE_WRITE_TOOL_NAME} to create new files. + To make multiple file edits, provide the following: + 1. file_path: The file_path parameter must be an filename only, do not include any directories unless the user specifically requests it. + 2. edits: An array of edit operations to perform, where each edit contains: + - old_string: The text to replace (must match the file contents exactly, including all whitespace and indentation) + - new_string: The edited text to replace the old_string + - replace_all: Replace all occurences of old_string. This parameter is optional and defaults to false. if true will replace all occurences of old_string, otherwise will only replace if there is exactly one match. + IMPORTANT: + - All edits are applied in sequence, in the order they are provided + - Each edit operates on the result of the previous edit + - All edits must be valid for the operation to succeed - if any edit fails, none will be applied + - This tool is ideal when you need to make several changes to different parts of the same file + CRITICAL REQUIREMENTS: + 1. All edits follow the same requirements as the ${FILE_SINGLE_EDIT_TOOL_NAME} tool + 2. The edits are atomic - either all succeed or none are applied + 3. Plan your edits carefully to avoid conflicts between sequential operations + WARNING: + - The tool will fail if edits.old_string doesn't match the file contents exactly (including whitespace) + - The tool will fail if edits.old_string and edits.new_string are the same + - Since edits are applied in sequence, ensure that earlier edits don't affect the text that later edits are trying to find + When making edits: + - Ensure all edits result in idiomatic, correct code + - Do not leave the code in a broken state + - Always use filename as the filepath unless the user specifically requests a directory. + - Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked. + - Use replace_all for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`, + inputSchema: z.object({ + file_path: z.string().describe(getFilePathDescription("edit")), + edits: z.array( + z.object({ + old_string: z.string().describe("The text to replace (must match the file contents exactly, including all whitespace and indentation)"), + new_string: z.string().describe("The text to replace it with (must be different from old_string)"), + replace_all: z.boolean().default(false).describe("Replace all occurences of old_string (default false), if true will replace all occurences of old_string, otherwise will only replace if there is exactly one match.") + }) + ).min(1).describe("Array of edit operations to perform sequentially on the file") + }), + execute + }); +} + +// 4. Read Tool +export function createReadTool(execute: ReadExecute) { + return tool({ + description: `Reads a file from the local filesystem. + ALWAYS prefer reading files mentioned in the ser’s message in the chat history first. Only use this tool if you need to read a file that is not present in the chat history. + Usage: + - The file_path parameter must be an filename only, do not include any directories unless the user specifically requests it. + - You can optionally specify a line offset and limit (especially handy for long files). + - Any lines longer than 2000 characters will be truncated + - The file content will be returned as string + - If the file is very large, consider using the offset and limit parameters to read it in chunks.`, + inputSchema: z.object({ + file_path: z.string().describe(getFilePathDescription("read")), + offset: z.number().optional().describe("The line number to start reading from. Only provide if the file is too large to read at once"), + limit: z.number().optional().describe("The number of lines to read. Only provide if the file is too large to read at once.") + }), + execute + }); +} +function insertIntoUpdateFileNames(updatedFileNames: string[], file_path: string) { + if (!updatedFileNames.includes(file_path)) { + updatedFileNames.push(file_path); } } + From 9d104160515ad3e93f8ebcf200f972b0fb98db7b Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Thu, 9 Oct 2025 22:24:43 +0530 Subject: [PATCH 157/730] Fix issues in the MI Extension --- .../mi-core/src/rpc-types/mi-diagram/types.ts | 1 + .../src/rpc-types/mi-visualizer/types.ts | 2 +- .../mi-data-mapper/rpc-manager.ts | 2 +- .../rpc-managers/mi-diagram/rpc-manager.ts | 29 +++++++++++++++++-- .../mi/mi-extension/src/util/tsBuilder.ts | 2 +- .../src/RuntimeServicesPanel.tsx | 2 +- .../ProjectInformationForm.tsx | 13 ++++----- 7 files changed, 37 insertions(+), 14 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 a17745fee74..919897c7ced 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 @@ -1781,6 +1781,7 @@ export interface SwaggerFromAPIRequest { isJsonIn?: boolean; isJsonOut?: boolean; port?: number; + projectPath?: string; } export interface CompareSwaggerAndAPIResponse { diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/types.ts b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/types.ts index ae9a7236e26..2165ec7b662 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/types.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/types.ts @@ -123,7 +123,7 @@ export interface PrimaryDetails { export interface BuildDetails { dockerDetails: DockerDetails; enableFatCar: PomNodeDetails; - deploymentType: PomNodeDetails; + versionedDeployment: PomNodeDetails; advanceDetails: AdvanceDetails; } diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts index 488179aaa61..d6c8bd34373 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-data-mapper/rpc-manager.ts @@ -390,7 +390,7 @@ export class MiDataMapperRpcManager implements MIDataMapperAPI { async createDMFiles(params: GenerateDMInputRequest): Promise { return new Promise(async (resolve, reject) => { try { - const dmContent = `import * as ${DM_OPERATORS_IMPORT_NAME} from "./${DM_OPERATORS_FILE_NAME}";\n\n/**\n* inputType:unknown\n*/\ninterface InputRoot {\n}\n\n/**\n* outputType:unknown\n*/\ninterface OutputRoot {\n}\n\nexport function mapFunction(input: InputRoot): OutputRoot {\nreturn {}\n};`; + const dmContent = `import * as ${DM_OPERATORS_IMPORT_NAME} from "./${DM_OPERATORS_FILE_NAME}";\ndeclare var DM_PROPERTIES: any;\n\n/**\n* inputType:unknown\n*/\ninterface InputRoot {\n}\n\n/**\n* outputType:unknown\n*/\ninterface OutputRoot {\n}\n\nexport function mapFunction(input: InputRoot): OutputRoot {\nreturn {}\n};`; const { filePath, dmName } = params; const workspaceFolder = workspace.getWorkspaceFolder(Uri.file(filePath)); let miDiagramRpcManager: MiDiagramRpcManager = new MiDiagramRpcManager(this.projectUri); 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 de4c8a294dc..1381397ec29 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 @@ -3844,7 +3844,7 @@ ${endpointAttributes} // Determine the destination file name let desFileName = path.basename(params.sourceFilePath); // If desFileName does nto contain .xml, append .xml - if (desFileName && !desFileName.endsWith('.xml')) { + if (desFileName && !['.xml', '.dbs'].some(ext => desFileName.endsWith(ext))) { desFileName += '.xml'; } const destinationFilePath = path.join(destinationDirectory, desFileName); @@ -5466,7 +5466,8 @@ ${keyValuesXML}`; const langClient = getStateMachine(this.projectUri).context().langClient!; let response; if (params.isRuntimeService) { - response = await langClient.swaggerFromAPI({ apiPath: params.apiPath, port: DebuggerConfig.getServerPort(), ...(fs.existsSync(swaggerPath) && { swaggerPath: swaggerPath }) }); + const versionedUrl = exposeVersionedServices(this.projectUri); + response = await langClient.swaggerFromAPI({ apiPath: params.apiPath, port: DebuggerConfig.getServerPort(), projectPath: versionedUrl ? this.projectUri : "", ...(fs.existsSync(swaggerPath) && { swaggerPath: swaggerPath }) }); } else { response = await langClient.swaggerFromAPI({ apiPath: params.apiPath, ...(fs.existsSync(swaggerPath) && { swaggerPath: swaggerPath }) }); } @@ -6199,6 +6200,30 @@ ${keyValuesXML}`; } } +function exposeVersionedServices(projectUri: string): boolean { + const config = vscode.workspace.getConfiguration('MI', vscode.Uri.file(projectUri)); + const serverPath = config.get('SERVER_PATH') || undefined; + const configPath = serverPath ? path.join(serverPath, 'conf', 'deployment.toml') : ''; + if (!fs.existsSync(configPath)) { + console.error(`Config file path not found: ${configPath}`); + return false; + } + const fileContent = fs.readFileSync(configPath, "utf8"); + const lines = fileContent.split(/\r?\n/); + for (let rawLine of lines) { + let line = rawLine.trim(); + if (!line || line.startsWith("#")) continue; + const match = line.match(/^expose\.versioned\.services\s*=\s*(.+)$/i); + if (match) { + let value = match[1].trim(); + value = value.replace(/^["']|["']$/g, ""); + if (value.toLowerCase() === "true") return true; + return false; + } + } + return false; +} + export function getRepoRoot(projectRoot: string): string | undefined { // traverse up the directory tree until .git directory is found const gitDir = path.join(projectRoot, ".git"); diff --git a/workspaces/mi/mi-extension/src/util/tsBuilder.ts b/workspaces/mi/mi-extension/src/util/tsBuilder.ts index eff2f565cfc..41fb1f5d07e 100644 --- a/workspaces/mi/mi-extension/src/util/tsBuilder.ts +++ b/workspaces/mi/mi-extension/src/util/tsBuilder.ts @@ -96,7 +96,7 @@ export async function updateTsFileIoTypes(dmName: string, sourcePath: string, sc return ""; } } - tsContent += `import * as ${DM_OPERATORS_IMPORT_NAME} from "./${DM_OPERATORS_FILE_NAME}";\n\n`; + tsContent += `import * as ${DM_OPERATORS_IMPORT_NAME} from "./${DM_OPERATORS_FILE_NAME}";\ndeclare var DM_PROPERTIES: any;\n\n`; tsSources.forEach((source) => { tsContent += source.getFullText(); tsContent += "\n\n"; diff --git a/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx b/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx index a4dbfbc0f1f..fd417dc3f30 100644 --- a/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx +++ b/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx @@ -190,7 +190,7 @@ export function RuntimeServicePanel() { resourceType: "api" }); - const resource = api_resource.resources.find((resource: any) => resource.name === name); + const resource = api_resource.resources.find((resource: any) => resource.name === name.split("__").pop()); const aboslutePath = resource?.absolutePath; if (aboslutePath) { diff --git a/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx b/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx index e9609178d75..24e5c616e6a 100644 --- a/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx @@ -52,7 +52,7 @@ const sectionTitleStyle = { margin: 0, paddingLeft: 20 }; // Field name to pom property name mapping export const fieldToPomPropertyMap: Record = { - "buildDetails-deploymentType": "deploymentType", + "buildDetails-versionedDeployment": "versionedDeployment", "buildDetails-enableFatCar": "fat.car.enable", "buildDetails-dockerDetails-cipherToolEnable": "ciphertool.enable" }; @@ -72,7 +72,7 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { "buildDetails-dockerDetails-dockerFileBaseImage": yup.string().required("Base image is required"), "buildDetails-dockerDetails-dockerName": yup.string().required("Docker name is required"), "buildDetails-enableFatCar": yup.boolean(), - "buildDetails-deploymentType": yup.boolean(), + "buildDetails-versionedDeployment": yup.boolean(), "buildDetails-dockerDetails-cipherToolEnable": yup.boolean(), "buildDetails-dockerDetails-keyStoreName": yup.string(), "buildDetails-dockerDetails-keyStoreAlias": yup.string(), @@ -181,7 +181,7 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { "buildDetails-dockerDetails-dockerFileBaseImage": response.buildDetails?.dockerDetails?.dockerFileBaseImage?.value, "buildDetails-dockerDetails-dockerName": response.buildDetails?.dockerDetails?.dockerName.value, "buildDetails-enableFatCar": response.buildDetails?.enableFatCar?.value === 'true', - "buildDetails-deploymentType": response.buildDetails?.deploymentType?.value === 'true', + "buildDetails-versionedDeployment": response.buildDetails?.versionedDeployment?.value === 'true', "buildDetails-dockerDetails-cipherToolEnable": response.buildDetails?.dockerDetails?.cipherToolEnable?.value === 'true', "buildDetails-dockerDetails-keyStoreName": response.buildDetails?.dockerDetails?.keyStoreName?.value, "buildDetails-dockerDetails-keyStoreAlias": response.buildDetails?.dockerDetails?.keyStoreAlias?.value, @@ -264,11 +264,8 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { await rpcClient.getMiVisualizerRpcClient().updateProjectSettingsConfig({ configName: "useLocalMaven", value: useLocalMaven }); } - let fieldValue = getValues(field as any); + const fieldValue = getValues(field as any); const range = field.split('-').reduce((acc, key) => acc?.[key], projectDetails as any)?.range; - if (field === "buildDetails-deploymentType" && fieldValue === false) { - fieldValue = ""; - } if (range) { if (Array.isArray(range)) { range.forEach((r: any) => { @@ -523,7 +520,7 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { descriptionSx={{ margin: "10px 0" }} control={control as any} sx={fieldStyle} - {...register("buildDetails-deploymentType")} + {...register("buildDetails-versionedDeployment")} /> Date: Thu, 9 Oct 2025 22:56:12 +0530 Subject: [PATCH 158/730] Update custom edit tools with system prompt --- .../src/features/ai/service/code/code.ts | 6 +-- .../ai/service/libs/text_editor_tool.ts | 39 ++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 7b722e79ad0..7c7fe328c26 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -155,7 +155,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler `Fetched libraries: [${libraryNames.join(", ")}]` ); toolResult = libraryNames; - } else if (toolName == "str_replace_based_edit_tool") { + } else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_MULTI_EDIT_TOOL_NAME].includes(toolName)) { console.log(`[Tool Call] Tool call finished: ${toolName}`); } eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); @@ -362,7 +362,7 @@ ${JSON.stringify(langlibs, null, 2)} - To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. ### File modifications -- You must apply changes to the existing source code using the **str_replace_based_edit_tool** tool. The complete existing source code will be provided in the section of the user prompt. +- You must apply changes to the existing source code using the provided ${[FILE_MULTI_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME].join(", ")} tools. The complete existing source code will be provided in the section of the user prompt. - When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. - Do not modify the README.md file unless explicitly asked to be modified in the query. - Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). @@ -462,7 +462,7 @@ export async function repairCode(params: RepairParams, role: "user", content: "Generated code returns the following compiler errors that uses the library details from the `LibraryProviderTool` results in previous messages. First check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + - "And also do not create any new files. Just update the existing code to fix the errors. \n Errors: \n " + + "And also do not create any new files. Just carefully analyze the error descriptions and update the existing code to fix the errors. \n Errors: \n " + params.diagnostics.map((d) => d.message).join("\n"), }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index f790a96de3a..1ef2a7e99cd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -144,6 +144,10 @@ function updateOrCreateFile( } function countOccurrences(text: string, searchString: string): number { + if (searchString.trim().length === 0 && text.trim().length === 0) { + return 1; + } + if (!searchString) { return 0; } let count = 0; @@ -182,7 +186,7 @@ export function createWriteExecute(files: SourceFile[], updatedFileNames: string // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { - console.log(`[FileWriteTool] Invalid file path: ${file_path}`); + console.error(`[FileWriteTool] Invalid file path: ${file_path}`); return { success: false, message: pathValidation.error!, @@ -192,7 +196,7 @@ export function createWriteExecute(files: SourceFile[], updatedFileNames: string // Validate content is not empty if (!content || content.trim().length === 0) { - console.log(`[FileWriteTool] Empty content provided for file: ${file_path}`); + console.error(`[FileWriteTool] Empty content provided for file: ${file_path}`); return { success: false, message: 'Content cannot be empty when writing a file.', @@ -203,7 +207,7 @@ export function createWriteExecute(files: SourceFile[], updatedFileNames: string // Check if file exists with non-empty content const existingContent = getFileContent(files, file_path); if (existingContent !== null && existingContent.trim().length > 0) { - console.log(`[FileWriteTool] File already exists with content: ${file_path}`); + console.error(`[FileWriteTool] File already exists with content: ${file_path}`); return { success: false, message: `File '${file_path}' already exists with content. Use file_edit or file_multi_edit to modify it instead.`, @@ -217,6 +221,11 @@ export function createWriteExecute(files: SourceFile[], updatedFileNames: string const lineCount = content.split('\n').length; insertIntoUpdateFileNames(updatedFileNames, file_path); + + if (existingContent != undefined && existingContent != null && existingContent.trim().length === 0) { + console.warn(`[FileWriteTool] Warning: Created new file for empty file: ${file_path}`); + } + console.log(`[FileWriteTool] Successfully wrote file: ${file_path} with ${lineCount} lines.`); return { success: true, @@ -242,7 +251,7 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { - console.log(`[FileEditTool] Invalid file path: ${file_path}`); + console.error(`[FileEditTool] Invalid file path: ${file_path}`); return { success: false, message: pathValidation.error!, @@ -252,7 +261,7 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ // Check if old_string and new_string are identical if (old_string === new_string) { - console.log(`[FileEditTool] old_string and new_string are identical for file: ${file_path}`); + console.error(`[FileEditTool] old_string and new_string are identical for file: ${file_path}`); return { success: false, message: 'old_string and new_string are identical. No changes to make.', @@ -263,7 +272,7 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ // Get file content const content = getFileContent(files, file_path); if (content === null) { - console.log(`[FileEditTool] File not found: ${file_path}`); + console.error(`[FileEditTool] File not found: ${file_path}`); return { success: false, message: `File '${file_path}' not found. Use file_write to create new files.`, @@ -276,7 +285,7 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ if (occurrenceCount === 0) { const preview = content.substring(0, PREVIEW_LENGTH); - console.log(`[FileEditTool] No occurrences of old_string found in file: ${file_path}`); + console.error(`[FileEditTool] No occurrences of old_string found in file: ${file_path}`); return { success: false, message: `String to replace was not found in '${file_path}'. Please verify the exact text to replace, including whitespace and indentation. \n File Preview: \n${preview + (content.length > PREVIEW_LENGTH ? '...' : '')}`, @@ -286,7 +295,7 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ // If not replace_all, ensure exactly one match if (!replace_all && occurrenceCount > 1) { - console.log(`[FileEditTool] Multiple occurrences (${occurrenceCount}) found for old_string in file: ${file_path}`); + console.error(`[FileEditTool] Multiple occurrences (${occurrenceCount}) found for old_string in file: ${file_path}`); return { success: false, message: `Found ${occurrenceCount} occurrences of the text in '${file_path}'. Either make old_string more specific to match exactly one occurrence, or set replace_all to true to replace all occurrences.`, @@ -333,7 +342,7 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { - console.log(`[FileMultiEditTool] Invalid file path: ${file_path}`); + console.error(`[FileMultiEditTool] Invalid file path: ${file_path}`); return { success: false, message: pathValidation.error!, @@ -343,7 +352,7 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st // Validate edits array if (!edits || edits.length === 0) { - console.log(`[FileMultiEditTool] No edits provided for file: ${file_path}`); + console.error(`[FileMultiEditTool] No edits provided for file: ${file_path}`); return { success: false, message: 'No edits provided. At least one edit is required.', @@ -354,7 +363,7 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st // Get file content let content = getFileContent(files, file_path); if (content === null) { - console.log(`[FileMultiEditTool] File not found: ${file_path}`); + console.error(`[FileMultiEditTool] File not found: ${file_path}`); return { success: false, message: `File '${file_path}' not found. Use file_write to create new files.`, @@ -400,7 +409,7 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st // If there were validation errors, return them without applying any edits if (validationErrors.length > 0) { - console.log(`[FileMultiEditTool] Validation errors:\n${validationErrors.join('\n')}`); + console.error(`[FileMultiEditTool] Validation errors:\n${validationErrors.join('\n')}`); return { success: false, message: `Multi-edit validation failed:\n${validationErrors.join('\n')}`, @@ -434,7 +443,7 @@ export function createReadExecute(files: SourceFile[], updatedFileNames: string[ // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { - console.log(`[FileReadTool] Invalid file path: ${file_path}`); + console.error(`[FileReadTool] Invalid file path: ${file_path}`); return { success: false, message: pathValidation.error!, @@ -445,7 +454,7 @@ export function createReadExecute(files: SourceFile[], updatedFileNames: string[ // Get file content const content = getFileContent(files, file_path); if (content === null) { - console.log(`[FileReadTool] File not found: ${file_path}`); + console.error(`[FileReadTool] File not found: ${file_path}`); return { success: false, message: `File '${file_path}' not found.`, @@ -470,7 +479,7 @@ export function createReadExecute(files: SourceFile[], updatedFileNames: string[ if (offset !== undefined && limit !== undefined) { const validation = validateLineRange(offset, limit, totalLines); if (!validation.valid) { - console.log(`[FileReadTool] Invalid line range for file: ${file_path}, offset: ${offset}, limit: ${limit}`); + console.error(`[FileReadTool] Invalid line range for file: ${file_path}, offset: ${offset}, limit: ${limit}`); return { success: false, message: validation.error!, From 7410f9314560992ea09e54f7fae298fd5ae21df1 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Fri, 10 Oct 2025 00:12:48 +0530 Subject: [PATCH 159/730] Update tool names --- .../src/features/ai/service/code/code.ts | 12 ++++++------ .../src/features/ai/service/libs/text_editor_tool.ts | 11 +++++++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 7c7fe328c26..9d601bb0708 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -43,7 +43,7 @@ import { getProjectFromResponse, getProjectSource, postProcess } from "../../../ import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; -import { createEditExecute, createEditTool, createMultiEditExecute, createMultiEditTool, createReadExecute, createReadTool, createWriteExecute, createWriteTool, FILE_MULTI_EDIT_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from "../libs/text_editor_tool"; +import { createEditExecute, createEditTool, createMultiEditExecute, createBatchEditTool, createReadExecute, createReadTool, createWriteExecute, createWriteTool, FILE_BATCH_EDIT_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from "../libs/text_editor_tool"; const SEARCH_LIBRARY_TOOL_NAME = 'LibraryProviderTool'; @@ -110,7 +110,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), [FILE_WRITE_TOOL_NAME]: createWriteTool(createWriteExecute(updatedSourceFiles, updatedFileNames)), [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool(createEditExecute(updatedSourceFiles, updatedFileNames)), - [FILE_MULTI_EDIT_TOOL_NAME]: createMultiEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), + [FILE_BATCH_EDIT_TOOL_NAME]: createBatchEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), }; @@ -155,7 +155,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler `Fetched libraries: [${libraryNames.join(", ")}]` ); toolResult = libraryNames; - } else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_MULTI_EDIT_TOOL_NAME].includes(toolName)) { + } else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_BATCH_EDIT_TOOL_NAME].includes(toolName)) { console.log(`[Tool Call] Tool call finished: ${toolName}`); } eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); @@ -207,7 +207,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler finalResponse = postProcessedResp.assistant_response; let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; - const MAX_REPAIR_ATTEMPTS = 1; + const MAX_REPAIR_ATTEMPTS = 3; let repair_attempt = 0; let diagnosticFixResp = finalResponse; //TODO: Check if we need this variable while ( @@ -362,7 +362,7 @@ ${JSON.stringify(langlibs, null, 2)} - To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. ### File modifications -- You must apply changes to the existing source code using the provided ${[FILE_MULTI_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME].join(", ")} tools. The complete existing source code will be provided in the section of the user prompt. +- You must apply changes to the existing source code using the provided ${[FILE_BATCH_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME].join(", ")} tools. The complete existing source code will be provided in the section of the user prompt. - When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. - Do not modify the README.md file unless explicitly asked to be modified in the query. - Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). @@ -503,7 +503,7 @@ export async function repairCode(params: RepairParams, LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), [FILE_WRITE_TOOL_NAME]: createWriteTool(createWriteExecute(updatedSourceFiles, updatedFileNames)), [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool(createEditExecute(updatedSourceFiles, updatedFileNames)), - [FILE_MULTI_EDIT_TOOL_NAME]: createMultiEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), + [FILE_BATCH_EDIT_TOOL_NAME]: createBatchEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts index 1ef2a7e99cd..330c89c0be8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts @@ -38,7 +38,7 @@ interface TextEditorResult { // ============================================================================ const VALID_FILE_EXTENSIONS = [ - '.bal', '.toml', '.md' + '.bal', '.toml', '.md', '.sql' ]; const MAX_LINE_LENGTH = 2000; @@ -512,7 +512,7 @@ export function createReadExecute(files: SourceFile[], updatedFileNames: string[ // ============================================================================ -export const FILE_MULTI_EDIT_TOOL_NAME = "file_multi_edit"; +export const FILE_BATCH_EDIT_TOOL_NAME = "file_batch_edit"; export const FILE_SINGLE_EDIT_TOOL_NAME = "file_edit"; export const FILE_WRITE_TOOL_NAME = "file_write"; export const FILE_READ_TOOL_NAME = "file_read"; @@ -554,7 +554,7 @@ export function createWriteTool(execute: WriteExecute) { Usage: - This tool will return an error if there is a file with non-empty content at the provided path. - ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required. - - If this is an existing file, Use ${FILE_MULTI_EDIT_TOOL_NAME} or ${FILE_SINGLE_EDIT_TOOL_NAME} to modify it instead. + - If this is an existing file, Use ${FILE_BATCH_EDIT_TOOL_NAME} or ${FILE_SINGLE_EDIT_TOOL_NAME} to modify it instead. - NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User. - Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`, inputSchema: z.object({ @@ -575,7 +575,9 @@ export function createEditTool(execute: EditExecute) { Usage: - You must read the chat history at least once before editing, as the user’s message contains the content of the each source file. This tool will error if you attempt an edit without reading the chat history. - When editing text content of a file that you obtained from the chat history you read earlier, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. + - If there are multiple edits to be made to the same file, prefer using the ${FILE_BATCH_EDIT_TOOL_NAME} tool instead of this one. - Do not create new files using this tool. Only edit existing files. If the file does not exist, Use ${FILE_WRITE_TOOL_NAME} to create new files. + - NEVER proactively edit documentation files (*.md) or README files. Only edit documentation files if explicitly requested by the User. - Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked. - The edit will FAIL if **old_string** is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use **replace_all** to change every instance of **old_string**. - Use **replace_all** for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`, @@ -590,7 +592,7 @@ export function createEditTool(execute: EditExecute) { } // 3. Multi Edit Tool -export function createMultiEditTool(execute: MultiEditExecute) { +export function createBatchEditTool(execute: MultiEditExecute) { return tool({ description: `This is a tool for making multiple edits to a single file in one operation. It is built on top of the ${FILE_SINGLE_EDIT_TOOL_NAME} tool and allows you to perform multiple find-and-replace operations efficiently. Prefer this tool over the ${FILE_SINGLE_EDIT_TOOL_NAME} tool when you need to make multiple edits to the same file. Before using this tool: @@ -608,6 +610,7 @@ export function createMultiEditTool(execute: MultiEditExecute) { - Each edit operates on the result of the previous edit - All edits must be valid for the operation to succeed - if any edit fails, none will be applied - This tool is ideal when you need to make several changes to different parts of the same file + - NEVER proactively edit documentation files (*.md) or README files. Only edit documentation files if explicitly requested by the User. CRITICAL REQUIREMENTS: 1. All edits follow the same requirements as the ${FILE_SINGLE_EDIT_TOOL_NAME} tool 2. The edits are atomic - either all succeed or none are applied From 576e1e383e75cbfed8e3eb6153b45a773f5d22cf Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Fri, 10 Oct 2025 08:56:28 +0530 Subject: [PATCH 160/730] Add event handler section and improve ResourceAccordion UI --- .../components/ResourceAccordion.tsx | 24 ++++++++++++++++--- .../src/views/BI/ServiceDesigner/index.tsx | 10 +++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx index 4e4ce4fab14..581775ce468 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordion.tsx @@ -70,6 +70,21 @@ const MethodPath = styled.span` margin-left: 10px; `; +const MethodBox = styled.div` + display: flex; + justify-content: center; + height: 25px; + min-width: 70px; + width: auto; + margin-left: 0px; + text-align: center; + padding: 3px 5px 3px 5px; + background-color: #876036; + color: #FFF; + align-items: center; + font-weight: bold; +`; + const colors = { "GET": '#3d7eff', "PUT": '#fca130', @@ -157,18 +172,21 @@ export function ResourceAccordion(params: ResourceAccordionProps) { + + handler + {functionModel.name.value} - {functionModel.editable && + {functionModel && <> {onEditResource! && ( - )} {onDeleteResource! && ( - )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 4fd5ece0e2e..e5f22b604f1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -769,7 +769,15 @@ export function ServiceDesigner(props: ServiceDesignerProps) { + > + + {unusedHandlers.length > 0 && ( + + )} + + {enabledHandlers.map((functionModel, index) => ( Date: Fri, 10 Oct 2025 09:22:34 +0530 Subject: [PATCH 161/730] Update workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1381397ec29..4c4cad2c370 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 @@ -6205,7 +6205,7 @@ function exposeVersionedServices(projectUri: string): boolean { const serverPath = config.get('SERVER_PATH') || undefined; const configPath = serverPath ? path.join(serverPath, 'conf', 'deployment.toml') : ''; if (!fs.existsSync(configPath)) { - console.error(`Config file path not found: ${configPath}`); + console.error(`Failed to find deployment configuration file at: ${configPath}`); return false; } const fileContent = fs.readFileSync(configPath, "utf8"); From 9011b9bf9ea8d7b927f6b1d9707a5737fd914131 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Fri, 10 Oct 2025 09:40:31 +0530 Subject: [PATCH 162/730] Fix code server generator --- .../test/code-server/setup-bi-code-server.sh | 172 +++++++++++++++--- 1 file changed, 148 insertions(+), 24 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh b/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh index a79668c8c97..27a6bf9d6ec 100755 --- a/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh +++ b/workspaces/bi/bi-extension/src/test/code-server/setup-bi-code-server.sh @@ -12,6 +12,12 @@ # 4. Starts code-server with proper configuration # ============================================================================= +# Ensure script is run with bash +if [ -z "$BASH_VERSION" ]; then + echo "Error: This script requires bash. Please run with: bash $0" + exit 1 +fi + set -e # Exit on any error # Colors for output @@ -107,19 +113,40 @@ check_and_install_code_server() { get_vsix_paths() { print_step "Getting VSIX file paths..." + # Get the directory where this script is located + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + # Navigate to the bi-extension root (3 levels up: code-server -> test -> src -> bi-extension) + BI_EXTENSION_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" + # Default path to VSIX directory (in bi-extension's vsix folder) + DEFAULT_VSIX_DIR="$BI_EXTENSION_ROOT/vsix" + # Get Ballerina VSIX path while true; do echo "" - read -p "Enter the path to the Ballerina VSIX file: " BALLERINA_VSIX_PATH + print_info "Default: Look for Ballerina VSIX in $DEFAULT_VSIX_DIR" + read -p "Enter the path to the Ballerina VSIX file (or press Enter to use default): " BALLERINA_VSIX_PATH if [[ -z "$BALLERINA_VSIX_PATH" ]]; then - print_error "Path cannot be empty!" - continue + # Use default path - find the first ballerina-*.vsix file (excluding ballerina-integrator) + if [[ -d "$DEFAULT_VSIX_DIR" ]]; then + BALLERINA_VSIX_PATH=$(find "$DEFAULT_VSIX_DIR" -maxdepth 1 -name "ballerina-*.vsix" -type f | grep -v "ballerina-integrator" | head -n 1) + if [[ -f "$BALLERINA_VSIX_PATH" ]]; then + print_info "Using default Ballerina VSIX: $BALLERINA_VSIX_PATH" + else + print_error "No Ballerina VSIX file found in default location: $DEFAULT_VSIX_DIR" + print_info "Please run 'pnpm run copy-balerina-ext' to copy the Ballerina VSIX file." + continue + fi + else + print_error "Default VSIX directory not found: $DEFAULT_VSIX_DIR" + print_info "Please enter the path manually." + continue + fi + else + # Expand tilde to home directory + BALLERINA_VSIX_PATH="${BALLERINA_VSIX_PATH/#\~/$HOME}" fi - # Expand tilde to home directory - BALLERINA_VSIX_PATH="${BALLERINA_VSIX_PATH/#\~/$HOME}" - if [[ -f "$BALLERINA_VSIX_PATH" ]] && [[ "$BALLERINA_VSIX_PATH" == *.vsix ]]; then print_success "Ballerina VSIX file found: $BALLERINA_VSIX_PATH" break @@ -131,16 +158,30 @@ get_vsix_paths() { # Get Ballerina Integrator VSIX path while true; do echo "" - read -p "Enter the path to the Ballerina Integrator VSIX file: " BI_VSIX_PATH + print_info "Default: Look for Ballerina Integrator VSIX in $DEFAULT_VSIX_DIR" + read -p "Enter the path to the Ballerina Integrator VSIX file (or press Enter to use default): " BI_VSIX_PATH if [[ -z "$BI_VSIX_PATH" ]]; then - print_error "Path cannot be empty!" - continue + # Use default path - find the first ballerina-integrator-*.vsix file + if [[ -d "$DEFAULT_VSIX_DIR" ]]; then + BI_VSIX_PATH=$(find "$DEFAULT_VSIX_DIR" -maxdepth 1 -name "ballerina-integrator-*.vsix" | head -n 1) + if [[ -f "$BI_VSIX_PATH" ]]; then + print_info "Using default Ballerina Integrator VSIX: $BI_VSIX_PATH" + else + print_error "No Ballerina Integrator VSIX file found in default location: $DEFAULT_VSIX_DIR" + print_info "Please ensure the BI extension is built first (run 'pnpm run rebuild')." + continue + fi + else + print_error "Default VSIX directory not found: $DEFAULT_VSIX_DIR" + print_info "Please enter the path manually." + continue + fi + else + # Expand tilde to home directory + BI_VSIX_PATH="${BI_VSIX_PATH/#\~/$HOME}" fi - # Expand tilde to home directory - BI_VSIX_PATH="${BI_VSIX_PATH/#\~/$HOME}" - if [[ -f "$BI_VSIX_PATH" ]] && [[ "$BI_VSIX_PATH" == *.vsix ]]; then print_success "Ballerina Integrator VSIX file found: $BI_VSIX_PATH" break @@ -193,7 +234,80 @@ install_extensions() { } # ============================================================================= -# Step 4: Get Workspace and Server Configuration +# Step 5: Configure Code-Server Settings +# ============================================================================= + +configure_code_server_settings() { + print_step "Configuring code-server settings..." + + # Get code-server config directory + CONFIG_DIR="$HOME/.local/share/code-server/User" + mkdir -p "$CONFIG_DIR" + + SETTINGS_FILE="$CONFIG_DIR/settings.json" + + # Create or update settings.json + print_info "Configuring settings.json..." + + # Check if settings file exists + if [[ -f "$SETTINGS_FILE" ]]; then + print_info "Existing settings.json found. Backing up..." + cp "$SETTINGS_FILE" "$SETTINGS_FILE.backup.$(date +%Y%m%d_%H%M%S)" + fi + + # Create settings with trusted extensions and default password requirement disabled + cat > "$SETTINGS_FILE" << 'EOF' +{ + "extensions.autoCheckUpdates": false, + "extensions.autoUpdate": false, + "workbench.enableExperiments": false, + "extensions.ignoreRecommendations": true, + "security.workspace.trust.enabled": false, + "extensions.confirmedUriHandlerExtensionIds": [ + "wso2.ballerina", + "wso2.ballerina-integrator", + "ballerina.ballerina" + ], + "security.allowedUNCHosts": [], + "security.restrictUNCAccess": false +} +EOF + + print_success "Settings configured successfully!" + print_info "Settings file: $SETTINGS_FILE" +} + +# ============================================================================= +# Step 6: Configure Default Password +# ============================================================================= + +configure_default_password() { + print_step "Configuring code-server authentication..." + + # Get code-server config directory + CONFIG_DIR="$HOME/.config/code-server" + mkdir -p "$CONFIG_DIR" + + CONFIG_FILE="$CONFIG_DIR/config.yaml" + + # Check if config exists + if [[ -f "$CONFIG_FILE" ]]; then + print_info "Existing config.yaml found. Backing up..." + cp "$CONFIG_FILE" "$CONFIG_FILE.backup.$(date +%Y%m%d_%H%M%S)" + fi + + # Create new config without authentication + cat > "$CONFIG_FILE" << EOF +bind-addr: 127.0.0.1:8080 +auth: none +cert: false +EOF + print_success "Authentication disabled - no password required!" + print_info "Config file: $CONFIG_FILE" +} + +# ============================================================================= +# Step 7: Get Workspace and Server Configuration # ============================================================================= get_server_config() { @@ -256,7 +370,7 @@ get_server_config() { } # ============================================================================= -# Step 5: Start Code-Server +# Step 8: Start Code-Server # ============================================================================= start_code_server() { @@ -277,16 +391,16 @@ start_code_server() { print_info "Final workspace verification successful: $(ls -la "$WORKSPACE_PATH" | head -3)" - # Get password from config + # Check authentication status from config CONFIG_FILE="$HOME/.config/code-server/config.yaml" + AUTH_TYPE="none" + PASSWORD="" + if [[ -f "$CONFIG_FILE" ]]; then - PASSWORD=$(grep "^password:" "$CONFIG_FILE" | cut -d' ' -f2) - if [[ -n "$PASSWORD" ]]; then - print_info "Access URL: http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH" - print_info "Password: $PASSWORD" + AUTH_TYPE=$(grep "^auth:" "$CONFIG_FILE" | cut -d' ' -f2) + if [[ "$AUTH_TYPE" == "password" ]]; then + PASSWORD=$(grep "^password:" "$CONFIG_FILE" | cut -d' ' -f2) fi - else - print_info "Access URL: http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH" fi echo "" @@ -294,9 +408,13 @@ start_code_server() { echo -e "${GREEN}===========================================${NC}" echo -e "${GREEN}1. Open your web browser${NC}" echo -e "${GREEN}2. Navigate to: ${BLUE}http://$SERVER_HOST:$SERVER_PORT/?folder=$WORKSPACE_PATH${NC}" - if [[ -n "$PASSWORD" ]]; then + + if [[ "$AUTH_TYPE" == "none" ]]; then + echo -e "${GREEN}3. No password required! 🎉${NC}" + elif [[ -n "$PASSWORD" ]]; then echo -e "${GREEN}3. Enter password: ${YELLOW}$PASSWORD${NC}" fi + echo -e "${GREEN}4. Your WSO2 BI extensions are ready to use!${NC}" echo "" print_success "Code-server running... Press Ctrl+C to stop." @@ -328,10 +446,16 @@ main() { # Step 4: Install extensions install_extensions - # Step 5: Get server configuration + # Step 5: Configure code-server settings (trust extensions) + configure_code_server_settings + + # Step 6: Disable authentication (no password required) + configure_default_password + + # Step 7: Get server configuration get_server_config - # Step 6: Start code-server + # Step 8: Start code-server start_code_server } From e11ab4bc7c559ac1ed441ff3460367f867410b5d Mon Sep 17 00:00:00 2001 From: Ravindu Wegiriya Date: Fri, 10 Oct 2025 09:45:08 +0530 Subject: [PATCH 163/730] Do reviewed changes --- .../Form/GenerateComponents/GenerateDiv.tsx | 23 +++++++++++-------- .../DataSourceForm/DatasourceRDBMSForm.tsx | 6 ++++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx b/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx index 8544bd3ab98..11c200ef4bc 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx @@ -62,6 +62,19 @@ const GenerateDiv = (props: GenerateDivProps) => { isConnection, } = props; + /** + * Extracts the display value from form details, handling both object and primitive values + */ + const getDisplayValue = (fieldName: string): any => { + const value = generatedFormDetails[fieldName]; + // Handle object with isExpression/value structure + if (value && typeof value === 'object' && 'value' in value) { + return value.value; + } + // Handle primitive values + return value; + }; + return (
{ }}> {!isChecked && !isExpression && isConnection && generatedFormDetails["configKey"]} {!isChecked && isExpression && generatedFormDetails[element.name].value} - {!isChecked && !isExpression && !isConnection && (() => { - const value = generatedFormDetails[element.name]; - // Handle object with isExpression/value structure - if (value && typeof value === 'object' && 'value' in value) { - return value.value; - } - // Handle primitive values - return value; - })()} + {!isChecked && !isExpression && !isConnection && getDisplayValue(element.name)} {isChecked && !isExpression && (
Date: Fri, 10 Oct 2025 10:14:19 +0530 Subject: [PATCH 164/730] Update system prompt on response format --- .../ballerina-extension/src/features/ai/service/code/code.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 9d601bb0708..73834c60c9d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -367,8 +367,8 @@ ${JSON.stringify(langlibs, null, 2)} - Do not modify the README.md file unless explicitly asked to be modified in the query. - Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). -Begin your response with the explanation. The explanation should detail the control flow decided in step 1, along with the selected libraries and their functions. -Once the explanation is finished, make necessary file edits for the code that needs to generate. +Begin your response with the very consise explanation. The explanation should contain a very high level the control flow decided in step 1 along with the how libraries are utilized. +Once the explanation is finished, make necessary File modifications. `; } From 70b459b5a3a54cd368e659e19cbec5e29d4e7b48 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Fri, 10 Oct 2025 10:51:08 +0530 Subject: [PATCH 165/730] Add initialization function support in ServiceDesigner and update FunctionForm parameters handling --- .../Forms/FunctionForm/index.tsx | 2 +- .../src/views/BI/ServiceDesigner/index.tsx | 86 ++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/index.tsx index 1bd01c314c0..3fe5312fa22 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/FunctionForm/index.tsx @@ -81,7 +81,7 @@ export function FunctionForm(props: ResourceFormProps) { - + Returns diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index e5f22b604f1..7465a13bfb8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -30,7 +30,7 @@ import { import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { PanelContainer } from "@wso2/ballerina-side-panel"; import { NodePosition } from "@wso2/syntax-tree"; -import { Button, Codicon, Icon, TextField, Typography, View } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon, LinkButton, TextField, Typography, View } from "@wso2/ui-toolkit"; import { useEffect, useRef, useState } from "react"; import { LoadingRing } from "../../../components/Loader"; import { TitleBar } from "../../../components/TitleBar"; @@ -202,6 +202,33 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [enabledHandlers, setEnabledHandlers] = useState([]); const [unusedHandlers, setUnusedHandlers] = useState([]); + + const [initFunction, setInitFunction] = useState(undefined); + + + const handleCloseInitFunction = () => { + setInitFunction(undefined); + }; + + const handleInitFunctionSave = async (value: FunctionModel) => { + setIsSaving(true); + const lineRange: LineRange = { + startLine: { line: position.startLine, offset: position.startColumn }, + endLine: { line: position.endLine, offset: position.endColumn }, + }; + const res = await rpcClient + .getServiceDesignerRpcClient() + .updateResourceSourceCode({ filePath, codedata: { lineRange }, function: value, service: serviceModel }); + const serviceArtifact = res.artifacts.find(res => res.name === serviceIdentifier); + if (serviceArtifact) { + fetchService(serviceArtifact.position); + await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { documentUri: serviceArtifact.path, position: serviceArtifact.position } }); + setIsSaving(false); + setInitFunction(undefined); + return; + } + } + useEffect(() => { if (!serviceModel || isPositionChanged(prevPosition.current, position)) { fetchService(position); @@ -339,6 +366,12 @@ export function ServiceDesigner(props: ServiceDesignerProps) { if (services.length > 0) { const selectedService = services.find((service) => service.name === serviceIdentifier); setResources(selectedService.resources); + + // // Remove the init option from setDropdownOptions(options); if init function is here + // if (selectedService.resources.find((func) => func.name === "init")) { + // const filtered = [...dropdownOptions].filter((option) => option.value !== ADD_INIT_FUNCTION); + // setDropdownOptions(filtered); + // } } }); }; @@ -414,8 +447,16 @@ export function ServiceDesigner(props: ServiceDesignerProps) { setShowFunctionConfigForm(true); }; - const onSelectAddInitFunction = () => { - // TODO: Implement add init function functionality + const onSelectAddInitFunction = async () => { + setIsNew(false); + const lsResponse = await rpcClient.getServiceDesignerRpcClient().getFunctionModel({ + type: 'object', + functionName: 'init' + }); + if (lsResponse.function) { + setInitFunction(lsResponse.function); + console.log(`Adding init function`, lsResponse.function); + } }; const handleAddDropdownOption = (option: string) => { @@ -620,6 +661,12 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const haveServiceTypeName = serviceModel?.properties["serviceTypeName"]?.value; + const openInit = async (resource: ProjectStructureArtifactResponse) => { + await rpcClient + .getVisualizerRpcClient() + .openView({ type: EVENT_TYPE.OPEN_VIEW, location: { position: resource.position, documentUri: resource.path } }); + } + const resourcesCount = resources .filter((resource) => { @@ -707,6 +754,22 @@ export function ServiceDesigner(props: ServiceDesignerProps) { ))} )} + + {resources?. + filter((func) => func.name === "init") + .map((functionModel, index) => ( + + Initialization Function: + + openInit(functionModel)} + > + {functionModel.name} + + + + ))} )} @@ -736,6 +799,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); return nameMatch || iconMatch; }) + .filter((resource) => resource.name !== "init") .map((resource, index) => ( )} + + + {/* This is for adding a init function to the service */} + + + ) From 37cc20d8f8d3e76e4980fd216fd0609b07021da3 Mon Sep 17 00:00:00 2001 From: kaumini Date: Fri, 10 Oct 2025 11:24:53 +0530 Subject: [PATCH 166/730] Add pulling dependencies loader on startup --- .../mi/mi-core/src/state-machine-types.ts | 2 +- .../mi/mi-extension/src/stateMachine.ts | 51 ++++++++++++++++++- .../mi/mi-visualizer/src/Visualizer.tsx | 6 +++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-core/src/state-machine-types.ts b/workspaces/mi/mi-core/src/state-machine-types.ts index c78cf04f35b..b08086bc72c 100644 --- a/workspaces/mi/mi-core/src/state-machine-types.ts +++ b/workspaces/mi/mi-core/src/state-machine-types.ts @@ -106,7 +106,7 @@ export enum AI_MACHINE_VIEW { export type MachineStateValue = | 'initialize' | 'projectDetected' | 'oldProjectDetected' | 'oldWorkspaceDetected' | 'LSInit' | 'ready' | 'disabled' - | { ready: 'viewReady' } | { ready: 'viewEditing' } + | { ready: 'viewReady' } | { ready: 'viewEditing' } | { ready: 'resolveMissingDependencies' } | { newProject: 'viewReady' }| { environmentSetup: 'viewReady' }; export type AIMachineStateValue = 'Initialize' | 'loggedOut' | 'Ready' | 'WaitingForLogin' | 'Executing' | 'updateExtension' | 'disabled' | 'notSupported'; diff --git a/workspaces/mi/mi-extension/src/stateMachine.ts b/workspaces/mi/mi-extension/src/stateMachine.ts index b4b46012533..448b7f9dd9a 100644 --- a/workspaces/mi/mi-extension/src/stateMachine.ts +++ b/workspaces/mi/mi-extension/src/stateMachine.ts @@ -35,6 +35,7 @@ const fs = require('fs'); interface MachineContext extends VisualizerLocation { langClient: ExtendedLanguageClient | null; + dependenciesResolved?: boolean; } const stateMachine = createMachine({ @@ -46,7 +47,8 @@ const stateMachine = createMachine({ projectUri: "", langClient: null, errors: [], - view: MACHINE_VIEW.Welcome + view: MACHINE_VIEW.Welcome, + dependenciesResolved: false }, states: { initialize: { @@ -205,8 +207,27 @@ const stateMachine = createMachine({ entry: () => log("State Machine: Entering 'ready.viewLoading' state"), invoke: { src: 'openWebPanel', + onDone: [ + { + target: "resolveMissingDependencies", + cond: (context) => !context.dependenciesResolved + }, + { + target: "viewFinding", + cond: (context) => !!context.dependenciesResolved + } + ] + } + }, + resolveMissingDependencies: { + entry: () => log("State Machine: Entering 'ready.resolveMissingDependencies' state"), + invoke: { + src: 'resolveMissingDependencies', onDone: { - target: 'viewFinding' + target: 'viewFinding', + actions: assign({ + dependenciesResolved: true + }) } } }, @@ -428,6 +449,32 @@ const stateMachine = createMachine({ } }); }, + resolveMissingDependencies: (context, event) => { + return new Promise(async (resolve, reject) => { + const langClient = context.langClient!; + // Temporary code - to be replaced with the ls API + const hasMissingModuleDiagnostics = true; + if (!hasMissingModuleDiagnostics) { + resolve({ view: context.view }); + return; + } + + const response = await langClient.updateConnectorDependencies(); + + // Add a delay to allow the user to see the "Dependencies resolved" message + await new Promise(res => setTimeout(res, 5000)); + + if (response === 'Success') { + vscode.window.showInformationMessage('All dependencies are resolved!'); + } else { + vscode.window.showErrorMessage('Failed to resolve dependencies.'); + console.error('Failed to resolve dependencies:', response); + } + + resolve(true); + + }); + }, findView: (context, event): Promise => { return new Promise(async (resolve, reject) => { const langClient = context.langClient!; diff --git a/workspaces/mi/mi-visualizer/src/Visualizer.tsx b/workspaces/mi/mi-visualizer/src/Visualizer.tsx index 85eb14540cb..f3c824f46c8 100644 --- a/workspaces/mi/mi-visualizer/src/Visualizer.tsx +++ b/workspaces/mi/mi-visualizer/src/Visualizer.tsx @@ -31,6 +31,7 @@ import { SwaggerPanel } from "./SwaggerPanel"; import { gitIssueUrl } from "./constants"; import { EnvironmentSetup } from "./views/EnvironmentSetup"; import { UnsupportedProject } from "./views/UnsupportedProject"; +import { PullingDependenciesView } from "./views/PullingDependenciesView"; const LoaderWrapper = styled.div` display: flex; @@ -82,6 +83,8 @@ export function Visualizer({ mode, swaggerData }: { mode: string, swaggerData?: setCurrentView('environmentSetup'); } else if ('oldWorkspaceDetected' in newState && newState.oldWorkspaceDetected === "viewReady") { setCurrentView('oldWorkspaceDetected'); + } else if ('ready' in newState && newState.ready === "resolveMissingDependencies") { + setCurrentView('resolvingDependencies'); } } else if (newState === 'disabled') { setCurrentView('disabled'); @@ -125,6 +128,9 @@ export function Visualizer({ mode, swaggerData }: { mode: string, swaggerData?: case 'disabled': setView(); break; + case 'resolvingDependencies': + setView(); + break; case 'loading': setView( From 63274f4311da9f37af9b8861be4e3f9c2263dfe2 Mon Sep 17 00:00:00 2001 From: kaumini Date: Fri, 10 Oct 2025 11:26:15 +0530 Subject: [PATCH 167/730] Add pulling dependencies loader on startup --- .../views/PullingDependenciesView/index.tsx | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 workspaces/mi/mi-visualizer/src/views/PullingDependenciesView/index.tsx diff --git a/workspaces/mi/mi-visualizer/src/views/PullingDependenciesView/index.tsx b/workspaces/mi/mi-visualizer/src/views/PullingDependenciesView/index.tsx new file mode 100644 index 00000000000..a2c004c6250 --- /dev/null +++ b/workspaces/mi/mi-visualizer/src/views/PullingDependenciesView/index.tsx @@ -0,0 +1,108 @@ +/** + * 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 { VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react"; +import styled from "@emotion/styled"; +import { css, Global } from "@emotion/react"; + +const LoadingContent = styled.div` + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + height: 100%; + width: 100%; + padding-top: 30vh; + text-align: center; + max-width: 500px; + margin: 0 auto; + animation: fadeIn 1s ease-in-out; +`; + +const ProgressRing = styled(VSCodeProgressRing)` + height: 50px; + width: 50px; + margin: 1.5rem; +`; + +const LoadingTitle = styled.h1` + color: var(--vscode-foreground); + font-size: 1.5em; + font-weight: 400; + margin: 0; + letter-spacing: -0.02em; + line-height: normal; +`; + +const LoadingSubtitle = styled.p` + color: var(--vscode-descriptionForeground); + font-size: 13px; + margin: 0.5rem 0 2rem 0; + opacity: 0.8; +`; + +const LoadingText = styled.div` + color: var(--vscode-foreground); + font-size: 13px; + font-weight: 500; +`; + +const globalStyles = css` + @keyframes fadeIn { + 0% { opacity: 0; } + 100% { opacity: 1; } + } + .loading-dots::after { + content: ''; + animation: dots 1.5s infinite; + } + @keyframes dots { + 0%, 20% { content: ''; } + 40% { content: '.'; } + 60% { content: '..'; } + 80%, 100% { content: '...'; } + } +`; + +export function PullingDependenciesView() { + + return ( +
+ + + + + Pulling Dependencies + + + Fetching required modules for your project.
+ Please wait, this might take some time. +
+ + Pulling + +
+
+ ); +} From 67ffb364770732cd8165bf2cd1360aad0f0143d0 Mon Sep 17 00:00:00 2001 From: Ravindu Wegiriya Date: Fri, 10 Oct 2025 13:44:55 +0530 Subject: [PATCH 168/730] Do reviewed changes --- .../src/components/Form/GenerateComponents/GenerateDiv.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx b/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx index 11c200ef4bc..496bd84d6a9 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/GenerateComponents/GenerateDiv.tsx @@ -102,7 +102,7 @@ const GenerateDiv = (props: GenerateDivProps) => { }}> {!isChecked && !isExpression && isConnection && generatedFormDetails["configKey"]} {!isChecked && isExpression && generatedFormDetails[element.name].value} - {!isChecked && !isExpression && !isConnection && getDisplayValue(element.name)} + {!isChecked && !isExpression && getDisplayValue(element.name)} {isChecked && !isExpression && (
Date: Fri, 10 Oct 2025 14:43:23 +0530 Subject: [PATCH 169/730] Add packag lock files --- workspaces/ballerina/ballerina-extension/package.json | 8 ++++---- workspaces/choreo/choreo-extension/package.json | 2 +- workspaces/mi/mi-extension/package.json | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 13f53d827ba..e72a01a8013 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -965,21 +965,21 @@ "description": "design-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f180" + "fontCharacter": "\\f182" } }, "distro-start": { "description": "start", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1f5" + "fontCharacter": "\\f1f7" } }, "distro-debug": { "description": "debug", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f17b" + "fontCharacter": "\\f17d" } }, "distro-source-view": { @@ -993,7 +993,7 @@ "description": "persist-diagram", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1d0" + "fontCharacter": "\\f1d2" } }, "distro-cached-rounded": { diff --git a/workspaces/choreo/choreo-extension/package.json b/workspaces/choreo/choreo-extension/package.json index 7ebb0206ea2..122bdbcae0e 100644 --- a/workspaces/choreo/choreo-extension/package.json +++ b/workspaces/choreo/choreo-extension/package.json @@ -158,7 +158,7 @@ "description": "choreo-2", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f166" + "fontCharacter": "\\f168" } } } diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 346a9caf352..3630bc3a074 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -931,14 +931,14 @@ "description": "design-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f180" + "fontCharacter": "\\f182" } }, "distro-build-package": { "description": "build-package", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f15b" + "fontCharacter": "\\f15d" } } } From 10b7711172d2b8b05b17f8a78c31cd00c14ffa23 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:20:20 +0530 Subject: [PATCH 170/730] Fix local maven setting not updating issue --- workspaces/mi/mi-extension/package.json | 3 ++- workspaces/mi/mi-extension/src/util/onboardingUtils.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 346a9caf352..f962ef62819 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -143,7 +143,8 @@ "MI.useLocalMaven": { "type": "boolean", "default": false, - "description": "Use local Maven within the extension" + "description": "Use local Maven within the extension", + "scope": "resource" }, "MI.Scope": { "type": "string", diff --git a/workspaces/mi/mi-extension/src/util/onboardingUtils.ts b/workspaces/mi/mi-extension/src/util/onboardingUtils.ts index 7b0972dd812..be37aa134bd 100644 --- a/workspaces/mi/mi-extension/src/util/onboardingUtils.ts +++ b/workspaces/mi/mi-extension/src/util/onboardingUtils.ts @@ -88,8 +88,8 @@ export async function setupEnvironment(projectUri: string, isOldProject: boolean await updateCarPluginVersion(projectUri); const config = vscode.workspace.getConfiguration('MI', vscode.Uri.parse(projectUri)); const currentState = config.inspect("useLocalMaven"); - if (currentState?.workspaceValue === undefined) { - config.update("useLocalMaven", currentState?.globalValue ?? false, vscode.ConfigurationTarget.Workspace); + if (currentState?.workspaceFolderValue === undefined) { + config.update("useLocalMaven", currentState?.globalValue ?? false, vscode.ConfigurationTarget.WorkspaceFolder); } return !isUpdateRequested; } From e282ded3563251f43f38d8ac13febd312665cd71 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Thu, 9 Oct 2025 14:50:21 +0530 Subject: [PATCH 171/730] Enhances library provider tool and result handling Refactors the library provider tool to improve library selection and result handling. - Updates the tool to validate library names against available options, preventing errors due to incorrect names. - Modifies the tool call and result events to handle scenarios where no relevant libraries are found. - Changes `libraryNames` to `toolOutput` of `ToolResult` interface to be generic for different tool results. --- .../ballerina-core/src/state-machine-types.ts | 2 +- .../src/features/ai/service/code/code.ts | 32 +++++++++++-------- .../src/features/ai/service/event.ts | 25 ++++++++------- .../ai/service/libs/libraryProviderTool.ts | 4 +-- .../src/features/ai/service/utils.ts | 4 +-- .../result-management/result-conversion.ts | 8 ++--- .../test/ai/evals/code/types/result-types.ts | 2 +- .../ai/evals/code/utils/test-event-handler.ts | 12 ++++++- .../views/AIPanel/components/AIChat/index.tsx | 21 +++++++++--- 9 files changed, 68 insertions(+), 42 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 4f91f8a20cd..f29c0387b09 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -235,7 +235,7 @@ export interface ToolCall { export interface ToolResult { type: "tool_result"; toolName: string; - libraryNames: string[]; + toolOutput: any; } export interface EvalsToolResult { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index dd8667db3df..dfdd6d5d2ed 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -127,38 +127,42 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "start" }); let assistantResponse: string = ""; let finalResponse: string = ""; - + let selectedLibraries: string[] = []; for await (const part of fullStream) { switch (part.type) { case "tool-call": { const toolName = part.toolName; console.log(`[Tool Call] Tool call started: ${toolName}`); - eventHandler({ type: "tool_call", toolName }); if (toolName == "LibraryProviderTool") { + selectedLibraries = (part.input as any)?.libraryNames ? (part.input as any).libraryNames : []; + eventHandler({ type: "tool_call", toolName }); assistantResponse += `\n\nAnalyzing request & selecting libraries...`; } break; } case "tool-result": { const toolName = part.toolName; - let toolResult: string[] = []; + console.log(`[Tool Call] Tool call finished: ${toolName}`); if (toolName == "LibraryProviderTool") { - console.log(`[Tool Call] Tool call finished: ${toolName}`); - console.log(`[Tool Call] Tool call finished: ${toolName}`); + const libraryNames = (part.output as Library[]).map((lib) => lib.name); + const fetchedLibraries = libraryNames.filter((name) => selectedLibraries.includes(name)); console.log( "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", part.output as Library[] ); - const libraryNames = (part.output as Library[]).map((lib) => lib.name); - assistantResponse = assistantResponse.replace( - `Analyzing request & selecting libraries...`, - `Fetched libraries: [${libraryNames.join(", ")}]` - ); - toolResult = libraryNames; - } else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_BATCH_EDIT_TOOL_NAME].includes(toolName)) { - console.log(`[Tool Call] Tool call finished: ${toolName}`); + if (fetchedLibraries.length === 0) { + assistantResponse = assistantResponse.replace( + `Analyzing request & selecting libraries...`, + `No relevant libraries found.` + ); + } else { + assistantResponse = assistantResponse.replace( + `Analyzing request & selecting libraries...`, + `Fetched libraries: [${fetchedLibraries.join(", ")}]` + ); + } + eventHandler({ type: "tool_result", toolName, toolOutput: fetchedLibraries }); } - eventHandler({ type: "tool_result", toolName, libraryNames: toolResult }); eventHandler({ type: "evals_tool_result", toolName, output: part.output }); break; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts index deb486dad48..c25db3ab525 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts @@ -23,37 +23,38 @@ export type CopilotEventHandler = (event: ChatNotify) => void; export function createWebviewEventHandler(command: Command): CopilotEventHandler { return (event: ChatNotify) => { switch (event.type) { - case 'start': + case "start": sendMessageStartNotification(); break; - case 'content_block': + case "content_block": sendContentAppendNotification(event.content); break; - case 'content_replace': + case "content_replace": sendContentReplaceNotification(event.content); break; - case 'error': + case "error": sendErrorNotification(event.content); break; - case 'stop': + case "stop": sendMessageStopNotification(command); break; - case 'intermediary_state': + case "intermediary_state": sendIntermidateStateNotification(event.state); break; - case 'messages': + case "messages": sendMessagesNotification(event.messages); break; - case 'tool_call': + case "tool_call": sendToolCallNotification(event.toolName); break; - case 'tool_result': - sendToolResultNotification(event.toolName,event.libraryNames); + case "tool_result": + sendToolResultNotification(event.toolName, event.toolOutput); break; - case 'evals_tool_result': + case "evals_tool_result": + case "usage_metrics": // Ignore evals-specific events in webview break; - case 'diagnostics': + case "diagnostics": sendDiagnosticMessageNotification(event.diagnostics); break; default: diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts index 924e8061125..dcb5cd95c9c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts @@ -71,7 +71,7 @@ ${libraryDescriptions} Before calling this tool: - Review all library names and their descriptions. - Analyze the user query provided in the user message to identify the relevant Ballerina libraries which can be utilized to fulfill the query. -- Select the minimal set of libraries that can fulfill the query based on their descriptions. +- Select the minimal set of libraries that can fulfill the query based on their descriptions. # Example **Query**: Write an integration to read GitHub issues, summarize them, and post the summary to a Slack channel. @@ -80,7 +80,7 @@ Before calling this tool: Tool Response: Tool responds with the following information about the requested libraries: -name, description, type definitions (records, objects, enums, type aliases), clients(if any), functions and services(if any). +name, description, type definitions (records, objects, enums, type aliases), clients (if any), functions and services (if any). `, inputSchema: LibraryProviderToolSchema, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index 358ee8eca95..58249ba53b9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -202,11 +202,11 @@ export function sendToolCallNotification(toolName: string): void { sendAIPanelNotification(msg); } -export function sendToolResultNotification(toolName: string, libraryNames: string[]): void { +export function sendToolResultNotification(toolName: string, toolOutput: any): void { const msg: ToolResult = { type: "tool_result", toolName: toolName, - libraryNames: libraryNames + toolOutput: toolOutput, }; sendAIPanelNotification(msg); } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index 3efff803c36..447935f9bfc 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -46,9 +46,9 @@ export function convertTestResultToUsecaseResult(testResult: TestCaseResult, ite } as ToolCallEvent; } else if (event.type === 'tool_result') { return { - type: 'tool_result', + type: "tool_result", toolName: event.toolName, - libraryNames: event.libraryNames || [] + toolOutput: event.toolOutput, } as ToolResultEvent; } else { // evals_tool_result @@ -104,7 +104,7 @@ export function generateComprehensiveSummary(results: readonly UsecaseResult[], const durations = results.filter(r => r.duration).map(r => r.duration!); const totalDuration = durations.reduce((sum, d) => sum + d, 0); const averageDuration = durations.length > 0 ? totalDuration / durations.length : 0; - + // Calculate average rating from evaluation results const totalRating = results.reduce((sum, r) => sum + (r.evaluationResult?.rating ?? 0), 0); const averageRating = totalUsecases > 0 ? totalRating / totalUsecases : 0; @@ -391,4 +391,4 @@ function calculateOverallCacheValidation(results: readonly UsecaseResult[], aggr repairIterationCounts, validationIssues }; -} \ No newline at end of file +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts index 3d0d4e8d8bf..ab3947e8563 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/result-types.ts @@ -53,7 +53,7 @@ export interface ToolCallEvent { export interface ToolResultEvent { readonly type: "tool_result"; readonly toolName: string; - readonly libraryNames: readonly string[]; + readonly toolOutput: any; } /** diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts index d44bee10433..98b9bef4f3d 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-event-handler.ts @@ -81,7 +81,17 @@ export function createTestEventHandler(useCase?: TestUseCase): { console.log(`[${useCase?.id || 'unknown'}] Tool called: ${event.toolName}`); break; case "tool_result": - console.log(`[${useCase?.id || 'unknown'}] Tool result from ${event.toolName}: ${event.libraryNames?.join(', ') || 'no libraries'}`); + if (event.toolName == "LibraryProviderTool") { + console.log( + `[${useCase?.id || "unknown"}] Tool result from ${event.toolName}: ${ + event.toolOutput?.join(", ") || "no libraries" + }` + ); + } + else{ + console.log(`[${useCase?.id || "unknown"}] Tool result from ${event.toolName}:`); + console.log(JSON.stringify(event.toolOutput, null, 2)); + } break; case "evals_tool_result": console.log(`[${useCase?.id || 'unknown'}] [EVALS] Tool result from ${event.toolName}:`); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 0fce0e7035a..6cf1eb320e5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -303,14 +303,25 @@ const AIChat: React.FC = () => { } } else if (type === "tool_result") { if (response.toolName == "LibraryProviderTool") { - const libraryNames = response.libraryNames; + const libraryNames = response.toolOutput; setMessages((prevMessages) => { const newMessages = [...prevMessages]; if (newMessages.length > 0) { - newMessages[newMessages.length - 1].content = newMessages[newMessages.length - 1].content.replace( - `Analyzing request & selecting libraries...`, - `Fetched libraries: [${libraryNames.join(", ")}]` - ); + if (libraryNames.length === 0) { + newMessages[newMessages.length - 1].content = newMessages[ + newMessages.length - 1 + ].content.replace( + `Analyzing request & selecting libraries...`, + `No relevant libraries found.` + ); + } else { + newMessages[newMessages.length - 1].content = newMessages[ + newMessages.length - 1 + ].content.replace( + `Analyzing request & selecting libraries...`, + `Fetched libraries: [${libraryNames.join(", ")}]` + ); + } } return newMessages; }); From 4b8aa96b0e8158a6b212cc4b9c9f0570fd9dccb9 Mon Sep 17 00:00:00 2001 From: RNViththagan Date: Fri, 10 Oct 2025 17:10:41 +0530 Subject: [PATCH 172/730] Remove descriptions from type definitions to reduce payload size --- .../src/features/ai/service/libs/funcs.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index c32b8a96cc2..c2960ab34c0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -572,6 +572,19 @@ function addInternalRecord( } const typeDefResult = getTypeDefByName(link.recordName, allTypeDefs); + + // Temporarily remove descriptions to reduce payload size + if (typeDefResult && "description" in typeDefResult) { + delete typeDefResult.description; + } + if (typeDefResult && typeDefResult.type === TYPE_RECORD) { + const recordDef = typeDefResult as RecordTypeDefinition; + for (const field of recordDef.fields) { + if ("description" in field) { + delete field.description; + } + } + } if (typeDefResult) { ownRecords.set(link.recordName, typeDefResult); foundTypes.push(typeDefResult); From e94726b207cb32105755c398d509ac260b8e7ad4 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Fri, 10 Oct 2025 23:18:25 +0530 Subject: [PATCH 173/730] Fix E2E tests --- .../e2e-playwright-tests/data/datamapper-files/array/del1.ts | 1 + .../e2e-playwright-tests/data/datamapper-files/array/del2.ts | 1 + .../e2e-playwright-tests/data/datamapper-files/array/init1.ts | 1 + .../e2e-playwright-tests/data/datamapper-files/array/init2.ts | 1 + .../e2e-playwright-tests/data/datamapper-files/array/map1.ts | 1 + .../e2e-playwright-tests/data/datamapper-files/array/map2.ts | 1 + .../test/e2e-playwright-tests/data/datamapper-files/basic/del.ts | 1 + .../e2e-playwright-tests/data/datamapper-files/basic/init.ts | 1 + .../test/e2e-playwright-tests/data/datamapper-files/basic/map.ts | 1 + .../src/test/e2e-playwright-tests/data/datamapper-files/reset.ts | 1 + .../data/datamapper-files/schemas/xml-csv.ts | 1 + .../data/datamapper-files/schemas/xsd-csv.ts | 1 + 12 files changed, 12 insertions(+) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del1.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del1.ts index b1dc7c447a3..a271b972704 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del1.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del1.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del2.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del2.ts index 7a2003bcdfd..56455e9b60e 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del2.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/del2.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init1.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init1.ts index 16b4d0770ac..c1764f629b9 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init1.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init1.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init2.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init2.ts index f0000ed30c1..51e60499b34 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init2.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/init2.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map1.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map1.ts index 96831659a3c..a6605e9e368 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map1.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map1.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map2.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map2.ts index d3511ffa201..deee1378319 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map2.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/array/map2.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/del.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/del.ts index c5394a052d1..c8f18ec3b65 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/del.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/del.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/init.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/init.ts index aec2ac64d1c..3547d10f233 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/init.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/init.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/map.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/map.ts index 1f791731295..f2e75a77c89 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/map.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/basic/map.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/reset.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/reset.ts index ea223d139ce..04c2e5f9e46 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/reset.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/reset.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /** * inputType:unknown diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xml-csv.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xml-csv.ts index 93b081c3201..5e5f03d1e1f 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xml-csv.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xml-csv.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xsd-csv.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xsd-csv.ts index 73e9388361e..bd61a49a296 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xsd-csv.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/data/datamapper-files/schemas/xsd-csv.ts @@ -1,4 +1,5 @@ import * as dmUtils from "./dm-utils"; +declare var DM_PROPERTIES: any; /* * title : "root", From 2b571b1e0b84476648f2b3778861d137b7f01cc2 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Sat, 11 Oct 2025 20:23:09 +0530 Subject: [PATCH 174/730] Improve system prompt for response structure and http related improvements --- .../src/features/ai/service/code/code.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 73834c60c9d..820246b4ad0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -247,6 +247,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "content_replace", content: assistantResponse }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); + eventHandler({ type: "stop", command: Command.Code }); break; } @@ -364,11 +365,12 @@ ${JSON.stringify(langlibs, null, 2)} ### File modifications - You must apply changes to the existing source code using the provided ${[FILE_BATCH_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME].join(", ")} tools. The complete existing source code will be provided in the section of the user prompt. - When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. -- Do not modify the README.md file unless explicitly asked to be modified in the query. +- Do not modify documentation such as .md files unless explicitly asked to be modified in the query. - Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). +- Prefer modifying existing bal files over creating new files unless explicitly asked to create a new file in the query. -Begin your response with the very consise explanation. The explanation should contain a very high level the control flow decided in step 1 along with the how libraries are utilized. -Once the explanation is finished, make necessary File modifications. +Begin your response with the very consice explanation. The explanation should contain a very high level the control flow decided in step 1 along with the how libraries are utilized. +Once the explanation is finished, make the necessary File modifications. Avoid any usage guides or explanations after the file modifications. `; } From 75f1f3d95c7cbdaa21dc576e4921c21f67b0d46d Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Sun, 12 Oct 2025 22:28:40 +0530 Subject: [PATCH 175/730] Add code generation changes in UI --- .../ballerina-extension/src/core/extension.ts | 6 +++++- .../src/features/ai/service/code/code.ts | 12 +++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index e8de14a22a0..8ed05aa5fb9 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -2420,7 +2420,11 @@ export class BallerinaExtension { if (error instanceof Error) { debug(`[SYNC_ENV] Error name: ${error.name}`); debug(`[SYNC_ENV] Error message: ${error.message}`); - debug(`[SYNC_ENV] Error stack: ${error.stack}`); + if (error.stack) { + console.log("--- Stack Trace ---"); + debug(`${error.stack}`); + console.log("-------------------"); + } } // Don't throw the error, as this is not critical for basic functionality } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index e6868b851cd..93e6b98876c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -128,6 +128,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler let assistantResponse: string = ""; let finalResponse: string = ""; let selectedLibraries: string[] = []; + let codeGenStart = false; for await (const part of fullStream) { switch (part.type) { case "tool-call": { @@ -135,9 +136,17 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler console.log(`[Tool Call] Tool call started: ${toolName}`); if (toolName == "LibraryProviderTool") { selectedLibraries = (part.input as any)?.libraryNames ? (part.input as any).libraryNames : []; - eventHandler({ type: "tool_call", toolName }); assistantResponse += `\n\nAnalyzing request & selecting libraries...`; } + else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_BATCH_EDIT_TOOL_NAME, FILE_READ_TOOL_NAME].includes(toolName)) { + if(!codeGenStart) { + codeGenStart = true; + // send this pattern \s*```(\w+)\s*([\s\S]*?)```\s*<\/code> + // to temprorily indicate the start of code generation in the webview + eventHandler({ type: "content_block", content: "\n```ballerina\n// Code Generation\n```\n" }); + } + } + eventHandler({ type: "tool_call", toolName }); break; } case "tool-result": { @@ -264,6 +273,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler assistantResponse += "\n\n" + diagnosticFixResp; } console.log("Final Diagnostics ", diagnostics); + codeGenStart = false; eventHandler({ type: "content_replace", content: assistantResponse }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); From d85728fb35236016ac518fd0da2f24c3362816a8 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Sun, 12 Oct 2025 22:53:53 +0530 Subject: [PATCH 176/730] Add todo for code generation loading status --- .../ballerina-extension/src/features/ai/service/code/code.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 93e6b98876c..2f40e939b2c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -141,6 +141,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_BATCH_EDIT_TOOL_NAME, FILE_READ_TOOL_NAME].includes(toolName)) { if(!codeGenStart) { codeGenStart = true; + // TODO: temporary solution until this get refactored properly // send this pattern \s*```(\w+)\s*([\s\S]*?)```\s*<\/code> // to temprorily indicate the start of code generation in the webview eventHandler({ type: "content_block", content: "\n```ballerina\n// Code Generation\n```\n" }); From 5d99288675e813a9c9c8c087f118661e9e380174 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Sun, 12 Oct 2025 22:59:03 +0530 Subject: [PATCH 177/730] Remove debug changes --- .../ballerina/ballerina-extension/src/core/extension.ts | 6 +----- .../src/features/ai/service/code/code.ts | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 8ed05aa5fb9..e8de14a22a0 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -2420,11 +2420,7 @@ export class BallerinaExtension { if (error instanceof Error) { debug(`[SYNC_ENV] Error name: ${error.name}`); debug(`[SYNC_ENV] Error message: ${error.message}`); - if (error.stack) { - console.log("--- Stack Trace ---"); - debug(`${error.stack}`); - console.log("-------------------"); - } + debug(`[SYNC_ENV] Error stack: ${error.stack}`); } // Don't throw the error, as this is not critical for basic functionality } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 2f40e939b2c..1ad60329f16 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -144,7 +144,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler // TODO: temporary solution until this get refactored properly // send this pattern \s*```(\w+)\s*([\s\S]*?)```\s*<\/code> // to temprorily indicate the start of code generation in the webview - eventHandler({ type: "content_block", content: "\n```ballerina\n// Code Generation\n```\n" }); + eventHandler({ type: "content_block", content: "\n```ballerina\n// Code Generation\n```\n" }); } } eventHandler({ type: "tool_call", toolName }); From 869412dbd011336e02670d10e7b154ebc3026196 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Sun, 12 Oct 2025 11:02:11 +0530 Subject: [PATCH 178/730] Fix test creation issue in code generator --- .../ballerina-extension/src/utils/modification.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/modification.ts b/workspaces/ballerina/ballerina-extension/src/utils/modification.ts index 83c14f3eca2..901f68b388a 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/modification.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/modification.ts @@ -22,6 +22,8 @@ import { URI } from "vscode-uri"; import { writeFileSync } from "fs"; import { StateMachine, updateView } from "../stateMachine"; import { ArtifactNotificationHandler, ArtifactsUpdated } from "./project-artifacts-handler"; +import { dirname } from 'path'; +import { existsSync, mkdirSync } from 'fs'; interface UpdateFileContentRequest { filePath: string; @@ -65,6 +67,11 @@ export async function modifyFileContent(params: UpdateFileContentRequest): Promi } export function writeBallerinaFileDidOpenTemp(filePath: string, content: string) { + // Replace the selection with: + const dir = dirname(filePath); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } writeFileSync(filePath, content.trim()); StateMachine.langClient().didChange({ textDocument: { uri: filePath, version: 1 }, From fc9cf8f1ce611c6d7688fc70a4a949e2f1d6dcf8 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Sun, 12 Oct 2025 12:34:55 +0530 Subject: [PATCH 179/730] Fix markdown invalid character in copilot chat window --- .../AIPanel/components/MarkdownRenderer.tsx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/MarkdownRenderer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/MarkdownRenderer.tsx index 6597a9f15f4..ac1d2dd4bbb 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/MarkdownRenderer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/MarkdownRenderer.tsx @@ -33,11 +33,26 @@ import { ColorThemeKind } from "@wso2/ballerina-core"; hljs.registerLanguage("yaml", yaml); hljs.registerLanguage("ballerina", ballerina); -// Escapes all HTML tags except the custom tag +// Escapes HTML tags except our custom and tags +// Uses context-aware detection to distinguish HTML tags from generic type parameters const escapeHtmlForCustomTags = (markdown: string): string => { - return markdown.replace(/<\/?(?!badge\b|error\b)(\w+)[^>]*>/g, (match) => - match.replace(//g, ">") - ); + return markdown.replace(/<\/?([a-zA-Z][a-zA-Z0-9]*)\b[^>]*>/g, (match, tagName, offset, fullString) => { + // Preserve our custom tags - they need to be processed by rehypeRaw + if (tagName.toLowerCase() === 'badge' || tagName.toLowerCase() === 'error') { + return match; + } + + // Check character before '<' - if it's a word character, it's likely a generic type + // Examples: "convert", "List", "Map" + const charBefore = offset > 0 ? fullString[offset - 1] : ''; + if (/\w/.test(charBefore)) { + return match; // Don't escape - likely generic type parameter + } + + // Escape standalone HTML tags (preceded by space, newline, or start of string) + // Examples: "`; + +function injectTheme() { + console.log('🎨 Injecting custom CSS theme into MCP Inspector npm package...'); + + // Check if index.html exists + if (!fs.existsSync(INDEX_HTML_PATH)) { + console.error(` ❌ Error: index.html not found at ${INDEX_HTML_PATH}`); + console.error(' 💡 Try running: pnpm install'); + process.exit(1); + } + + // Read index.html + let html = fs.readFileSync(INDEX_HTML_PATH, 'utf8'); + + // Check if theme is already injected (avoid duplicate injection) + if (html.includes('Dynamic Theme Injection Placeholder')) { + console.log(' ℹ️ Theme already injected, skipping...'); + return; + } + + // Inject custom CSS before tag + html = html.replace('', `${CUSTOM_CSS}\n `); + + // Write back to file + fs.writeFileSync(INDEX_HTML_PATH, html, 'utf8'); + + console.log(' ✅ Custom CSS theme injected successfully!'); + console.log(` 📍 Location: ${INDEX_HTML_PATH}`); + console.log(' 💡 Theme will be applied when MCP Inspector client server starts'); +} + +// Run the injection +try { + injectTheme(); +} catch (error) { + console.error(' ❌ Failed to inject theme:', error.message); + process.exit(1); +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/MCPInspectorManager.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/MCPInspectorManager.ts new file mode 100644 index 00000000000..b0f66466955 --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/MCPInspectorManager.ts @@ -0,0 +1,256 @@ +import * as vscode from 'vscode'; +import * as childProcess from 'child_process'; +import { randomBytes } from 'crypto'; +import { Logger } from './utils/logger'; +import { Ports, ProcessConfig, ErrorMessages } from './constants'; +import type { ProcessSpawnConfig } from './types'; + +/** + * Manages the MCP Inspector server and client processes + */ +export class MCPInspectorManager { + private authToken: string | null = null; + private isRunning = false; + private serverProcess: childProcess.ChildProcess | null = null; + private clientProcess: childProcess.ChildProcess | null = null; + + constructor(private readonly extensionUri: vscode.Uri) {} + + /** + * Get the path to the bundled MCP Inspector files + * Uses webpack-bundled files from out/inspector/ + */ + private getInspectorPath(): vscode.Uri { + return vscode.Uri.joinPath(this.extensionUri, 'out', 'inspector'); + } + + /** + * Generate a secure authentication token for the MCP proxy server + */ + private generateAuthToken(): string { + return randomBytes(32).toString('hex'); + } + + /** + * Get the current auth token, generating one if it doesn't exist + */ + public getAuthToken(): string { + if (!this.authToken) { + this.authToken = this.generateAuthToken(); + } + return this.authToken; + } + + /** + * Check if the inspector is currently running + */ + public isInspectorRunning(): boolean { + return this.isRunning; + } + + /** + * Generic method to spawn and monitor a child process + * Follows DRY principle by eliminating duplicated spawn logic + */ + private async spawnProcess( + config: ProcessSpawnConfig, + processRef: 'serverProcess' | 'clientProcess' + ): Promise { + return new Promise((resolve, reject) => { + // Spawn the process + const process = childProcess.spawn('node', [config.scriptPath], { + env: config.env, + cwd: config.cwd, + stdio: ['ignore', 'pipe', 'pipe'], + }); + + this[processRef] = process; + let resolved = false; + + // Set timeout for process startup + const timeout = setTimeout(() => { + if (!resolved) { + resolved = true; + process.kill(); + this[processRef] = null; + if (processRef === 'serverProcess') { + this.isRunning = false; + } + reject(new Error(config.timeoutError)); + } + }, ProcessConfig.STARTUP_TIMEOUT_MS); + + // Handle stdout - look for ready message + process.stdout?.on('data', (data: Buffer) => { + const output = data.toString().trim(); + + if (!resolved && output.includes(config.readyMessage)) { + resolved = true; + clearTimeout(timeout); + Logger.info(`${config.errorPrefix} started successfully`); + resolve(); + } + }); + + // Handle stderr - detect port conflicts + process.stderr?.on('data', (data: Buffer) => { + const output = data.toString().trim(); + + if (!resolved && output.includes(ProcessConfig.PORT_IN_USE_MESSAGE)) { + resolved = true; + clearTimeout(timeout); + process.kill(); + this[processRef] = null; + if (processRef === 'serverProcess') { + this.isRunning = false; + } + reject(new Error(config.portInUseError( + processRef === 'serverProcess' ? Ports.SERVER : Ports.CLIENT + ))); + } else { + // Log errors for debugging + Logger.error(`[${config.errorPrefix}] ${output}`); + } + }); + + // Handle process exit + process.on('exit', (code) => { + this[processRef] = null; + if (processRef === 'serverProcess') { + this.isRunning = false; + } + if (!resolved) { + resolved = true; + clearTimeout(timeout); + reject(new Error(`${config.errorPrefix} process exited unexpectedly (code: ${code})`)); + } + }); + + // Handle process errors + process.on('error', (error) => { + Logger.error(`${config.errorPrefix} process error`, error); + this[processRef] = null; + if (processRef === 'serverProcess') { + this.isRunning = false; + } + if (!resolved) { + resolved = true; + clearTimeout(timeout); + reject(error); + } + }); + }); + } + + /** + * Spawn the MCP Inspector proxy server process + */ + private async startServerProcess(): Promise { + const inspectorPath = this.getInspectorPath(); + const token = this.getAuthToken(); + + const config: ProcessSpawnConfig = { + scriptPath: vscode.Uri.joinPath(inspectorPath, 'server.js').fsPath, + env: { + ...process.env, + MCP_PROXY_AUTH_TOKEN: token, + SERVER_PORT: Ports.SERVER, + CLIENT_PORT: Ports.CLIENT, + }, + cwd: inspectorPath.fsPath, + readyMessage: ProcessConfig.SERVER_READY_MESSAGE, + errorPrefix: 'Server', + portInUseError: ErrorMessages.SERVER_PORT_IN_USE, + timeoutError: ErrorMessages.SERVER_TIMEOUT, + }; + + return this.spawnProcess(config, 'serverProcess'); + } + + /** + * Spawn the MCP Inspector client HTTP server process + */ + private async startClientProcess(): Promise { + const inspectorPath = this.getInspectorPath(); + const token = this.getAuthToken(); + const inspectorUrl = `http://localhost:${Ports.CLIENT}/?MCP_PROXY_AUTH_TOKEN=${token}`; + + const config: ProcessSpawnConfig = { + scriptPath: vscode.Uri.joinPath(inspectorPath, 'client.js').fsPath, + env: { + ...process.env, + CLIENT_PORT: Ports.CLIENT, + INSPECTOR_URL: inspectorUrl, + MCP_AUTO_OPEN_ENABLED: 'false', + }, + cwd: inspectorPath.fsPath, + readyMessage: ProcessConfig.CLIENT_READY_MESSAGE, + errorPrefix: 'Client', + portInUseError: ErrorMessages.CLIENT_PORT_IN_USE, + timeoutError: ErrorMessages.CLIENT_TIMEOUT, + }; + + return this.spawnProcess(config, 'clientProcess'); + } + + /** + * Start the MCP Inspector (server and client processes) + */ + public async start(): Promise { + try { + Logger.info('Starting MCP Inspector...'); + + // Generate auth token + this.getAuthToken(); + + // Start the server process (waits for ready message) + await this.startServerProcess(); + + // Start the client process (waits for ready message) + await this.startClientProcess(); + + this.isRunning = true; + Logger.info('MCP Inspector started successfully'); + } catch (error) { + Logger.error('Failed to start MCP Inspector', error); + this.isRunning = false; + throw error; + } + } + + /** + * Stop the MCP Inspector and clean up resources + */ + public async stop(): Promise { + try { + // Kill client process + if (this.clientProcess) { + this.clientProcess.kill('SIGTERM'); + this.clientProcess = null; + } + + // Kill server process + if (this.serverProcess) { + this.serverProcess.kill('SIGTERM'); + this.serverProcess = null; + } + + this.isRunning = false; + this.authToken = null; + + Logger.info('MCP Inspector stopped'); + } catch (error) { + Logger.error('Failed to stop MCP Inspector', error); + throw error; + } + } + + /** + * Dispose of resources + */ + public dispose(): void { + this.stop().catch((error) => { + Logger.error('Error during disposal', error); + }); + } +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/MCPInspectorViewProvider.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/MCPInspectorViewProvider.ts new file mode 100644 index 00000000000..0b6db6adaf0 --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/MCPInspectorViewProvider.ts @@ -0,0 +1,297 @@ +import * as vscode from 'vscode'; +import { Views, WebviewConfig, Ports } from './constants'; +import { Logger } from './utils/logger'; +import type { MCPInspectorManager } from './MCPInspectorManager'; +import type { ServerParams } from './types'; + +/** + * Provides the webview content for the MCP Inspector + */ +export class MCPInspectorViewProvider implements vscode.WebviewViewProvider { + public static readonly viewType = Views.INSPECTOR_VIEW; + + constructor(private readonly _inspectorManager?: MCPInspectorManager) {} + + /** + * Resolves the webview view when it's shown + */ + public resolveWebviewView( + webviewView: vscode.WebviewView, + _context: vscode.WebviewViewResolveContext, + _token: vscode.CancellationToken + ): void { + try { + webviewView.webview.options = { + enableScripts: WebviewConfig.ENABLE_SCRIPTS, + }; + + webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); + } catch (error) { + Logger.error('Failed to resolve webview view', error); + throw error; + } + } + + /** + * Get HTML content for the webview + */ + public getHtmlForWebview(webview: vscode.Webview, serverParams?: ServerParams): string { + return this._getHtmlForWebview(webview, serverParams); + } + + /** + * Get loading HTML while processes are starting + */ + public getLoadingHtml(): string { + return ` + + + + + MCP Inspector - Loading + + + +
+
+
Starting MCP Inspector...
+
This may take a few seconds
+
+ +`; + } + + /** + * Get error HTML when startup fails + */ + public getErrorHtml(errorMessage: string): string { + return ` + + + + + MCP Inspector - Error + + + +
+
⚠️
+
Failed to Start MCP Inspector
+
${errorMessage}
+
Try closing and reopening the panel
+
+ +`; + } + + /** + * Generate HTML for the webview + */ + private _getHtmlForWebview(_webview: vscode.Webview, serverParams?: ServerParams): string { + // Get auth token from inspector manager + const authToken = this._inspectorManager?.getAuthToken() || ''; + + // Build URL with auth token and optional server parameters + const urlParams = new URLSearchParams({ MCP_PROXY_AUTH_TOKEN: authToken }); + if (serverParams?.serverUrl) { + urlParams.set('serverUrl', serverParams.serverUrl); + } + if (serverParams?.serverCommand) { + urlParams.set('serverCommand', serverParams.serverCommand); + } + if (serverParams?.serverArgs) { + urlParams.set('serverArgs', serverParams.serverArgs); + } + if (serverParams?.transport) { + urlParams.set('transport', serverParams.transport); + } + + const inspectorUrl = `http://localhost:${Ports.CLIENT}/?${urlParams.toString()}`; + + // CSP policy that allows iframe to localhost + const csp = [ + `default-src 'none'`, + `frame-src http://localhost:${Ports.CLIENT}`, + `style-src 'unsafe-inline'`, + `script-src 'unsafe-inline'`, + ].join('; '); + + return ` + + + + + + MCP Inspector + + + + + + +`; + } +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/constants.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/constants.ts new file mode 100644 index 00000000000..eb30d98708b --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/constants.ts @@ -0,0 +1,74 @@ +/** + * Extension constants + */ + +export const EXTENSION_ID = 'mcpInspector'; +export const EXTENSION_NAME = 'MCP Inspector'; + +/** + * Command IDs + */ +export const Commands = { + OPEN_INSPECTOR: `${EXTENSION_ID}.openInspector`, + OPEN_INSPECTOR_WITH_URL: `${EXTENSION_ID}.openInspectorWithUrl`, +} as const; + +/** + * View IDs + */ +export const Views = { + INSPECTOR_VIEW: `${EXTENSION_ID}.inspectorView`, +} as const; + +/** + * Configuration keys + */ +export const Configuration = { + SECTION: EXTENSION_ID, +} as const; + +/** + * Webview configuration + */ +export const WebviewConfig = { + RETAIN_CONTEXT: true, + ENABLE_SCRIPTS: true, +} as const; + +/** + * MCP Inspector port configuration + */ +export const Ports = { + SERVER: '6277', + CLIENT: '6274', +} as const; + +/** + * Process configuration + */ +export const ProcessConfig = { + STARTUP_TIMEOUT_MS: 30000, // 30 seconds + SERVER_READY_MESSAGE: 'Proxy server listening', + CLIENT_READY_MESSAGE: 'MCP Inspector is up and running', + PORT_IN_USE_MESSAGE: 'PORT IS IN USE', +} as const; + +/** + * Error messages + */ +export const ErrorMessages = { + SERVER_TIMEOUT: 'Server process failed to start within 30 seconds. Please check the logs and try again.', + CLIENT_TIMEOUT: 'Client process failed to start within 30 seconds. Please check the logs and try again.', + SERVER_PORT_IN_USE: (port: string) => `Port ${port} is already in use. Please close any other MCP Inspector instances or processes using this port.`, + CLIENT_PORT_IN_USE: (port: string) => `Port ${port} is already in use. Please close any other MCP Inspector instances or processes using this port.`, + ACTIVATION_FAILED: (error: string) => `Failed to activate ${EXTENSION_NAME}: ${error}`, + STARTUP_FAILED: (error: string) => `Failed to start MCP Inspector: ${error}`, + PANEL_OPEN_FAILED: (error: string) => `Failed to open ${EXTENSION_NAME}: ${error}`, +} as const; + +/** + * User-facing messages + */ +export const UserMessages = { + PORT_CONFLICT_DETAILS: `MCP Inspector uses ports ${Ports.CLIENT} (client) and ${Ports.SERVER} (server). Please ensure no other processes are using these ports.`, +} as const; diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/extension.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/extension.ts new file mode 100644 index 00000000000..3d2b01f1b3e --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/extension.ts @@ -0,0 +1,190 @@ +import * as vscode from 'vscode'; +import { MCPInspectorViewProvider } from './MCPInspectorViewProvider'; +import { MCPInspectorManager } from './MCPInspectorManager'; +import { Commands, WebviewConfig, EXTENSION_NAME, ErrorMessages, UserMessages } from './constants'; +import { Logger } from './utils/logger'; +import type { ServerParams } from './types'; + +/** + * Singleton reference to the current webview panel + */ +let currentPanel: vscode.WebviewPanel | undefined; + +/** + * Singleton reference to the MCP Inspector manager + */ +let inspectorManager: MCPInspectorManager | undefined; + +/** + * Extension activation function + * Called when the extension is first activated + */ +export function activate(context: vscode.ExtensionContext): void { + try { + Logger.info(`${EXTENSION_NAME} activating...`); + + // Create MCP Inspector manager (starts on-demand when panel opens) + inspectorManager = new MCPInspectorManager(context.extensionUri); + context.subscriptions.push({ + dispose: () => inspectorManager?.dispose(), + }); + + // Register the webview provider for view container support + const provider = new MCPInspectorViewProvider(inspectorManager); + context.subscriptions.push( + vscode.window.registerWebviewViewProvider( + MCPInspectorViewProvider.viewType, + provider, + { + webviewOptions: { + retainContextWhenHidden: WebviewConfig.RETAIN_CONTEXT, + }, + } + ) + ); + + // Register command to open the inspector as a webview panel + context.subscriptions.push( + vscode.commands.registerCommand(Commands.OPEN_INSPECTOR, () => { + openInspectorPanel(context, provider); + }) + ); + + // Register command to open inspector with pre-populated server URL/command + context.subscriptions.push( + vscode.commands.registerCommand( + Commands.OPEN_INSPECTOR_WITH_URL, + (params: ServerParams) => { + openInspectorPanel(context, provider, params); + } + ) + ); + + Logger.info(`${EXTENSION_NAME} activated successfully`); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + Logger.error('Failed to activate extension', error); + vscode.window.showErrorMessage(ErrorMessages.ACTIVATION_FAILED(errorMessage)); + } +} + +/** + * Extension deactivation function + * Called when the extension is deactivated + */ +export function deactivate(): void { + try { + if (currentPanel) { + currentPanel.dispose(); + currentPanel = undefined; + } + + Logger.info(`${EXTENSION_NAME} deactivated`); + } catch (error) { + console.error('Error during deactivation:', error); + } +} + +/** + * Open or reveal the inspector webview panel + */ +function openInspectorPanel( + context: vscode.ExtensionContext, + provider: MCPInspectorViewProvider, + serverParams?: ServerParams +): void { + try { + const column = vscode.ViewColumn.One; + + if (currentPanel) { + // Panel already exists, just reveal it + currentPanel.reveal(column); + return; + } + + // Create new webview panel first with loading state + currentPanel = vscode.window.createWebviewPanel( + 'mcpInspector', + EXTENSION_NAME, + column, + { + enableScripts: WebviewConfig.ENABLE_SCRIPTS, + retainContextWhenHidden: WebviewConfig.RETAIN_CONTEXT, + } + ); + + // Set the panel icon + currentPanel.iconPath = { + light: vscode.Uri.joinPath(context.extensionUri, 'resources', 'icon-dark.svg'), + dark: vscode.Uri.joinPath(context.extensionUri, 'resources', 'icon-light.svg'), + }; + + // Set initial loading content + currentPanel.webview.html = provider.getLoadingHtml(); + + // Start the MCP Inspector processes if not already running + if (inspectorManager && !inspectorManager.isInspectorRunning()) { + inspectorManager.start().then( + () => { + // Update webview with inspector iframe once processes are ready + if (currentPanel) { + currentPanel.webview.html = provider.getHtmlForWebview(currentPanel.webview, serverParams); + } + }, + (error) => { + Logger.error('Failed to start MCP Inspector processes', error); + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + + // Check if it's a port conflict error + if (errorMessage.includes('already in use')) { + vscode.window.showErrorMessage( + errorMessage, + 'Show Details', + 'Retry' + ).then((selection) => { + if (selection === 'Show Details') { + vscode.window.showInformationMessage(UserMessages.PORT_CONFLICT_DETAILS, 'OK'); + } else if (selection === 'Retry') { + // Close the current panel and reopen to retry + if (currentPanel) { + currentPanel.dispose(); + } + vscode.commands.executeCommand(Commands.OPEN_INSPECTOR); + } + }); + } else { + vscode.window.showErrorMessage(ErrorMessages.STARTUP_FAILED(errorMessage)); + } + + // Show error in webview + if (currentPanel) { + currentPanel.webview.html = provider.getErrorHtml(errorMessage); + } + } + ); + } else { + // Processes already running, show inspector immediately + currentPanel.webview.html = provider.getHtmlForWebview(currentPanel.webview, serverParams); + } + + // Handle panel disposal + currentPanel.onDidDispose( + () => { + currentPanel = undefined; + + // Stop the MCP Inspector processes when panel is closed + if (inspectorManager && inspectorManager.isInspectorRunning()) { + inspectorManager.stop().catch((error) => { + Logger.error('Failed to stop MCP Inspector', error); + }); + } + }, + null, + context.subscriptions + ); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + Logger.error('Failed to open inspector panel', error); + vscode.window.showErrorMessage(ErrorMessages.PANEL_OPEN_FAILED(errorMessage)); + } +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/test/extension.test.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/test/extension.test.ts new file mode 100644 index 00000000000..4ca0ab41982 --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/test/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/types.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/types.ts new file mode 100644 index 00000000000..edacf6c61ad --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/types.ts @@ -0,0 +1,35 @@ +/** + * Shared type definitions for the extension + */ + +/** + * MCP transport types supported by the inspector + */ +export type MCPTransport = 'stdio' | 'sse' | 'streamable-http'; + +/** + * Parameters for opening the inspector with pre-populated server configuration + */ +export interface ServerParams { + /** Server URL for SSE/HTTP transport */ + serverUrl?: string; + /** Command to execute for stdio transport */ + serverCommand?: string; + /** Arguments for the server command */ + serverArgs?: string; + /** Transport protocol to use */ + transport?: MCPTransport; +} + +/** + * Process spawn configuration + */ +export interface ProcessSpawnConfig { + scriptPath: string; + env: NodeJS.ProcessEnv; + cwd: string; + readyMessage: string; + errorPrefix: string; + portInUseError: (port: string) => string; + timeoutError: string; +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/src/utils/logger.ts b/workspaces/mcp-inspector/mcp-inspector-extension/src/utils/logger.ts new file mode 100644 index 00000000000..8f8726d4bf8 --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/src/utils/logger.ts @@ -0,0 +1,27 @@ +import { EXTENSION_NAME } from '../constants'; + +/** + * Logger utility for consistent logging throughout the extension + */ +export class Logger { + /** + * Log an info message + */ + public static info(message: string, ...args: unknown[]): void { + console.log(`[${EXTENSION_NAME}] [INFO]`, message, ...args); + } + + /** + * Log a warning message + */ + public static warn(message: string, ...args: unknown[]): void { + console.warn(`[${EXTENSION_NAME}] [WARN]`, message, ...args); + } + + /** + * Log an error message + */ + public static error(message: string, error?: Error | unknown, ...args: unknown[]): void { + console.error(`[${EXTENSION_NAME}] [ERROR]`, message, error, ...args); + } +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/tsconfig.json b/workspaces/mcp-inspector/mcp-inspector-extension/tsconfig.json new file mode 100644 index 00000000000..63b9fc053ff --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "module": "Node16", + "target": "ES2022", + "lib": ["ES2022"], + "sourceMap": true, + "rootDir": "src", + "outDir": "out", + + /* Strict Type-Checking Options */ + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + + /* Additional Checks */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + + /* Module Resolution Options */ + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + + /* Advanced Options */ + "skipLibCheck": true, + "declaration": true, + "declarationMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "out", "dist"] +} diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/vsc-extension-quickstart.md b/workspaces/mcp-inspector/mcp-inspector-extension/vsc-extension-quickstart.md new file mode 100644 index 00000000000..26c66f47483 --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/vsc-extension-quickstart.md @@ -0,0 +1,125 @@ +# MCP Inspector + +A Visual Studio Code extension for inspecting and debugging Model Context Protocol (MCP) connections. + +## Overview + +The MCP Inspector provides developers with tools to inspect, debug, and monitor Model Context Protocol connections directly within Visual Studio Code. This extension integrates the [MCP Inspector](https://github.com/modelcontextprotocol/inspector) into VSCode for a seamless development experience. + +## Prerequisites + +Before using this extension, ensure you have the following installed: + +- **Node.js** – version **18.x** or later + [Download Node.js](https://nodejs.org) + +- **pnpm** – version **9.0** or later + Install with: + ```bash + npm install -g pnpm + ``` + +- **Visual Studio Code** – version **1.104.0** or later + [Download VSCode](https://code.visualstudio.com) + +## Installation + +### From VSIX + +1. Download the latest `.vsix` file from the [releases page](https://github.com/wso2/mcp-inspector-extension/releases) +2. In VSCode, go to **Extensions** → **Views and More Actions (...)** → **Install from VSIX** +3. Select the downloaded `.vsix` file + +### From Source + +1. **Clone the repository**: + ```bash + git clone https://github.com/wso2/mcp-inspector-extension.git + cd mcp-inspector-extension + ``` + +2. **Install dependencies**: + ```bash + pnpm install + ``` + +3. **Build the extension**: + ```bash + pnpm build + ``` + +4. **Package the extension**: + ```bash + pnpm package + ``` + +5. **Install locally**: + ```bash + pnpm run install:local + ``` + +## Usage + +### Opening the Inspector + +- Use the command palette (`Cmd+Shift+P` / `Ctrl+Shift+P`) and search for **"Open MCP Inspector"** +- Or use the command **"Open MCP Inspector with URL"** to pre-populate server configuration + +### Features + +- **Real-time MCP connection monitoring** +- **Request/response inspection** +- **Debug MCP servers and clients** +- **Integrated within VSCode** for a seamless workflow + +## Development + +### Available Commands + +- `pnpm build` – Build the extension for production +- `pnpm dev` – Watch mode for development +- `pnpm lint` – Lint TypeScript files +- `pnpm lint:fix` – Auto-fix linting issues +- `pnpm test` – Run tests +- `pnpm clean` – Remove build artifacts +- `pnpm package` – Create VSIX package +- `pnpm install:local` – Install VSIX locally + +### Development Workflow + +1. **Start watch mode**: + ```bash + pnpm dev + ``` + +2. **Launch the extension**: + - Press `F5` in VSCode + - Or use **Run → Start Debugging** + - The Extension Development Host window will open + +3. **Test your changes** in the new VSCode window + +## Contribution Guidelines + +If you are planning on contributing to the development of the MCP Inspector extension: + +1. Fork the repository before making changes +2. Create a feature branch (`git checkout -b feature/your-feature`) +3. Follow the existing code style and conventions +4. Write tests for new functionality +5. Ensure all tests pass (`pnpm test`) +6. Submit a pull request with a clear description + +Please follow the detailed instructions available at: [https://wso2.github.io](https://wso2.github.io) + +## License + +This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details. + +By downloading and using this Visual Studio Code extension, you agree to the license terms and [privacy statement](https://wso2.com/privacy-policy). + +This extension uses the MCP Inspector, which is part of the [Model Context Protocol](https://modelcontextprotocol.io/) project. + +--- + +**Developed by WSO2** diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/webpack.config.js b/workspaces/mcp-inspector/mcp-inspector-extension/webpack.config.js new file mode 100644 index 00000000000..94cdcf2b31c --- /dev/null +++ b/workspaces/mcp-inspector/mcp-inspector-extension/webpack.config.js @@ -0,0 +1,106 @@ +//@ts-check + +'use strict'; + +const path = require('path'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + +//@ts-check +/** @typedef {import('webpack').Configuration} WebpackConfig **/ + +/** @type WebpackConfig */ +const extensionConfig = { + target: 'node', // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + + entry: { + extension: './src/extension.ts' + }, // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ + output: { + // the bundle is stored in the 'out' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ + path: path.resolve(__dirname, 'out'), + filename: '[name].js', + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../[resource-path]' + }, + externals: { + vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + // modules added here also need to be added in the .vscodeignore file + }, + resolve: { + // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + devtool: 'nosources-source-map', + infrastructureLogging: { + level: "log", // enables logging required for problem matchers + }, +}; + +/** @type WebpackConfig */ +const inspectorServerConfig = { + target: 'node', + mode: 'none', + entry: './node_modules/@modelcontextprotocol/inspector/server/build/index.js', + output: { + path: path.resolve(__dirname, 'out', 'inspector'), + filename: 'server.js', + libraryTarget: 'commonjs2' + }, + externals: { + // Native modules that can't be bundled + 'bufferutil': 'commonjs bufferutil', + 'utf-8-validate': 'commonjs utf-8-validate', + }, + resolve: { + extensions: ['.js', '.json'] + }, + devtool: 'nosources-source-map', +}; + +/** @type WebpackConfig */ +const inspectorClientConfig = { + target: 'node', + mode: 'none', + entry: './node_modules/@modelcontextprotocol/inspector/client/bin/client.js', + output: { + path: path.resolve(__dirname, 'out', 'inspector'), + filename: 'client.js', + libraryTarget: 'commonjs2' + }, + externals: { + // Native modules that can't be bundled + 'bufferutil': 'commonjs bufferutil', + 'utf-8-validate': 'commonjs utf-8-validate', + }, + resolve: { + extensions: ['.js', '.json'] + }, + plugins: [ + // Copy the client's static files (HTML, CSS, JS, assets) + new CopyWebpackPlugin({ + patterns: [ + { + from: 'node_modules/@modelcontextprotocol/inspector/client/dist', + to: path.resolve(__dirname, 'out', 'inspector', 'client-dist'), + }, + ], + }), + ], + devtool: 'nosources-source-map', +}; + +module.exports = [ extensionConfig, inspectorServerConfig, inspectorClientConfig ]; \ No newline at end of file From 96860b3150b5cfd87e81e4f9959415c76c08d400 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 4 Nov 2025 08:54:19 +0530 Subject: [PATCH 653/730] Downgrade webpack-cli in MCP Inspector Extension --- common/config/rush/pnpm-lock.yaml | 10629 +++++++++------- .../ballerina-extension/package.json | 8 +- .../ballerina-visualizer/package.json | 1 + .../choreo/choreo-extension/package.json | 2 +- .../mcp-inspector-extension/package.json | 2 +- workspaces/mi/mi-extension/package.json | 4 +- 6 files changed, 5747 insertions(+), 4899 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 243ba002847..db02fb2aa57 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -72,7 +72,7 @@ importers: version: 0.5.16 axios: specifier: ~1.12.0 - version: 1.12.0 + version: 1.12.2 copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -96,10 +96,10 @@ importers: version: 2.6.13(encoding@0.1.13) node-loader: specifier: ~2.0.0 - version: 2.0.0(webpack@5.101.0) + version: 2.0.0(webpack@5.102.1) portfinder: specifier: ^1.0.32 - version: 1.0.37 + version: 1.0.38 to-json-schema: specifier: 0.2.5 version: 0.2.5 @@ -121,7 +121,7 @@ importers: version: 16.18.126 '@types/vscode': specifier: ^1.81.0 - version: 1.102.0 + version: 1.105.0 '@typescript-eslint/eslint-plugin': specifier: ^6.4.1 version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -139,16 +139,16 @@ importers: version: 5.0.10 ts-loader: specifier: ^9.4.4 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@5.1.4) + version: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.101.0) + version: 5.1.4(webpack@5.102.1) ../../workspaces/api-designer/api-designer-rpc-client: dependencies: @@ -206,10 +206,10 @@ importers: version: 3.3.4(react-hook-form@7.56.4(react@18.2.0)) '@mdxeditor/editor': specifier: ~3.14.0 - version: 3.14.0(@codemirror/language@6.11.2)(@lezer/highlight@1.2.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 3.14.0(@codemirror/language@6.11.3)(@lezer/highlight@1.2.3)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 - version: 4.40.0 + version: 4.41.0 '@tanstack/react-query': specifier: 4.0.10 version: 4.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -258,10 +258,10 @@ importers: devDependencies: '@babel/plugin-syntax-flow': specifier: ~7.22.5 - version: 7.22.5(@babel/core@7.27.7) + version: 7.22.5(@babel/core@7.28.5) '@babel/preset-typescript': specifier: ~7.22.11 - version: 7.22.15(@babel/core@7.27.7) + version: 7.22.15(@babel/core@7.28.5) '@storybook/addon-actions': specifier: ~7.4.0 version: 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -276,7 +276,7 @@ importers: version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/react-webpack5': specifier: ~7.4.0 - version: 7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + version: 7.4.6(@babel/core@7.28.5)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) '@types/js-yaml': specifier: ~4.0.9 version: 4.0.9 @@ -285,7 +285,7 @@ importers: version: 4.14.202 '@types/node': specifier: ^20.10.6 - version: 20.19.22 + version: 20.19.24 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -303,31 +303,31 @@ importers: version: 2.4.1 css-loader: specifier: ^5.2.7 - version: 5.2.7(webpack@5.101.0) + version: 5.2.7(webpack@5.102.1) sass-loader: specifier: ^13.2.0 - version: 13.3.3(sass@1.90.0)(webpack@5.101.0) + version: 13.3.3(sass@1.93.3)(webpack@5.102.1) source-map-loader: specifier: ^4.0.1 - version: 4.0.2(webpack@5.101.0) + version: 4.0.2(webpack@5.102.1) style-loader: specifier: ^1.3.0 - version: 1.3.0(webpack@5.101.0) + version: 1.3.0(webpack@5.102.1) ts-loader: specifier: ^9.5.0 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@5.1.4) + version: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) + version: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) ../../workspaces/apk/apk-extension: devDependencies: @@ -339,10 +339,10 @@ importers: version: 10.0.10 '@types/node': specifier: ^18.11.19 - version: 18.19.121 + version: 18.19.130 '@types/vscode': specifier: ^1.63.0 - version: 1.102.0 + version: 1.105.0 '@typescript-eslint/eslint-plugin': specifier: ~5.48.2 version: 5.48.2(@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -417,7 +417,7 @@ importers: version: 3.1.0 vscode-ws-jsonrpc: specifier: ^3.4.0 - version: 3.4.0 + version: 3.5.0 devDependencies: '@types/node': specifier: ^22.15.21 @@ -427,19 +427,19 @@ importers: version: 18.2.0 '@types/vscode': specifier: ^1.83.1 - version: 1.102.0 + version: 1.105.0 '@typescript-eslint/eslint-plugin': specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.26.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -448,10 +448,10 @@ importers: dependencies: '@ai-sdk/amazon-bedrock': specifier: ^3.0.25 - version: 3.0.30(zod@4.1.11) + version: 3.0.51(zod@4.1.11) '@ai-sdk/anthropic': specifier: ^2.0.20 - version: 2.0.23(zod@4.1.11) + version: 2.0.41(zod@4.1.11) '@types/lodash': specifier: ^4.14.200 version: 4.17.17 @@ -478,7 +478,7 @@ importers: version: link:../../wso2-platform/wso2-platform-core ai: specifier: ^5.0.56 - version: 5.0.59(zod@4.1.11) + version: 5.0.87(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -514,7 +514,7 @@ importers: version: 2.1.1 portfinder: specifier: ^1.0.32 - version: 1.0.37 + version: 1.0.38 source-map-support: specifier: ^0.5.21 version: 0.5.21 @@ -575,22 +575,22 @@ importers: version: 10.0.10 '@types/node': specifier: ^18.18.7 - version: 18.19.121 + version: 18.19.130 '@types/tcp-port-used': specifier: ^1.0.3 version: 1.0.4 '@types/vscode': specifier: ^1.83.1 - version: 1.102.0 + version: 1.105.0 '@types/vscode-notebook-renderer': specifier: ~1.72.2 - version: 1.72.3 + version: 1.72.4 adm-zip: specifier: ^0.5.16 version: 0.5.16 axios: specifier: ^1.12.0 - version: 1.12.0 + version: 1.12.2 chai: specifier: ^4.3.10 version: 4.5.0 @@ -638,7 +638,7 @@ importers: version: 1.0.2 ts-loader: specifier: ^9.5.0 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.3) @@ -653,13 +653,13 @@ importers: version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.101.0) + version: 6.0.1(webpack@5.102.1) webpack-merge-and-include-globally: specifier: ^2.3.4 - version: 2.3.4(webpack@5.101.0) + version: 2.3.4(webpack@5.102.1) yarn: specifier: ^1.22.19 version: 1.22.22 @@ -695,16 +695,16 @@ importers: version: 3.2.0(date-fns@4.1.0) dexie: specifier: ^4.0.11 - version: 4.0.11 + version: 4.2.1 graphql: specifier: ^16.11.0 - version: 16.11.0 + version: 16.12.0 handlebars: specifier: ^4.7.8 version: 4.7.8 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) joi: specifier: ^17.13.3 version: 17.13.3 @@ -728,7 +728,7 @@ importers: version: 18.2.0(react@18.2.0) react-intl: specifier: ^7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) + version: 7.1.14(react@18.2.0)(typescript@5.8.3) react-lottie: specifier: ^1.2.10 version: 1.2.10(react@18.2.0) @@ -750,31 +750,31 @@ importers: version: 7.27.2(@babel/core@7.27.7) '@rollup/plugin-commonjs': specifier: ^28.0.3 - version: 28.0.6(rollup@4.46.2) + version: 28.0.9(rollup@4.52.5) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.46.2) + version: 6.1.0(rollup@4.52.5) '@rollup/plugin-node-resolve': specifier: ^16.0.1 - version: 16.0.1(rollup@4.46.2) + version: 16.0.3(rollup@4.52.5) '@storybook/addon-actions': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-essentials': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.101.0) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.102.1) '@storybook/addon-links': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.16 - version: 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -804,34 +804,34 @@ importers: version: 10.0.0 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + version: 5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.102.1) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.101.0) + version: 13.0.1(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) express: specifier: ^5.1.0 version: 5.1.0 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.101.0) + version: 9.1.0(typescript@5.8.3)(webpack@5.102.1) glob: specifier: ^11.0.2 version: 11.0.3 react-scripts-ts: specifier: ^3.1.0 - version: 3.1.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 3.1.0(@swc/core@1.14.0(@swc/helpers@0.5.17))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) react-test-renderer: specifier: ^19.1.0 version: 19.1.1(react@18.2.0) @@ -840,16 +840,16 @@ importers: version: 6.0.1 rollup: specifier: ^4.41.0 - version: 4.46.2 + version: 4.52.5 rollup-plugin-import-css: specifier: ^3.5.8 - version: 3.5.8(rollup@4.46.2) + version: 3.5.8(rollup@4.52.5) rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.46.2) + version: 2.2.4(rollup@4.52.5) rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) rollup-plugin-scss: specifier: ^4.0.1 version: 4.0.1 @@ -858,31 +858,31 @@ importers: version: 2.0.0 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.46.2)(typescript@5.8.3) + version: 0.36.0(rollup@4.52.5)(typescript@5.8.3) sass: specifier: ^1.89.0 - version: 1.90.0 + version: 1.93.3 sass-loader: specifier: ^16.0.5 - version: 16.0.5(sass@1.90.0)(webpack@5.101.0) + version: 16.0.6(sass@1.93.3)(webpack@5.102.1) storybook: specifier: ^8.6.14 version: 8.6.14(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) stylelint: specifier: ^16.19.1 - version: 16.23.0(typescript@5.8.3) + version: 16.25.0(typescript@5.8.3) stylelint-config-standard: specifier: ^38.0.0 - version: 38.0.0(stylelint@16.23.0(typescript@5.8.3)) + version: 38.0.0(stylelint@16.25.0(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.101.0) + version: 8.0.0(webpack@5.102.1) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -900,13 +900,13 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + version: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -946,22 +946,22 @@ importers: version: 18.2.0 '@typescript-eslint/eslint-plugin': specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) + version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1004,7 +1004,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -1034,13 +1034,13 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) '@headlessui/react': specifier: ~2.2.4 - version: 2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hookform/resolvers': specifier: ~5.0.1 version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) '@tanstack/query-core': specifier: ^5.77.1 - version: 5.83.1 + version: 5.90.6 '@tanstack/react-query': specifier: 5.77.1 version: 5.77.1(react@18.2.0) @@ -1133,7 +1133,7 @@ importers: version: 10.1.0(@types/react@18.2.0)(react@18.2.0) react-syntax-highlighter: specifier: ~15.6.1 - version: 15.6.1(react@18.2.0) + version: 15.6.6(react@18.2.0) rehype-raw: specifier: ^7.0.0 version: 7.0.0 @@ -1170,13 +1170,13 @@ importers: version: 1.57.5 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@4.10.0) + version: 5.28.5(webpack-cli@5.1.4) '@typescript-eslint/eslint-plugin': specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -1185,37 +1185,40 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) eslint: specifier: ^9.26.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) + version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.5(sass@1.90.0)(webpack@5.101.0) + version: 16.0.6(sass@1.93.3)(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@4.10.0) + version: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) + version: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -1276,7 +1279,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1315,7 +1318,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -1327,7 +1330,7 @@ importers: version: 19.1.1(react@18.2.0) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1394,7 +1397,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1433,7 +1436,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -1445,7 +1448,7 @@ importers: version: 19.1.1(react@18.2.0) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1475,7 +1478,7 @@ importers: version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@tanstack/query-core': specifier: ^5.77.1 - version: 5.83.1 + version: 5.90.6 '@tanstack/react-query': specifier: 5.77.1 version: 5.77.1(react@18.2.0) @@ -1523,7 +1526,7 @@ importers: version: 3.17.5 zustand: specifier: ^5.0.4 - version: 5.0.7(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.5.0(react@18.2.0)) + version: 5.0.8(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) devDependencies: '@types/blueimp-md5': specifier: ^2.18.2 @@ -1542,34 +1545,34 @@ importers: version: 17.0.26(@types/react@18.2.0) '@typescript-eslint/eslint-plugin': specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) eslint: specifier: ^9.26.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) + version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) react-hook-form: specifier: ~7.56.3 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1593,10 +1596,10 @@ importers: version: 2.4.1 graphiql: specifier: 3.7.0 - version: 3.7.0(@codemirror/language@6.11.2)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 3.7.0(@codemirror/language@6.11.3)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.12.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) graphiql-explorer: specifier: ^0.9.0 - version: 0.9.0(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.9.0(graphql@16.12.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -1612,19 +1615,19 @@ importers: version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-essentials': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.101.0) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.102.1) '@storybook/addon-links': specifier: ^6.5.9 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.9 - version: 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + version: 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + version: 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -1633,34 +1636,34 @@ importers: version: 18.2.0 babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.102.1) css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) graphql: specifier: ^16.11.0 - version: 16.11.0 + version: 16.12.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.9.3(webpack@5.101.0) + version: 2.9.4(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@4.10.0) + version: 5.102.1(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1791,7 +1794,7 @@ importers: version: 5.2.0(eslint@8.57.1) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@8.57.1) + version: 0.4.24(eslint@8.57.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1839,7 +1842,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) html-to-image: specifier: ^1.10.8 version: 1.11.11 @@ -1882,31 +1885,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) ts-loader: specifier: ^9.4.1 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) ../../workspaces/ballerina/record-creator: dependencies: @@ -1963,7 +1966,7 @@ importers: version: 18.2.0(react@18.2.0) react-intl: specifier: ~7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) + version: 7.1.14(react@18.2.0)(typescript@5.8.3) react-lottie: specifier: ~1.2.4 version: 1.2.10(react@18.2.0) @@ -1985,10 +1988,10 @@ importers: version: 2.4.1 eslint: specifier: ~9.26.0 - version: 9.26.0(jiti@2.5.1) + version: 9.26.0(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) + version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.5))(babel-runtime@6.26.0)(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2043,7 +2046,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2058,19 +2061,19 @@ importers: version: 18.2.0 '@typescript-eslint/eslint-plugin': specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ~9.26.0 - version: 9.26.0(jiti@2.5.1) + version: 9.26.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.26.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.26.0(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1)) prettier: specifier: ~3.5.3 version: 3.5.3 @@ -2085,13 +2088,13 @@ importers: version: 11.13.5 '@emotion/react': specifier: ^11.9.3 - version: 11.14.0(@types/react@17.0.87)(react@19.1.0) + version: 11.14.0(@types/react@17.0.89)(react@19.1.0) '@emotion/styled': specifier: ^11.10.5 - version: 11.14.1(@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0))(@types/react@17.0.87)(react@19.1.0) + version: 11.14.1(@emotion/react@11.14.0(@types/react@17.0.89)(react@19.1.0))(@types/react@17.0.89)(react@19.1.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 - version: 4.40.0 + version: 4.41.0 '@tanstack/react-query': specifier: 4.0.10 version: 4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2127,7 +2130,7 @@ importers: version: 4.12.0(react@19.1.0) react-intl: specifier: ^7.1.11 - version: 7.1.11(react@19.1.0)(typescript@4.9.5) + version: 7.1.14(react@19.1.0)(typescript@4.9.5) react-lottie: specifier: ^1.2.3 version: 1.2.10(react@19.1.0) @@ -2143,7 +2146,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2158,7 +2161,7 @@ importers: version: 4.0.9 '@types/react': specifier: ^17.0.37 - version: 17.0.87 + version: 17.0.89 '@types/react-dom': specifier: 17.0.14 version: 17.0.14 @@ -2194,7 +2197,7 @@ importers: version: 9.1.7 lint-staged: specifier: ^16.0.0 - version: 16.1.4 + version: 16.2.6 prettier: specifier: ^3.5.3 version: 3.5.3 @@ -2251,7 +2254,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -2300,31 +2303,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) ts-loader: specifier: ^9.4.1 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) ../../workspaces/ballerina/type-editor: dependencies: @@ -2378,7 +2381,7 @@ importers: version: 18.2.0(react@18.2.0) react-intl: specifier: ^7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) + version: 7.1.14(react@18.2.0)(typescript@5.8.3) react-lottie: specifier: ^1.2.10 version: 1.2.10(react@18.2.0) @@ -2406,10 +2409,10 @@ importers: version: 2.4.1 eslint: specifier: ~9.26.0 - version: 9.26.0(jiti@2.5.1) + version: 9.26.0(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) + version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.5))(babel-runtime@6.26.0)(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2437,7 +2440,7 @@ importers: version: 22.15.18 '@types/vscode': specifier: ^1.84.0 - version: 1.102.0 + version: 1.105.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -2455,7 +2458,7 @@ importers: version: link:../../common-libs/playwright-vscode-tester copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.101.0) + version: 13.0.1(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2467,22 +2470,22 @@ importers: version: 11.0.3 mocha: specifier: ^11.2.2 - version: 11.7.1 + version: 11.7.4 source-map-support: specifier: ^0.5.21 version: 0.5.21 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.101.0) + version: 6.0.1(webpack@5.102.1) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2522,7 +2525,7 @@ importers: version: 1.0.0(tslib@2.8.1) '@vscode/iconv-lite-umd': specifier: ^0.7.0 - version: 0.7.0 + version: 0.7.1 '@vscode/webview-ui-toolkit': specifier: ^1.2.0 version: 1.4.0(react@19.1.0) @@ -2567,7 +2570,7 @@ importers: version: 2.8.1 zustand: specifier: ^5.0.5 - version: 5.0.7(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) + version: 5.0.8(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) devDependencies: '@biomejs/biome': specifier: ^1.8.3 @@ -2589,7 +2592,7 @@ importers: version: 22.15.35 '@types/vscode': specifier: ^1.100.0 - version: 1.102.0 + version: 1.105.0 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -2601,10 +2604,10 @@ importers: version: link:../../common-libs/playwright-vscode-tester axios: specifier: ^1.12.0 - version: 1.12.0 + version: 1.12.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.101.0) + version: 13.0.1(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2613,25 +2616,25 @@ importers: version: 6.0.0 mocha: specifier: ^11.5.0 - version: 11.7.1 + version: 11.7.4 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + version: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-loader: specifier: ~9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 vscode-extension-tester: specifier: ^8.14.1 - version: 8.14.1(mocha@11.7.1)(typescript@5.8.3) + version: 8.14.1(mocha@11.7.4)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.101.0) + version: 6.0.1(webpack@5.102.1) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2646,10 +2649,10 @@ importers: version: 0.8.2 '@headlessui/react': specifier: ^2.2.4 - version: 2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hookform/resolvers': specifier: ^5.0.1 - version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) + version: 5.2.2(react-hook-form@7.56.4(react@18.2.0)) '@tanstack/react-query': specifier: ~4.28.0 version: 4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -2703,7 +2706,7 @@ importers: version: 4.0.1 swagger-ui-react: specifier: ^5.22.0 - version: 5.27.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.30.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) timezone-support: specifier: ^3.1.0 version: 3.1.0 @@ -2746,10 +2749,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) path: specifier: ^0.12.7 version: 0.12.7 @@ -2758,34 +2761,34 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.101.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1) sass-loader: specifier: ^16.0.5 - version: 16.0.5(sass@1.90.0)(webpack@5.101.0) + version: 16.0.6(sass@1.93.3)(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) tailwindcss: specifier: ^3.4.3 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 3.4.18(yaml@2.8.1) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: @@ -2815,7 +2818,7 @@ importers: version: 6.1.1 fs-extra: specifier: ~11.3.0 - version: 11.3.1 + version: 11.3.2 got: specifier: 14.4.7 version: 14.4.7 @@ -2843,10 +2846,10 @@ importers: version: 0.10.11 '@typescript-eslint/eslint-plugin': specifier: ~8.33.0 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.33.0 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2895,7 +2898,7 @@ importers: version: 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@storybook/react-webpack5': specifier: ~7.4.0 - version: 7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) + version: 7.4.6(@babel/core@7.28.5)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -2922,7 +2925,7 @@ importers: version: 4.6.2(eslint@8.57.1) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.20(eslint@8.57.1) + version: 0.4.24(eslint@8.57.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2983,19 +2986,19 @@ importers: devDependencies: '@storybook/addon-docs': specifier: ^9.0.12 - version: 9.1.1(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + version: 9.1.16(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/addon-essentials': specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/cli': specifier: ^9.0.12 - version: 9.1.1(@babel/preset-env@7.27.2(@babel/core@7.27.7))(@testing-library/dom@10.4.1)(prettier@3.5.3) + version: 9.1.16(@babel/preset-env@7.27.2(@babel/core@7.28.5))(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/react': specifier: ^9.0.12 - version: 9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) + version: 9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': specifier: ^9.0.12 - version: 9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.46.2)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) + version: 9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.52.5)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -3028,7 +3031,7 @@ importers: version: 5.2.0(eslint@8.57.1) eslint-plugin-storybook: specifier: ^9.0.12 - version: 9.1.1(eslint@8.57.1)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) + version: 9.1.16(eslint@8.57.1)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -3043,7 +3046,7 @@ importers: version: 6.0.0(react@19.1.0) storybook: specifier: ^9.0.12 - version: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + version: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3052,7 +3055,7 @@ importers: dependencies: '@modelcontextprotocol/inspector': specifier: ^0.17.2 - version: 0.17.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3) + version: 0.17.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3) devDependencies: '@types/mocha': specifier: ^10.0.3 @@ -3062,7 +3065,7 @@ importers: version: 22.15.18 '@types/vscode': specifier: ^1.84.0 - version: 1.102.0 + version: 1.105.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -3077,7 +3080,7 @@ importers: version: 3.4.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.101.0) + version: 13.0.1(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3086,19 +3089,19 @@ importers: version: 8.57.1 mocha: specifier: ^11.2.2 - version: 11.7.1 + version: 11.7.4 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + version: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4) webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack@5.101.0) + specifier: ^5.1.4 + version: 5.1.4(webpack@5.102.1) ../../workspaces/mi/mi-component-diagram: dependencies: @@ -3144,7 +3147,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3187,13 +3190,13 @@ importers: version: 9.27.0 '@typescript-eslint/eslint-plugin': specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3223,7 +3226,7 @@ importers: version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@tanstack/query-core': specifier: ^5.76.2 - version: 5.83.1 + version: 5.90.6 '@tanstack/react-query': specifier: 5.76.2 version: 5.76.2(react@18.2.0) @@ -3277,7 +3280,7 @@ importers: version: 3.17.5 zustand: specifier: ^5.0.5 - version: 5.0.7(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.5.0(react@18.2.0)) + version: 5.0.8(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) devDependencies: '@types/blueimp-md5': specifier: ^2.18.2 @@ -3296,34 +3299,34 @@ importers: version: 18.2.0 '@typescript-eslint/eslint-plugin': specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) + version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) react-hook-form: specifier: 7.56.4 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) ts-morph: specifier: ^22.0.0 version: 22.0.0 @@ -3409,10 +3412,10 @@ importers: version: 2.4.1 eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) html-to-image: specifier: 1.11.11 version: 1.11.11 @@ -3448,7 +3451,7 @@ importers: version: 1.21.3(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-json-view-lite: specifier: latest - version: 2.4.2(react@18.2.0) + version: 2.5.0(react@18.2.0) react-markdown: specifier: ~10.1.0 version: 10.1.0(@types/react@18.2.0)(react@18.2.0) @@ -3488,7 +3491,7 @@ importers: 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) '@storybook/react-webpack5': specifier: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.13.3(@swc/helpers@0.5.17))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.14.0(@swc/helpers@0.5.17))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) '@storybook/test': specifier: ^8.6.14 version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) @@ -3521,7 +3524,7 @@ importers: version: 0.4.14 '@typescript-eslint/eslint-plugin': specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) babel-jest: specifier: 29.7.0 version: 29.7.0(@babel/core@7.27.7) @@ -3533,7 +3536,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -3548,7 +3551,7 @@ importers: version: 8.6.14(prettier@3.5.3) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3575,7 +3578,7 @@ importers: version: 7.27.7 '@babel/plugin-transform-typescript': specifier: ^7.27.1 - version: 7.28.0(@babel/core@7.27.7) + version: 7.28.5(@babel/core@7.27.7) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -3623,7 +3626,7 @@ importers: version: 0.5.16 axios: specifier: ~1.12.0 - version: 1.12.0 + version: 1.12.2 copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3641,7 +3644,7 @@ importers: version: 1.4.11 fs-extra: specifier: ~11.3.0 - version: 11.3.1 + version: 11.3.2 json-schema: specifier: 0.4.0 version: 0.4.0 @@ -3662,16 +3665,16 @@ importers: version: 3.3.2 node-loader: specifier: ~2.1.0 - version: 2.1.0(webpack@5.101.0) + version: 2.1.0(webpack@5.102.1) portfinder: specifier: ^1.0.37 - version: 1.0.37 + version: 1.0.38 recast: specifier: ^0.23.11 version: 0.23.11 tmp: specifier: ~0.2.4 - version: 0.2.4 + version: 0.2.5 to-json-schema: specifier: 0.2.5 version: 0.2.5 @@ -3695,7 +3698,7 @@ importers: version: 1.51.0 vscode-extension-tester: specifier: ~8.14.1 - version: 8.14.1(mocha@11.7.1)(typescript@5.8.3) + version: 8.14.1(mocha@11.7.4)(typescript@5.8.3) vscode-languageclient: specifier: ^9.0.1 version: 9.0.1 @@ -3726,13 +3729,13 @@ importers: version: 22.15.21 '@types/vscode': specifier: ^1.100.0 - version: 1.102.0 + version: 1.105.0 '@typescript-eslint/eslint-plugin': specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3750,13 +3753,13 @@ importers: version: 1.0.1 eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) glob: specifier: ^11.0.2 version: 11.0.3 mocha: specifier: ^11.4.0 - version: 11.7.1 + version: 11.7.4 playwright-core: specifier: ~1.55.1 version: 1.55.1 @@ -3765,7 +3768,7 @@ importers: version: 6.0.1 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -3774,10 +3777,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@4.10.0) + version: 5.102.1(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.101.0) + version: 4.10.0(webpack@5.102.1) yaml: specifier: ~2.8.0 version: 2.8.1 @@ -3814,13 +3817,13 @@ importers: version: 18.2.0 '@typescript-eslint/eslint-plugin': specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3856,10 +3859,10 @@ importers: version: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 - version: 0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + version: 0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@tanstack/query-core': specifier: ^5.76.0 - version: 5.83.1 + version: 5.90.6 '@tanstack/react-query': specifier: 5.76.1 version: 5.76.1(react@18.2.0) @@ -3883,7 +3886,7 @@ importers: version: 1.57.5 '@uiw/react-codemirror': specifier: ~4.23.12 - version: 4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@vscode/webview-ui-toolkit': specifier: ^1.4.0 version: 1.4.0(react@18.2.0) @@ -3958,7 +3961,7 @@ importers: version: 0.1.92(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-syntax-highlighter: specifier: ~15.6.1 - version: 15.6.1(react@18.2.0) + version: 15.6.6(react@18.2.0) swagger-ui-react: specifier: 5.21.0 version: 5.21.0(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -3977,25 +3980,25 @@ importers: devDependencies: '@babel/plugin-syntax-flow': specifier: ~7.27.1 - version: 7.27.1(@babel/core@7.27.7) + version: 7.27.1(@babel/core@7.28.5) '@babel/preset-typescript': specifier: ~7.27.1 - version: 7.27.1(@babel/core@7.27.7) + version: 7.27.1(@babel/core@7.28.5) '@headlessui/react': specifier: ~2.2.4 - version: 2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-actions': specifier: ~8.6.14 - version: 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + version: 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/addon-essentials': specifier: ~8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/addon-links': specifier: ~8.6.14 - version: 8.6.14(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + version: 8.6.14(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/react-webpack5': specifier: ~8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) '@types/lodash': specifier: ~4.17.17 version: 4.17.17 @@ -4016,19 +4019,19 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) sass-loader: specifier: ^16.0.5 - version: 16.0.5(sass@1.90.0)(webpack@5.101.0) + version: 16.0.6(sass@1.93.3)(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4037,13 +4040,13 @@ importers: version: 3.17.5 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@5.1.4) + version: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) + version: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) yaml: specifier: ~2.8.0 version: 2.8.1 @@ -4055,7 +4058,7 @@ importers: version: 22.15.35 eslint: specifier: ~9.27.0 - version: 9.27.0(jiti@2.5.1) + version: 9.27.0(jiti@2.6.1) jsonix: specifier: ~3.0.0 version: 3.0.0 @@ -4071,13 +4074,13 @@ importers: version: 11.2.0(size-limit@11.2.0) '@typescript-eslint/eslint-plugin': specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) + version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -4117,7 +4120,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.862.0 + version: 3.922.0 '@vscode-logging/logger': specifier: ^2.0.0 version: 2.0.0 @@ -4132,7 +4135,7 @@ importers: version: 1.0.0(tslib@2.8.1) '@vscode/iconv-lite-umd': specifier: ^0.7.0 - version: 0.7.0 + version: 0.7.1 '@vscode/webview-ui-toolkit': specifier: ^1.4.0 version: 1.4.0(react@19.1.0) @@ -4177,7 +4180,7 @@ importers: version: 3.25.76 zustand: specifier: ^5.0.5 - version: 5.0.7(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) + version: 5.0.8(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) devDependencies: '@biomejs/biome': specifier: ^1.9.4 @@ -4199,7 +4202,7 @@ importers: version: 22.15.35 '@types/vscode': specifier: ^1.100.0 - version: 1.102.0 + version: 1.105.0 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -4211,10 +4214,10 @@ importers: version: link:../../common-libs/playwright-vscode-tester axios: specifier: ^1.12.0 - version: 1.12.0 + version: 1.12.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.101.0) + version: 13.0.1(webpack@5.102.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -4223,25 +4226,25 @@ importers: version: 6.0.0 mocha: specifier: ^11.5.0 - version: 11.7.1 + version: 11.7.4 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + version: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-loader: specifier: ~9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: ^5.8.3 version: 5.8.3 vscode-extension-tester: specifier: ^8.14.1 - version: 8.14.1(mocha@11.7.1)(typescript@5.8.3) + version: 8.14.1(mocha@11.7.4)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.101.0) + version: 6.0.1(webpack@5.102.1) webpack-permissions-plugin: specifier: ^1.0.10 version: 1.0.10 @@ -4256,7 +4259,7 @@ importers: version: 0.8.2 '@headlessui/react': specifier: ^2.1.2 - version: 2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hookform/resolvers': specifier: 5.2.2 version: 5.2.2(react-hook-form@7.63.0(react@18.2.0)) @@ -4310,7 +4313,7 @@ importers: version: 4.0.1 swagger-ui-react: specifier: ^5.22.0 - version: 5.27.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.30.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) timezone-support: specifier: ^3.1.0 version: 3.1.0 @@ -4353,10 +4356,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.101.0) + version: 7.1.2(webpack@5.102.1) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.0) + version: 6.2.0(webpack@5.102.1) path: specifier: ^0.12.7 version: 0.12.7 @@ -4365,60 +4368,60 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.101.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1) sass-loader: specifier: ^16.0.5 - version: 16.0.5(sass@1.90.0)(webpack@5.101.0) + version: 16.0.6(sass@1.93.3)(webpack@5.102.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.101.0) + version: 5.0.0(webpack@5.102.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.101.0) + version: 4.0.0(webpack@5.102.1) tailwindcss: specifier: ^4.1.7 - version: 4.1.11 + version: 4.1.16 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.102.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.101.0(webpack-cli@6.0.1) + version: 5.102.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) packages: - '@adobe/css-tools@4.4.3': - resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/amazon-bedrock@3.0.30': - resolution: {integrity: sha512-aF21FFpTusWAdXc70bqA8SIFnIfCokwrp4G8efMETIRXIH+N5QGd6UYEMbfMfwx4P9iN9v3oUwsHsRtr87TKPQ==} + '@ai-sdk/amazon-bedrock@3.0.51': + resolution: {integrity: sha512-nPyUZDH9XS5iqgxM2ZPK2kSE1M1UoXdWaqWRqZ7k90BZu32VEreL1Z3pTTo58qEj9OuOkdlQ1oO5DujIE7VDLA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.23': - resolution: {integrity: sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw==} + '@ai-sdk/anthropic@2.0.41': + resolution: {integrity: sha512-ZQebpyE6rM3JoeEyhJXUNDiRfVegw8ZrxT+rB8yurxI5JXDnlGpYQvSPmdR8TQfMbps4YkggfbcOwMeEZaTS+g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@1.0.32': - resolution: {integrity: sha512-TQRIM63EI/ccJBc7RxeB8nq/CnGNnyl7eu5stWdLwL41stkV5skVeZJe0QRvFbaOrwCkgUVE0yrUqJi4tgDC1A==} + '@ai-sdk/gateway@2.0.6': + resolution: {integrity: sha512-FmhR6Tle09I/RUda8WSPpJ57mjPWzhiVVlB50D+k+Qf/PBW0CBtnbAUxlNSR5v+NIZNLTK3C56lhb23ntEdxhQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.10': - resolution: {integrity: sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==} + '@ai-sdk/provider-utils@3.0.16': + resolution: {integrity: sha512-lsWQY9aDXHitw7C1QRYIbVGmgwyT98TF3MfM8alNIXKpdJdi+W782Rzd9f1RyOfgRmZ08gJ2EYNDhWNK7RqpEA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4470,123 +4473,123 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.862.0': - resolution: {integrity: sha512-sPmqv2qKORtGRN51cRoHyTOK/SMejG1snXUQytuximeDPn5e/p6cCsYwOI8QuQNW+/7HbmosEz91lPcbClWXxg==} + '@aws-sdk/client-s3@3.922.0': + resolution: {integrity: sha512-SZRaZUUAHCWfEyBf4SRSPd29ko4uFoJpfd0E/w1meE68XhFB52FTtz/71UqYcwqZmN+s7oUNFFZT+DE/dnQSEA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.862.0': - resolution: {integrity: sha512-zHf7Bn22K09BdFgiGg6yWfy927djGhs58KB5qpqD2ie7u796TvetPH14p6UUAOGyk6aah+wR/WLFFoc+51uADA==} + '@aws-sdk/client-sso@3.922.0': + resolution: {integrity: sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.862.0': - resolution: {integrity: sha512-oJ5Au3QCAQmOmh7PD7dUxnPDxWsT9Z95XEOiJV027//11pwRSUMiNSvW8srPa3i7CZRNjz5QHX6O4KqX9PxNsQ==} + '@aws-sdk/core@3.922.0': + resolution: {integrity: sha512-EvfP4cqJfpO3L2v5vkIlTkMesPtRwWlMfsaW6Tpfm7iYfBOuTi6jx60pMDMTyJNVfh6cGmXwh/kj1jQdR+w99Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.862.0': - resolution: {integrity: sha512-/nafSJMuixcrCN1SmsOBIQ5m1fhr9ZnCxw3JZD9qJm3yNXhAshqAC+KcA3JGFnvdBVLhY/pUpdoQmxZmuFJItQ==} + '@aws-sdk/credential-provider-env@3.922.0': + resolution: {integrity: sha512-WikGQpKkROJSK3D3E7odPjZ8tU7WJp5/TgGdRuZw3izsHUeH48xMv6IznafpRTmvHcjAbDQj4U3CJZNAzOK/OQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.862.0': - resolution: {integrity: sha512-JnF3vH6GxvPuMGSI5QsmVlmWc0ebElEiJvUGByTMSr/BfzywZdJBKzPVqViwNqAW5cBWiZ/rpL+ekZ24Nb0Vow==} + '@aws-sdk/credential-provider-http@3.922.0': + resolution: {integrity: sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.862.0': - resolution: {integrity: sha512-LkpZ2S9DQCTHTPu1p0Qg5bM5DN/b/cEflW269RoeuYpiznxdV8r/mqYuhh/VPXQKkBZdiILe4/OODtg+vk4S0A==} + '@aws-sdk/credential-provider-ini@3.922.0': + resolution: {integrity: sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.862.0': - resolution: {integrity: sha512-4+X/LdEGPCBMlhn6MCcNJ5yJ8k+yDXeSO1l9X49NNQiG60SH/yObB3VvotcHWC+A3EEZx4dOw/ylcPt86e7Irg==} + '@aws-sdk/credential-provider-node@3.922.0': + resolution: {integrity: sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.862.0': - resolution: {integrity: sha512-bR/eRCjRsilAuaUpNzTWWE4sUxJC4k571+4LLxE6Xo+0oYHfH+Ih00+sQRX06s4SqZZROdppissm3OOr5d26qA==} + '@aws-sdk/credential-provider-process@3.922.0': + resolution: {integrity: sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.862.0': - resolution: {integrity: sha512-1E1rTKWJAbzN/uiIXFPCVAS2PrZgy87O6BEO69404bI7o/iYHOfohfn66bdSqBnZ7Tn/hFJdCk6i23U3pibf5w==} + '@aws-sdk/credential-provider-sso@3.922.0': + resolution: {integrity: sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.862.0': - resolution: {integrity: sha512-Skv07eOS4usDf/Bna3FWKIo0/35qhxb22Z/OxrbNtx2Hxa/upp42S+Y6fA9qzgLqXMNYDZngKYwwMPtzrbkMAg==} + '@aws-sdk/credential-provider-web-identity@3.922.0': + resolution: {integrity: sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.862.0': - resolution: {integrity: sha512-Wcsc7VPLjImQw+CP1/YkwyofMs9Ab6dVq96iS8p0zv0C6YTaMjvillkau4zFfrrrTshdzFWKptIFhKK8Zsei1g==} + '@aws-sdk/middleware-bucket-endpoint@3.922.0': + resolution: {integrity: sha512-Dpr2YeOaLFqt3q1hocwBesynE3x8/dXZqXZRuzSX/9/VQcwYBFChHAm4mTAl4zuvArtDbLrwzWSxmOWYZGtq5w==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.862.0': - resolution: {integrity: sha512-oG3AaVUJ+26p0ESU4INFn6MmqqiBFZGrebST66Or+YBhteed2rbbFl7mCfjtPWUFgquQlvT1UP19P3LjQKeKpw==} + '@aws-sdk/middleware-expect-continue@3.922.0': + resolution: {integrity: sha512-xmnLWMtmHJHJBupSWMUEW1gyxuRIeQ1Ov2xa8Tqq77fPr4Ft2AluEwiDMaZIMHoAvpxWKEEt9Si59Li7GIA+bQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.862.0': - resolution: {integrity: sha512-3PuTNJs43GmtNIfj4R/aNPGX6lfIq0gjfekVPUO/MnP/eV+RVgkCvEqWYyN6RZyOzrzsJydXbmydwLHAwMzxiw==} + '@aws-sdk/middleware-flexible-checksums@3.922.0': + resolution: {integrity: sha512-G363np7YcJhf+gBucskdv8cOTbs2TRwocEzRupuqDIooGDlLBlfJrvwehdgtWR8l53yjJR3zcHvGrVPTe2h8Nw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.862.0': - resolution: {integrity: sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==} + '@aws-sdk/middleware-host-header@3.922.0': + resolution: {integrity: sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.862.0': - resolution: {integrity: sha512-MnwLxCw7Cc9OngEH3SHFhrLlDI9WVxaBkp3oTsdY9JE7v8OE38wQ9vtjaRsynjwu0WRtrctSHbpd7h/QVvtjyA==} + '@aws-sdk/middleware-location-constraint@3.922.0': + resolution: {integrity: sha512-T4iqd7WQ2DDjCH/0s50mnhdoX+IJns83ZE+3zj9IDlpU0N2aq8R91IG890qTfYkUEdP9yRm0xir/CNed+v6Dew==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.862.0': - resolution: {integrity: sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==} + '@aws-sdk/middleware-logger@3.922.0': + resolution: {integrity: sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.862.0': - resolution: {integrity: sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==} + '@aws-sdk/middleware-recursion-detection@3.922.0': + resolution: {integrity: sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.862.0': - resolution: {integrity: sha512-rDRHxxZuY9E7py/OVYN1VQRAw0efEThvK5sZ3HfNNpL6Zk4HeOGtc6NtULSfeCeyHCVlJsdOVkIxJge2Ax5vSA==} + '@aws-sdk/middleware-sdk-s3@3.922.0': + resolution: {integrity: sha512-ygg8lME1oFAbsH42ed2wtGqfHLoT5irgx6VC4X98j79fV1qXEwwwbqMsAiMQ/HJehpjqAFRVsHox3MHLN48Z5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.862.0': - resolution: {integrity: sha512-72VtP7DZC8lYTE2L3Efx2BrD98oe9WTK8X6hmd3WTLkbIjvgWQWIdjgaFXBs8WevsXkewIctfyA3KEezvL5ggw==} + '@aws-sdk/middleware-ssec@3.922.0': + resolution: {integrity: sha512-eHvSJZTSRJO+/tjjGD6ocnPc8q9o3m26+qbwQTu/4V6yOJQ1q+xkDZNqwJQphL+CodYaQ7uljp8g1Ji/AN3D9w==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.862.0': - resolution: {integrity: sha512-7OOaGbAw7Kg1zoKO9wV8cA5NnJC+RYsocjmP3FZ0FiKa7gbmeQ6Cfheunzd1Re9fgelgL3OIRjqO5mSmOIhyhA==} + '@aws-sdk/middleware-user-agent@3.922.0': + resolution: {integrity: sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.862.0': - resolution: {integrity: sha512-fPrfXa+m9S0DA5l8+p4A9NFQ22lEHm/ezaUWWWs6F3/U49lR6yKhNAGji3LlIG7b7ZdTJ3smAcaxNHclJsoQIg==} + '@aws-sdk/nested-clients@3.922.0': + resolution: {integrity: sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.862.0': - resolution: {integrity: sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==} + '@aws-sdk/region-config-resolver@3.922.0': + resolution: {integrity: sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.862.0': - resolution: {integrity: sha512-ZAjrbXnu3yTxXMPiEVxDP/I8zfssrLQGgUi0NgJP6Cz/mOS/S/3hfOZrMown1jLhkTrzLpjNE8Q2n18VtRbScQ==} + '@aws-sdk/signature-v4-multi-region@3.922.0': + resolution: {integrity: sha512-mmsgEEL5pE+A7gFYiJMDBCLVciaXq4EFI5iAP7bPpnHvOplnNOYxVy2IreKMllGvrfjVyLnwxzZYlo5zZ65FWg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.862.0': - resolution: {integrity: sha512-p3u7aom3WQ7ArFByNbccRIkCssk5BB4IUX9oFQa2P0MOFCbkKFBLG7WMegRXhq5grOHmI4SRftEDDy3CcoTqSQ==} + '@aws-sdk/token-providers@3.922.0': + resolution: {integrity: sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.862.0': - resolution: {integrity: sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==} + '@aws-sdk/types@3.922.0': + resolution: {integrity: sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-arn-parser@3.804.0': - resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.862.0': - resolution: {integrity: sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==} + '@aws-sdk/util-endpoints@3.922.0': + resolution: {integrity: sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.804.0': - resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.862.0': - resolution: {integrity: sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==} + '@aws-sdk/util-user-agent-browser@3.922.0': + resolution: {integrity: sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA==} - '@aws-sdk/util-user-agent-node@3.862.0': - resolution: {integrity: sha512-KtJdSoa1Vmwquy+zwiqRQjtsuKaHlVcZm8tsTchHbc6809/VeaC+ZZOqlil9IWOOyWNGIX8GTRwP9TEb8cT5Gw==} + '@aws-sdk/util-user-agent-node@3.922.0': + resolution: {integrity: sha512-NrPe/Rsr5kcGunkog0eBV+bY0inkRELsD2SacC4lQZvZiXf8VJ2Y7j+Yq1tB+h+FPLsdt3v9wItIvDf/laAm0Q==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -4594,8 +4597,12 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.862.0': - resolution: {integrity: sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==} + '@aws-sdk/xml-builder@3.921.0': + resolution: {integrity: sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.1.1': + resolution: {integrity: sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==} engines: {node: '>=18.0.0'} '@azu/format-text@1.0.2': @@ -4608,52 +4615,52 @@ packages: resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} - '@azure/core-auth@1.10.0': - resolution: {integrity: sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow==} + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} engines: {node: '>=20.0.0'} - '@azure/core-client@1.10.0': - resolution: {integrity: sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g==} + '@azure/core-client@1.10.1': + resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} engines: {node: '>=20.0.0'} - '@azure/core-rest-pipeline@1.22.0': - resolution: {integrity: sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw==} + '@azure/core-rest-pipeline@1.22.1': + resolution: {integrity: sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==} engines: {node: '>=20.0.0'} - '@azure/core-tracing@1.3.0': - resolution: {integrity: sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw==} + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} engines: {node: '>=20.0.0'} - '@azure/core-util@1.13.0': - resolution: {integrity: sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw==} + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} engines: {node: '>=20.0.0'} - '@azure/identity@4.11.1': - resolution: {integrity: sha512-0ZdsLRaOyLxtCYgyuqyWqGU5XQ9gGnjxgfoNTt1pvELGkkUFrMATABZFIq8gusM7N1qbqpVtwLOhk0d/3kacLg==} + '@azure/identity@4.13.0': + resolution: {integrity: sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==} engines: {node: '>=20.0.0'} '@azure/logger@1.3.0': resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.19.0': - resolution: {integrity: sha512-g6Ea+sJmK7l5NUyrPhtD7DNj/tZcsr6VTNNLNuYs8yPvL3HNiIpO/0kzXntF9AqJ/6L+uz9aHmoT1x+RNq6zBQ==} + '@azure/msal-browser@4.26.0': + resolution: {integrity: sha512-Ie3SZ4IMrf9lSwWVzzJrhTPE+g9+QDUfeor1LKMBQzcblp+3J/U1G8hMpNSfLL7eA5F/DjjPXkATJ5JRUdDJLA==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.10.0': - resolution: {integrity: sha512-+cGnma71NV3jzl6DdgdHsqriN4ZA7puBIzObSYCvcIVGMULGb2NrcOGV6IJxO06HoVRHFKijkxd9lcBvS063KQ==} + '@azure/msal-common@15.13.1': + resolution: {integrity: sha512-vQYQcG4J43UWgo1lj7LcmdsGUKWYo28RfEvDQAEMmQIMjSFufvb+pS0FJ3KXmrPmnWlt1vHDl3oip6mIDUQ4uA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.7.0': - resolution: {integrity: sha512-WsL11pT0hnoIr/4NCjG6uJswkmNA/9AgEre4mSQZS2e+ZPKUWwUdA5nCTnr4n1FMT1O5ezSEiJushnPW25Y+dA==} + '@azure/msal-node@3.8.1': + resolution: {integrity: sha512-HszfqoC+i2C9+BRDQfuNUGp15Re7menIhCEbFCQ49D3KaqEDrgZIgQ8zSct4T59jWeUIL9N/Dwiv4o2VueTdqQ==} engines: {node: '>=16'} '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} '@babel/core@7.12.9': @@ -4664,8 +4671,12 @@ packages: resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -4676,14 +4687,14 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4707,16 +4718,16 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4752,29 +4763,29 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.2': - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4797,8 +4808,8 @@ packages: peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5024,8 +5035,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.0': - resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + '@babel/plugin-transform-block-scoping@7.28.5': + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5036,14 +5047,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.0': - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5054,8 +5065,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.0': - resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5084,8 +5095,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + '@babel/plugin-transform-exponentiation-operator@7.28.5': + resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5126,8 +5137,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5150,8 +5161,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5186,8 +5197,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.0': - resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5204,8 +5215,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-optional-chaining@7.28.5': + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5258,8 +5269,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.1': - resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5306,8 +5317,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.0': - resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5371,37 +5382,37 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.27.1': - resolution: {integrity: sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==} + '@babel/register@7.28.3': + resolution: {integrity: sha512-CieDOtd8u208eI49bYl4z1J22ySFw87IGwE+IswFEExH7e3rLgKb0WNQeumnacQ1+VoDJLYI5QFA3AJZuyZQfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.28.2': - resolution: {integrity: sha512-FVFaVs2/dZgD3Y9ZD+AKNKjyGKzwu0C54laAXWUXgLcVXcCX6YZ6GhK2cp7FogSN2OA0Fu+QT8dP3FUdo9ShSQ==} + '@babel/runtime-corejs3@7.28.4': + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.28.2': - resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.1': resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - '@bazel/runfiles@6.3.1': - resolution: {integrity: sha512-1uLNT5NZsUVIGS4syuHwTzZ8HycMPyr6POA3FCE4GbMtc4rhoJk8aZKtNIRthJYfL+iioppi+rTfH3olMPr9nA==} + '@bazel/runfiles@6.5.0': + resolution: {integrity: sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -5463,16 +5474,25 @@ packages: cpu: [x64] os: [win32] + '@cacheable/memoize@2.0.3': + resolution: {integrity: sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==} + + '@cacheable/memory@2.0.4': + resolution: {integrity: sha512-cCmJKCKlT1t7hNBI1+gFCwmKFd9I4pS3zqBeNGXTSODnpa0EeDmORHY8oEMTuozfdg3cgsVh8ojLaPYb6eC7Cg==} + + '@cacheable/utils@2.2.0': + resolution: {integrity: sha512-7xaQayO3msdVcxXLYcLU5wDqJBNdQcPPPHr6mdTEIQI7N7TbtSVVTpWOTfjyhg0L6AQwQdq7miKdWtTDBoBldQ==} + '@cnakazawa/watch@1.0.4': resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} engines: {node: '>=0.1.95'} hasBin: true - '@codemirror/autocomplete@6.18.6': - resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} + '@codemirror/autocomplete@6.19.1': + resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} - '@codemirror/commands@6.8.1': - resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + '@codemirror/commands@6.10.0': + resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==} '@codemirror/lang-angular@0.1.4': resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} @@ -5495,6 +5515,9 @@ packages: '@codemirror/lang-javascript@6.2.4': resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} + '@codemirror/lang-jinja@6.0.0': + resolution: {integrity: sha512-47MFmRcR8UAxd8DReVgj7WJN1WSAMT7OJnewwugZM4XiHWkOjgJQqvEM1NpMj9ALMPyxmlziEI1opH9IaEvmaw==} + '@codemirror/lang-json@6.0.2': resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} @@ -5504,8 +5527,8 @@ packages: '@codemirror/lang-liquid@6.3.0': resolution: {integrity: sha512-fY1YsUExcieXRTsCiwX/bQ9+PbCTA/Fumv7C7mTUZHoFkibfESnaXwpr2aKH6zZVwysEunsHHkaIpM/pl3xETQ==} - '@codemirror/lang-markdown@6.4.0': - resolution: {integrity: sha512-ZeArR54seh4laFbUTVy0ZmQgO+C/cxxlW4jEoQMhL3HALScBpZBeZcLzrQmJsTEx4is9GzOe0bFAke2B1KZqeA==} + '@codemirror/lang-markdown@6.5.0': + resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} '@codemirror/lang-php@6.0.2': resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} @@ -5534,11 +5557,11 @@ packages: '@codemirror/lang-yaml@6.1.2': resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} - '@codemirror/language-data@6.5.1': - resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} + '@codemirror/language-data@6.5.2': + resolution: {integrity: sha512-CPkWBKrNS8stYbEU5kwBwTf3JB1kghlbh4FSAwzGW2TEscdeHHH4FGysREW86Mqnj3Qn09s0/6Ea/TutmoTobg==} - '@codemirror/language@6.11.2': - resolution: {integrity: sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw==} + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} '@codemirror/legacy-modes@6.5.2': resolution: {integrity: sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==} @@ -5546,8 +5569,8 @@ packages: '@codemirror/lint@6.8.5': resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} - '@codemirror/merge@6.11.0': - resolution: {integrity: sha512-Wu5Camx8u0jKA4yV3IxcWGMIoXUxuptsbWW9kTje8d/NInnnALeyQaxcVssJznp9FRnu4As3qsBhacERyB9p6w==} + '@codemirror/merge@6.11.1': + resolution: {integrity: sha512-NleJ//mSmcal3jRdm9WwOVMUaJWvP2h69K96z3xTDJnde/nsMnLt9qfKUBkycWm5iO3/g4Zd69XTuTFErTZ72A==} '@codemirror/search@6.5.11': resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} @@ -5558,8 +5581,8 @@ packages: '@codemirror/theme-one-dark@6.1.3': resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} - '@codemirror/view@6.38.1': - resolution: {integrity: sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==} + '@codemirror/view@6.38.6': + resolution: {integrity: sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==} '@codesandbox/nodebox@0.1.8': resolution: {integrity: sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==} @@ -5608,8 +5631,8 @@ packages: peerDependencies: postcss-selector-parser: ^7.0.0 - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} '@date-io/core@3.2.0': resolution: {integrity: sha512-hqwXvY8/YBsT9RwQITG868ZNb1MVFFkF7W1Ecv4P472j/ZWa7EFcgSmxy8PUElNVZfvhdvfv+a8j6NWJqOX5mA==} @@ -5630,8 +5653,8 @@ packages: resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} - '@dual-bundle/import-meta-resolve@4.1.0': - resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + '@dual-bundle/import-meta-resolve@4.2.1': + resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -5648,8 +5671,8 @@ packages: '@emotion/is-prop-valid@0.8.8': resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - '@emotion/is-prop-valid@1.3.1': - resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} '@emotion/memoize@0.7.4': resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} @@ -5696,170 +5719,170 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.20.1': @@ -5878,8 +5901,8 @@ packages: resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@2.1.4': @@ -5902,12 +5925,12 @@ packages: resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fal-works/esbuild-plugin-global-externals@2.1.2': @@ -5916,11 +5939,11 @@ packages: '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/dom@1.7.3': - resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - '@floating-ui/react-dom@2.1.5': - resolution: {integrity: sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q==} + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -5934,23 +5957,23 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@formatjs/ecma402-abstract@2.3.4': - resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} + '@formatjs/ecma402-abstract@2.3.6': + resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} '@formatjs/fast-memoize@2.2.7': resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} - '@formatjs/icu-messageformat-parser@2.11.2': - resolution: {integrity: sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==} + '@formatjs/icu-messageformat-parser@2.11.4': + resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} - '@formatjs/icu-skeleton-parser@1.8.14': - resolution: {integrity: sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==} + '@formatjs/icu-skeleton-parser@1.8.16': + resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} - '@formatjs/intl-localematcher@0.6.1': - resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} + '@formatjs/intl-localematcher@0.6.2': + resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} - '@formatjs/intl@3.1.6': - resolution: {integrity: sha512-tDkXnA4qpIFcDWac8CyVJq6oW8DR7W44QDUBsfXWIIJD/FYYen0QoH46W7XsVMFfPOVKkvbufjboZrrWbEfmww==} + '@formatjs/intl@3.1.8': + resolution: {integrity: sha512-LWXgwI5zTMatvR8w8kCNh/priDTOF/ZssokMBHJ7ZWXFoYLVOYo0EJERD9Eajv+xsfQO1QkuAt77KWQ1OI4mOQ==} peerDependencies: typescript: ^5.6.0 peerDependenciesMeta: @@ -5995,8 +6018,8 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - '@headlessui/react@2.2.7': - resolution: {integrity: sha512-WKdTymY8Y49H8/gUc/lIyYK1M+/6dq0Iywh4zTZVAaiTDprRfioxSgD0wnXTQTBpjpGJuTL1NO/mqEvc//5SSg==} + '@headlessui/react@2.2.9': + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -6026,8 +6049,8 @@ packages: resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/config-array@0.13.0': @@ -6043,10 +6066,6 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -6201,21 +6220,24 @@ packages: typescript: optional: true - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -6229,8 +6251,8 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/buffers@1.0.0': - resolution: {integrity: sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==} + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6241,14 +6263,14 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.8.0': - resolution: {integrity: sha512-paJGjyBTRzfgkqhIyer992g21aSKuu9h//zGS7aqm795roD6VYFf6iU9NYua1Bndmh/NRPkjtm9+hEPkK0yZSw==} + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/json-pointer@1.0.1': - resolution: {integrity: sha512-tJpwQfuBuxqZlyoJOSZcqf7OUmiYQ6MiPNmOv4KbZdXE/DdvBSSAwhos0zIlJU/AXxC8XpuO8p08bh2fIl+RKA==} + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6262,8 +6284,14 @@ packages: '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@keyv/serialize@1.1.0': - resolution: {integrity: sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==} + '@keyv/bigmap@1.1.0': + resolution: {integrity: sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.5.3 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -6339,8 +6367,8 @@ packages: peerDependencies: yjs: '>=13.5.22' - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + '@lezer/common@1.3.0': + resolution: {integrity: sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==} '@lezer/cpp@1.1.3': resolution: {integrity: sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==} @@ -6351,8 +6379,8 @@ packages: '@lezer/go@1.0.1': resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==} - '@lezer/highlight@1.2.1': - resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + '@lezer/highlight@1.2.3': + resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} '@lezer/html@1.3.12': resolution: {integrity: sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==} @@ -6366,11 +6394,11 @@ packages: '@lezer/json@1.0.3': resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + '@lezer/lr@1.4.3': + resolution: {integrity: sha512-yenN5SqAxAPv/qMnpWW0AT7l+SxVrgG+u0tNsRQWqbrz66HIl8DnEbBObvy21J5K7+I1v7gsAnlE2VQ5yYVSeA==} - '@lezer/markdown@1.4.3': - resolution: {integrity: sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg==} + '@lezer/markdown@1.6.0': + resolution: {integrity: sha512-AXb98u3M6BEzTnreBnGtQaF7xFTiMA92Dsy5tqEjpacbjRxDSFdN4bKJo9uvU4cEEOS7D2B9MT7kvDgOEIzJSw==} '@lezer/php@1.0.5': resolution: {integrity: sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==} @@ -6406,8 +6434,8 @@ packages: peerDependencies: react: '>=16' - '@mdx-js/react@3.1.0': - resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: '@types/react': '>=16' react: '>=16' @@ -6429,32 +6457,32 @@ packages: react: '>= 18 || >= 19' react-dom: '>= 18 || >= 19' - '@microsoft/1ds-core-js@4.3.9': - resolution: {integrity: sha512-T8s5qROH7caBNiFrUpN8vgC6wg7QysVPryZKprgl3kLQQPpoMFM6ffIYvUWD74KM9fWWLU7vzFFNBWDBsrTyWg==} + '@microsoft/1ds-core-js@4.3.10': + resolution: {integrity: sha512-5fSZmkGwWkH+mrIA5M1GYPZdPM+SjXwCCl2Am7VhFoVwOBJNhRnwvIpAdzw6sFjiebN/rz+/YH0NdxztGZSa9Q==} - '@microsoft/1ds-post-js@4.3.9': - resolution: {integrity: sha512-BvxI4CW8Ws+gfXKy+Y/9pmEXp88iU1GYVjkUfqXP7La59VHARTumlG5iIgMVvaifOrvSW7G6knvQM++0tEfMBQ==} + '@microsoft/1ds-post-js@4.3.10': + resolution: {integrity: sha512-VSLjc9cT+Y+eTiSfYltJHJCejn8oYr0E6Pq2BMhOEO7F6IyLGYIxzKKvo78ze9x+iHX7KPTATcZ+PFgjGXuNqg==} - '@microsoft/applicationinsights-channel-js@3.3.9': - resolution: {integrity: sha512-/yEgSe6vT2ycQJkXu6VF04TB5XBurk46ECV7uo6KkNhWyDEctAk1VDWB7EqXYdwLhKMbNOYX1pvz7fj43fGNqg==} + '@microsoft/applicationinsights-channel-js@3.3.10': + resolution: {integrity: sha512-iolFLz1ocWAzIQqHIEjjov3gNTPkgFQ4ArHnBcJEYoffOGWlJt6copaevS5YPI5rHzmbySsengZ8cLJJBBrXzQ==} peerDependencies: tslib: '>= 1.0.0' - '@microsoft/applicationinsights-common@3.3.9': - resolution: {integrity: sha512-IgruOuDBxmBK9jYo7SqLJG7Z9OwmAmlvHET49srpN6pqQlEjRpjD1nfA3Ps4RSEbF89a/ad2phQaBp8jvm122g==} + '@microsoft/applicationinsights-common@3.3.10': + resolution: {integrity: sha512-RVIenPIvNgZCbjJdALvLM4rNHgAFuHI7faFzHCgnI6S2WCUNGHeXlQTs9EUUrL+n2TPp9/cd0KKMILU5VVyYiA==} peerDependencies: tslib: '>= 1.0.0' - '@microsoft/applicationinsights-core-js@3.3.9': - resolution: {integrity: sha512-xliiE9H09xCycndlua4QjajN8q5k/ET6VCv+e0Jjodxr9+cmoOP/6QY9dun9ptokuwR8TK0qOaIJ8z4fgslVSA==} + '@microsoft/applicationinsights-core-js@3.3.10': + resolution: {integrity: sha512-5yKeyassZTq2l+SAO4npu6LPnbS++UD+M+Ghjm9uRzoBwD8tumFx0/F8AkSVqbniSREd+ztH/2q2foewa2RZyg==} peerDependencies: tslib: '>= 1.0.0' '@microsoft/applicationinsights-shims@3.0.1': resolution: {integrity: sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==} - '@microsoft/applicationinsights-web-basic@3.3.9': - resolution: {integrity: sha512-8tLaAgsCpWjoaxit546RqeuECnHQPBLnOZhzTYG76oPG1ku7dNXaRNieuZLbO+XmAtg/oxntKLAVoPND8NRgcA==} + '@microsoft/applicationinsights-web-basic@3.3.10': + resolution: {integrity: sha512-AZib5DAT3NU0VT0nLWEwXrnoMDDgZ/5S4dso01CNU5ELNxLdg+1fvchstlVdMy4FrAnxzs8Wf/GIQNFYOVgpAw==} peerDependencies: tslib: '>= 1.0.0' @@ -6492,10 +6520,6 @@ packages: engines: {node: '>=22.7.5'} hasBin: true - '@modelcontextprotocol/sdk@1.17.1': - resolution: {integrity: sha512-CPle1OQehbWqd25La9Ack5B07StKIxh4+Bf19qnpZKJC1oI22Y0czZHbifjw1UoczIfKBwBDAp/dFxvHG13B5A==} - engines: {node: '>=18'} - '@modelcontextprotocol/sdk@1.21.0': resolution: {integrity: sha512-YFBsXJMFCyI1zP98u7gezMFKX4lgu/XpoZJk7ufI6UlFKXLj2hAMUuRlQX/nrmIPOmhRrG6tw2OQ2ZA/ZlXYpQ==} engines: {node: '>=18'} @@ -6505,8 +6529,8 @@ packages: '@cfworker/json-schema': optional: true - '@monaco-editor/loader@1.5.0': - resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} + '@monaco-editor/loader@1.6.1': + resolution: {integrity: sha512-w3tEnj9HYEC73wtjdpR089AqkUPskFRcdkxsiSFt3SoUc3OHpmu+leP94CXBm4mHfefmhsdfI0ZQu6qJ0wgtPg==} '@monaco-editor/react@4.7.0': resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} @@ -6815,9 +6839,6 @@ packages: '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - '@radix-ui/primitive@1.1.2': - resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} - '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} @@ -6922,8 +6943,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.14': - resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -6966,19 +6987,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dismissable-layer@1.1.10': - resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-dismissable-layer@1.1.11': resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: @@ -6992,8 +7000,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.15': - resolution: {integrity: sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==} + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7014,15 +7022,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-guards@1.1.2': - resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-focus-guards@1.1.3': resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: @@ -7094,8 +7093,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.1.15': - resolution: {integrity: sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==} + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7133,19 +7132,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.7': - resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-popper@1.2.8': resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} peerDependencies: @@ -7185,19 +7171,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.4': - resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: @@ -7237,19 +7210,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.1.10': - resolution: {integrity: sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-roving-focus@1.1.11': resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} peerDependencies: @@ -7359,8 +7319,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toggle-group@1.1.10': - resolution: {integrity: sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==} + '@radix-ui/react-toggle-group@1.1.11': + resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7372,8 +7332,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toggle@1.1.9': - resolution: {integrity: sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==} + '@radix-ui/react-toggle@1.1.10': + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7385,8 +7345,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toolbar@1.1.10': - resolution: {integrity: sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A==} + '@radix-ui/react-toolbar@1.1.11': + resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7398,8 +7358,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.2.7': - resolution: {integrity: sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==} + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7578,14 +7538,14 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-aria/focus@3.21.0': - resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==} + '@react-aria/focus@3.21.2': + resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.25.4': - resolution: {integrity: sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==} + '@react-aria/interactions@3.25.6': + resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -7596,8 +7556,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.30.0': - resolution: {integrity: sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==} + '@react-aria/utils@3.31.0': + resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -7629,19 +7589,19 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.31.0': - resolution: {integrity: sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==} + '@react-types/shared@3.32.1': + resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@redhat-developer/locators@1.15.0': - resolution: {integrity: sha512-xxkCoCQsqiA7IVR5kdNfU3MnuT9QSYDeu0KXrwW59FMCcZpUftz6uiQkqgbB212ASlS3mxVhyYpqJan4zr+XtA==} + '@redhat-developer/locators@1.17.0': + resolution: {integrity: sha512-CPDrTJfrA5lxXPd64RHuntq+foRorMIOQAN0tlaQQD5wX0X2xlCOf324TVWS1hmTiYHtA8VfFTJNOjMQYvu0Mw==} peerDependencies: '@redhat-developer/page-objects': '>=1.0.0' selenium-webdriver: '>=4.6.1' - '@redhat-developer/page-objects@1.15.0': - resolution: {integrity: sha512-Mfr7rVcFB+J16VzLbbqLF9Yo1W7G2bgjkVv0vPUrlkz1dgYdAjZpaQpjs6dVlRO5Uopt11loYu4SS+wnxPopMw==} + '@redhat-developer/page-objects@1.17.0': + resolution: {integrity: sha512-KytdvW8iHyECmt7rLf/MWdrtHmUi/SIkgWowjscIx0+U6sgXW7hHZ/5/gWP5HGX0Q5K1AA67veC75x2eZosN2g==} peerDependencies: selenium-webdriver: '>=4.6.1' typescript: '>=4.6.2' @@ -7663,8 +7623,8 @@ packages: peerDependencies: rollup: ^1.20.0||^2.0.0 - '@rollup/plugin-commonjs@28.0.6': - resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} + '@rollup/plugin-commonjs@28.0.9': + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -7686,8 +7646,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.1': - resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -7716,8 +7676,8 @@ packages: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -7725,103 +7685,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.46.2': - resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.46.2': - resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.46.2': - resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.46.2': - resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.46.2': - resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.46.2': - resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': - resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.46.2': - resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.46.2': - resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.46.2': - resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': - resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.46.2': - resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.46.2': - resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.46.2': - resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.46.2': - resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.46.2': - resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.46.2': - resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.46.2': - resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.46.2': - resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.46.2': - resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] @@ -7904,14 +7874,18 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@sindresorhus/is@7.0.2': - resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + '@sindresorhus/is@7.1.1': + resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} engines: {node: '>=18'} '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -7938,218 +7912,225 @@ packages: peerDependencies: size-limit: 11.2.0 - '@smithy/abort-controller@4.0.5': - resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==} + '@smithy/abort-controller@4.2.4': + resolution: {integrity: sha512-Z4DUr/AkgyFf1bOThW2HwzREagee0sB5ycl+hDiSZOfRLW8ZgrOjDi6g8mHH19yyU5E2A/64W3z6SMIf5XiUSQ==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.0.0': - resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + '@smithy/chunked-blob-reader-native@4.2.1': + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.0.0': - resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + '@smithy/chunked-blob-reader@5.2.0': + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.5': - resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==} + '@smithy/config-resolver@4.4.1': + resolution: {integrity: sha512-BciDJ5hkyYEGBBKMbjGB1A/Zq8bYZ41Zo9BMnGdKF6QD1fY4zIkYx6zui/0CHaVGnv6h0iy8y4rnPX9CPCAPyQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.8.0': - resolution: {integrity: sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==} + '@smithy/core@3.17.2': + resolution: {integrity: sha512-n3g4Nl1Te+qGPDbNFAYf+smkRVB+JhFsGy9uJXXZQEufoP4u0r+WLh6KvTDolCswaagysDc/afS1yvb2jnj1gQ==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.7': - resolution: {integrity: sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==} + '@smithy/credential-provider-imds@4.2.4': + resolution: {integrity: sha512-YVNMjhdz2pVto5bRdux7GMs0x1m0Afz3OcQy/4Yf9DH4fWOtroGH7uLvs7ZmDyoBJzLdegtIPpXrpJOZWvUXdw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.5': - resolution: {integrity: sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==} + '@smithy/eventstream-codec@4.2.4': + resolution: {integrity: sha512-aV8blR9RBDKrOlZVgjOdmOibTC2sBXNiT7WA558b4MPdsLTV6sbyc1WIE9QiIuYMJjYtnPLciefoqSW8Gi+MZQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.5': - resolution: {integrity: sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==} + '@smithy/eventstream-serde-browser@4.2.4': + resolution: {integrity: sha512-d5T7ZS3J/r8P/PDjgmCcutmNxnSRvPH1U6iHeXjzI50sMr78GLmFcrczLw33Ap92oEKqa4CLrkAPeSSOqvGdUA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.1.3': - resolution: {integrity: sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==} + '@smithy/eventstream-serde-config-resolver@4.3.4': + resolution: {integrity: sha512-lxfDT0UuSc1HqltOGsTEAlZ6H29gpfDSdEPTapD5G63RbnYToZ+ezjzdonCCH90j5tRRCw3aLXVbiZaBW3VRVg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.0.5': - resolution: {integrity: sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==} + '@smithy/eventstream-serde-node@4.2.4': + resolution: {integrity: sha512-TPhiGByWnYyzcpU/K3pO5V7QgtXYpE0NaJPEZBCa1Y5jlw5SjqzMSbFiLb+ZkJhqoQc0ImGyVINqnq1ze0ZRcQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.0.5': - resolution: {integrity: sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==} + '@smithy/eventstream-serde-universal@4.2.4': + resolution: {integrity: sha512-GNI/IXaY/XBB1SkGBFmbW033uWA0tj085eCxYih0eccUe/PFR7+UBQv9HNDk2fD9TJu7UVsCWsH99TkpEPSOzQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.1.1': - resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==} + '@smithy/fetch-http-handler@5.3.5': + resolution: {integrity: sha512-mg83SM3FLI8Sa2ooTJbsh5MFfyMTyNRwxqpKHmE0ICRIa66Aodv80DMsTQI02xBLVJ0hckwqTRr5IGAbbWuFLQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.0.5': - resolution: {integrity: sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==} + '@smithy/hash-blob-browser@4.2.5': + resolution: {integrity: sha512-kCdgjD2J50qAqycYx0imbkA9tPtyQr1i5GwbK/EOUkpBmJGSkJe4mRJm+0F65TUSvvui1HZ5FFGFCND7l8/3WQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.5': - resolution: {integrity: sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==} + '@smithy/hash-node@4.2.4': + resolution: {integrity: sha512-kKU0gVhx/ppVMntvUOZE7WRMFW86HuaxLwvqileBEjL7PoILI8/djoILw3gPQloGVE6O0oOzqafxeNi2KbnUJw==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.5': - resolution: {integrity: sha512-IJuDS3+VfWB67UC0GU0uYBG/TA30w+PlOaSo0GPm9UHS88A6rCP6uZxNjNYiyRtOcjv7TXn/60cW8ox1yuZsLg==} + '@smithy/hash-stream-node@4.2.4': + resolution: {integrity: sha512-amuh2IJiyRfO5MV0X/YFlZMD6banjvjAwKdeJiYGUbId608x+oSNwv3vlyW2Gt6AGAgl3EYAuyYLGRX/xU8npQ==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.0.5': - resolution: {integrity: sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==} + '@smithy/invalid-dependency@4.2.4': + resolution: {integrity: sha512-z6aDLGiHzsMhbS2MjetlIWopWz//K+mCoPXjW6aLr0mypF+Y7qdEh5TyJ20Onf9FbWHiWl4eC+rITdizpnXqOw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.0.5': - resolution: {integrity: sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==} + '@smithy/md5-js@4.2.4': + resolution: {integrity: sha512-h7kzNWZuMe5bPnZwKxhVbY1gan5+TZ2c9JcVTHCygB14buVGOZxLl+oGfpY2p2Xm48SFqEWdghpvbBdmaz3ncQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.5': - resolution: {integrity: sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==} + '@smithy/middleware-content-length@4.2.4': + resolution: {integrity: sha512-hJRZuFS9UsElX4DJSJfoX4M1qXRH+VFiLMUnhsWvtOOUWRNvvOfDaUSdlNbjwv1IkpVjj/Rd/O59Jl3nhAcxow==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.18': - resolution: {integrity: sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==} + '@smithy/middleware-endpoint@4.3.6': + resolution: {integrity: sha512-PXehXofGMFpDqr933rxD8RGOcZ0QBAWtuzTgYRAHAL2BnKawHDEdf/TnGpcmfPJGwonhginaaeJIKluEojiF/w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.19': - resolution: {integrity: sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==} + '@smithy/middleware-retry@4.4.6': + resolution: {integrity: sha512-OhLx131znrEDxZPAvH/OYufR9d1nB2CQADyYFN4C3V/NQS7Mg4V6uvxHC/Dr96ZQW8IlHJTJ+vAhKt6oxWRndA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.9': - resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==} + '@smithy/middleware-serde@4.2.4': + resolution: {integrity: sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.5': - resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==} + '@smithy/middleware-stack@4.2.4': + resolution: {integrity: sha512-Gy3TKCOnm9JwpFooldwAboazw+EFYlC+Bb+1QBsSi5xI0W5lX81j/P5+CXvD/9ZjtYKRgxq+kkqd/KOHflzvgA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.4': - resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==} + '@smithy/node-config-provider@4.3.4': + resolution: {integrity: sha512-3X3w7qzmo4XNNdPKNS4nbJcGSwiEMsNsRSunMA92S4DJLLIrH5g1AyuOA2XKM9PAPi8mIWfqC+fnfKNsI4KvHw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.1.1': - resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==} + '@smithy/node-http-handler@4.4.4': + resolution: {integrity: sha512-VXHGfzCXLZeKnFp6QXjAdy+U8JF9etfpUXD1FAbzY1GzsFJiDQRQIt2CnMUvUdz3/YaHNqT3RphVWMUpXTIODA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.5': - resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==} + '@smithy/property-provider@4.2.4': + resolution: {integrity: sha512-g2DHo08IhxV5GdY3Cpt/jr0mkTlAD39EJKN27Jb5N8Fb5qt8KG39wVKTXiTRCmHHou7lbXR8nKVU14/aRUf86w==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.3': - resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==} + '@smithy/protocol-http@5.3.4': + resolution: {integrity: sha512-3sfFd2MAzVt0Q/klOmjFi3oIkxczHs0avbwrfn1aBqtc23WqQSmjvk77MBw9WkEQcwbOYIX5/2z4ULj8DuxSsw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.5': - resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==} + '@smithy/querystring-builder@4.2.4': + resolution: {integrity: sha512-KQ1gFXXC+WsbPFnk7pzskzOpn4s+KheWgO3dzkIEmnb6NskAIGp/dGdbKisTPJdtov28qNDohQrgDUKzXZBLig==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.5': - resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==} + '@smithy/querystring-parser@4.2.4': + resolution: {integrity: sha512-aHb5cqXZocdzEkZ/CvhVjdw5l4r1aU/9iMEyoKzH4eXMowT6M0YjBpp7W/+XjkBnY8Xh0kVd55GKjnPKlCwinQ==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.7': - resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==} + '@smithy/service-error-classification@4.2.4': + resolution: {integrity: sha512-fdWuhEx4+jHLGeew9/IvqVU/fxT/ot70tpRGuOLxE3HzZOyKeTQfYeV1oaBXpzi93WOk668hjMuuagJ2/Qs7ng==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.5': - resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==} + '@smithy/shared-ini-file-loader@4.3.4': + resolution: {integrity: sha512-y5ozxeQ9omVjbnJo9dtTsdXj9BEvGx2X8xvRgKnV+/7wLBuYJQL6dOa/qMY6omyHi7yjt1OA97jZLoVRYi8lxA==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.1.3': - resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==} + '@smithy/signature-v4@5.3.4': + resolution: {integrity: sha512-ScDCpasxH7w1HXHYbtk3jcivjvdA1VICyAdgvVqKhKKwxi+MTwZEqFw0minE+oZ7F07oF25xh4FGJxgqgShz0A==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.10': - resolution: {integrity: sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==} + '@smithy/smithy-client@4.9.2': + resolution: {integrity: sha512-gZU4uAFcdrSi3io8U99Qs/FvVdRxPvIMToi+MFfsy/DN9UqtknJ1ais+2M9yR8e0ASQpNmFYEKeIKVcMjQg3rg==} engines: {node: '>=18.0.0'} - '@smithy/types@4.3.2': - resolution: {integrity: sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==} + '@smithy/types@4.8.1': + resolution: {integrity: sha512-N0Zn0OT1zc+NA+UVfkYqQzviRh5ucWwO7mBV3TmHHprMnfcJNfhlPicDkBHi0ewbh+y3evR6cNAW0Raxvb01NA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.5': - resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==} + '@smithy/url-parser@4.2.4': + resolution: {integrity: sha512-w/N/Iw0/PTwJ36PDqU9PzAwVElo4qXxCC0eCTlUtIz/Z5V/2j/cViMHi0hPukSBHp4DVwvUlUhLgCzqSJ6plrg==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.0.0': - resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.0.0': - resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.26': - resolution: {integrity: sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==} + '@smithy/util-defaults-mode-browser@4.3.5': + resolution: {integrity: sha512-GwaGjv/QLuL/QHQaqhf/maM7+MnRFQQs7Bsl6FlaeK6lm6U7mV5AAnVabw68cIoMl5FQFyKK62u7RWRzWL25OQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.26': - resolution: {integrity: sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==} + '@smithy/util-defaults-mode-node@4.2.7': + resolution: {integrity: sha512-6hinjVqec0WYGsqN7h9hL/ywfULmJJNXGXnNZW7jrIn/cFuC/aVlVaiDfBIJEvKcOrmN8/EgsW69eY0gXABeHw==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.7': - resolution: {integrity: sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==} + '@smithy/util-endpoints@3.2.4': + resolution: {integrity: sha512-f+nBDhgYRCmUEDKEQb6q0aCcOTXRDqH5wWaFHJxt4anB4pKHlgGoYP3xtioKXH64e37ANUkzWf6p4Mnv1M5/Vg==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.5': - resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==} + '@smithy/util-middleware@4.2.4': + resolution: {integrity: sha512-fKGQAPAn8sgV0plRikRVo6g6aR0KyKvgzNrPuM74RZKy/wWVzx3BMk+ZWEueyN3L5v5EDg+P582mKU+sH5OAsg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.7': - resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==} + '@smithy/util-retry@4.2.4': + resolution: {integrity: sha512-yQncJmj4dtv/isTXxRb4AamZHy4QFr4ew8GxS6XLWt7sCIxkPxPzINWd7WLISEFPsIan14zrKgvyAF+/yzfwoA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.4': - resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==} + '@smithy/util-stream@4.5.5': + resolution: {integrity: sha512-7M5aVFjT+HPilPOKbOmQfCIPchZe4DSBc1wf1+NvHvSoFTiFtauZzT+onZvCj70xhXd0AEmYnZYmdJIuwxOo4w==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.4': + resolution: {integrity: sha512-roKXtXIC6fopFvVOju8VYHtguc/jAcMlK8IlDOHsrQn0ayMkHynjm/D2DCMRf7MJFXzjHhlzg2edr3QPEakchQ==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.7': - resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==} + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -8265,10 +8246,10 @@ packages: peerDependencies: storybook: ^8.6.14 - '@storybook/addon-docs@9.1.1': - resolution: {integrity: sha512-CzgvTy3V5X4fe+VPkiZVwPKARlpEBDAKte8ajLAlHJQLFpADdYrBRQ0se6I+kcxva7rZQzdhuH7qjXMDRVcfnw==} + '@storybook/addon-docs@9.1.16': + resolution: {integrity: sha512-JfaUD6fC7ySLg5duRdaWZ0FUUXrgUvqbZe/agCbSyOaIHOtJdhGaPjOC3vuXTAcV8/8/wWmbu0iXFMD08iKvdw==} peerDependencies: - storybook: ^9.1.1 + storybook: ^9.1.16 '@storybook/addon-essentials@6.5.16': resolution: {integrity: sha512-TeoMr6tEit4Pe91GH6f8g/oar1P4M0JL9S6oMcFxxrhhtOGO7XkWD5EnfyCx272Ok2VYfE58FNBTGPNBVIqYKQ==} @@ -8534,10 +8515,10 @@ packages: '@storybook/builder-manager@7.6.20': resolution: {integrity: sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==} - '@storybook/builder-vite@9.1.1': - resolution: {integrity: sha512-rM0QOfykr39SFBRQnoAa5PU3xTHnJE1R5tigvjved1o7sumcfjrhqmEyAgNZv1SoRztOO92jwkTi7En6yheOKg==} + '@storybook/builder-vite@9.1.16': + resolution: {integrity: sha512-CyvYA5w1BKeSVaRavKi+euWxLffshq0v9Rz/5E9MKCitbYtjwkDH6UMIYmcbTs906mEBuYqrbz3nygDP0ppodw==} peerDependencies: - storybook: ^9.1.1 + storybook: ^9.1.16 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/builder-webpack4@6.5.16': @@ -8598,8 +8579,8 @@ packages: resolution: {integrity: sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==} hasBin: true - '@storybook/cli@9.1.1': - resolution: {integrity: sha512-NbEVLi6nXF8G1nXy5DVpwSkj9c3mplVrhGI0FQnvntoP64BkuVwOVmti0M+hAStU607cT9sNAkg0yFpgK5twpA==} + '@storybook/cli@9.1.16': + resolution: {integrity: sha512-ixwLn3pdhYaWV5MagZVPC8D/WVonersWVj0t8eHCMyxIO4v6wxQ1rK49eizbHJSFrbK+J0xmGvxWsYUobEkv1A==} hasBin: true '@storybook/client-api@6.5.16': @@ -8623,8 +8604,8 @@ packages: '@storybook/codemod@7.6.20': resolution: {integrity: sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==} - '@storybook/codemod@9.1.1': - resolution: {integrity: sha512-biUFc8TmeHUjByOFSaN5RJYGVZe1EJTwlxRcB7/PiXwsoy3SNLj0PJiTGdZyzmz+T2zNNpMQPpgEWQFk/aoSgQ==} + '@storybook/codemod@9.1.16': + resolution: {integrity: sha512-uDl6FuAuvW0X6E8o4jEaUmKqjYCNmGolzUYad3M0yvr1bZmXiNdO1E4IRmnUHUqt6yqnOPNj8hG6AHKhibpB3w==} '@storybook/components@6.5.16': resolution: {integrity: sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA==} @@ -8742,10 +8723,10 @@ packages: peerDependencies: storybook: ^8.6.14 - '@storybook/csf-plugin@9.1.1': - resolution: {integrity: sha512-MwdtvzzFpkard06pCfDrgRXZiBfWAQICdKh7kzpv1L8SwewsRgUr5WZQuEAVfYdSvCFJbWnNN4KirzPhe5ENCg==} + '@storybook/csf-plugin@9.1.16': + resolution: {integrity: sha512-GKlNNlmWeFBQxhQY5hZOSnFGbeKq69jal0dYNWoSImTjor28eYRHb9iQkDzRpijLPizBaB9MlxLsLrgFDp7adA==} peerDependencies: - storybook: ^9.1.1 + storybook: ^9.1.16 '@storybook/csf-tools@6.5.16': resolution: {integrity: sha512-+WD4sH/OwAfXZX3IN6/LOZ9D9iGEFcN+Vvgv9wOsLRgsAZ10DG/NK6c1unXKDM/ogJtJYccNI8Hd+qNE/GFV6A==} @@ -8779,8 +8760,8 @@ packages: '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@1.4.0': - resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} + '@storybook/icons@1.6.0': + resolution: {integrity: sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==} engines: {node: '>=14.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta @@ -8917,20 +8898,20 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^8.6.14 - '@storybook/react-dom-shim@9.1.1': - resolution: {integrity: sha512-L+HCOXvOP+PwKrVS8od9aF+F4hO7zA0Nt1vnpbg2LeAHCxYghrjFVtioe7gSlzrlYdozQrPLY98a4OkDB7KGrw==} + '@storybook/react-dom-shim@9.1.16': + resolution: {integrity: sha512-MsI4qTxdT6lMXQmo3IXhw3EaCC+vsZboyEZBx4pOJ+K/5cDJ6ZoQ3f0d4yGpVhumDxaxlnNAg954+f8WWXE1rQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.1 + storybook: ^9.1.16 - '@storybook/react-vite@9.1.1': - resolution: {integrity: sha512-9rMjAqgrcuVF/GS171fYSLuUs5QC3e0WPpIm2JOP7Z9qWctM1ApVb9UCYY7ZNl9Gc3kvjKsK5J1+A4Zw4a2+ag==} + '@storybook/react-vite@9.1.16': + resolution: {integrity: sha512-WRKSq0XfQ/Qx66aKisQCfa/1UKwN9HjVbY6xrmsX7kI5zBdITxIcKInq6PWoPv91SJD7+Et956yX+F86R1aEXw==} engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.1 + storybook: ^9.1.16 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/react-webpack5@7.4.6': @@ -9013,13 +8994,13 @@ packages: typescript: optional: true - '@storybook/react@9.1.1': - resolution: {integrity: sha512-F5vRFxDf1fzM6CG88olrzEH03iP6C1YAr4/nr5bkLNs6TNm9Hh7KmRVG2jFtoy5w9uCwbQ9RdY+TrRbBI7n67g==} + '@storybook/react@9.1.16': + resolution: {integrity: sha512-M/SkHJJdtiGpodBJq9+DYmSkEOD+VqlPxKI+FvbHESTNs//1IgqFIjEWetd8quhd9oj/gvo4ICBAPu+UmD6M9w==} engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.1 + storybook: ^9.1.16 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: @@ -9097,95 +9078,95 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@swagger-api/apidom-ast@1.0.0-beta.45': - resolution: {integrity: sha512-2npCF6V4QYSRv8USSmQ9jmsnNrjhTww4C84+cetNpxvTYXmEi9bRwIfzn2LH7DedsZsOJOMucVbJkCcRB/VC2Q==} + '@swagger-api/apidom-ast@1.0.0-rc.1': + resolution: {integrity: sha512-hsAySkWlIjgkQEDu1YEbvnxdEC3rD9bjQf7UYm0vzkvL5PNDd6lHLhxb825bQAfXQjw7WOxtV7eNrgqRQohMDg==} - '@swagger-api/apidom-core@1.0.0-beta.45': - resolution: {integrity: sha512-JEKf/bIl0RgaYAILlSDjuWhcg/+gbrI6p6OZuXR7EVxPlPNBAsme98UYyICA9AENyi2fzxwCP5eDRFl4cIzMHQ==} + '@swagger-api/apidom-core@1.0.0-rc.1': + resolution: {integrity: sha512-vlguVts28oYBjCU5ZYfnX6yAFys/dZ1PUZqpYevMIGi8lEvxEfoxKEaUQa1Lr974cfKaVGBs8gNNhvDKXbH/jA==} - '@swagger-api/apidom-error@1.0.0-beta.45': - resolution: {integrity: sha512-kEy7blIEF77BnoqLhGW3h3I+evPHrtZwKe4fSw22UEUJUTG1Daw9FhaSgfBNptifZzzdLgiVDujrIOI6SpkH3Q==} + '@swagger-api/apidom-error@1.0.0-rc.1': + resolution: {integrity: sha512-74tTb6QX8VeAvu/9XipXd4Ly3N3q+yJez+lGZD7Qa11E00AhNpzqH7swgZKutLEfq1tHxyGWE1A6xF8IiU4CJg==} - '@swagger-api/apidom-json-pointer@1.0.0-beta.45': - resolution: {integrity: sha512-s8eMDc/zL5W9mtBRbjEGPDt9yNJlpq9S+7/ACLjlSg1J3toadZmNiyR0svVLroVzVZHD5aGClGRpdammbO/PhQ==} + '@swagger-api/apidom-json-pointer@1.0.0-rc.1': + resolution: {integrity: sha512-fNDQozPRuD9ReYcCnIqr5jU0faFDUl3VrUtfeLl3YevxNB+onZkUidUvzUJgDjZK9Se567BgL0rK9hnEO/Q8qw==} - '@swagger-api/apidom-ns-api-design-systems@1.0.0-beta.45': - resolution: {integrity: sha512-uX+lkOi1g32mIhBVtMm5a304H68GIR4IXf/wiD6mdf2iwjfR0+drn/4NmirZqrNvlMtmf1a6VSe4u6KE3OBIpw==} + '@swagger-api/apidom-ns-api-design-systems@1.0.0-rc.1': + resolution: {integrity: sha512-gV6vQHpdtVKtrV+uUCPwsSL5nX5zD/3vR7dSYE0Lii7f7RkpIXAgQViZSbv7+h8TB20DNobGt+JZH/gGaY+Oxg==} - '@swagger-api/apidom-ns-arazzo-1@1.0.0-beta.45': - resolution: {integrity: sha512-ZjzTvby6Zvu7vh6uabRCGsnhAPeefxgJQ7DPKLELe9KyzcT+OqorjDtfaESFy4zzIMokalJcja/in29yTS+kxw==} + '@swagger-api/apidom-ns-arazzo-1@1.0.0-rc.1': + resolution: {integrity: sha512-Bx3PMLp+613EgSsLLg6Ucg3FtbO2i1bVcFZXgImun5pYNfmtQu21ELfWKj8ty/Ts2zR1VKOn5+i9DyMOH/zpsA==} - '@swagger-api/apidom-ns-asyncapi-2@1.0.0-beta.45': - resolution: {integrity: sha512-OQY2cSs5oZo0/rlGa8hHfgu7DFQ6lDhBC+IAKp0E7gF27oH2Yy9BEHlxHUA3iUeCMxDfIo021+Qc8FpNqivtxA==} + '@swagger-api/apidom-ns-asyncapi-2@1.0.0-rc.1': + resolution: {integrity: sha512-Vvo1f/H3mUuTny1d+XPudSattDWdHP1VhowxAOAFrnLVM4qvFbeBdzWjmTPEaeRsOz+Vq6rJOC4DPmHmtkR+oQ==} - '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-beta.45': - resolution: {integrity: sha512-StoPoa1yI5gBfPZ57LhA41f+JNJ/JnrsWZnmDlJG8W2hyjJAeyVkOo0qoVpt40240WZmH2EuywIFrdD+n+hrLA==} + '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-rc.1': + resolution: {integrity: sha512-1va09+kSTpNKc9oKs0rk2FWP2wk9AAdOcdmLpPEbzMnThQD1DHeBCk5OMStGZlaROxKWMPVZ5EmKy6rTRXvEIQ==} - '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-beta.45': - resolution: {integrity: sha512-l70stVPz1kGIiM7t55twYhfI2GwDKLOjfr+Py1Rknyo75LYw08QhppZ7PxWamgvKmoYfBnGeaoC+18Q2dn2Bhg==} + '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-rc.1': + resolution: {integrity: sha512-ixNci2lwVD0yC4lUrmOOhgE/denI8keGVnHXYokbq0QxlQWuwuVzjVEtVMdmEaX3JaYVmEI5tr8K9MPW1zso1A==} - '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-beta.45': - resolution: {integrity: sha512-tlDz4+Ko+ylVWSpSprZM9WoBMfmBxoUxcxvbkcafCJTO4MCQuytYaW3p/BIMscCsa0LP1eR4ycMY8h445ur58Q==} + '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-rc.1': + resolution: {integrity: sha512-kLGANNv8oAWWvnVqWat/AqOEo6XBfdMF3I7BLL2eZFBE8bhTbFMvmAvUfnwcehYo3K4vT+J60DWrwqYBoGSSUQ==} - '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-beta.45': - resolution: {integrity: sha512-wBkk2AqDddZvf1VixAuwFu9LRTJya3yL+FAmg4KyMGrA32VOFYupe9jc1RmV/noTfGwf5AWZVnuGo9xiI2z4Wg==} + '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-rc.1': + resolution: {integrity: sha512-UzoTSrPOh+dwzSKZmawBwhWg4xGgpdNBmtV7jDJGEyFGsEkPvDBvViq+4sfMxO/BGoqPCD/jdt4yF16AKRxLiw==} - '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-beta.45': - resolution: {integrity: sha512-EggsaTXUw0j8PmcO+IxnoJ7TyXz8sNarPlB2EGNqVT3qEwGQn96qXZ8pZab0sr1iStIWzyAaXMKrnmlcSIDpSQ==} + '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-rc.1': + resolution: {integrity: sha512-3alW6gJKeb+DzTu+LYpYyEc5swo3oP8aoatOcVceWo/A/568zfIW0wWssf9WoasI42jEktV17z4A6ZwT6PzYbA==} - '@swagger-api/apidom-ns-openapi-2@1.0.0-beta.45': - resolution: {integrity: sha512-OY/FM8lDB6MzJfTgqHPj6k6Kk62Uho5gynsZLyroxgTz+Ez9zSdgA+p8+mdE4hBQxfwSnUtaiFMWgAzY+12Q9A==} + '@swagger-api/apidom-ns-openapi-2@1.0.0-rc.1': + resolution: {integrity: sha512-SJ79fGH+WA7IYEXOJFPjXCB5bg6uoJDmkEYxMtZpN0Q+juFSkMcquh3jVf0j0y+6gFe/MZjIFDHxiBdeJarOig==} - '@swagger-api/apidom-ns-openapi-3-0@1.0.0-beta.45': - resolution: {integrity: sha512-HaacHMmYfMp9UNSTONVxGRQDlQn8yEIOklHowI+/u8SRqdV87dE9UQhp8AMGw2hfnYiyt8ADFdPsLnYR6LEq7g==} + '@swagger-api/apidom-ns-openapi-3-0@1.0.0-rc.1': + resolution: {integrity: sha512-TC2EBxBFJWD5pbZKUcbySqCt2nQmeP60ooS4f4Nl5r6vB/BeNbuO4FmO7CDI8OXD7b4J2+ro5KrXMs1EOQ3kVA==} - '@swagger-api/apidom-ns-openapi-3-1@1.0.0-beta.45': - resolution: {integrity: sha512-irU2jMOZNWf/lAXc/JuWohHs55MQe7Rb36xzAqoyOjauk2nj/ougy5b+xvG3dLZu3ZKc/X9kmimPPLTs7P2Xhw==} + '@swagger-api/apidom-ns-openapi-3-1@1.0.0-rc.1': + resolution: {integrity: sha512-IY87MhqFBJnzhPWlr/OEVUa3iDjZuiwlyoWX4lw2jbKX+mLDrceGG5nqZawDACAjTjvtsjJcFP81D2VmjHVT5Q==} - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-beta.45': - resolution: {integrity: sha512-F8Glj81vrYc9oghEeM1Pfo8qbOptEl3tPOU3hQIqDM4pqMRuB3vwYfoZLVnwpewXacBRgwUiXXnaWV7alMnPzg==} + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-rc.1': + resolution: {integrity: sha512-1/koF8VwJHzFwk6FMWen39vpMUNcoCMXVY6MjMGag0h37LY5YAByl0LcYzLa33cvm5KCa23Aa75cu7Ns0SR1HQ==} - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-beta.45': - resolution: {integrity: sha512-Xdhk2yffGD2KcncTs8uNeiKBeBvr0njRRlhfSKdewb91SHXqyh2eKf168M6UPdT0dg3QQKdCT5lV+meKcYGpkw==} + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-rc.1': + resolution: {integrity: sha512-Gjx1gojtYvGFqKnGttv84ba0RCkY7Xa+12kj9HVik8G+YVzUN78Qt8yu96ak0oXFlY1Ai8MQb5siC8YH4pC8Dg==} - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-beta.45': - resolution: {integrity: sha512-SMJseBO32aHPXskwYThT2y3Py2B8B4gKqGXl+ZlMGCaM72Fnnr0hbqtI8wt2v58F97qVlTYvXvTSfQGUuUh/Kg==} + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-rc.1': + resolution: {integrity: sha512-RHIly3bprJELMlt91UFqmMbAtIxDyHi8DM27YVXRjrX7zncP6QKyevcg2ajEe8UaNtkCFvPZW9h0gDh/ZW6ZYQ==} - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-beta.45': - resolution: {integrity: sha512-w9v3E0F9OKSUoK2DtMphpUO2Dd+op+YrwHAYyZTbKL48DEd+Ez5L9wW1bURpfNMSaRjm5H9BrMM2eVdSz8TFQw==} + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-rc.1': + resolution: {integrity: sha512-a+FweCIFAAnjvEWpMAd93xczbYX7AU4prwAMJ3QpFszltq2K7HKWUN1mMRplYPg5SSRLZojymdyMlu1evuP2Sg==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-beta.45': - resolution: {integrity: sha512-7txrflmTsG2400mHq6rswnxi6+r+H7vtL0Mfb0lMj4docaSODnTdEiNjG35jaQaBMbMEtRPokJ6i4018SNFy3Q==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-rc.1': + resolution: {integrity: sha512-IKJ95OH35dW1+yGYDoE8uE3movG9z8Nht2QW8Ja75/H/jAFYGCxj56ZborEIiZxp83ItFqxQFn+ZUvwD7bDZew==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-beta.45': - resolution: {integrity: sha512-laxCy1UmLjlUGRRlcEEQLHWmzwnUq750SFjnBUJe70DxNrBr68UqlLqKC/kGkpOOgsf+NMWhqSkS8WQ/eLsQww==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-rc.1': + resolution: {integrity: sha512-cVu2Ue1U809HiGeAR/54yF42y4UKiWh45sEKzkXPYJUqRUd2Ewyo5KHtlckjNnCDRILZEhaPaZFpxURSbyUeSg==} - '@swagger-api/apidom-parser-adapter-json@1.0.0-beta.45': - resolution: {integrity: sha512-5fFln56FM/6xEvGEAjk+GvTcmts8P5nnCPNDQpxc/PVDcLxC0gzyp5bjkOLmj9nZXqCQRzm/PH0bmxGQv4JSmg==} + '@swagger-api/apidom-parser-adapter-json@1.0.0-rc.1': + resolution: {integrity: sha512-pmWOuZFxSNdbV1xNV0IoIrRiweaVl9yGAiEtiYH0BzbD+yGQSxi1ltMkZDVoyBPbe2NtygFDRaINSDLwuYpUYA==} - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-beta.45': - resolution: {integrity: sha512-lFRbbCGyGilEkNLgZyJeHK2sUsmtEKljkvyZytjGXshd45lLkHD+/1vByKhClbyoA+aIk8lzLpeaMECbOH+a9w==} + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-rc.1': + resolution: {integrity: sha512-+OsFBsD9PPqtcgETXU7l00/TMOfbtM+gvafJIdS/a+O1NQ2upAujQB3ArIB3sry3vloorjKmPyY6ZK/8rEKhNA==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-beta.45': - resolution: {integrity: sha512-AMCSLQhWcsTvlAhZMIwGezXBxhqLnnQQPkZHwKBFA1sD0FLZJKmIs1bxuEuo3iKNHKfDvbKJLQsr6OOqCg1MtQ==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-rc.1': + resolution: {integrity: sha512-FEUJ+RaXKMP6LHMVeVyUPKdqjEqMSEZVhpvZt3Kh5fvnZvdgWngqs4gUjxO+dQCDVWkBxH/29uXm2eghdaM2Lw==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-beta.45': - resolution: {integrity: sha512-rnao77rKeLHrpfM/QRzsOVNaaqZVYv4QID35GDOkuIHjjDNTjmquUsuWscAtI32P7tJHmPrLAJWKxb48W02mmw==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-rc.1': + resolution: {integrity: sha512-pcfPj3FW2IWPYmU5kE0YB7npqV2vN+DvqUsw1GcDzsb8y2IdkzagHtMPZkM/KrfHFmhsoHm5YNpYC+Vvd2g61Q==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-beta.45': - resolution: {integrity: sha512-zilhJHYEV0cGde6ZdAfB+/4OnzHW8OCLO7bXmtoXdsxwJV0DHnwjrq2FgOlwqWBPWRIlyFwBwdUO0Rd5P4re3g==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-rc.1': + resolution: {integrity: sha512-ckt6b1P+iwYkTMibixpo0oKWFm0wOGf88gslMMCo1xNaLVJnjxiadTQ/lNJd58CBJiQeN/dziTkRqGcFDqV9JQ==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-beta.45': - resolution: {integrity: sha512-loof/awV/RNIaCHqr4+uVVjdSayAvNyxjLszyd0moAQv/247mfjvCH0h9VLIlpjI4kf+C3q4bhyYYaeVl9MSVg==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-rc.1': + resolution: {integrity: sha512-JFyNwcj43cmps18Y+iqyna3uufyib8eLku+z4EhKFRPCuGFQ2bjsfVCFSP+Sv6sJATlagRRcfont+Q0BgNjwvw==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-beta.45': - resolution: {integrity: sha512-h2oHGosYXditkPJ66aGEsvz6zpM6N26ay1ZRhk9LjuSA8S4BqFYY+MbJVD6C0LLP6Mn5jvDWCUq7yB0DTWNxpg==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-rc.1': + resolution: {integrity: sha512-kLRZYxJdix+irs0HTXJ223rj4Ou8AXo9IHiSf44KTuAZ/bsuakb0P8xROHg5MWTTEHYMfDrdLX+LaUo3b2GFyA==} - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-beta.45': - resolution: {integrity: sha512-/Emcfl4Va1GJB7kU2DWZBrqAn6dLi/sclPa4z0sjg+2EtOJ9l9zw3sKc4d7cEY5PX2QzgD8bFxBYrP9lU03IZw==} + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-rc.1': + resolution: {integrity: sha512-XmRG/5lmoRusCupHEf10OeK1SQnSym4N1OrK+c3OTfN1GGX60Gxu2XCZ70pafJDuu+cvo/F8Db8UX3UOHapjwA==} - '@swagger-api/apidom-reference@1.0.0-beta.45': - resolution: {integrity: sha512-1EbK7P6oki5mR8bho+E0yoc9JwhOT/vboTjidolH8Fjw/WuE6GcMHX+8OBcwcgjt9hXWsY3YfvZFwK7baxkPnQ==} + '@swagger-api/apidom-reference@1.0.0-rc.1': + resolution: {integrity: sha512-Xj4aYrawCseCf6N6UuGSIaboN60ERmQVcKqXs/rybQz1gnD2AVqb8gklC2sUdOIUyN+ehDy+HDSM8I+yP32J0w==} '@swaggerexpert/cookie@2.0.2': resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} @@ -9195,68 +9176,68 @@ packages: resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} engines: {node: '>=12.20.0'} - '@swc/core-darwin-arm64@1.13.3': - resolution: {integrity: sha512-ux0Ws4pSpBTqbDS9GlVP354MekB1DwYlbxXU3VhnDr4GBcCOimpocx62x7cFJkSpEBF8bmX8+/TTCGKh4PbyXw==} + '@swc/core-darwin-arm64@1.14.0': + resolution: {integrity: sha512-uHPC8rlCt04nvYNczWzKVdgnRhxCa3ndKTBBbBpResOZsRmiwRAvByIGh599j+Oo6Z5eyTPrgY+XfJzVmXnN7Q==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.13.3': - resolution: {integrity: sha512-p0X6yhxmNUOMZrbeZ3ZNsPige8lSlSe1llllXvpCLkKKxN/k5vZt1sULoq6Nj4eQ7KeHQVm81/+AwKZyf/e0TA==} + '@swc/core-darwin-x64@1.14.0': + resolution: {integrity: sha512-2SHrlpl68vtePRknv9shvM9YKKg7B9T13tcTg9aFCwR318QTYo+FzsKGmQSv9ox/Ua0Q2/5y2BNjieffJoo4nA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.13.3': - resolution: {integrity: sha512-OmDoiexL2fVWvQTCtoh0xHMyEkZweQAlh4dRyvl8ugqIPEVARSYtaj55TBMUJIP44mSUOJ5tytjzhn2KFxFcBA==} + '@swc/core-linux-arm-gnueabihf@1.14.0': + resolution: {integrity: sha512-SMH8zn01dxt809svetnxpeg/jWdpi6dqHKO3Eb11u4OzU2PK7I5uKS6gf2hx5LlTbcJMFKULZiVwjlQLe8eqtg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.13.3': - resolution: {integrity: sha512-STfKku3QfnuUj6k3g9ld4vwhtgCGYIFQmsGPPgT9MK/dI3Lwnpe5Gs5t1inoUIoGNP8sIOLlBB4HV4MmBjQuhw==} + '@swc/core-linux-arm64-gnu@1.14.0': + resolution: {integrity: sha512-q2JRu2D8LVqGeHkmpVCljVNltG0tB4o4eYg+dElFwCS8l2Mnt9qurMCxIeo9mgoqz0ax+k7jWtIRHktnVCbjvQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.13.3': - resolution: {integrity: sha512-bc+CXYlFc1t8pv9yZJGus372ldzOVscBl7encUBlU1m/Sig0+NDJLz6cXXRcFyl6ABNOApWeR4Yl7iUWx6C8og==} + '@swc/core-linux-arm64-musl@1.14.0': + resolution: {integrity: sha512-uofpVoPCEUjYIv454ZEZ3sLgMD17nIwlz2z7bsn7rl301Kt/01umFA7MscUovFfAK2IRGck6XB+uulMu6aFhKQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.13.3': - resolution: {integrity: sha512-dFXoa0TEhohrKcxn/54YKs1iwNeW6tUkHJgXW33H381SvjKFUV53WR231jh1sWVJETjA3vsAwxKwR23s7UCmUA==} + '@swc/core-linux-x64-gnu@1.14.0': + resolution: {integrity: sha512-quTTx1Olm05fBfv66DEBuOsOgqdypnZ/1Bh3yGXWY7ANLFeeRpCDZpljD9BSjdsNdPOlwJmEUZXMHtGm3v1TZQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.13.3': - resolution: {integrity: sha512-ieyjisLB+ldexiE/yD8uomaZuZIbTc8tjquYln9Quh5ykOBY7LpJJYBWvWtm1g3pHv6AXlBI8Jay7Fffb6aLfA==} + '@swc/core-linux-x64-musl@1.14.0': + resolution: {integrity: sha512-caaNAu+aIqT8seLtCf08i8C3/UC5ttQujUjejhMcuS1/LoCKtNiUs4VekJd2UGt+pyuuSrQ6dKl8CbCfWvWeXw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.13.3': - resolution: {integrity: sha512-elTQpnaX5vESSbhCEgcwXjpMsnUbqqHfEpB7ewpkAsLzKEXZaK67ihSRYAuAx6ewRQTo7DS5iTT6X5aQD3MzMw==} + '@swc/core-win32-arm64-msvc@1.14.0': + resolution: {integrity: sha512-EeW3jFlT3YNckJ6V/JnTfGcX7UHGyh6/AiCPopZ1HNaGiXVCKHPpVQZicmtyr/UpqxCXLrTgjHOvyMke7YN26A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.13.3': - resolution: {integrity: sha512-nvehQVEOdI1BleJpuUgPLrclJ0TzbEMc+MarXDmmiRFwEUGqj+pnfkTSb7RZyS1puU74IXdK/YhTirHurtbI9w==} + '@swc/core-win32-ia32-msvc@1.14.0': + resolution: {integrity: sha512-dPai3KUIcihV5hfoO4QNQF5HAaw8+2bT7dvi8E5zLtecW2SfL3mUZipzampXq5FHll0RSCLzlrXnSx+dBRZIIQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.13.3': - resolution: {integrity: sha512-A+JSKGkRbPLVV2Kwx8TaDAV0yXIXm/gc8m98hSkVDGlPBBmydgzNdWy3X7HTUBM7IDk7YlWE7w2+RUGjdgpTmg==} + '@swc/core-win32-x64-msvc@1.14.0': + resolution: {integrity: sha512-nm+JajGrTqUA6sEHdghDlHMNfH1WKSiuvljhdmBACW4ta4LC3gKurX2qZuiBARvPkephW9V/i5S8QPY1PzFEqg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.13.3': - resolution: {integrity: sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w==} + '@swc/core@1.14.0': + resolution: {integrity: sha512-oExhY90bes5pDTVrei0xlMVosTxwd/NMafIpqsC4dMbRYZ5KB981l/CX8tMnGsagTplj/RcG9BeRYmV6/J5m3w==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -9270,8 +9251,8 @@ packages: '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@swc/types@0.1.24': - resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -9280,8 +9261,8 @@ packages: '@tanstack/query-core@4.27.0': resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} - '@tanstack/query-core@4.40.0': - resolution: {integrity: sha512-7MJTtZkCSuehMC7IxMOCGsLvHS3jHx4WjveSrGsG1Nc1UQLjaFwwkpLA2LmPfvOAxnH4mszMOBFD6LlZE+aB+Q==} + '@tanstack/query-core@4.41.0': + resolution: {integrity: sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==} '@tanstack/query-core@5.76.0': resolution: {integrity: sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==} @@ -9292,8 +9273,8 @@ packages: '@tanstack/query-core@5.77.1': resolution: {integrity: sha512-nfxVhy4UynChMFfN4NxwI8pktV9R3Zt/ROxOAe6pdOf8CigDLn26p+ex1YW5uien26BBICLmN0dTvIELHCs5vw==} - '@tanstack/query-core@5.83.1': - resolution: {integrity: sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==} + '@tanstack/query-core@5.90.6': + resolution: {integrity: sha512-AnZSLF26R8uX+tqb/ivdrwbVdGemdEDm1Q19qM6pry6eOZ6bEYiY7mWhzXT1YDIPTNEVcZ5kYP9nWjoxDLiIVw==} '@tanstack/query-persist-client-core@4.27.0': resolution: {integrity: sha512-A+dPA7zG0MJOMDeBc/2WcKXW4wV2JMkeBVydobPW9G02M4q0yAj7vI+7SmM2dFuXyIvxXp4KulCywN6abRKDSQ==} @@ -9480,8 +9461,8 @@ packages: '@types/chai@4.3.20': resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/classnames@2.3.4': resolution: {integrity: sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ==} @@ -9490,8 +9471,8 @@ packages: '@types/codemirror@0.0.90': resolution: {integrity: sha512-8Z9+tSg27NPRGubbUPUCrt5DDG/OWzLph5BvcDykwR5D7RyZh5mhHG0uS1ePKV1YFCA+/cwc4Ey2AJAEFfV3IA==} - '@types/codemirror@5.60.16': - resolution: {integrity: sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw==} + '@types/codemirror@5.60.17': + resolution: {integrity: sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==} '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -9526,8 +9507,8 @@ packages: '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - '@types/emscripten@1.40.1': - resolution: {integrity: sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==} + '@types/emscripten@1.41.5': + resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} '@types/escodegen@0.0.6': resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} @@ -9553,11 +9534,11 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} - '@types/express@4.17.23': - resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} '@types/find-cache-dir@3.2.1': resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} @@ -9601,8 +9582,8 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/http-proxy@1.17.16': - resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} '@types/is-function@1.0.3': resolution: {integrity: sha512-/CLhCW79JUeLKznI6mbVieGbl4QU5Hfn+6udw1YHZoofASjbQ5zaP5LzAUZYDpRYEjS4/P+DhEgyJ/PQmGGTWw==} @@ -9701,17 +9682,17 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node-forge@1.3.13': - resolution: {integrity: sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==} + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - '@types/node@18.19.121': - resolution: {integrity: sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@20.19.22': - resolution: {integrity: sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==} + '@types/node@20.19.24': + resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -9785,8 +9766,8 @@ packages: '@types/react-test-renderer@19.1.0': resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} - '@types/react@17.0.87': - resolution: {integrity: sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g==} + '@types/react@17.0.89': + resolution: {integrity: sha512-I98SaDCar5lvEYl80ClRIUztH/hyWHR+I2f+5yTVp/MQ205HgYkA2b5mVdry/+nsEIrf8I65KA5V/PASx68MsQ==} '@types/react@18.2.0': resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==} @@ -9812,20 +9793,23 @@ packages: '@types/scheduler@0.26.0': resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} - '@types/selenium-webdriver@4.1.28': - resolution: {integrity: sha512-Au7CXegiS7oapbB16zxPToY4Cjzi9UQQMf3W2ZZM8PigMLTGR3iUAHjPUTddyE5g1SBjT/qpmvlsAQLBfNAdKg==} + '@types/selenium-webdriver@4.35.3': + resolution: {integrity: sha512-V8rEfVHFNsamhflPVqEgP1u8VShsEBAuQoLkIzpjwvPOkfmcNFp+mzJzFBwcIS9S90bxgRN3sp+Us/Mx55MXIA==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} '@types/serve-index@1.9.4': resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} @@ -9887,14 +9871,14 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/vscode-notebook-renderer@1.72.3': - resolution: {integrity: sha512-MfmEI3A2McbUV2WaijoTgLOAs9chwHN4WmqOedl3jdtlbzJBWIQ9ZFmQdzPa3lYr5j8DJhRg3KB5AIM/BBfg9Q==} + '@types/vscode-notebook-renderer@1.72.4': + resolution: {integrity: sha512-bdKO41c6Dc24pH/O/eM/jqfCwGH4zc76o/g/6Gt1y/eg/bvvqP2/VpbV+Sa5Te2sZekFRcbYnSSFTKo3wcVGUg==} '@types/vscode-webview@1.57.5': resolution: {integrity: sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==} - '@types/vscode@1.102.0': - resolution: {integrity: sha512-V9sFXmcXz03FtYTSUsYsu5K0Q9wH9w9V25slddcxrh5JgORD14LpnOA7ov0L9ALi+6HrTjskLJ/tY5zeRF3TFA==} + '@types/vscode@1.105.0': + resolution: {integrity: sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==} '@types/webpack-env@1.18.8': resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} @@ -9923,8 +9907,8 @@ packages: '@types/yargs@15.0.19': resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.34': + resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==} '@typescript-eslint/eslint-plugin@2.34.0': resolution: {integrity: sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==} @@ -10052,8 +10036,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.39.0': - resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + '@typescript-eslint/project-service@8.46.3': + resolution: {integrity: sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -10078,8 +10062,8 @@ packages: resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.39.0': - resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} + '@typescript-eslint/scope-manager@8.46.3': + resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.33.1': @@ -10088,8 +10072,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/tsconfig-utils@8.39.0': - resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} + '@typescript-eslint/tsconfig-utils@8.46.3': + resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -10158,8 +10142,8 @@ packages: resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.39.0': - resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} + '@typescript-eslint/types@8.46.3': + resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@2.34.0': @@ -10210,8 +10194,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.39.0': - resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} + '@typescript-eslint/typescript-estree@8.46.3': + resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -10248,8 +10232,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.39.0': - resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + '@typescript-eslint/utils@8.46.3': + resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -10275,12 +10259,12 @@ packages: resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.39.0': - resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} + '@typescript-eslint/visitor-keys@8.46.3': + resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typespec/ts-http-runtime@0.3.0': - resolution: {integrity: sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg==} + '@typespec/ts-http-runtime@0.3.1': + resolution: {integrity: sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==} engines: {node: '>=20.0.0'} '@uiw/codemirror-extensions-basic-setup@4.23.14': @@ -10299,6 +10283,10 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vercel/oidc@3.0.3': + resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} + engines: {node: '>= 20'} + '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} @@ -10359,60 +10347,60 @@ packages: resolution: {integrity: sha512-vaTZE65zigWwSWYB6yaZUAyVC/Ux+6U82hnzy/ejuS/KpFifO+0oORNd5yAoPeIRnYjvllM6ES3YlX4K5tUuww==} engines: {vscode: ^1.75.0} - '@vscode/iconv-lite-umd@0.7.0': - resolution: {integrity: sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==} + '@vscode/iconv-lite-umd@0.7.1': + resolution: {integrity: sha512-tK6k0DXFHW7q5+GGuGZO+phpAqpxO4WXl+BLc/8/uOk3RsM2ssAL3CQUQDb1TGfwltjsauhN6S4ghYZzs4sPFw==} '@vscode/test-electron@2.5.2': resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} engines: {node: '>=16'} - '@vscode/vsce-sign-alpine-arm64@2.0.5': - resolution: {integrity: sha512-XVmnF40APwRPXSLYA28Ye+qWxB25KhSVpF2eZVtVOs6g7fkpOxsVnpRU1Bz2xG4ySI79IRuapDJoAQFkoOgfdQ==} + '@vscode/vsce-sign-alpine-arm64@2.0.6': + resolution: {integrity: sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==} cpu: [arm64] os: [alpine] - '@vscode/vsce-sign-alpine-x64@2.0.5': - resolution: {integrity: sha512-JuxY3xcquRsOezKq6PEHwCgd1rh1GnhyH6urVEWUzWn1c1PC4EOoyffMD+zLZtFuZF5qR1I0+cqDRNKyPvpK7Q==} + '@vscode/vsce-sign-alpine-x64@2.0.6': + resolution: {integrity: sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==} cpu: [x64] os: [alpine] - '@vscode/vsce-sign-darwin-arm64@2.0.5': - resolution: {integrity: sha512-z2Q62bk0ptADFz8a0vtPvnm6vxpyP3hIEYMU+i1AWz263Pj8Mc38cm/4sjzxu+LIsAfhe9HzvYNS49lV+KsatQ==} + '@vscode/vsce-sign-darwin-arm64@2.0.2': + resolution: {integrity: sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==} cpu: [arm64] os: [darwin] - '@vscode/vsce-sign-darwin-x64@2.0.5': - resolution: {integrity: sha512-ma9JDC7FJ16SuPXlLKkvOD2qLsmW/cKfqK4zzM2iJE1PbckF3BlR08lYqHV89gmuoTpYB55+z8Y5Fz4wEJBVDA==} + '@vscode/vsce-sign-darwin-x64@2.0.2': + resolution: {integrity: sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==} cpu: [x64] os: [darwin] - '@vscode/vsce-sign-linux-arm64@2.0.5': - resolution: {integrity: sha512-Hr1o0veBymg9SmkCqYnfaiUnes5YK6k/lKFA5MhNmiEN5fNqxyPUCdRZMFs3Ajtx2OFW4q3KuYVRwGA7jdLo7Q==} + '@vscode/vsce-sign-linux-arm64@2.0.6': + resolution: {integrity: sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==} cpu: [arm64] os: [linux] - '@vscode/vsce-sign-linux-arm@2.0.5': - resolution: {integrity: sha512-cdCwtLGmvC1QVrkIsyzv01+o9eR+wodMJUZ9Ak3owhcGxPRB53/WvrDHAFYA6i8Oy232nuen1YqWeEohqBuSzA==} + '@vscode/vsce-sign-linux-arm@2.0.6': + resolution: {integrity: sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==} cpu: [arm] os: [linux] - '@vscode/vsce-sign-linux-x64@2.0.5': - resolution: {integrity: sha512-XLT0gfGMcxk6CMRLDkgqEPTyG8Oa0OFe1tPv2RVbphSOjFWJwZgK3TYWx39i/7gqpDHlax0AP6cgMygNJrA6zg==} + '@vscode/vsce-sign-linux-x64@2.0.6': + resolution: {integrity: sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==} cpu: [x64] os: [linux] - '@vscode/vsce-sign-win32-arm64@2.0.5': - resolution: {integrity: sha512-hco8eaoTcvtmuPhavyCZhrk5QIcLiyAUhEso87ApAWDllG7djIrWiOCtqn48k4pHz+L8oCQlE0nwNHfcYcxOPw==} + '@vscode/vsce-sign-win32-arm64@2.0.6': + resolution: {integrity: sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==} cpu: [arm64] os: [win32] - '@vscode/vsce-sign-win32-x64@2.0.5': - resolution: {integrity: sha512-1ixKFGM2FwM+6kQS2ojfY3aAelICxjiCzeg4nTHpkeU1Tfs4RC+lVLrgq5NwcBC7ZLr6UfY3Ct3D6suPeOf7BQ==} + '@vscode/vsce-sign-win32-x64@2.0.6': + resolution: {integrity: sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==} cpu: [x64] os: [win32] - '@vscode/vsce-sign@2.0.6': - resolution: {integrity: sha512-j9Ashk+uOWCDHYDxgGsqzKq5FXW9b9MW7QqOIYZ8IYpneJclWTBeHZz2DJCSKQgo+JAqNcaRRE1hzIx0dswqAw==} + '@vscode/vsce-sign@2.0.8': + resolution: {integrity: sha512-H7p8E11cZMj6mt8xIi3QXZ7dSU/2MH3Y7c+5JfUhHAV4xfaPNc8ozwLVK282c6ah596KoIJIdPUlNHV7Qs/5JA==} '@vscode/vsce@2.21.1': resolution: {integrity: sha512-f45/aT+HTubfCU2oC7IaWnH9NjOWp668ML002QiFObFRVUCoLtcwepp9mmql/ArFUy+HCHp54Xrq4koTcOD6TA==} @@ -10555,8 +10543,8 @@ packages: engines: {node: '>=10.0.0'} deprecated: this version is no longer supported, please update to at least 0.8.* - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} '@xtuc/ieee754@1.2.0': @@ -10698,8 +10686,8 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@5.0.59: - resolution: {integrity: sha512-SuAFxKXt2Ha9FiXB3gaOITkOg9ek/3QNVatGVExvTT4gNXc+hJpuNe1dmuwf6Z5Op4fzc8wdbsrYP27ZCXBzlw==} + ai@5.0.87: + resolution: {integrity: sha512-9Cjx7o8IY9zAczigX0Tk/BaQwjPe/M6DpEjejKSBNrf8mOPIvyM+pJLqJSC10IsKci3FPsnaizJeJhoetU1Wfw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -10781,8 +10769,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + ansi-escapes@7.1.1: + resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} ansi-html-community@0.0.8: @@ -10811,8 +10799,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@2.2.1: @@ -10831,8 +10819,8 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} ansi-to-html@0.6.15: @@ -11118,12 +11106,12 @@ packages: aws4fetch@1.0.20: resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + axe-core@4.11.0: + resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} engines: {node: '>=4'} - axios@1.12.0: - resolution: {integrity: sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -11543,11 +11531,16 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - bare-events@2.7.0: - resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} + bare-events@2.8.1: + resolution: {integrity: sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true - bare-fs@4.4.4: - resolution: {integrity: sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==} + bare-fs@4.5.0: + resolution: {integrity: sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -11573,8 +11566,8 @@ packages: bare-events: optional: true - bare-url@2.2.2: - resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==} + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} base16@1.0.0: resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} @@ -11582,6 +11575,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.23: + resolution: {integrity: sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==} + hasBin: true + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -11661,8 +11658,8 @@ packages: boundary@2.0.0: resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} - bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} boxen@1.3.0: resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} @@ -11711,8 +11708,8 @@ packages: deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. hasBin: true - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -11823,8 +11820,8 @@ packages: resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} engines: {node: '>=18'} - cacheable@1.10.3: - resolution: {integrity: sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==} + cacheable@2.1.1: + resolution: {integrity: sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -11896,14 +11893,14 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001731: - resolution: {integrity: sha512-IbYSXiOfvIJmCRLkrE/hMSsTZTu48NBddgIgC027NnuPwu/V14PnO3UtHxoQGSA16b09zZJkCsaoLbwMSllZrA==} + caniuse-db@1.0.30001753: + resolution: {integrity: sha512-M08EdkYtgpwpvFLscj+mmtjDYaqFVYqbCMIDlsKnw86CxaT2bjlDAEaxtktDiv70uFQtwNV2Ou2UZhQogpr4Ew==} - caniuse-lite@1.0.30001731: - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} + caniuse-lite@1.0.30001753: + resolution: {integrity: sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==} - canvas@3.1.2: - resolution: {integrity: sha512-Z/tzFAcBzoCvJlOSlCnoekh1Gu8YMn0J51+UAuXJAbW1Z6I9l2mZgdD7738MepoeeIcUdDtbMnOg6cC7GJxy/g==} + canvas@3.2.0: + resolution: {integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==} engines: {node: ^18.12.0 || >= 20.9.0} capital-case@1.0.4: @@ -11938,8 +11935,8 @@ packages: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} chainsaw@0.1.0: @@ -11961,8 +11958,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.5.0: - resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} change-case@4.1.2: @@ -12116,9 +12113,9 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@5.1.1: + resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + engines: {node: '>=20'} cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} @@ -12137,6 +12134,10 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} + clipboardy@5.0.0: + resolution: {integrity: sha512-MQfKHaD09eP80Pev4qBxZLbxJK/ONnqfSYAPlCmPh+7BDboYtO/3BmB6HGzxDIT0SlTRc2tzS8lQqfcdLtZ0Kg==} + engines: {node: '>=20'} + cliui@3.2.0: resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} @@ -12216,8 +12217,8 @@ packages: codemirror: ^5.65.3 graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - codemirror@5.65.19: - resolution: {integrity: sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==} + codemirror@5.65.20: + resolution: {integrity: sha512-i5dLDDxwkFCbhjvL2pNjShsojoL3XHyDwsGv1jqETUoW+lzpBKKqNTUWgQwVAOa0tUm4BwekT455ujafi8payA==} codemirror@6.0.2: resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} @@ -12225,8 +12226,8 @@ packages: collapse-white-space@1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -12235,17 +12236,26 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-convert@3.1.2: + resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} + engines: {node: '>=14.6'} + color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@2.0.2: + resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==} + engines: {node: '>=12.20'} + color-string@0.3.0: resolution: {integrity: sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@2.1.2: + resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} + engines: {node: '>=18'} color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} @@ -12254,8 +12264,9 @@ packages: color@0.11.4: resolution: {integrity: sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA==} - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@5.0.2: + resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} + engines: {node: '>=18'} colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -12277,9 +12288,6 @@ packages: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -12306,8 +12314,8 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} commander@2.13.0: @@ -12448,8 +12456,8 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - copy-webpack-plugin@13.0.0: - resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} + copy-webpack-plugin@13.0.1: + resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 @@ -12458,18 +12466,18 @@ packages: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true - core-js-compat@3.45.0: - resolution: {integrity: sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==} + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} - core-js-pure@3.45.0: - resolution: {integrity: sha512-OtwjqcDpY2X/eIIg1ol/n0y/X8A9foliaNt1dSK0gV3J2/zw+89FcNG3mPK+N8YWts4ZFUPxnrAzsxs/lf8yDA==} + core-js-pure@3.46.0: + resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-js@3.45.0: - resolution: {integrity: sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==} + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -12543,8 +12551,8 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - create-storybook@9.1.1: - resolution: {integrity: sha512-JrW3xqo1pbgsX1fvopjN6vZoFO+UyJbXv8sX2Gwvz3LMqwdQToEyUAn8KpOmHH3N+WnUd0tqC5TvK8g7bkk7YA==} + create-storybook@9.1.16: + resolution: {integrity: sha512-Po8ZeU1sAcab+gHjAXFnjMMO6HLjItQoXTnfE9gcMytKI25dbBuwX/aKpdHr731vgL6wW82e76PrUpAZdSibRg==} hasBin: true crelt@1.0.6: @@ -12801,8 +12809,8 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -12846,8 +12854,8 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -12949,8 +12957,8 @@ packages: resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} engines: {node: '>=14.16'} - del@8.0.0: - resolution: {integrity: sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==} + del@8.0.1: + resolution: {integrity: sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==} engines: {node: '>=18'} delayed-stream@1.0.0: @@ -12992,8 +13000,8 @@ packages: engines: {node: '>=0.10'} hasBin: true - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -13023,8 +13031,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dexie@4.0.11: - resolution: {integrity: sha512-SOKO002EqlvBYYKQSew3iymBoN2EQ4BDw/3yprjh7kAfFzjBYkaMNa/pZvcA7HSWlcKSQb9XhPe3wKyQ0x4A8A==} + dexie@4.2.1: + resolution: {integrity: sha512-Ckej0NS6jxQ4Po3OrSQBFddayRhTCic2DoCAG5zacOfOVB9P2Q5Xc5uL/nVa7ZVs+HdMnvUPzLFCB/JwpB6Csg==} diagnostic-channel-publishers@0.3.5: resolution: {integrity: sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==} @@ -13132,6 +13140,9 @@ packages: dompurify@3.2.4: resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} + dompurify@3.2.6: + resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -13201,9 +13212,9 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - editions@6.21.0: - resolution: {integrity: sha512-ofkXJtn7z0urokN62DI3SBo/5xAtF0rR7tn+S/bSYV79Ka8pTajIIl+fFQ1q88DQEImymmo97M4azY3WX/nUdg==} - engines: {node: '>=4'} + editions@6.22.0: + resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} + engines: {ecmascript: '>= es5', node: '>=4'} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -13213,8 +13224,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.198: - resolution: {integrity: sha512-G5COfnp3w+ydVu80yprgWSfmfQaYRh9DOxfhAxstLyetKaLyl55QrNjx8C38Pc/C+RaDmb1M0Lk8wPEMQ+bGgQ==} + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -13226,8 +13237,8 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} @@ -13299,8 +13310,8 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + envinfo@7.20.0: + resolution: {integrity: sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==} engines: {node: '>=4'} hasBin: true @@ -13318,8 +13329,8 @@ packages: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -13365,8 +13376,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.39.8: - resolution: {integrity: sha512-A8QO9TfF+rltS8BXpdu8OS+rpGgEdnRhqIVxO/ZmNvnXBYgOdSsxukT55ELyP94gZIntWJ+Li9QRrT2u1Kitpg==} + es-toolkit@1.41.0: + resolution: {integrity: sha512-bDd3oRmbVgqZCJS6WmeQieOrzpl3URcWBUVDXxOELlUW2FuW+0glPOz1n0KnRie+PdyvUZcXz2sOn00c6pPRIA==} es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} @@ -13403,8 +13414,8 @@ packages: peerDependencies: esbuild: '>=0.12 <1' - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true @@ -13527,8 +13538,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + eslint-plugin-react-refresh@0.4.24: + resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} peerDependencies: eslint: '>=8.40' @@ -13538,12 +13549,12 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@9.1.1: - resolution: {integrity: sha512-g4/i9yW6cl4TCEMzYyALNvO3d/jB6TDvSs/Pmye7dHDrra2B7dgZJGzmEWILD62brVrLVHNoXgy2dNPtx80kmw==} + eslint-plugin-storybook@9.1.16: + resolution: {integrity: sha512-I8f3DXniPxFbcptVgOjtIHNvW6sDu1O2d1zNsxLKmeAvEaRLus1ij8iFHCgkNzMthrU5U2F4Wdo/aaSpz5kHjA==} engines: {node: '>=20.0.0'} peerDependencies: eslint: '>=8' - storybook: ^9.1.1 + storybook: ^9.1.16 eslint-plugin-unused-imports@4.1.4: resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} @@ -13769,6 +13780,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + exenv-es6@1.1.1: resolution: {integrity: sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==} @@ -13795,8 +13810,8 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} express-rate-limit@7.5.1: resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} @@ -13885,8 +13900,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-xml-parser@5.2.5: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} @@ -13930,8 +13945,9 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -13956,8 +13972,12 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@10.1.3: - resolution: {integrity: sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@10.1.4: + resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} file-entry-cache@5.0.1: resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} @@ -14102,8 +14122,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.12: - resolution: {integrity: sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==} + flat-cache@6.1.18: + resolution: {integrity: sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -14119,8 +14139,8 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flow-parser@0.278.0: - resolution: {integrity: sha512-9oUcYDHf9n+E/t0FXndgBqGbaUsGEcmWqIr1ldqCzTzctsJV5E/bHusOj4ThB72Ss2mqWpLFNz0+o2c1O8J6+A==} + flow-parser@0.289.0: + resolution: {integrity: sha512-w4sVnH6ddNAIxokoz0mGyiIIdzvqncFhAYW+RmkPbPSSTYozG6yhqAixzaWeBCQf2qqXJTlHkoKPnf/BAj8Ofw==} engines: {node: '>=0.4.0'} flush-write-stream@1.1.1: @@ -14258,8 +14278,8 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} - fs-extra@11.3.1: - resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs-extra@3.0.1: @@ -14338,6 +14358,10 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + generic-names@4.0.0: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} @@ -14355,8 +14379,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} get-func-name@2.0.2: @@ -14467,6 +14491,12 @@ packages: peerDependencies: glob: '*' + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.3.0: resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} @@ -14616,8 +14646,8 @@ packages: peerDependencies: graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - graphql@16.11.0: - resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} growly@1.3.0: @@ -14796,8 +14826,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.11.0: - resolution: {integrity: sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==} + hookified@1.12.2: + resolution: {integrity: sha512-aokUX1VdTpI0DUsndvW+OiwmBpKCu/NgRsSSkuSY0zq8PY6Q6a+lmOfAFDXAAOtBqJELvcWY9L1EVtzjbQcMdg==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -14879,8 +14909,8 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 - html-webpack-plugin@5.6.3: - resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + html-webpack-plugin@5.6.4: + resolution: {integrity: sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==} engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -14976,8 +15006,12 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - humanize-duration@3.33.0: - resolution: {integrity: sha512-vYJX7BSzn7EQ4SaP2lPYVy+icHDppB6k7myNeI3wrSRfwMS5+BHyGgzpHR0ptqJ2AQ6UuIKrclSg5ve6Ci4IAQ==} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + humanize-duration@3.33.1: + resolution: {integrity: sha512-hwzSCymnRdFx9YdRkQQ0OYequXiVAV6ZGQA2uzocwB0F4309Ke6pO8dg0P8LHhRQJyVjGteRTAA/zNfEcpXn8A==} humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -15004,6 +15038,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + icss-replace-symbols@1.1.0: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} @@ -15049,8 +15087,8 @@ packages: resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} engines: {node: '>=0.10.0'} - immutable@5.1.3: - resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} @@ -15111,8 +15149,8 @@ packages: inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-parser@0.2.6: + resolution: {integrity: sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==} inquirer@3.3.0: resolution: {integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==} @@ -15139,9 +15177,10 @@ packages: intersection-observer@0.10.0: resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} + deprecated: The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019. - intl-messageformat@10.7.16: - resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} + intl-messageformat@10.7.18: + resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -15150,8 +15189,8 @@ packages: resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} engines: {node: '>=0.10.0'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} ip-regex@2.1.0: @@ -15204,9 +15243,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -15317,12 +15353,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} is-function@1.0.2: @@ -15336,8 +15368,8 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@2.0.1: @@ -15393,8 +15425,8 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} engines: {node: '>=16'} is-npm@1.0.0: @@ -15561,6 +15593,10 @@ packages: is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + is-wayland@0.1.0: + resolution: {integrity: sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA==} + engines: {node: '>=20'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -15686,8 +15722,8 @@ packages: istanbul-reports@1.5.1: resolution: {integrity: sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} istanbul@0.4.5: @@ -16118,8 +16154,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true joi@17.13.3: @@ -16159,9 +16195,6 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jschardet@3.1.4: resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==} engines: {node: '>=0.1.90'} @@ -16175,8 +16208,8 @@ packages: '@babel/preset-env': optional: true - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + jsdoc-type-pratt-parser@4.8.0: + resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} engines: {node: '>=12.0.0'} jsdom@11.12.0: @@ -16211,11 +16244,6 @@ packages: resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -16285,8 +16313,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} @@ -16330,8 +16358,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.0: - resolution: {integrity: sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==} + keyv@5.5.3: + resolution: {integrity: sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==} kill-port@2.0.1: resolution: {integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==} @@ -16373,8 +16401,8 @@ packages: resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} engines: {node: '>=4'} - launch-editor@2.11.0: - resolution: {integrity: sha512-R/PIF14L6e2eHkhvQPu7jDRCr0msfCYCxbYiLgkkAGi0dVPWuM+RrsPu0a5dpuNe0KWGL3jpAkOlv53xGfPheQ==} + launch-editor@2.12.0: + resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} lazy-universal-dotenv@3.0.1: resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} @@ -16435,24 +16463,24 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.1.4: - resolution: {integrity: sha512-xy7rnzQrhTVGKMpv6+bmIA3C0yET31x8OhKBYfvGo0/byeZ6E0BjGARrir3Kg/RhhYHutpsi01+2J5IpfVoueA==} + lint-staged@16.2.6: + resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==} engines: {node: '>=20.17'} hasBin: true listenercount@1.0.1: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - listr2@9.0.1: - resolution: {integrity: sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==} + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} loader-utils@0.2.17: @@ -16634,8 +16662,8 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} @@ -16657,8 +16685,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@4.1.5: @@ -16683,8 +16711,8 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - luxon@3.7.1: - resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} lz-string@1.5.0: @@ -16694,8 +16722,8 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-cancellable-promise@1.3.2: resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} @@ -16758,11 +16786,14 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - markdown-to-jsx@7.7.13: - resolution: {integrity: sha512-DiueEq2bttFcSxUs85GJcQVrOr0+VVsPfj9AEUPqmExJ3f8P/iQNvZHltV4tm1XVhu1kl0vWBZWT3l99izRMaA==} + markdown-to-jsx@7.7.17: + resolution: {integrity: sha512-7mG/1feQ0TX5I7YyMZVDgCC/y2I3CiEhIRQIhyov9nGBP5eoVrOXXHuL5ZP8GRfxVZKRiXWJgwXkb9It+nQZfQ==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' + peerDependenciesMeta: + react: + optional: true matches-selector@0.0.1: resolution: {integrity: sha512-Bm8wuvuNGPY3j1Mo23PxieRQAmQQe2qVcqgmpHOp1BEBNgb4dqzn2Dcgu5bYltMosjGi6LD7GPW72zboSdyJQg==} @@ -16890,9 +16921,8 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - memfs@4.36.0: - resolution: {integrity: sha512-mfBfzGUdoEw5AZwG8E965ej3BbvW2F9LxEWj4uLxF6BEh1dO2N9eS3AGu9S6vfenuQYrVjsbUOOZK7y3vz4vyQ==} - engines: {node: '>= 4.0.0'} + memfs@4.50.0: + resolution: {integrity: sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==} memoizee@0.4.17: resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} @@ -16941,8 +16971,8 @@ packages: merge@1.2.1: resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} - meros@1.3.1: - resolution: {integrity: sha512-eV7dRObfTrckdmAz4/n7pT1njIsIJXRIZkgCiX43xEsPNy4gjXQzOYYxmGcolAMtF7HyfqRuDBh3Lgs4hmhVEw==} + meros@1.3.2: + resolution: {integrity: sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==} engines: {node: '>=13'} peerDependencies: '@types/node': '>=13' @@ -17207,8 +17237,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - mini-css-extract-plugin@2.9.3: - resolution: {integrity: sha512-tRA0+PsS4kLVijnN1w9jUu5lkxBwUk9E8SbgEB5dBJqchE6pVYdawROG6uQtpmAri7tdCK9i7b1bULeVWqS6Ag==} + mini-css-extract-plugin@2.9.4: + resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -17220,8 +17250,8 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.0.3: @@ -17310,16 +17340,16 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mocha@10.8.2: resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} engines: {node: '>= 14.0.0'} hasBin: true - mocha@11.7.1: - resolution: {integrity: sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==} + mocha@11.7.4: + resolution: {integrity: sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true @@ -17389,8 +17419,8 @@ packages: nan@2.23.0: resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} - nano-spawn@1.0.2: - resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} + nano-spawn@2.0.0: + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} nanoid@3.3.11: @@ -17398,8 +17428,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true @@ -17452,8 +17482,8 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.75.0: - resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + node-abi@3.80.0: + resolution: {integrity: sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA==} engines: {node: '>=10'} node-abort-controller@3.1.1: @@ -17546,8 +17576,8 @@ packages: node-notifier@6.0.0: resolution: {integrity: sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} node-sarif-builder@2.0.3: resolution: {integrity: sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg==} @@ -17600,8 +17630,8 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - normalize-url@8.0.2: - resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} npm-run-path@2.0.2: @@ -17616,6 +17646,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + npmlog@4.1.2: resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} deprecated: This package is no longer supported. @@ -17645,8 +17679,8 @@ packages: nwmatcher@1.4.4: resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} - nwsapi@2.2.21: - resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} + nwsapi@2.2.22: + resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} nypm@0.5.4: resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} @@ -17977,6 +18011,10 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} @@ -18076,9 +18114,8 @@ packages: path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} path-type@1.1.0: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} @@ -18253,8 +18290,8 @@ packages: popmotion@11.0.3: resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} - portfinder@1.0.37: - resolution: {integrity: sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==} + portfinder@1.0.38: + resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} engines: {node: '>= 10.12'} possible-typed-array-names@1.1.0: @@ -18341,8 +18378,8 @@ packages: peerDependencies: postcss: ^8.0.0 - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 @@ -18363,16 +18400,22 @@ packages: ts-node: optional: true - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: + jiti: '>=1.21.0' postcss: '>=8.0.9' - ts-node: '>=9.0.0' + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true postcss-load-options@1.2.0: @@ -18394,8 +18437,8 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^4.0.0 || ^5.0.0 - postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + postcss-loader@8.2.0: + resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -18699,6 +18742,10 @@ packages: resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} engines: {node: '>=0.10.0'} + presentable-error@0.0.1: + resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} + engines: {node: '>=16'} + prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} @@ -18755,6 +18802,10 @@ packages: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + prism-react-renderer@2.4.1: resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} peerDependencies: @@ -18889,6 +18940,10 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + qified@0.5.1: + resolution: {integrity: sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==} + engines: {node: '>=20'} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -18952,9 +19007,9 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} raw-loader@4.0.2: resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} @@ -19032,8 +19087,8 @@ packages: resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} engines: {node: '>=16.14.0'} - react-docgen@8.0.0: - resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==} + react-docgen@8.0.2: + resolution: {integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==} engines: {node: ^20.9.0 || >=22} react-dom@18.2.0: @@ -19133,8 +19188,8 @@ packages: peerDependencies: react: ^16.8.4 || ^17.0.0 || ^18.0.0 - react-intl@7.1.11: - resolution: {integrity: sha512-tnVoRCWvW5Ie2ikYSdPF7z3+880yCe/9xPmitFeRPw3RYDcCfR4m8ZYa4MBq19W4adt9Z+PQA4FaMBCJ7E+HCQ==} + react-intl@7.1.14: + resolution: {integrity: sha512-VE/0Wi/lHJlBC7APQpCzLUdIt3GB5B0GZrRW8Q+ACbkHI4j+Wwgg9J1TniN6zmLHmPH5gxXcMy+fkSPfw5p1WQ==} peerDependencies: react: 16 || 17 || 18 || 19 typescript: ^5.6.0 @@ -19154,11 +19209,11 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.1.1: - resolution: {integrity: sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==} + react-is@19.2.0: + resolution: {integrity: sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==} - react-json-view-lite@2.4.2: - resolution: {integrity: sha512-m7uTsXDgPQp8R9bJO4HD/66+i218eyQPAb+7/dGQpwg8i4z2afTFqtHJPQFHvJfgDCjGQ1HSGlL3HtrZDa3Tdg==} + react-json-view-lite@2.5.0: + resolution: {integrity: sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==} engines: {node: '>=18'} peerDependencies: react: ^18.0.0 || ^19.0.0 @@ -19290,8 +19345,8 @@ packages: '@types/react': optional: true - react-syntax-highlighter@15.6.1: - resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} + react-syntax-highlighter@15.6.6: + resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} peerDependencies: react: '>= 0.14.0' @@ -19456,8 +19511,8 @@ packages: refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} regenerate@1.4.2: @@ -19487,8 +19542,8 @@ packages: regexpu-core@2.0.0: resolution: {integrity: sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} registry-auth-token@3.4.0: @@ -19508,8 +19563,8 @@ packages: resolution: {integrity: sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==} hasBin: true - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true rehype-raw@6.1.1: @@ -19661,8 +19716,8 @@ packages: resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -19800,8 +19855,8 @@ packages: resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} hasBin: true - rollup@4.46.2: - resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -19813,8 +19868,8 @@ packages: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} engines: {node: 6.* || >= 7.*} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} run-async@2.4.1: @@ -19906,8 +19961,8 @@ packages: sass-embedded: optional: true - sass-loader@16.0.5: - resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} + sass-loader@16.0.6: + resolution: {integrity: sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -19927,16 +19982,16 @@ packages: webpack: optional: true - sass@1.90.0: - resolution: {integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==} + sass@1.93.3: + resolution: {integrity: sha512-elOcIZRTM76dvxNAjqYrucTSI0teAF/L2Lv0s6f6b7FOwcwIuA357bIE871580AjHJuSvLIRUosgV+lIWx6Rgg==} engines: {node: '>=14.0.0'} hasBin: true sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.4.2: + resolution: {integrity: sha512-FySGAa0RGcFiN6zfrO9JvK1r7TB59xuzCcTHOBXBNoKgDejlOQCR2KL/FGk3/iDlsqyYg1ELZpOmlg09B01Czw==} saxes@3.1.11: resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} @@ -19972,8 +20027,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} secretlint@9.3.4: @@ -19987,8 +20042,8 @@ packages: select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - selenium-webdriver@4.34.0: - resolution: {integrity: sha512-zGfQFcsASAv3KrYzYh+iw4fFqB7iZAgHW7BU6rRz7isK1i1X4x3LvjmZad4bUUgHDwTnAhlqTzDh21byB+zHMg==} + selenium-webdriver@4.38.0: + resolution: {integrity: sha512-5/UXXFSQmn7FGQkbcpAqvfhzflUdMWtT7QqpEgkFD6Q6rDucxB5EUfzgjmr6JbUj30QodcW3mDXehzoeS/Vy5w==} engines: {node: '>= 20.0.0'} selfsigned@2.4.1: @@ -20011,8 +20066,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -20175,9 +20230,6 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -20214,12 +20266,8 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} slugify@1.6.6: @@ -20243,8 +20291,8 @@ packages: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} - socks@2.8.6: - resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sort-keys@1.1.2: @@ -20345,9 +20393,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sshpk@1.18.0: resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} engines: {node: '>=0.10.0'} @@ -20439,8 +20484,8 @@ packages: prettier: optional: true - storybook@9.1.1: - resolution: {integrity: sha512-q6GaGZdVZh6rjOdGnc+4hGTu8ECyhyjQDw4EZNxKtQjDO8kqtuxbFm8l/IP2l+zLVJAatGWKkaX9Qcd7QZxz+Q==} + storybook@9.1.16: + resolution: {integrity: sha512-339U14K6l46EFyRvaPS2ZlL7v7Pb+LlcXT8KAETrGPxq8v1sAjj2HAOB6zrlAK3M+0+ricssfAwsLCwt7Eg8TQ==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -20511,6 +20556,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + string.fromcodepoint@0.2.1: resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} @@ -20576,8 +20625,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@2.0.0: @@ -20604,6 +20653,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@1.0.1: resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} engines: {node: '>=0.10.0'} @@ -20613,8 +20666,8 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} strip-json-comments@2.0.1: @@ -20670,17 +20723,17 @@ packages: peerDependencies: webpack: ^5.27.0 - style-mod@4.1.2: - resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} - style-to-js@1.1.17: - resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + style-to-js@1.1.19: + resolution: {integrity: sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==} style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} - style-to-object@1.0.9: - resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + style-to-object@1.0.12: + resolution: {integrity: sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==} style-value-types@5.0.0: resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} @@ -20703,8 +20756,8 @@ packages: peerDependencies: stylelint: ^16.18.0 - stylelint@16.23.0: - resolution: {integrity: sha512-69T5aS2LUY306ekt1Q1oaSPwz/jaG9HjyMix3UMrai1iEbuOafBe2Dh8xlyczrxFAy89qcKyZWWtc42XLx3Bbw==} + stylelint@16.25.0: + resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -20820,8 +20873,8 @@ packages: resolution: {integrity: sha512-v/hu7KQQtospyDLpZxz7m5c7s90aj53YEkJ/A8x3mLPlSgIkZ6RKJkTjBG75P1p/fo5IeSA4TycyJg3VSu/aPw==} deprecated: 'Please migrate to Workbox: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-sw' - swagger-client@3.35.6: - resolution: {integrity: sha512-OgwNneIdC45KXwOfwrlkwgWPeAKiV4K75mOnZioTddo1mpp9dTboCDVJas7185Ww1ziBwzShBqXpNGmyha9ZQg==} + swagger-client@3.36.0: + resolution: {integrity: sha512-9fkjxGHXuKy20jj8zwE6RwgFSOGKAyOD5U7aKgW/+/futtHZHOdZeqiEkb97sptk2rdBv7FEiUQDNlWZR186RA==} swagger-ui-react@5.21.0: resolution: {integrity: sha512-lS5paITM1kkcBb/BTTSMHKelh8elHfcuUP4T3R3mO80tDR0AYJL2HR5UdQD6nV1LwdvekzRM8gKjJA6hVayi0A==} @@ -20829,11 +20882,11 @@ packages: react: '>=16.8.0 <19' react-dom: '>=16.8.0 <19' - swagger-ui-react@5.27.1: - resolution: {integrity: sha512-wwDoavIeJI/Pwiavn32FMJ5dfptz0BAOKjSrj7EdU22QdP3gdk9+MZHdzzjxWURmVj0kc0XoQfsFgjln0toJaw==} + swagger-ui-react@5.30.1: + resolution: {integrity: sha512-W3HP5vHkLy+f+N7sKv/zNuUArWypBjFXUIbvYyYQ0Ke50yUvW1WhQvogIp8FCi/y1/kp20nnEfTVxSG1CtvZqw==} peerDependencies: - react: '>=16.8.0 <19' - react-dom: '>=16.8.0 <19' + react: '>=16.8.0 <20' + react-dom: '>=16.8.0 <20' swc-loader@0.2.6: resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} @@ -20858,8 +20911,8 @@ packages: tabbable@5.3.3: resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} table@5.4.6: resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} @@ -20872,13 +20925,13 @@ packages: tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.1.11: - resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tailwindcss@4.1.16: + resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} tapable@0.2.9: resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==} @@ -20888,8 +20941,8 @@ packages: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-fs@3.1.1: @@ -20965,8 +21018,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true @@ -21001,8 +21054,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -21050,8 +21103,8 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tinyrainbow@1.2.0: @@ -21066,23 +21119,23 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.2.4: - resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} to-fast-properties@1.0.3: @@ -21144,8 +21197,8 @@ packages: traverse@0.3.9: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - tree-dump@1.0.3: - resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -21271,8 +21324,8 @@ packages: resolution: {integrity: sha512-8t3bu2FcEkXb+D4L+Cn8qiK2E2C6Ms4/GQChvz6IMbVurcFHLXrhW4EMtfaol1a1ASQACZGDUGit4NHnX9g7hQ==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - ts-loader@9.5.2: - resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} + ts-loader@9.5.4: + resolution: {integrity: sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' @@ -21532,8 +21585,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - ua-parser-js@1.0.40: - resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} hasBin: true uc.micro@1.0.6: @@ -21580,8 +21633,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.13.0: - resolution: {integrity: sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} unfetch@4.2.0: @@ -21598,12 +21651,12 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} unicorn-magic@0.1.0: @@ -21676,8 +21729,8 @@ packages: unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -21709,8 +21762,8 @@ packages: unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} @@ -21769,8 +21822,8 @@ packages: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -21879,8 +21932,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -21965,8 +22018,8 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - version-range@4.14.0: - resolution: {integrity: sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg==} + version-range@4.15.0: + resolution: {integrity: sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==} engines: {node: '>=4'} vfile-location@3.2.0: @@ -22103,9 +22156,9 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vscode-ws-jsonrpc@3.4.0: - resolution: {integrity: sha512-jkNZvX0LdHt4skPxMw/jFePr3jRCJU6ZmO28oPoQ7RwNSkwU3uN8mgtxACYEbOY68bYmi/b/uJzhxewKCz1P4w==} - engines: {node: '>=18.19.0', npm: '>=10.2.3'} + vscode-ws-jsonrpc@3.5.0: + resolution: {integrity: sha512-13ZDy7Od4AfEPK2HIfY3DtyRi4FVsvFql1yobVJrpIoHOKGGJpIjVvIJpMxkrHzCZzWlYlg+WEu2hrYkCTvM0Q==} + engines: {node: '>=20.10.0', npm: '>=10.2.3'} w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} @@ -22239,8 +22292,8 @@ packages: webpack: optional: true - webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.0.0 @@ -22315,8 +22368,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.101.0: - resolution: {integrity: sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==} + webpack@5.102.1: + resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -22452,8 +22505,8 @@ packages: workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - workerpool@9.3.3: - resolution: {integrity: sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} wrap-ansi@2.1.0: resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} @@ -22475,8 +22528,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} wrappy@1.0.2: @@ -22687,6 +22740,10 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + yup@1.4.0: resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} @@ -22707,8 +22764,8 @@ packages: zod@4.1.11: resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} - zustand@5.0.7: - resolution: {integrity: sha512-Ot6uqHDW/O2VdYsKLLU8GQu8sCOM1LcoE8RwvLv9uuRT9s6SOHCKs0ZEOhxg+I1Ld+A1Q5lwx+UlKXXUoCZITg==} + zustand@5.0.8: + resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -22733,31 +22790,32 @@ packages: snapshots: - '@adobe/css-tools@4.4.3': {} + '@adobe/css-tools@4.4.4': {} - '@ai-sdk/amazon-bedrock@3.0.30(zod@4.1.11)': + '@ai-sdk/amazon-bedrock@3.0.51(zod@4.1.11)': dependencies: - '@ai-sdk/anthropic': 2.0.23(zod@4.1.11) + '@ai-sdk/anthropic': 2.0.41(zod@4.1.11) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) - '@smithy/eventstream-codec': 4.0.5 - '@smithy/util-utf8': 4.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.11) + '@smithy/eventstream-codec': 4.2.4 + '@smithy/util-utf8': 4.2.0 aws4fetch: 1.0.20 zod: 4.1.11 - '@ai-sdk/anthropic@2.0.23(zod@4.1.11)': + '@ai-sdk/anthropic@2.0.41(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/gateway@1.0.32(zod@4.1.11)': + '@ai-sdk/gateway@2.0.6(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.11) + '@vercel/oidc': 3.0.3 zod: 4.1.11 - '@ai-sdk/provider-utils@3.0.10(zod@4.1.11)': + '@ai-sdk/provider-utils@3.0.16(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 @@ -22772,8 +22830,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@apidevtools/json-schema-ref-parser@11.6.1': dependencies: @@ -22794,21 +22852,21 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.922.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.922.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-locate-window': 3.804.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -22817,15 +22875,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-locate-window': 3.804.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.922.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -22834,429 +22892,430 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.862.0 + '@aws-sdk/types': 3.922.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.862.0': + '@aws-sdk/client-s3@3.922.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.862.0 - '@aws-sdk/credential-provider-node': 3.862.0 - '@aws-sdk/middleware-bucket-endpoint': 3.862.0 - '@aws-sdk/middleware-expect-continue': 3.862.0 - '@aws-sdk/middleware-flexible-checksums': 3.862.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-location-constraint': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-sdk-s3': 3.862.0 - '@aws-sdk/middleware-ssec': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.862.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/signature-v4-multi-region': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.862.0 - '@aws-sdk/xml-builder': 3.862.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/eventstream-serde-browser': 4.0.5 - '@smithy/eventstream-serde-config-resolver': 4.1.3 - '@smithy/eventstream-serde-node': 4.0.5 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-blob-browser': 4.0.5 - '@smithy/hash-node': 4.0.5 - '@smithy/hash-stream-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/md5-js': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.7 - '@types/uuid': 9.0.8 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/credential-provider-node': 3.922.0 + '@aws-sdk/middleware-bucket-endpoint': 3.922.0 + '@aws-sdk/middleware-expect-continue': 3.922.0 + '@aws-sdk/middleware-flexible-checksums': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-location-constraint': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-sdk-s3': 3.922.0 + '@aws-sdk/middleware-ssec': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/signature-v4-multi-region': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 + '@aws-sdk/xml-builder': 3.921.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/eventstream-serde-browser': 4.2.4 + '@smithy/eventstream-serde-config-resolver': 4.3.4 + '@smithy/eventstream-serde-node': 4.2.4 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-blob-browser': 4.2.5 + '@smithy/hash-node': 4.2.4 + '@smithy/hash-stream-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/md5-js': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-stream': 4.5.5 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.4 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.862.0': + '@aws-sdk/client-sso@3.922.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.862.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.862.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.862.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.862.0': - dependencies: - '@aws-sdk/types': 3.862.0 - '@aws-sdk/xml-builder': 3.862.0 - '@smithy/core': 3.8.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-utf8': 4.0.0 - fast-xml-parser: 5.2.5 + '@aws-sdk/core@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@aws-sdk/xml-builder': 3.921.0 + '@smithy/core': 3.17.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.862.0': + '@aws-sdk/credential-provider-env@3.922.0': dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.862.0': - dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/node-http-handler': 4.1.1 - '@smithy/property-provider': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-stream': 4.2.4 + '@aws-sdk/credential-provider-http@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/node-http-handler': 4.4.4 + '@smithy/property-provider': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-stream': 4.5.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.862.0': - dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/credential-provider-env': 3.862.0 - '@aws-sdk/credential-provider-http': 3.862.0 - '@aws-sdk/credential-provider-process': 3.862.0 - '@aws-sdk/credential-provider-sso': 3.862.0 - '@aws-sdk/credential-provider-web-identity': 3.862.0 - '@aws-sdk/nested-clients': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/credential-provider-ini@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/credential-provider-env': 3.922.0 + '@aws-sdk/credential-provider-http': 3.922.0 + '@aws-sdk/credential-provider-process': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.922.0 + '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.862.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.862.0 - '@aws-sdk/credential-provider-http': 3.862.0 - '@aws-sdk/credential-provider-ini': 3.862.0 - '@aws-sdk/credential-provider-process': 3.862.0 - '@aws-sdk/credential-provider-sso': 3.862.0 - '@aws-sdk/credential-provider-web-identity': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/credential-provider-node@3.922.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.922.0 + '@aws-sdk/credential-provider-http': 3.922.0 + '@aws-sdk/credential-provider-ini': 3.922.0 + '@aws-sdk/credential-provider-process': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.922.0 + '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.862.0': + '@aws-sdk/credential-provider-process@3.922.0': dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.862.0': + '@aws-sdk/credential-provider-sso@3.922.0': dependencies: - '@aws-sdk/client-sso': 3.862.0 - '@aws-sdk/core': 3.862.0 - '@aws-sdk/token-providers': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/client-sso': 3.922.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/token-providers': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.862.0': + '@aws-sdk/credential-provider-web-identity@3.922.0': dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/nested-clients': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.862.0': + '@aws-sdk/middleware-bucket-endpoint@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.862.0': + '@aws-sdk/middleware-expect-continue@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.922.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.862.0': + '@aws-sdk/middleware-flexible-checksums@3.922.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.862.0': + '@aws-sdk/middleware-host-header@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.922.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.862.0': + '@aws-sdk/middleware-location-constraint@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.862.0': + '@aws-sdk/middleware-logger@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.862.0': + '@aws-sdk/middleware-recursion-detection@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.922.0 + '@aws/lambda-invoke-store': 0.1.1 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.862.0': - dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.8.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/middleware-sdk-s3@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.17.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.862.0': + '@aws-sdk/middleware-ssec@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.862.0': + '@aws-sdk/middleware-user-agent@3.922.0': dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@smithy/core': 3.8.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@smithy/core': 3.17.2 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.862.0': + '@aws-sdk/nested-clients@3.922.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.862.0 - '@aws-sdk/middleware-host-header': 3.862.0 - '@aws-sdk/middleware-logger': 3.862.0 - '@aws-sdk/middleware-recursion-detection': 3.862.0 - '@aws-sdk/middleware-user-agent': 3.862.0 - '@aws-sdk/region-config-resolver': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@aws-sdk/util-endpoints': 3.862.0 - '@aws-sdk/util-user-agent-browser': 3.862.0 - '@aws-sdk/util-user-agent-node': 3.862.0 - '@smithy/config-resolver': 4.1.5 - '@smithy/core': 3.8.0 - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/hash-node': 4.0.5 - '@smithy/invalid-dependency': 4.0.5 - '@smithy/middleware-content-length': 4.0.5 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-retry': 4.1.19 - '@smithy/middleware-serde': 4.0.9 - '@smithy/middleware-stack': 4.0.5 - '@smithy/node-config-provider': 4.1.4 - '@smithy/node-http-handler': 4.1.1 - '@smithy/protocol-http': 5.1.3 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.26 - '@smithy/util-defaults-mode-node': 4.0.26 - '@smithy/util-endpoints': 3.0.7 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@smithy/util-utf8': 4.0.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.862.0': + '@aws-sdk/region-config-resolver@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 + '@aws-sdk/types': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.862.0': + '@aws-sdk/signature-v4-multi-region@3.922.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/signature-v4': 5.1.3 - '@smithy/types': 4.3.2 + '@aws-sdk/middleware-sdk-s3': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.862.0': + '@aws-sdk/token-providers@3.922.0': dependencies: - '@aws-sdk/core': 3.862.0 - '@aws-sdk/nested-clients': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.862.0': + '@aws-sdk/types@3.922.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.804.0': + '@aws-sdk/util-arn-parser@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.862.0': + '@aws-sdk/util-endpoints@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-endpoints': 3.0.7 + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-endpoints': 3.2.4 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.804.0': + '@aws-sdk/util-locate-window@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.862.0': + '@aws-sdk/util-user-agent-browser@3.922.0': dependencies: - '@aws-sdk/types': 3.862.0 - '@smithy/types': 4.3.2 - bowser: 2.11.0 + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 + bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.862.0': + '@aws-sdk/util-user-agent-node@3.922.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.862.0 - '@aws-sdk/types': 3.862.0 - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.862.0': + '@aws-sdk/xml-builder@3.921.0': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 + fast-xml-parser: 5.2.5 tslib: 2.8.1 + '@aws/lambda-invoke-store@0.1.1': {} + '@azu/format-text@1.0.2': {} '@azu/style-format@1.0.1': @@ -23267,61 +23326,61 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-auth@1.10.0': + '@azure/core-auth@1.10.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.13.0 + '@azure/core-util': 1.13.1 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-client@1.10.0': + '@azure/core-client@1.10.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.0 - '@azure/core-rest-pipeline': 1.22.0 - '@azure/core-tracing': 1.3.0 - '@azure/core-util': 1.13.0 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.22.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-rest-pipeline@1.22.0': + '@azure/core-rest-pipeline@1.22.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.0 - '@azure/core-tracing': 1.3.0 - '@azure/core-util': 1.13.0 + '@azure/core-auth': 1.10.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.0 + '@typespec/ts-http-runtime': 0.3.1 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-tracing@1.3.0': + '@azure/core-tracing@1.3.1': dependencies: tslib: 2.8.1 - '@azure/core-util@1.13.0': + '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.0 + '@typespec/ts-http-runtime': 0.3.1 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/identity@4.11.1': + '@azure/identity@4.13.0': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.0 - '@azure/core-client': 1.10.0 - '@azure/core-rest-pipeline': 1.22.0 - '@azure/core-tracing': 1.3.0 - '@azure/core-util': 1.13.0 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.22.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.19.0 - '@azure/msal-node': 3.7.0 + '@azure/msal-browser': 4.26.0 + '@azure/msal-node': 3.8.1 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23329,47 +23388,47 @@ snapshots: '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.0 + '@typespec/ts-http-runtime': 0.3.1 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.19.0': + '@azure/msal-browser@4.26.0': dependencies: - '@azure/msal-common': 15.10.0 + '@azure/msal-common': 15.13.1 - '@azure/msal-common@15.10.0': {} + '@azure/msal-common@15.13.1': {} - '@azure/msal-node@3.7.0': + '@azure/msal-node@3.8.1': dependencies: - '@azure/msal-common': 15.10.0 + '@azure/msal-common': 15.13.1 jsonwebtoken: 9.0.2 uuid: 8.3.2 '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.28.5': {} '@babel/core@7.12.9': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.12.9) - '@babel/helpers': 7.28.2 - '@babel/parser': 7.28.0 + '@babel/generator': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.12.9) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 convert-source-map: 1.9.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 lodash: 4.17.21 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 source-map: 0.5.7 transitivePeerDependencies: @@ -23379,61 +23438,102 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) - '@babel/helpers': 7.28.2 - '@babel/parser': 7.28.0 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.0': + '@babel/core@7.28.5': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.27.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.7)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.7)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 semver: 6.3.1 + optional: true '@babel/helper-define-polyfill-provider@0.0.3(@babel/core@7.27.7)': dependencies: @@ -23441,10 +23541,10 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - debug: 4.4.1(supports-color@8.1.1) + '@babel/traverse': 7.28.5 + debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.11 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -23455,10 +23555,10 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - debug: 4.4.1(supports-color@8.1.1) + '@babel/traverse': 7.28.5 + debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.11 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -23468,49 +23568,70 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color + optional: true '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.12.9)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.7)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@babel/helper-plugin-utils@7.10.4': {} @@ -23520,89 +23641,148 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.27.1': + '@babel/helper-wrap-function@7.28.3': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.2': + '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 - '@babel/parser@7.28.0': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -23610,7 +23790,7 @@ snapshots: '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: @@ -23630,13 +23810,13 @@ snapshots: '@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/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-proposal-object-rest-spread@7.20.7(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.5 '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 @@ -23655,7 +23835,7 @@ snapshots: '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -23664,11 +23844,16 @@ snapshots: dependencies: '@babel/core': 7.27.7 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + optional: true + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.7) transitivePeerDependencies: @@ -23704,9 +23889,9 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.27.7)': + '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7)': @@ -23714,16 +23899,33 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -23744,6 +23946,11 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -23794,26 +24001,54 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -23823,33 +24058,73 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 @@ -23857,9 +24132,22 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + optional: true '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.7)': dependencies: @@ -23867,52 +24155,112 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + optional: true + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 + optional: true '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 + optional: true '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -23921,101 +24269,218 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color + optional: true '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -24024,12 +24489,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 @@ -24037,6 +24517,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 @@ -24047,33 +24536,69 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color + optional: true '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color + optional: true '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -24081,6 +24606,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -24088,7 +24620,18 @@ snapshots: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -24098,27 +24641,58 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.27.7)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -24127,67 +24701,132 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 + optional: true '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 + optional: true '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/preset-env@7.27.2(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.5 '@babel/core': 7.27.7 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.27.7) '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.7) '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.7) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.27.7) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.7) '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.7) '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.7) @@ -24196,41 +24835,41 @@ snapshots: '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.27.7) '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.27.7) '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.27.7) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.27.7) '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -24246,11 +24885,87 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.27.7) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.7) babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.27.7) - core-js-compat: 3.45.0 + core-js-compat: 3.46.0 semver: 6.3.1 transitivePeerDependencies: - supports-color + '@babel/preset-env@7.27.2(@babel/core@7.28.5)': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.46.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/preset-flow@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -24258,12 +24973,27 @@ snapshots: '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.7) + '@babel/preset-flow@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.5) + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 + esutils: 2.0.3 + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.5 esutils: 2.0.3 + optional: true '@babel/preset-react@7.27.1(@babel/core@7.27.7)': dependencies: @@ -24277,14 +25007,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.22.15(@babel/core@7.27.7)': + '@babel/preset-react@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.22.15(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color @@ -24295,11 +25037,22 @@ snapshots: '@babel/helper-validator-option': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/register@7.27.1(@babel/core@7.27.7)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.28.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 clone-deep: 4.0.1 @@ -24308,38 +25061,38 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 - '@babel/runtime-corejs3@7.28.2': + '@babel/runtime-corejs3@7.28.4': dependencies: - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 - '@babel/runtime@7.28.2': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.28.0': + '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.1(supports-color@8.1.1) + '@babel/types': 7.28.5 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.28.2': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@base2/pretty-print-object@1.0.1': {} - '@bazel/runfiles@6.3.1': {} + '@bazel/runfiles@6.5.0': {} '@bcoe/v8-coverage@0.2.3': {} @@ -24380,190 +25133,213 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true + '@cacheable/memoize@2.0.3': + dependencies: + '@cacheable/utils': 2.2.0 + + '@cacheable/memory@2.0.4': + dependencies: + '@cacheable/utils': 2.2.0 + '@keyv/bigmap': 1.1.0(keyv@5.5.3) + hookified: 1.12.2 + keyv: 5.5.3 + + '@cacheable/utils@2.2.0': + dependencies: + keyv: 5.5.3 + '@cnakazawa/watch@1.0.4': dependencies: exec-sh: 0.3.6 minimist: 1.2.8 - '@codemirror/autocomplete@6.18.6': + '@codemirror/autocomplete@6.19.1': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 - '@codemirror/commands@6.8.1': + '@codemirror/commands@6.10.0': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 '@codemirror/lang-angular@0.1.4': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 - '@codemirror/language': 6.11.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@codemirror/lang-cpp@6.0.3': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@lezer/cpp': 1.1.3 '@codemirror/lang-css@6.3.1': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lezer/css': 1.3.0 '@codemirror/lang-go@6.0.1': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lezer/go': 1.0.1 '@codemirror/lang-html@6.4.11': dependencies: - '@codemirror/autocomplete': 6.18.6 + '@codemirror/autocomplete': 6.19.1 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.4 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 '@lezer/css': 1.3.0 '@lezer/html': 1.3.12 '@codemirror/lang-java@6.0.2': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@lezer/java': 1.1.3 '@codemirror/lang-javascript@6.2.4': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 '@lezer/javascript': 1.5.4 + '@codemirror/lang-jinja@6.0.0': + dependencies: + '@codemirror/lang-html': 6.4.11 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 + '@codemirror/lang-json@6.0.2': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@lezer/json': 1.0.3 '@codemirror/lang-less@6.0.2': dependencies: '@codemirror/lang-css': 6.3.1 - '@codemirror/language': 6.11.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@codemirror/lang-liquid@6.3.0': dependencies: - '@codemirror/autocomplete': 6.18.6 + '@codemirror/autocomplete': 6.19.1 '@codemirror/lang-html': 6.4.11 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 - '@codemirror/lang-markdown@6.4.0': + '@codemirror/lang-markdown@6.5.0': dependencies: - '@codemirror/autocomplete': 6.18.6 + '@codemirror/autocomplete': 6.19.1 '@codemirror/lang-html': 6.4.11 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 - '@lezer/markdown': 1.4.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + '@lezer/markdown': 1.6.0 '@codemirror/lang-php@6.0.2': dependencies: '@codemirror/lang-html': 6.4.11 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lezer/php': 1.0.5 '@codemirror/lang-python@6.2.1': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lezer/python': 1.1.18 '@codemirror/lang-rust@6.0.2': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@lezer/rust': 1.0.2 '@codemirror/lang-sass@6.0.2': dependencies: '@codemirror/lang-css': 6.3.1 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lezer/sass': 1.1.0 '@codemirror/lang-sql@6.10.0': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@codemirror/lang-vue@0.1.3': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 - '@codemirror/language': 6.11.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@codemirror/lang-wast@6.0.2': dependencies: - '@codemirror/language': 6.11.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@codemirror/language': 6.11.3 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@codemirror/lang-xml@6.1.0': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 '@lezer/xml': 1.0.6 '@codemirror/lang-yaml@6.1.2': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/yaml': 1.0.3 - '@codemirror/language-data@6.5.1': + '@codemirror/language-data@6.5.2': dependencies: '@codemirror/lang-angular': 0.1.4 '@codemirror/lang-cpp': 6.0.3 @@ -24572,10 +25348,11 @@ snapshots: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-java': 6.0.2 '@codemirror/lang-javascript': 6.2.4 + '@codemirror/lang-jinja': 6.0.0 '@codemirror/lang-json': 6.0.2 '@codemirror/lang-less': 6.0.2 '@codemirror/lang-liquid': 6.3.0 - '@codemirror/lang-markdown': 6.4.0 + '@codemirror/lang-markdown': 6.5.0 '@codemirror/lang-php': 6.0.2 '@codemirror/lang-python': 6.2.1 '@codemirror/lang-rust': 6.0.2 @@ -24585,40 +25362,40 @@ snapshots: '@codemirror/lang-wast': 6.0.2 '@codemirror/lang-xml': 6.1.0 '@codemirror/lang-yaml': 6.1.2 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/legacy-modes': 6.5.2 - '@codemirror/language@6.11.2': + '@codemirror/language@6.11.3': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - style-mod: 4.1.2 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 + style-mod: 4.1.3 '@codemirror/legacy-modes@6.5.2': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/lint@6.8.5': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 crelt: 1.0.6 - '@codemirror/merge@6.11.0': + '@codemirror/merge@6.11.1': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/highlight': 1.2.1 - style-mod: 4.1.2 + '@codemirror/view': 6.38.6 + '@lezer/highlight': 1.2.3 + style-mod: 4.1.3 '@codemirror/search@6.5.11': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 crelt: 1.0.6 '@codemirror/state@6.5.2': @@ -24627,16 +25404,16 @@ snapshots: '@codemirror/theme-one-dark@6.1.3': dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/highlight': 1.2.1 + '@codemirror/view': 6.38.6 + '@lezer/highlight': 1.2.3 - '@codemirror/view@6.38.1': + '@codemirror/view@6.38.6': dependencies: '@codemirror/state': 6.5.2 crelt: 1.0.6 - style-mod: 4.1.2 + style-mod: 4.1.3 w3c-keyname: 2.2.8 '@codesandbox/nodebox@0.1.8': @@ -24655,16 +25432,16 @@ snapshots: '@codesandbox/sandpack-react@2.20.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/commands': 6.10.0 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@codesandbox/sandpack-client': 2.19.8 - '@lezer/highlight': 1.2.1 + '@lezer/highlight': 1.2.3 '@react-hook/intersection-observer': 3.1.2(react@18.2.0) '@stitches/core': 1.2.8 anser: 2.3.2 @@ -24701,9 +25478,9 @@ snapshots: dependencies: postcss-selector-parser: 7.1.0 - '@dabh/diagnostics@2.0.3': + '@dabh/diagnostics@2.0.8': dependencies: - colorspace: 1.1.4 + '@so-ric/colorspace': 1.1.6 enabled: 2.0.0 kuler: 2.0.0 @@ -24719,12 +25496,12 @@ snapshots: '@discoveryjs/json-ext@0.6.3': {} - '@dual-bundle/import-meta-resolve@4.1.0': {} + '@dual-bundle/import-meta-resolve@4.2.1': {} '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -24762,7 +25539,7 @@ snapshots: '@emotion/memoize': 0.7.4 optional: true - '@emotion/is-prop-valid@1.3.1': + '@emotion/is-prop-valid@1.4.0': dependencies: '@emotion/memoize': 0.9.0 @@ -24771,9 +25548,9 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0)': + '@emotion/react@11.14.0(@types/react@17.0.89)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -24783,13 +25560,13 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.0 optionalDependencies: - '@types/react': 17.0.87 + '@types/react': 17.0.89 transitivePeerDependencies: - supports-color '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -24805,7 +25582,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -24829,26 +25606,26 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0))(@types/react@17.0.87)(react@19.1.0)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.89)(react@19.1.0))(@types/react@17.0.89)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@17.0.87)(react@19.1.0) + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@17.0.89)(react@19.1.0) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) '@emotion/utils': 1.4.2 react: 19.1.0 optionalDependencies: - '@types/react': 17.0.87 + '@types/react': 17.0.89 transitivePeerDependencies: - supports-color '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 + '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.2.0) @@ -24861,9 +25638,9 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 + '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.2.0) @@ -24876,9 +25653,9 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 + '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) @@ -24903,105 +25680,105 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.26.0(jiti@2.6.1))': dependencies: - eslint: 9.26.0(jiti@2.5.1) + eslint: 9.26.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.27.0(jiti@2.6.1))': dependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.20.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@8.1.1) + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -25016,14 +25793,14 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -25037,7 +25814,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -25054,11 +25831,11 @@ snapshots: '@eslint/js@9.27.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@fal-works/esbuild-plugin-global-externals@2.1.2': {} @@ -25067,43 +25844,43 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.3': + '@floating-ui/dom@1.7.4': dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/dom': 1.7.3 + '@floating-ui/dom': 1.7.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@floating-ui/react-dom@2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.7.3 + '@floating-ui/dom': 1.7.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/react-dom@2.1.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.7.3 + '@floating-ui/dom': 1.7.4 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) '@floating-ui/react@0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.2.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tabbable: 6.2.0 + tabbable: 6.3.0 '@floating-ui/utils@0.2.10': {} - '@formatjs/ecma402-abstract@2.3.4': + '@formatjs/ecma402-abstract@2.3.6': dependencies: '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.1 + '@formatjs/intl-localematcher': 0.6.2 decimal.js: 10.6.0 tslib: 2.8.1 @@ -25111,37 +25888,37 @@ snapshots: dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.11.2': + '@formatjs/icu-messageformat-parser@2.11.4': dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-skeleton-parser': 1.8.14 + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/icu-skeleton-parser': 1.8.16 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.14': + '@formatjs/icu-skeleton-parser@1.8.16': dependencies: - '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/ecma402-abstract': 2.3.6 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.6.1': + '@formatjs/intl-localematcher@0.6.2': dependencies: tslib: 2.8.1 - '@formatjs/intl@3.1.6(typescript@4.9.5)': + '@formatjs/intl@3.1.8(typescript@4.9.5)': dependencies: - '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/ecma402-abstract': 2.3.6 '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 - intl-messageformat: 10.7.16 + '@formatjs/icu-messageformat-parser': 2.11.4 + intl-messageformat: 10.7.18 tslib: 2.8.1 optionalDependencies: typescript: 4.9.5 - '@formatjs/intl@3.1.6(typescript@5.8.3)': + '@formatjs/intl@3.1.8(typescript@5.8.3)': dependencies: - '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/ecma402-abstract': 2.3.6 '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 - intl-messageformat: 10.7.16 + '@formatjs/icu-messageformat-parser': 2.11.4 + intl-messageformat: 10.7.18 tslib: 2.8.1 optionalDependencies: typescript: 5.8.3 @@ -25150,25 +25927,23 @@ snapshots: '@gar/promisify@1.1.3': {} - '@github/markdown-toolbar-element@2.2.3': {} - - '@graphiql/react@0.26.2(@codemirror/language@6.11.2)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@graphiql/react@0.26.2(@codemirror/language@6.11.3)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.12.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@22.15.35)(graphql@16.11.0) + '@graphiql/toolkit': 0.11.3(@types/node@22.15.35)(graphql@16.12.0) '@headlessui/react': 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-dropdown-menu': 2.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-tooltip': 1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/codemirror': 5.60.16 + '@types/codemirror': 5.60.17 clsx: 1.2.1 - codemirror: 5.65.19 - codemirror-graphql: 2.2.4(@codemirror/language@6.11.2)(codemirror@5.65.19)(graphql@16.11.0) + codemirror: 5.65.20 + codemirror-graphql: 2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.20)(graphql@16.12.0) copy-to-clipboard: 3.3.3 framer-motion: 6.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) get-value: 3.0.1 - graphql: 16.11.0 - graphql-language-service: 5.5.0(graphql@16.11.0) + graphql: 16.12.0 + graphql-language-service: 5.5.0(graphql@16.12.0) markdown-it: 14.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -25180,11 +25955,11 @@ snapshots: - '@types/react-dom' - graphql-ws - '@graphiql/toolkit@0.11.3(@types/node@22.15.35)(graphql@16.11.0)': + '@graphiql/toolkit@0.11.3(@types/node@22.15.35)(graphql@16.12.0)': dependencies: '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 - graphql: 16.11.0 - meros: 1.3.1(@types/node@22.15.35) + graphql: 16.12.0 + meros: 1.3.2(@types/node@22.15.35) transitivePeerDependencies: - '@types/node' @@ -25208,15 +25983,15 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@headlessui/react@2.2.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@headlessui/react@2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/focus': 3.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/interactions': 3.25.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/focus': 3.21.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/interactions': 3.25.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/react-virtual': 3.13.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - use-sync-external-store: 1.5.0(react@18.2.0) + use-sync-external-store: 1.6.0(react@18.2.0) '@hookform/resolvers@2.9.11(react-hook-form@7.56.4(react@18.2.0))': dependencies: @@ -25231,6 +26006,11 @@ snapshots: '@standard-schema/utils': 0.3.0 react-hook-form: 7.56.4(react@18.2.0) + '@hookform/resolvers@5.2.2(react-hook-form@7.56.4(react@18.2.0))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.56.4(react@18.2.0) + '@hookform/resolvers@5.2.2(react-hook-form@7.63.0(react@18.2.0))': dependencies: '@standard-schema/utils': 0.3.0 @@ -25238,15 +26018,15 @@ snapshots: '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -25255,8 +26035,6 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@iarna/toml@2.2.5': {} @@ -25271,7 +26049,7 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -25339,7 +26117,7 @@ snapshots: - supports-color - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -25353,7 +26131,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -25438,7 +26216,7 @@ snapshots: '@jest/transform': 25.5.1 '@jest/types': 25.5.0 chalk: 3.0.0 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -25446,7 +26224,7 @@ snapshots: istanbul-lib-instrument: 4.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 jest-haste-map: 25.5.1 jest-resolve: 25.5.1 jest-util: 25.5.0 @@ -25468,10 +26246,10 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@types/node': 22.15.35 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -25479,7 +26257,7 @@ snapshots: istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -25502,7 +26280,7 @@ snapshots: '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 @@ -25511,14 +26289,14 @@ snapshots: '@jest/console': 25.5.0 '@jest/types': 25.5.0 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 '@jest/test-sequencer@25.5.4': dependencies: @@ -25585,7 +26363,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -25622,40 +26400,45 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 22.15.35 - '@types/yargs': 17.0.33 + '@types/yargs': 17.0.34 chalk: 4.1.2 '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)': dependencies: glob: 10.4.5 - magic-string: 0.30.17 + magic-string: 0.30.21 react-docgen-typescript: 2.4.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.10': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 '@jsdevtools/ono@7.1.3': {} @@ -25663,7 +26446,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/buffers@1.0.0(tslib@2.8.1)': + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -25671,29 +26454,38 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.8.0(tslib@2.8.1)': + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 1.0.1(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pointer@1.0.1(tslib@2.8.1)': + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/buffers': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 '@juggle/resize-observer@3.4.0': {} - '@keyv/serialize@1.1.0': {} + '@keyv/bigmap@1.1.0(keyv@5.5.3)': + dependencies: + hookified: 1.12.2 + keyv: 5.5.3 + + '@keyv/serialize@1.1.1': {} '@leichtgewicht/ip-codec@2.0.5': {} @@ -25841,98 +26633,98 @@ snapshots: '@lexical/offset': 0.17.1 lexical: 0.17.1 - '@lezer/common@1.2.3': {} + '@lezer/common@1.3.0': {} '@lezer/cpp@1.1.3': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/css@1.3.0': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/go@1.0.1': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 - '@lezer/highlight@1.2.1': + '@lezer/highlight@1.2.3': dependencies: - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lezer/html@1.3.12': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/java@1.1.3': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/javascript@1.5.4': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/json@1.0.3': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 - '@lezer/lr@1.4.2': + '@lezer/lr@1.4.3': dependencies: - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 - '@lezer/markdown@1.4.3': + '@lezer/markdown@1.6.0': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 '@lezer/php@1.0.5': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/python@1.1.18': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/rust@1.0.2': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/sass@1.1.0': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/xml@1.0.6': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@lezer/yaml@1.0.3': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.3 '@marijn/find-cluster-break@1.0.2': {} @@ -25976,7 +26768,7 @@ snapshots: '@types/react': 18.2.0 react: 19.1.0 - '@mdx-js/react@3.1.0(@types/react@18.2.0)(react@19.1.0)': + '@mdx-js/react@3.1.1(@types/react@18.2.0)(react@19.1.0)': dependencies: '@types/mdx': 2.0.13 '@types/react': 18.2.0 @@ -25984,13 +26776,13 @@ snapshots: '@mdx-js/util@1.6.22': {} - '@mdxeditor/editor@3.14.0(@codemirror/language@6.11.2)(@lezer/highlight@1.2.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mdxeditor/editor@3.14.0(@codemirror/language@6.11.3)(@lezer/highlight@1.2.3)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@codemirror/lang-markdown': 6.4.0 - '@codemirror/language-data': 6.5.1 - '@codemirror/merge': 6.11.0 + '@codemirror/lang-markdown': 6.5.0 + '@codemirror/language-data': 6.5.2 + '@codemirror/merge': 6.11.1 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@codesandbox/sandpack-react': 2.20.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@lexical/clipboard': 0.17.1 '@lexical/link': 0.17.1 @@ -26003,15 +26795,15 @@ snapshots: '@lexical/utils': 0.17.1 '@mdxeditor/gurx': 1.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/colors': 3.0.0 - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-icons': 1.3.2(react@18.2.0) '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-select': 2.2.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toggle-group': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toolbar': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-tooltip': 1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - cm6-theme-basic-light: 0.2.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + cm6-theme-basic-light: 0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.3) codemirror: 6.0.2 downshift: 7.6.2(react@18.2.0) js-yaml: 4.1.0 @@ -26053,9 +26845,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@microsoft/1ds-core-js@4.3.9(tslib@2.8.1)': + '@microsoft/1ds-core-js@4.3.10(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-core-js': 3.3.9(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.4 @@ -26063,9 +26855,9 @@ snapshots: transitivePeerDependencies: - tslib - '@microsoft/1ds-post-js@4.3.9(tslib@2.8.1)': + '@microsoft/1ds-post-js@4.3.10(tslib@2.8.1)': dependencies: - '@microsoft/1ds-core-js': 4.3.9(tslib@2.8.1) + '@microsoft/1ds-core-js': 4.3.10(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.4 @@ -26073,25 +26865,25 @@ snapshots: transitivePeerDependencies: - tslib - '@microsoft/applicationinsights-channel-js@3.3.9(tslib@2.8.1)': + '@microsoft/applicationinsights-channel-js@3.3.10(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-common': 3.3.9(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 3.3.9(tslib@2.8.1) + '@microsoft/applicationinsights-common': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.4 '@nevware21/ts-utils': 0.12.5 tslib: 2.8.1 - '@microsoft/applicationinsights-common@3.3.9(tslib@2.8.1)': + '@microsoft/applicationinsights-common@3.3.10(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-core-js': 3.3.9(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-utils': 0.12.5 tslib: 2.8.1 - '@microsoft/applicationinsights-core-js@3.3.9(tslib@2.8.1)': + '@microsoft/applicationinsights-core-js@3.3.10(tslib@2.8.1)': dependencies: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 @@ -26103,11 +26895,11 @@ snapshots: dependencies: '@nevware21/ts-utils': 0.12.5 - '@microsoft/applicationinsights-web-basic@3.3.9(tslib@2.8.1)': + '@microsoft/applicationinsights-web-basic@3.3.10(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-channel-js': 3.3.9(tslib@2.8.1) - '@microsoft/applicationinsights-common': 3.3.9(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 3.3.9(tslib@2.8.1) + '@microsoft/applicationinsights-channel-js': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-common': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-async': 0.5.4 @@ -26156,7 +26948,7 @@ snapshots: dependencies: '@modelcontextprotocol/sdk': 1.21.0 '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': 1.3.2(react@18.3.1) '@radix-ui/react-label': 2.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -26165,7 +26957,7 @@ snapshots: '@radix-ui/react-switch': 1.2.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toast': 1.2.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': 1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ajv: 6.12.6 class-variance-authority: 0.7.1 clsx: 2.1.1 @@ -26200,7 +26992,7 @@ snapshots: - supports-color - utf-8-validate - '@modelcontextprotocol/inspector@0.17.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3)': + '@modelcontextprotocol/inspector@0.17.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3)': dependencies: '@modelcontextprotocol/inspector-cli': 0.17.2 '@modelcontextprotocol/inspector-client': 0.17.2(@types/react-dom@18.2.0)(@types/react@18.2.0) @@ -26211,7 +27003,7 @@ snapshots: open: 10.2.0 shell-quote: 1.8.3 spawn-rx: 5.1.2 - ts-node: 10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.18)(typescript@5.8.3) zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' @@ -26225,23 +27017,6 @@ snapshots: - typescript - utf-8-validate - '@modelcontextprotocol/sdk@1.17.1': - dependencies: - ajv: 6.12.6 - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) - transitivePeerDependencies: - - supports-color - '@modelcontextprotocol/sdk@1.21.0': dependencies: ajv: 8.17.1 @@ -26254,26 +27029,26 @@ snapshots: express: 5.1.0 express-rate-limit: 7.5.1(express@5.1.0) pkce-challenge: 5.0.0 - raw-body: 3.0.0 + raw-body: 3.0.1 zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) transitivePeerDependencies: - supports-color - '@monaco-editor/loader@1.5.0': + '@monaco-editor/loader@1.6.1': dependencies: state-local: 1.0.7 '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@monaco-editor/loader': 1.5.0 + '@monaco-editor/loader': 1.6.1 monaco-editor: 0.52.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@monaco-editor/loader': 1.5.0 + '@monaco-editor/loader': 1.6.1 monaco-editor: 0.52.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -26326,6 +27101,7 @@ snapshots: pump: 3.0.3 tar-fs: 3.1.1 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -26352,12 +27128,12 @@ snapshots: '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@npmcli/move-file@1.1.2': dependencies: @@ -26458,105 +27234,105 @@ snapshots: dependencies: playwright: 1.55.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + '@types/webpack': 5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)))': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17)) + '@types/webpack': 5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17)) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + webpack-dev-server: 5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@4.10.0) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.102.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)(webpack@5.102.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack@5.102.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1)': dependencies: anser: 2.3.2 - core-js-pure: 3.45.0 + core-js-pure: 3.46.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 react-refresh: 0.11.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) webpack-hot-middleware: 2.26.1 '@projectstorm/geometry@6.7.4': {} @@ -26754,21 +27530,19 @@ snapshots: '@radix-ui/number@1.0.1': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.0.1': dependencies: - '@babel/runtime': 7.28.2 - - '@radix-ui/primitive@1.1.2': {} + '@babel/runtime': 7.28.4 '@radix-ui/primitive@1.1.3': {} '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -26778,7 +27552,7 @@ snapshots: '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -26822,7 +27596,7 @@ snapshots: '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -26835,7 +27609,7 @@ snapshots: '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -26884,14 +27658,14 @@ snapshots: '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26916,14 +27690,14 @@ snapshots: '@radix-ui/react-context@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-context@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26946,17 +27720,17 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - '@radix-ui/react-dialog@1.1.14(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) @@ -26968,17 +27742,17 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-dialog@1.1.14(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.2.0)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.3(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.3.1) @@ -26992,14 +27766,14 @@ snapshots: '@radix-ui/react-direction@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-direction@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -27024,7 +27798,7 @@ snapshots: '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -27038,7 +27812,7 @@ snapshots: '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -27050,32 +27824,6 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.2.0)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -27102,13 +27850,13 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-menu': 2.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 @@ -27119,30 +27867,18 @@ snapshots: '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 - '@radix-ui/react-focus-guards@1.1.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-focus-guards@1.1.2(@types/react@18.2.0)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.2.0 - '@radix-ui/react-focus-guards@1.1.3(@types/react@18.2.0)(react@18.2.0)': dependencies: react: 18.2.0 @@ -27157,7 +27893,7 @@ snapshots: '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) @@ -27169,7 +27905,7 @@ snapshots: '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) @@ -27211,7 +27947,7 @@ snapshots: '@radix-ui/react-id@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -27219,7 +27955,7 @@ snapshots: '@radix-ui/react-id@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -27255,22 +27991,22 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-menu@2.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.2.0)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.2.0) aria-hidden: 1.2.6 @@ -27329,8 +28065,8 @@ snapshots: '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 - '@floating-ui/react-dom': 2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.28.4 + '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@18.2.0) @@ -27348,8 +28084,8 @@ snapshots: '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 - '@floating-ui/react-dom': 2.1.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@babel/runtime': 7.28.4 + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@19.1.0) @@ -27365,45 +28101,9 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-popper@1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@floating-ui/react-dom': 2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/rect': 1.1.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-popper@1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/rect': 1.1.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - '@radix-ui/react-popper@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) @@ -27421,7 +28121,7 @@ snapshots: '@radix-ui/react-popper@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.3.1) @@ -27439,7 +28139,7 @@ snapshots: '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -27449,7 +28149,7 @@ snapshots: '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -27477,26 +28177,6 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-presence@1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-presence@1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - '@radix-ui/react-presence@1.1.5(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) @@ -27519,7 +28199,7 @@ snapshots: '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -27529,7 +28209,7 @@ snapshots: '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -27564,9 +28244,9 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) @@ -27581,23 +28261,6 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -27615,9 +28278,26 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 18.2.0 + '@types/react-dom': 18.2.0 + '@radix-ui/react-select@1.2.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -27647,7 +28327,7 @@ snapshots: '@radix-ui/react-select@1.2.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -27753,7 +28433,7 @@ snapshots: '@radix-ui/react-slot@1.0.2(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -27761,7 +28441,7 @@ snapshots: '@radix-ui/react-slot@1.0.2(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -27839,14 +28519,14 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-toggle-group@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toggle': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -27854,14 +28534,14 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-toggle-group@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -27869,9 +28549,9 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-toggle@1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 @@ -27880,9 +28560,9 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-toggle@1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 @@ -27891,46 +28571,46 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-toolbar@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-separator': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toggle-group': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-toolbar@1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-separator': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-tooltip@1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) @@ -27941,16 +28621,16 @@ snapshots: '@types/react': 18.2.0 '@types/react-dom': 18.2.0 - '@radix-ui/react-tooltip@1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': 1.2.3(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.3.1) @@ -27963,14 +28643,14 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -27995,7 +28675,7 @@ snapshots: '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28003,7 +28683,7 @@ snapshots: '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28056,7 +28736,7 @@ snapshots: '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28064,7 +28744,7 @@ snapshots: '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28086,14 +28766,14 @@ snapshots: '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -28118,14 +28798,14 @@ snapshots: '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -28144,7 +28824,7 @@ snapshots: '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/rect': 1.0.1 react: 18.2.0 optionalDependencies: @@ -28152,7 +28832,7 @@ snapshots: '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/rect': 1.0.1 react: 19.1.0 optionalDependencies: @@ -28174,7 +28854,7 @@ snapshots: '@radix-ui/react-use-size@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28182,7 +28862,7 @@ snapshots: '@radix-ui/react-use-size@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28204,7 +28884,7 @@ snapshots: '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -28214,7 +28894,7 @@ snapshots: '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -28242,26 +28922,26 @@ snapshots: '@radix-ui/rect@1.0.1': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@radix-ui/rect@1.1.1': {} - '@react-aria/focus@3.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/focus@3.21.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@react-aria/interactions': 3.25.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/utils': 3.30.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-types/shared': 3.31.0(react@18.2.0) + '@react-aria/interactions': 3.25.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.31.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-types/shared': 3.32.1(react@18.2.0) '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-aria/interactions@3.25.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/interactions@3.25.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.10(react@18.2.0) - '@react-aria/utils': 3.30.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.31.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.31.0(react@18.2.0) + '@react-types/shared': 3.32.1(react@18.2.0) '@swc/helpers': 0.5.17 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -28271,12 +28951,12 @@ snapshots: '@swc/helpers': 0.5.17 react: 18.2.0 - '@react-aria/utils@3.30.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/utils@3.31.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.10(react@18.2.0) '@react-stately/flags': 3.1.2 '@react-stately/utils': 3.10.8(react@18.2.0) - '@react-types/shared': 3.31.0(react@18.2.0) + '@react-types/shared': 3.32.1(react@18.2.0) '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 18.2.0 @@ -28307,22 +28987,22 @@ snapshots: '@swc/helpers': 0.5.17 react: 18.2.0 - '@react-types/shared@3.31.0(react@18.2.0)': + '@react-types/shared@3.32.1(react@18.2.0)': dependencies: react: 18.2.0 - '@redhat-developer/locators@1.15.0(@redhat-developer/page-objects@1.15.0(selenium-webdriver@4.34.0)(typescript@5.8.3))(selenium-webdriver@4.34.0)': + '@redhat-developer/locators@1.17.0(@redhat-developer/page-objects@1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0)': dependencies: - '@redhat-developer/page-objects': 1.15.0(selenium-webdriver@4.34.0)(typescript@5.8.3) - selenium-webdriver: 4.34.0 + '@redhat-developer/page-objects': 1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3) + selenium-webdriver: 4.38.0 - '@redhat-developer/page-objects@1.15.0(selenium-webdriver@4.34.0)(typescript@5.8.3)': + '@redhat-developer/page-objects@1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3)': dependencies: - clipboardy: 4.0.0 + clipboardy: 5.0.0 clone-deep: 4.0.1 compare-versions: 6.1.1 - fs-extra: 11.3.1 - selenium-webdriver: 4.34.0 + fs-extra: 11.3.2 + selenium-webdriver: 4.38.0 type-fest: 4.41.0 typescript: 5.8.3 @@ -28345,41 +29025,41 @@ snapshots: glob: 7.2.3 is-reference: 1.2.1 magic-string: 0.25.9 - resolve: 1.22.10 + resolve: 1.22.11 rollup: 1.32.1 - '@rollup/plugin-commonjs@28.0.6(rollup@4.46.2)': + '@rollup/plugin-commonjs@28.0.9(rollup@4.52.5)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.21 picomatch: 4.0.3 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.5 '@rollup/plugin-json@4.1.0(rollup@1.32.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@1.32.1) rollup: 1.32.1 - '@rollup/plugin-json@6.1.0(rollup@4.46.2)': + '@rollup/plugin-json@6.1.0(rollup@4.52.5)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.5 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.2)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.52.5)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.5 '@rollup/plugin-node-resolve@9.0.0(rollup@1.32.1)': dependencies: @@ -28388,7 +29068,7 @@ snapshots: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 rollup: 1.32.1 '@rollup/plugin-replace@2.4.2(rollup@1.32.1)': @@ -28409,72 +29089,78 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.2.0(rollup@4.46.2)': + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.46.2 + rollup: 4.52.5 + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true - '@rollup/rollup-android-arm-eabi@4.46.2': + '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-android-arm64@4.46.2': + '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.46.2': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.46.2': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true - '@rollup/rollup-freebsd-arm64@4.46.2': + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true - '@rollup/rollup-freebsd-x64@4.46.2': + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.46.2': + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.46.2': + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.46.2': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.46.2': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.46.2': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.46.2': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.46.2': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.46.2': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.46.2': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.46.2': + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.46.2': + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.46.2': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true '@rtsao/scc@1.1.0': {} @@ -28493,7 +29179,7 @@ snapshots: '@secretlint/resolver': 9.3.4 '@secretlint/types': 9.3.4 ajv: 8.17.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) rc-config-loader: 4.1.3 transitivePeerDependencies: - supports-color @@ -28502,7 +29188,7 @@ snapshots: dependencies: '@secretlint/profiler': 9.3.4 '@secretlint/types': 9.3.4 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) structured-source: 4.0.0 transitivePeerDependencies: - supports-color @@ -28515,7 +29201,7 @@ snapshots: '@textlint/module-interop': 14.8.4 '@textlint/types': 14.8.4 chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) pluralize: 8.0.0 strip-ansi: 6.0.1 table: 6.9.0 @@ -28531,7 +29217,7 @@ snapshots: '@secretlint/profiler': 9.3.4 '@secretlint/source-creator': 9.3.4 '@secretlint/types': 9.3.4 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) p-map: 4.0.0 transitivePeerDependencies: - supports-color @@ -28589,10 +29275,12 @@ snapshots: '@sindresorhus/is@5.6.0': {} - '@sindresorhus/is@7.0.2': {} + '@sindresorhus/is@7.1.1': {} '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 @@ -28607,8 +29295,8 @@ snapshots: '@size-limit/esbuild@11.2.0(size-limit@11.2.0)': dependencies: - esbuild: 0.25.8 - nanoid: 5.1.5 + esbuild: 0.25.12 + nanoid: 5.1.6 size-limit: 11.2.0 '@size-limit/file@11.2.0(size-limit@11.2.0)': @@ -28621,255 +29309,254 @@ snapshots: '@size-limit/file': 11.2.0(size-limit@11.2.0) size-limit: 11.2.0 - '@smithy/abort-controller@4.0.5': + '@smithy/abort-controller@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.0.0': + '@smithy/chunked-blob-reader-native@4.2.1': dependencies: - '@smithy/util-base64': 4.0.0 + '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.0.0': + '@smithy/chunked-blob-reader@5.2.0': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.5': + '@smithy/config-resolver@4.4.1': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.5 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 tslib: 2.8.1 - '@smithy/core@3.8.0': - dependencies: - '@smithy/middleware-serde': 4.0.9 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-stream': 4.2.4 - '@smithy/util-utf8': 4.0.0 - '@types/uuid': 9.0.8 + '@smithy/core@3.17.2': + dependencies: + '@smithy/middleware-serde': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - uuid: 9.0.1 - '@smithy/credential-provider-imds@4.0.7': + '@smithy/credential-provider-imds@4.2.4': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.5': + '@smithy/eventstream-codec@4.2.4': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.2 - '@smithy/util-hex-encoding': 4.0.0 + '@smithy/types': 4.8.1 + '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.5': + '@smithy/eventstream-serde-browser@4.2.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-serde-universal': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.3': + '@smithy/eventstream-serde-config-resolver@4.3.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.5': + '@smithy/eventstream-serde-node@4.2.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-serde-universal': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.5': + '@smithy/eventstream-serde-universal@4.2.4': dependencies: - '@smithy/eventstream-codec': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/eventstream-codec': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.1.1': + '@smithy/fetch-http-handler@5.3.5': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/querystring-builder': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/querystring-builder': 4.2.4 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.0.5': + '@smithy/hash-blob-browser@4.2.5': dependencies: - '@smithy/chunked-blob-reader': 5.0.0 - '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.3.2 + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/hash-node@4.0.5': + '@smithy/hash-node@4.2.4': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.8.1 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.0.5': + '@smithy/hash-stream-node@4.2.4': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.8.1 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.5': + '@smithy/invalid-dependency@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.0.0': + '@smithy/is-array-buffer@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.0.5': + '@smithy/md5-js@4.2.4': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.8.1 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.5': + '@smithy/middleware-content-length@4.2.4': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.18': + '@smithy/middleware-endpoint@4.3.6': dependencies: - '@smithy/core': 3.8.0 - '@smithy/middleware-serde': 4.0.9 - '@smithy/node-config-provider': 4.1.4 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 - '@smithy/url-parser': 4.0.5 - '@smithy/util-middleware': 4.0.5 + '@smithy/core': 3.17.2 + '@smithy/middleware-serde': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-middleware': 4.2.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.19': + '@smithy/middleware-retry@4.4.6': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/protocol-http': 5.1.3 - '@smithy/service-error-classification': 4.0.7 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-retry': 4.0.7 - '@types/uuid': 9.0.8 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/service-error-classification': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - uuid: 9.0.1 - '@smithy/middleware-serde@4.0.9': + '@smithy/middleware-serde@4.2.4': dependencies: - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.5': + '@smithy/middleware-stack@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.4': + '@smithy/node-config-provider@4.3.4': dependencies: - '@smithy/property-provider': 4.0.5 - '@smithy/shared-ini-file-loader': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.1.1': + '@smithy/node-http-handler@4.4.4': dependencies: - '@smithy/abort-controller': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/querystring-builder': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/abort-controller': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/querystring-builder': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/property-provider@4.0.5': + '@smithy/property-provider@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/protocol-http@5.1.3': + '@smithy/protocol-http@5.3.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.5': + '@smithy/querystring-builder@4.2.4': dependencies: - '@smithy/types': 4.3.2 - '@smithy/util-uri-escape': 4.0.0 + '@smithy/types': 4.8.1 + '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.5': + '@smithy/querystring-parser@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.7': + '@smithy/service-error-classification@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 - '@smithy/shared-ini-file-loader@4.0.5': + '@smithy/shared-ini-file-loader@4.3.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/signature-v4@5.1.3': + '@smithy/signature-v4@5.3.4': dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.5 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.4.10': + '@smithy/smithy-client@4.9.2': dependencies: - '@smithy/core': 3.8.0 - '@smithy/middleware-endpoint': 4.1.18 - '@smithy/middleware-stack': 4.0.5 - '@smithy/protocol-http': 5.1.3 - '@smithy/types': 4.3.2 - '@smithy/util-stream': 4.2.4 + '@smithy/core': 3.17.2 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-stack': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-stream': 4.5.5 tslib: 2.8.1 - '@smithy/types@4.3.2': + '@smithy/types@4.8.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.5': + '@smithy/url-parser@4.2.4': dependencies: - '@smithy/querystring-parser': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/querystring-parser': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-base64@4.0.0': + '@smithy/util-base64@4.3.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.0.0': + '@smithy/util-body-length-browser@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.0.0': + '@smithy/util-body-length-node@4.2.1': dependencies: tslib: 2.8.1 @@ -28878,66 +29565,65 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.0.0': + '@smithy/util-buffer-from@4.2.0': dependencies: - '@smithy/is-array-buffer': 4.0.0 + '@smithy/is-array-buffer': 4.2.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.0.0': + '@smithy/util-config-provider@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.26': + '@smithy/util-defaults-mode-browser@4.3.5': dependencies: - '@smithy/property-provider': 4.0.5 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 - bowser: 2.11.0 + '@smithy/property-provider': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.26': + '@smithy/util-defaults-mode-node@4.2.7': dependencies: - '@smithy/config-resolver': 4.1.5 - '@smithy/credential-provider-imds': 4.0.7 - '@smithy/node-config-provider': 4.1.4 - '@smithy/property-provider': 4.0.5 - '@smithy/smithy-client': 4.4.10 - '@smithy/types': 4.3.2 + '@smithy/config-resolver': 4.4.1 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.7': + '@smithy/util-endpoints@3.2.4': dependencies: - '@smithy/node-config-provider': 4.1.4 - '@smithy/types': 4.3.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.0.0': + '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.5': + '@smithy/util-middleware@4.2.4': dependencies: - '@smithy/types': 4.3.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-retry@4.0.7': + '@smithy/util-retry@4.2.4': dependencies: - '@smithy/service-error-classification': 4.0.7 - '@smithy/types': 4.3.2 + '@smithy/service-error-classification': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-stream@4.2.4': + '@smithy/util-stream@4.5.5': dependencies: - '@smithy/fetch-http-handler': 5.1.1 - '@smithy/node-http-handler': 4.1.1 - '@smithy/types': 4.3.2 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/node-http-handler': 4.4.4 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-uri-escape@4.0.0': + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 @@ -28946,17 +29632,26 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': + '@smithy/util-utf8@4.2.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-buffer-from': 4.2.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.7': + '@smithy/util-waiter@4.2.4': dependencies: - '@smithy/abort-controller': 4.0.5 - '@smithy/types': 4.3.2 + '@smithy/abort-controller': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.2 + text-hex: 1.0.0 + '@standard-schema/spec@1.0.0': {} '@standard-schema/utils@0.3.0': {} @@ -28972,7 +29667,7 @@ snapshots: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -29047,13 +29742,13 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) uuid: 9.0.1 - '@storybook/addon-actions@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-actions@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) uuid: 9.0.1 '@storybook/addon-backgrounds@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -29065,7 +29760,7 @@ snapshots: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 memoizerific: 1.11.3 regenerator-runtime: 0.13.11 @@ -29120,25 +29815,25 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-backgrounds@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-backgrounds@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/addon-controls@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 lodash: 4.17.21 ts-dedent: 2.2.0 optionalDependencies: @@ -29154,18 +29849,18 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 lodash: 4.17.21 ts-dedent: 2.2.0 optionalDependencies: @@ -29234,14 +29929,14 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-controls@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.101.0)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.102.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -29250,7 +29945,7 @@ snapshots: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -29261,8 +29956,8 @@ snapshots: '@storybook/source-loader': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) - core-js: 3.45.0 + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -29286,7 +29981,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.101.0)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.102.1)': dependencies: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -29295,7 +29990,7 @@ snapshots: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -29306,8 +30001,8 @@ snapshots: '@storybook/source-loader': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) - core-js: 3.45.0 + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -29348,7 +30043,7 @@ snapshots: '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 - fs-extra: 11.3.1 + fs-extra: 11.3.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) remark-external-links: 8.0.0 @@ -29377,7 +30072,7 @@ snapshots: '@storybook/react-dom-shim': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/types': 7.4.6 - fs-extra: 11.3.1 + fs-extra: 11.3.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) remark-external-links: 8.0.0 @@ -29391,7 +30086,7 @@ snapshots: '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@19.1.0) + '@mdx-js/react': 3.1.1(@types/react@18.2.0)(react@19.1.0) '@storybook/blocks': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) '@storybook/csf-plugin': 8.6.14(storybook@8.6.14(prettier@3.5.3)) '@storybook/react-dom-shim': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) @@ -29402,55 +30097,55 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@19.1.0) - '@storybook/blocks': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/csf-plugin': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/react-dom-shim': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@mdx-js/react': 3.1.1(@types/react@18.2.0)(react@19.1.0) + '@storybook/blocks': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@9.1.1(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-docs@9.1.16(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@19.1.0) - '@storybook/csf-plugin': 9.1.1(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/icons': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/react-dom-shim': 9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@mdx-js/react': 3.1.1(@types/react@18.2.0)(react@19.1.0) + '@storybook/csf-plugin': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/icons': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@storybook/react-dom-shim': 9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.101.0)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.102.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.101.0) + '@storybook/addon-controls': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.102.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -29462,29 +30157,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.101.0)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.102.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.101.0) + '@storybook/addon-controls': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.102.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -29560,18 +30255,18 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-controls': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-highlight': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-measure': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-outline': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-toolbars': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/addon-viewport': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': + dependencies: + '@storybook/addon-actions': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-controls': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-highlight': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-measure': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-outline': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-toolbars': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-viewport': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -29587,10 +30282,10 @@ snapshots: '@storybook/global': 5.0.0 storybook: 8.6.14(prettier@3.5.3) - '@storybook/addon-highlight@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-highlight@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/addon-interactions@8.6.14(storybook@8.6.14(prettier@3.5.3))': dependencies: @@ -29609,7 +30304,7 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/qs': 6.14.0 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 prop-types: 15.8.1 qs: 6.14.0 @@ -29643,10 +30338,10 @@ snapshots: optionalDependencies: react: 18.2.0 - '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 @@ -29659,7 +30354,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 optionalDependencies: react: 18.2.0 @@ -29705,10 +30400,10 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-measure@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-measure@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) tiny-invariant: 1.3.3 '@storybook/addon-onboarding@8.6.14(storybook@8.6.14(prettier@3.5.3))': @@ -29723,7 +30418,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 @@ -29771,10 +30466,10 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-outline@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-outline@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 '@storybook/addon-toolbars@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -29784,7 +30479,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 regenerator-runtime: 0.13.11 optionalDependencies: react: 18.2.0 @@ -29822,9 +30517,9 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/addon-toolbars@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-toolbars@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/addon-viewport@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -29834,7 +30529,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 memoizerific: 1.11.3 prop-types: 15.8.1 @@ -29884,10 +30579,10 @@ snapshots: memoizerific: 1.11.3 storybook: 8.6.14(prettier@3.5.3) - '@storybook/addon-viewport@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/addon-viewport@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: memoizerific: 1.11.3 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/addons@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -29899,7 +30594,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/webpack-env': 1.18.8 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -29915,7 +30610,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/webpack-env': 1.18.8 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -29946,7 +30641,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -29968,7 +30663,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -29998,7 +30693,7 @@ snapshots: color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.7.13(react@18.2.0) + markdown-to-jsx: 7.7.17(react@18.2.0) memoizerific: 1.11.3 polished: 4.3.1 react: 18.2.0 @@ -30031,7 +30726,7 @@ snapshots: color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 - markdown-to-jsx: 7.7.13(react@19.1.0) + markdown-to-jsx: 7.7.17(react@19.1.0) memoizerific: 1.11.3 polished: 4.3.1 react: 19.1.0 @@ -30049,7 +30744,7 @@ snapshots: '@storybook/blocks@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': dependencies: - '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@storybook/icons': 1.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: @@ -30058,17 +30753,17 @@ snapshots: '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))': dependencies: - '@storybook/icons': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@storybook/icons': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - '@storybook/icons': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + '@storybook/icons': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 19.1.0 @@ -30082,27 +30777,27 @@ snapshots: '@storybook/node-logger': 7.6.20 '@types/ejs': 3.1.5 '@types/find-cache-dir': 3.2.1 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.25.8) + '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.25.12) browser-assert: 1.2.1 ejs: 3.1.10 - esbuild: 0.25.8 + esbuild: 0.25.12 esbuild-plugin-alias: 0.2.1 express: 4.21.2 find-cache-dir: 3.3.2 - fs-extra: 11.3.1 + fs-extra: 11.3.2 process: 0.11.10 util: 0.12.5 transitivePeerDependencies: - encoding - supports-color - '@storybook/builder-vite@9.1.1(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/builder-vite@9.1.16(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - '@storybook/csf-plugin': 9.1.1(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + '@storybook/csf-plugin': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/builder-webpack4@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30112,7 +30807,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30124,33 +30819,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - file-loader: 6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + html-webpack-plugin: 4.5.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - raw-loader: 4.0.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + raw-loader: 4.0.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - terser-webpack-plugin: 4.2.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + style-loader: 1.3.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + terser-webpack-plugin: 4.2.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 3.7.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) + webpack-dev-middleware: 3.7.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30164,7 +30859,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30174,7 +30869,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30186,33 +30881,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) - file-loader: 6.2.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) - raw-loader: 4.0.2(webpack@5.101.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.102.1) + raw-loader: 4.0.2(webpack@5.102.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.101.0) - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30226,7 +30921,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30236,7 +30931,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30248,33 +30943,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) - file-loader: 6.2.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) - raw-loader: 4.0.2(webpack@5.101.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.102.1) + raw-loader: 4.0.2(webpack@5.102.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.101.0) - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30288,7 +30983,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30298,7 +30993,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30310,33 +31005,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) - file-loader: 6.2.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) - raw-loader: 4.0.2(webpack@5.101.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.102.1) + raw-loader: 4.0.2(webpack@5.102.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.101.0) - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30350,7 +31045,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30360,7 +31055,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30372,33 +31067,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) - file-loader: 6.2.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) - raw-loader: 4.0.2(webpack@5.101.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.102.1) + raw-loader: 4.0.2(webpack@5.102.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.101.0) - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30412,7 +31107,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -30422,7 +31117,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -30434,33 +31129,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) - file-loader: 6.2.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) - raw-loader: 4.0.2(webpack@5.101.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.102.1) + raw-loader: 4.0.2(webpack@5.102.1) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.101.0) - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30474,7 +31169,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30484,7 +31179,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30493,27 +31188,27 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 5.2.7(webpack@5.101.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 5.2.7(webpack@5.102.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.3(webpack@5.101.0) + html-webpack-plugin: 5.6.4(webpack@5.102.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 2.0.0(webpack@5.101.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + style-loader: 2.0.0(webpack@5.102.1) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -30528,7 +31223,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30538,7 +31233,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30547,27 +31242,27 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.45.0 - css-loader: 5.2.7(webpack@5.101.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 5.2.7(webpack@5.102.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.3(webpack@5.101.0) + html-webpack-plugin: 5.6.4(webpack@5.102.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 2.0.0(webpack@5.101.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + style-loader: 2.0.0(webpack@5.102.1) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -30601,33 +31296,33 @@ snapshots: '@storybook/router': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 7.4.6 '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) '@types/node': 16.18.126 - '@types/semver': 7.7.0 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.101.0) + '@types/semver': 7.7.1 + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.101.0) + css-loader: 6.11.0(webpack@5.102.1) express: 4.21.2 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0) - fs-extra: 11.3.1 - html-webpack-plugin: 5.6.3(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.102.1) + fs-extra: 11.3.2 + html-webpack-plugin: 5.6.4(webpack@5.102.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - semver: 7.7.2 - style-loader: 3.3.4(webpack@5.101.0) - swc-loader: 0.2.6(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + semver: 7.7.3 + style-loader: 3.3.4(webpack@5.102.1) + swc-loader: 0.2.6(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -30662,33 +31357,33 @@ snapshots: '@storybook/router': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/store': 7.4.6 '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) '@types/node': 16.18.126 - '@types/semver': 7.7.0 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@types/semver': 7.7.1 + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + css-loader: 6.11.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) express: 4.21.2 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - fs-extra: 11.3.1 - html-webpack-plugin: 5.6.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + fs-extra: 11.3.2 + html-webpack-plugin: 5.6.4(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) path-browserify: 1.0.1 process: 0.11.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - semver: 7.7.2 - style-loader: 3.3.4(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - swc-loader: 0.2.6(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + semver: 7.7.3 + style-loader: 3.3.4(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + swc-loader: 0.2.6(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 6.1.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) + webpack-dev-middleware: 6.1.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -30704,31 +31399,31 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/builder-webpack5@8.6.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + css-loader: 6.11.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - html-webpack-plugin: 5.6.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - magic-string: 0.30.17 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + html-webpack-plugin: 5.6.4(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.7.2 + semver: 7.7.3 storybook: 8.6.14(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + style-loader: 3.3.4(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 6.1.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) + webpack-dev-middleware: 6.1.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -30740,31 +31435,31 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/builder-webpack5@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@types/semver': 7.7.0 + '@storybook/core-webpack': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@types/semver': 7.7.1 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.101.0) + css-loader: 6.11.0(webpack@5.102.1) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0) - html-webpack-plugin: 5.6.3(webpack@5.101.0) - magic-string: 0.30.17 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.102.1) + html-webpack-plugin: 5.6.4(webpack@5.102.1) + magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.7.2 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.101.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + semver: 7.7.3 + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) + style-loader: 3.3.4(webpack@5.102.1) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.102.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -30781,7 +31476,7 @@ snapshots: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 qs: 6.14.0 telejson: 6.0.8 @@ -30790,13 +31485,13 @@ snapshots: dependencies: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 telejson: 6.0.8 '@storybook/channels@6.5.16': dependencies: - core-js: 3.45.0 + core-js: 3.46.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -30822,7 +31517,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.6.20 '@storybook/core-common': 7.6.20(encoding@0.1.13) @@ -30832,18 +31527,18 @@ snapshots: '@storybook/node-logger': 7.6.20 '@storybook/telemetry': 7.6.20(encoding@0.1.13) '@storybook/types': 7.6.20 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 '@yarnpkg/fslib': 2.10.3 '@yarnpkg/libzip': 2.3.0 chalk: 4.1.2 commander: 6.2.1 cross-spawn: 7.0.6 detect-indent: 6.1.0 - envinfo: 7.14.0 + envinfo: 7.20.0 execa: 5.1.1 express: 4.21.2 find-up: 5.0.0 - fs-extra: 11.3.1 + fs-extra: 11.3.2 get-npm-tarball-url: 2.1.0 get-port: 5.1.1 giget: 1.2.5 @@ -30855,12 +31550,13 @@ snapshots: prompts: 2.4.2 puppeteer-core: 2.1.1 read-pkg-up: 7.0.1 - semver: 7.7.2 + semver: 7.7.3 strip-json-comments: 3.1.1 tempy: 1.0.1 ts-dedent: 2.2.0 util-deprecate: 1.0.2 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil - encoding @@ -30868,15 +31564,15 @@ snapshots: - supports-color - utf-8-validate - '@storybook/cli@9.1.1(@babel/preset-env@7.27.2(@babel/core@7.27.7))(@testing-library/dom@10.4.1)(prettier@3.5.3)': + '@storybook/cli@9.1.16(@babel/preset-env@7.27.2(@babel/core@7.28.5))(@testing-library/dom@10.4.1)(prettier@3.5.3)': dependencies: - '@storybook/codemod': 9.1.1(@babel/preset-env@7.27.2(@babel/core@7.27.7))(@testing-library/dom@10.4.1) - '@types/semver': 7.7.0 + '@storybook/codemod': 9.1.16(@babel/preset-env@7.27.2(@babel/core@7.28.5))(@testing-library/dom@10.4.1) + '@types/semver': 7.7.1 commander: 12.1.0 - create-storybook: 9.1.1 + create-storybook: 9.1.16 giget: 1.2.5 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.5)) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@babel/preset-env' @@ -30899,7 +31595,7 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/qs': 6.14.0 '@types/webpack-env': 1.18.8 - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -30924,7 +31620,7 @@ snapshots: '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/qs': 6.14.0 '@types/webpack-env': 1.18.8 - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -30945,7 +31641,7 @@ snapshots: '@storybook/client-logger@6.5.16': dependencies: - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 '@storybook/client-logger@7.4.6': @@ -30960,7 +31656,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@storybook/csf': 0.1.13 '@storybook/csf-tools': 7.6.20 '@storybook/node-logger': 7.6.20 @@ -30975,15 +31671,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/codemod@9.1.1(@babel/preset-env@7.27.2(@babel/core@7.27.7))(@testing-library/dom@10.4.1)': + '@storybook/codemod@9.1.16(@babel/preset-env@7.27.2(@babel/core@7.28.5))(@testing-library/dom@10.4.1)': dependencies: '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 - es-toolkit: 1.39.8 + es-toolkit: 1.41.0 globby: 14.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)) + jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.5)) prettier: 3.5.3 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) tiny-invariant: 1.3.3 transitivePeerDependencies: - '@babel/preset-env' @@ -30999,7 +31695,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 qs: 6.14.0 react: 18.2.0 @@ -31012,7 +31708,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 qs: 6.14.0 react: 19.1.0 @@ -31023,7 +31719,7 @@ snapshots: '@storybook/components@7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-toolbar': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 7.4.6 '@storybook/csf': 0.1.13 '@storybook/global': 5.0.0 @@ -31041,7 +31737,7 @@ snapshots: '@storybook/components@7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toolbar': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 7.4.6 '@storybook/csf': 0.1.13 '@storybook/global': 5.0.0 @@ -31060,11 +31756,11 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/components@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/components@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)))': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31078,7 +31774,7 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 lodash: 4.17.21 qs: 6.14.0 @@ -31088,11 +31784,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0)': + '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31106,7 +31802,7 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 lodash: 4.17.21 qs: 6.14.0 @@ -31116,11 +31812,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0)': + '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.102.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/channel-postmessage': 6.5.16 @@ -31134,7 +31830,7 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 lodash: 4.17.21 qs: 6.14.0 @@ -31144,7 +31840,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 4.9.5 @@ -31153,7 +31849,7 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/core-common@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -31166,9 +31862,9 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -31176,20 +31872,20 @@ snapshots: '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 express: 4.21.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31206,7 +31902,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31218,7 +31914,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-common@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -31231,9 +31927,9 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -31241,20 +31937,20 @@ snapshots: '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 express: 4.21.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31271,7 +31967,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31283,7 +31979,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -31296,9 +31992,9 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -31306,20 +32002,20 @@ snapshots: '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 express: 4.21.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31336,7 +32032,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31348,7 +32044,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -31361,9 +32057,9 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -31371,20 +32067,20 @@ snapshots: '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 express: 4.21.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31401,7 +32097,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31413,7 +32109,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -31426,9 +32122,9 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -31436,20 +32132,20 @@ snapshots: '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 express: 4.21.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31466,7 +32162,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31478,7 +32174,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) @@ -31491,9 +32187,9 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) @@ -31501,20 +32197,20 @@ snapshots: '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 express: 4.21.2 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.102.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31531,7 +32227,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -31553,12 +32249,12 @@ snapshots: '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 chalk: 4.1.2 - esbuild: 0.25.8 - esbuild-register: 3.6.0(esbuild@0.25.8) + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) file-system-cache: 2.3.0 find-cache-dir: 3.3.2 find-up: 5.0.0 - fs-extra: 11.3.1 + fs-extra: 11.3.2 glob: 10.4.5 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 @@ -31578,16 +32274,16 @@ snapshots: '@storybook/node-logger': 7.6.20 '@storybook/types': 7.6.20 '@types/find-cache-dir': 3.2.1 - '@types/node': 18.19.121 + '@types/node': 18.19.130 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 chalk: 4.1.2 - esbuild: 0.25.8 - esbuild-register: 3.6.0(esbuild@0.25.8) + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) file-system-cache: 2.3.0 find-cache-dir: 3.3.2 find-up: 5.0.0 - fs-extra: 11.3.1 + fs-extra: 11.3.2 glob: 10.4.5 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 @@ -31603,7 +32299,7 @@ snapshots: '@storybook/core-events@6.5.16': dependencies: - core-js: 3.45.0 + core-js: 3.46.0 '@storybook/core-events@7.4.6': dependencies: @@ -31613,20 +32309,20 @@ snapshots: dependencies: ts-dedent: 2.2.0 - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/telemetry': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -31637,7 +32333,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.45.0 + core-js: 3.46.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.21.2 @@ -31659,12 +32355,12 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -31679,20 +32375,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -31703,7 +32399,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.45.0 + core-js: 3.46.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.21.2 @@ -31725,12 +32421,12 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -31745,20 +32441,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -31769,7 +32465,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.45.0 + core-js: 3.46.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.21.2 @@ -31791,7 +32487,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -31809,20 +32505,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -31833,7 +32529,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.45.0 + core-js: 3.46.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.21.2 @@ -31855,7 +32551,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -31873,20 +32569,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -31897,7 +32593,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.45.0 + core-js: 3.46.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.21.2 @@ -31919,7 +32615,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -31937,20 +32633,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -31961,7 +32657,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.45.0 + core-js: 3.46.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.21.2 @@ -31983,7 +32679,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -32019,23 +32715,23 @@ snapshots: '@storybook/telemetry': 7.6.20(encoding@0.1.13) '@storybook/types': 7.6.20 '@types/detect-port': 1.3.5 - '@types/node': 18.19.121 + '@types/node': 18.19.130 '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 better-opn: 3.0.2 chalk: 4.1.2 cli-table3: 0.6.5 compression: 1.8.1 detect-port: 1.6.1 express: 4.21.2 - fs-extra: 11.3.1 + fs-extra: 11.3.2 globby: 11.1.0 lodash: 4.17.21 open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 read-pkg-up: 7.0.1 - semver: 7.7.2 + semver: 7.7.3 telejson: 7.2.0 tiny-invariant: 1.3.3 ts-dedent: 2.2.0 @@ -32065,21 +32761,21 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core-webpack@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/core-webpack@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.101.0)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.102.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32094,16 +32790,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.101.0)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.102.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32118,13 +32814,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + '@storybook/core@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)))': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - '@storybook/core-server': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + '@storybook/core-server': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32140,13 +32836,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32162,13 +32858,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32184,13 +32880,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.102.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.102.1) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32211,12 +32907,12 @@ snapshots: '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.5.3)) better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.25.8 - esbuild-register: 3.6.0(esbuild@0.25.8) - jsdoc-type-pratt-parser: 4.1.0 + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) + jsdoc-type-pratt-parser: 4.8.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.2 + semver: 7.7.3 util: 0.12.5 ws: 8.18.3 optionalDependencies: @@ -32239,28 +32935,28 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) unplugin: 1.16.1 - '@storybook/csf-plugin@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/csf-plugin@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.1(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/csf-plugin@9.1.16(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) unplugin: 1.16.1 '@storybook/csf-tools@6.5.16': dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.7) - core-js: 3.45.0 + core-js: 3.46.0 fs-extra: 9.1.0 global: 4.4.0 regenerator-runtime: 0.13.11 @@ -32270,13 +32966,13 @@ snapshots: '@storybook/csf-tools@7.4.6': dependencies: - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@storybook/csf': 0.1.13 '@storybook/types': 7.4.6 - fs-extra: 11.3.1 + fs-extra: 11.3.2 recast: 0.23.11 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -32284,13 +32980,13 @@ snapshots: '@storybook/csf-tools@7.6.20': dependencies: - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@storybook/csf': 0.1.13 '@storybook/types': 7.6.20 - fs-extra: 11.3.1 + fs-extra: 11.3.2 recast: 0.23.11 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -32311,7 +33007,7 @@ snapshots: '@babel/core': 7.27.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 doctrine: 3.0.0 lodash: 4.17.21 regenerator-runtime: 0.13.11 @@ -32325,7 +33021,7 @@ snapshots: '@babel/core': 7.27.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.45.0 + core-js: 3.46.0 doctrine: 3.0.0 lodash: 4.17.21 regenerator-runtime: 0.13.11 @@ -32348,12 +33044,12 @@ snapshots: '@storybook/global@5.0.0': {} - '@storybook/icons@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@storybook/icons@1.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@storybook/icons@1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@storybook/icons@1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -32364,11 +33060,11 @@ snapshots: '@vitest/utils': 2.1.9 storybook: 8.6.14(prettier@3.5.3) - '@storybook/instrumenter@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/instrumenter@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) optional: true '@storybook/manager-api@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -32386,7 +33082,7 @@ snapshots: memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - semver: 7.7.2 + semver: 7.7.3 store2: 2.14.4 telejson: 7.2.0 ts-dedent: 2.2.0 @@ -32406,7 +33102,7 @@ snapshots: memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - semver: 7.7.2 + semver: 7.7.3 store2: 2.14.4 telejson: 7.2.0 ts-dedent: 2.2.0 @@ -32415,33 +33111,33 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/manager-api@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/manager-api@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/manager-webpack4@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) express: 4.21.2 - file-loader: 6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + html-webpack-plugin: 4.5.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32449,14 +33145,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + style-loader: 1.3.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + terser-webpack-plugin: 4.2.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 3.7.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) + webpack-dev-middleware: 3.7.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -32470,29 +33166,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) express: 4.21.2 - file-loader: 6.2.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32500,14 +33196,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -32521,29 +33217,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) express: 4.21.2 - file-loader: 6.2.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32551,14 +33247,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -32572,29 +33268,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) express: 4.21.2 - file-loader: 6.2.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32602,14 +33298,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -32623,29 +33319,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) express: 4.21.2 - file-loader: 6.2.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -32653,14 +33349,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -32674,29 +33370,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 3.6.0(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 3.6.0(webpack@5.102.1) express: 4.21.2 - file-loader: 6.2.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.102.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.101.0) + html-webpack-plugin: 4.5.2(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) react: 19.1.0 @@ -32704,14 +33400,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.101.0) + style-loader: 1.3.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.102.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.102.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 4.9.5 @@ -32725,27 +33421,27 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 5.2.7(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 5.2.7(webpack@5.102.1) express: 4.21.2 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.101.0) + html-webpack-plugin: 5.6.4(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -32753,13 +33449,13 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 2.0.0(webpack@5.101.0) + style-loader: 2.0.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.102.1) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -32774,27 +33470,27 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.102.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.45.0 - css-loader: 5.2.7(webpack@5.101.0) + core-js: 3.46.0 + css-loader: 5.2.7(webpack@5.102.1) express: 4.21.2 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.101.0) + html-webpack-plugin: 5.6.4(webpack@5.102.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -32802,13 +33498,13 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 2.0.0(webpack@5.101.0) + style-loader: 2.0.0(webpack@5.102.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.102.1) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -32827,10 +33523,10 @@ snapshots: '@storybook/mdx1-csf@0.0.1(@babel/core@7.27.7)': dependencies: - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.17.17 js-string-escape: 1.0.1 @@ -32848,7 +33544,7 @@ snapshots: dependencies: '@types/npmlog': 4.1.6 chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 npmlog: 5.0.1 pretty-hrtime: 1.0.3 @@ -32858,32 +33554,32 @@ snapshots: '@storybook/postinstall@6.5.16': dependencies: - core-js: 3.45.0 + core-js: 3.46.0 '@storybook/postinstall@7.4.6': {} - '@storybook/preset-react-webpack@7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/preset-react-webpack@7.4.6(@babel/core@7.28.5)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.5) + '@babel/preset-react': 7.27.1(@babel/core@7.28.5) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/core-webpack': 7.4.6(encoding@0.1.13) '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1) '@types/node': 16.18.126 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - fs-extra: 11.3.1 + fs-extra: 11.3.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-refresh: 0.11.0 - semver: 7.7.2 - webpack: 5.101.0(webpack-cli@5.1.4) + semver: 7.7.3 + webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 5.8.3 transitivePeerDependencies: - '@swc/core' @@ -32899,28 +33595,28 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': + '@storybook/preset-react-webpack@7.4.6(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.5) + '@babel/preset-react': 7.27.1(@babel/core@7.28.5) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/core-webpack': 7.4.6(encoding@0.1.13) '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1) '@types/node': 16.18.126 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - fs-extra: 11.3.1 + fs-extra: 11.3.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-refresh: 0.11.0 - semver: 7.7.2 - webpack: 5.101.0(webpack-cli@4.10.0) + semver: 7.7.3 + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 5.8.3 transitivePeerDependencies: - '@swc/core' @@ -32936,22 +33632,22 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.13.3(@swc/helpers@0.5.17))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.14.0(@swc/helpers@0.5.17))(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)': dependencies: '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.5.3)) '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - '@types/semver': 7.7.0 + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + '@types/semver': 7.7.1 find-up: 5.0.0 - magic-string: 0.30.17 + magic-string: 0.30.21 react: 18.2.0 react-docgen: 7.1.1 react-dom: 18.2.0(react@18.2.0) - resolve: 1.22.10 - semver: 7.7.2 + resolve: 1.22.11 + semver: 7.7.3 storybook: 8.6.14(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32962,22 +33658,22 @@ snapshots: - uglify-js - webpack-cli - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0) - '@types/semver': 7.7.0 + '@storybook/core-webpack': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1) + '@types/semver': 7.7.1 find-up: 5.0.0 - magic-string: 0.30.17 + magic-string: 0.30.21 react: 18.2.0 react-docgen: 7.1.1 react-dom: 18.2.0(react@18.2.0) - resolve: 1.22.10 - semver: 7.7.2 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + resolve: 1.22.11 + semver: 7.7.3 + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33026,9 +33722,9 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/preview-api@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/preview-api@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/preview-web@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -33039,7 +33735,7 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ansi-to-html: 0.6.15 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 lodash: 4.17.21 qs: 6.14.0 @@ -33060,7 +33756,7 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) ansi-to-html: 0.6.15 - core-js: 3.45.0 + core-js: 3.46.0 global: 4.4.0 lodash: 4.17.21 qs: 6.14.0 @@ -33074,9 +33770,9 @@ snapshots: '@storybook/preview@7.4.6': {} - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.101.0)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.102.1)': dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -33084,13 +33780,13 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)))': dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -33098,13 +33794,13 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1)': dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -33112,13 +33808,13 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)))': dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -33126,13 +33822,13 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.102.1)': dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -33140,7 +33836,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -33160,11 +33856,11 @@ snapshots: react-dom: 18.2.0(react@18.2.0) storybook: 8.6.14(prettier@3.5.3) - '@storybook/react-dom-shim@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/react-dom-shim@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/react-dom-shim@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))': dependencies: @@ -33172,47 +33868,47 @@ snapshots: react-dom: 19.1.0(react@19.1.0) storybook: 8.6.14(prettier@3.5.3) - '@storybook/react-dom-shim@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/react-dom-shim@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/react-dom-shim@9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/react-dom-shim@9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/react-vite@9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.46.2)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react-vite@9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.52.5)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3) - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) - '@storybook/builder-vite': 9.1.1(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/react': 9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@storybook/builder-vite': 9.1.16(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/react': 9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) find-up: 7.0.0 - magic-string: 0.30.17 + magic-string: 0.30.21 react: 19.1.0 - react-docgen: 8.0.0 + react-docgen: 8.0.2 react-dom: 19.1.0(react@19.1.0) - resolve: 1.22.10 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + resolve: 1.22.11 + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) tsconfig-paths: 4.2.0 transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react-webpack5@7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/react-webpack5@7.4.6(@babel/core@7.28.5)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': dependencies: '@storybook/builder-webpack5': 7.4.6(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.28.5)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 5.8.3 transitivePeerDependencies: - '@rspack/core' @@ -33232,16 +33928,16 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react-webpack5@7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': + '@storybook/react-webpack5@7.4.6(@babel/core@7.28.5)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': dependencies: '@storybook/builder-webpack5': 7.4.6(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) - '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) + '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@types/node': 16.18.126 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 5.8.3 transitivePeerDependencies: - '@rspack/core' @@ -33261,10 +33957,10 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.13.3(@swc/helpers@0.5.17))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.14.0(@swc/helpers@0.5.17))(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)': dependencies: - '@storybook/builder-webpack5': 8.6.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.13.3(@swc/helpers@0.5.17))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.14.0(@swc/helpers@0.5.17))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -33280,14 +33976,14 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/builder-webpack5': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33299,19 +33995,19 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33322,7 +34018,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.45.0 + core-js: 3.46.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -33338,11 +34034,11 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -33363,19 +34059,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33386,7 +34082,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.45.0 + core-js: 3.46.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -33402,11 +34098,11 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -33427,19 +34123,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33450,7 +34146,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.45.0 + core-js: 3.46.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -33466,7 +34162,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33489,19 +34185,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.5) + '@babel/preset-react': 7.27.1(@babel/core@7.28.5) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33512,7 +34208,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.45.0 + core-js: 3.46.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -33528,9 +34224,9 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -33551,19 +34247,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.5) + '@babel/preset-react': 7.27.1(@babel/core@7.28.5) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.102.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -33574,7 +34270,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.45.0 + core-js: 3.46.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -33590,9 +34286,9 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -33613,19 +34309,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.5)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)': dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.5) + '@babel/preset-react': 7.27.1(@babel/core@7.28.5) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.102.1))(webpack-hot-middleware@2.26.1)(webpack@5.102.1) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.102.1) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.101.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.102.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/estree': 0.0.51 @@ -33636,7 +34332,7 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.45.0 + core-js: 3.46.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 @@ -33652,9 +34348,9 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 typescript: 4.9.5 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -33752,35 +34448,35 @@ snapshots: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) typescript: 5.8.3 - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/components': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/preview-api': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) - '@storybook/theming': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/manager-api': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/preview-api': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/theming': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) optionalDependencies: - '@storybook/test': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/test': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) typescript: 5.8.3 - '@storybook/react@9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/react-dom-shim': 9.1.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 '@storybook/router@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 qs: 6.14.0 react: 18.2.0 @@ -33790,7 +34486,7 @@ snapshots: '@storybook/router@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 qs: 6.14.0 react: 19.1.0 @@ -33815,7 +34511,7 @@ snapshots: '@storybook/semver@7.3.2': dependencies: - core-js: 3.45.0 + core-js: 3.46.0 find-up: 4.1.0 '@storybook/source-loader@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -33823,7 +34519,7 @@ snapshots: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.45.0 + core-js: 3.46.0 estraverse: 5.3.0 global: 4.4.0 loader-utils: 2.0.4 @@ -33839,7 +34535,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -33859,7 +34555,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.45.0 + core-js: 3.46.0 fast-deep-equal: 3.1.3 global: 4.4.0 lodash: 4.17.21 @@ -33878,12 +34574,12 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/telemetry@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -33905,12 +34601,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/telemetry@6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.13.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.14.0(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -33932,12 +34628,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -33959,12 +34655,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -33986,12 +34682,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34013,12 +34709,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) chalk: 4.1.2 - core-js: 3.45.0 + core-js: 3.46.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34048,7 +34744,7 @@ snapshots: chalk: 4.1.2 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 - fs-extra: 11.3.1 + fs-extra: 11.3.2 read-pkg-up: 7.0.1 transitivePeerDependencies: - encoding @@ -34065,22 +34761,22 @@ snapshots: '@vitest/spy': 2.0.5 storybook: 8.6.14(prettier@3.5.3) - '@storybook/test@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/test@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/instrumenter': 8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) optional: true '@storybook/theming@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34089,7 +34785,7 @@ snapshots: '@storybook/theming@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -34117,22 +34813,22 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/theming@8.6.14(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))': + '@storybook/theming@8.6.14(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/types@7.4.6': dependencies: '@storybook/channels': 7.4.6 '@types/babel__core': 7.20.5 - '@types/express': 4.17.23 + '@types/express': 4.17.25 file-system-cache: 2.3.0 '@storybook/types@7.6.20': dependencies: '@storybook/channels': 7.6.20 '@types/babel__core': 7.20.5 - '@types/express': 4.17.23 + '@types/express': 4.17.25 file-system-cache: 2.3.0 '@storybook/ui@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -34146,7 +34842,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 qs: 6.14.0 react: 18.2.0 @@ -34165,7 +34861,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.45.0 + core-js: 3.46.0 memoizerific: 1.11.3 qs: 6.14.0 react: 19.1.0 @@ -34173,20 +34869,20 @@ snapshots: regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - '@swagger-api/apidom-ast@1.0.0-beta.45': + '@swagger-api/apidom-ast@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-error': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-error': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) unraw: 3.0.0 - '@swagger-api/apidom-core@1.0.0-beta.45': + '@swagger-api/apidom-core@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-ast': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-ast': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 '@types/ramda': 0.30.2 minim: 0.23.8 ramda: 0.30.1 @@ -34194,213 +34890,213 @@ snapshots: short-unique-id: 5.3.2 ts-mixer: 6.0.4 - '@swagger-api/apidom-error@1.0.0-beta.45': + '@swagger-api/apidom-error@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 + '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-json-pointer@1.0.0-beta.45': + '@swagger-api/apidom-json-pointer@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 '@swaggerexpert/json-pointer': 2.10.2 - '@swagger-api/apidom-ns-api-design-systems@1.0.0-beta.45': + '@swagger-api/apidom-ns-api-design-systems@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-arazzo-1@1.0.0-beta.45': + '@swagger-api/apidom-ns-arazzo-1@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-2@1.0.0-beta.45': + '@swagger-api/apidom-ns-asyncapi-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-beta.45': + '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-beta.45': + '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-2019-09': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-beta.45': + '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-ast': 1.0.0-beta.45 - '@swagger-api/apidom-core': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-ast': 1.0.0-rc.1 + '@swagger-api/apidom-core': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-beta.45': + '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-beta.45': + '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-draft-6': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-2@1.0.0-beta.45': + '@swagger-api/apidom-ns-openapi-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-openapi-3-0@1.0.0-beta.45': + '@swagger-api/apidom-ns-openapi-3-0@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-3-1@1.0.0-beta.45': + '@swagger-api/apidom-ns-openapi-3-1@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-ast': 1.0.0-beta.45 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-json-pointer': 1.0.0-beta.45 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-ast': 1.0.0-rc.1 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-json-pointer': 1.0.0-rc.1 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-api-design-systems': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-api-design-systems': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-api-design-systems': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-api-design-systems': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-arazzo-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-arazzo-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-json@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-json@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-ast': 1.0.0-beta.45 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-ast': 1.0.0-rc.1 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) @@ -34409,78 +35105,78 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-beta.45': + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-ast': 1.0.0-beta.45 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-ast': 1.0.0-rc.1 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -34489,38 +35185,38 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-reference@1.0.0-beta.45': + '@swagger-api/apidom-reference@1.0.0-rc.1': dependencies: - '@babel/runtime-corejs3': 7.28.2 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 + '@babel/runtime-corejs3': 7.28.4 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 '@types/ramda': 0.30.2 - axios: 1.12.0 + axios: 1.12.2 minimatch: 7.4.6 process: 0.11.10 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.0.0-beta.45 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.45 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.0.0-beta.45 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.45 + '@swagger-api/apidom-json-pointer': 1.0.0-rc.1 + '@swagger-api/apidom-ns-arazzo-1': 1.0.0-rc.1 + '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-2': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.0.0-rc.1 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.1 transitivePeerDependencies: - debug @@ -34532,51 +35228,51 @@ snapshots: dependencies: apg-lite: 1.0.5 - '@swc/core-darwin-arm64@1.13.3': + '@swc/core-darwin-arm64@1.14.0': optional: true - '@swc/core-darwin-x64@1.13.3': + '@swc/core-darwin-x64@1.14.0': optional: true - '@swc/core-linux-arm-gnueabihf@1.13.3': + '@swc/core-linux-arm-gnueabihf@1.14.0': optional: true - '@swc/core-linux-arm64-gnu@1.13.3': + '@swc/core-linux-arm64-gnu@1.14.0': optional: true - '@swc/core-linux-arm64-musl@1.13.3': + '@swc/core-linux-arm64-musl@1.14.0': optional: true - '@swc/core-linux-x64-gnu@1.13.3': + '@swc/core-linux-x64-gnu@1.14.0': optional: true - '@swc/core-linux-x64-musl@1.13.3': + '@swc/core-linux-x64-musl@1.14.0': optional: true - '@swc/core-win32-arm64-msvc@1.13.3': + '@swc/core-win32-arm64-msvc@1.14.0': optional: true - '@swc/core-win32-ia32-msvc@1.13.3': + '@swc/core-win32-ia32-msvc@1.14.0': optional: true - '@swc/core-win32-x64-msvc@1.13.3': + '@swc/core-win32-x64-msvc@1.14.0': optional: true - '@swc/core@1.13.3(@swc/helpers@0.5.17)': + '@swc/core@1.14.0(@swc/helpers@0.5.17)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.24 - optionalDependencies: - '@swc/core-darwin-arm64': 1.13.3 - '@swc/core-darwin-x64': 1.13.3 - '@swc/core-linux-arm-gnueabihf': 1.13.3 - '@swc/core-linux-arm64-gnu': 1.13.3 - '@swc/core-linux-arm64-musl': 1.13.3 - '@swc/core-linux-x64-gnu': 1.13.3 - '@swc/core-linux-x64-musl': 1.13.3 - '@swc/core-win32-arm64-msvc': 1.13.3 - '@swc/core-win32-ia32-msvc': 1.13.3 - '@swc/core-win32-x64-msvc': 1.13.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.14.0 + '@swc/core-darwin-x64': 1.14.0 + '@swc/core-linux-arm-gnueabihf': 1.14.0 + '@swc/core-linux-arm64-gnu': 1.14.0 + '@swc/core-linux-arm64-musl': 1.14.0 + '@swc/core-linux-x64-gnu': 1.14.0 + '@swc/core-linux-x64-musl': 1.14.0 + '@swc/core-win32-arm64-msvc': 1.14.0 + '@swc/core-win32-ia32-msvc': 1.14.0 + '@swc/core-win32-x64-msvc': 1.14.0 '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} @@ -34585,7 +35281,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/types@0.1.24': + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -34595,7 +35291,7 @@ snapshots: '@tanstack/query-core@4.27.0': {} - '@tanstack/query-core@4.40.0': {} + '@tanstack/query-core@4.41.0': {} '@tanstack/query-core@5.76.0': {} @@ -34603,7 +35299,7 @@ snapshots: '@tanstack/query-core@5.77.1': {} - '@tanstack/query-core@5.83.1': {} + '@tanstack/query-core@5.90.6': {} '@tanstack/query-persist-client-core@4.27.0': dependencies: @@ -34616,19 +35312,19 @@ snapshots: '@tanstack/react-query@4.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/query-core': 4.40.0 + '@tanstack/query-core': 4.41.0 '@types/use-sync-external-store': 0.0.3 react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) + use-sync-external-store: 1.6.0(react@18.2.0) optionalDependencies: react-dom: 18.2.0(react@18.2.0) '@tanstack/react-query@4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/query-core': 4.40.0 + '@tanstack/query-core': 4.41.0 '@types/use-sync-external-store': 0.0.3 react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) optionalDependencies: react-dom: 19.1.0(react@19.1.0) @@ -34636,7 +35332,7 @@ snapshots: dependencies: '@tanstack/query-core': 4.27.0 react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) + use-sync-external-store: 1.6.0(react@18.2.0) optionalDependencies: react-dom: 18.2.0(react@18.2.0) @@ -34672,7 +35368,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -34683,7 +35379,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -34693,7 +35389,7 @@ snapshots: '@testing-library/jest-dom@6.5.0': dependencies: - '@adobe/css-tools': 4.4.3 + '@adobe/css-tools': 4.4.4 aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 @@ -34703,7 +35399,7 @@ snapshots: '@testing-library/jest-dom@6.6.4': dependencies: - '@adobe/css-tools': 4.4.3 + '@adobe/css-tools': 4.4.4 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 @@ -34713,7 +35409,7 @@ snapshots: '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34739,7 +35435,7 @@ snapshots: '@textlint/resolver': 14.8.4 '@textlint/types': 14.8.4 chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) js-yaml: 3.14.1 lodash: 4.17.21 pluralize: 2.0.0 @@ -34784,7 +35480,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.0.3 + minimatch: 10.1.1 path-browserify: 1.0.1 '@tsconfig/node10@1.0.11': {} @@ -34799,24 +35495,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@types/blueimp-md5@2.18.2': {} @@ -34835,9 +35531,10 @@ snapshots: '@types/chai@4.3.20': {} - '@types/chai@5.2.2': + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 '@types/classnames@2.3.4': dependencies: @@ -34847,13 +35544,13 @@ snapshots: dependencies: '@types/tern': 0.23.9 - '@types/codemirror@5.60.16': + '@types/codemirror@5.60.17': dependencies: '@types/tern': 0.23.9 '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 4.19.6 + '@types/express-serve-static-core': 4.19.7 '@types/node': 22.15.35 '@types/connect@3.4.38': @@ -34882,7 +35579,7 @@ snapshots: '@types/ejs@3.1.5': {} - '@types/emscripten@1.40.1': {} + '@types/emscripten@1.41.5': {} '@types/escodegen@0.0.6': {} @@ -34908,19 +35605,19 @@ snapshots: '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.6': + '@types/express-serve-static-core@4.19.7': dependencies: '@types/node': 22.15.35 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 + '@types/send': 1.2.1 - '@types/express@4.17.23': + '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.6 + '@types/express-serve-static-core': 4.19.7 '@types/qs': 6.14.0 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/find-cache-dir@3.2.1': {} @@ -34968,7 +35665,7 @@ snapshots: '@types/http-errors@2.0.5': {} - '@types/http-proxy@1.17.16': + '@types/http-proxy@1.17.17': dependencies: '@types/node': 22.15.35 @@ -35053,7 +35750,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.0.3 + minimatch: 10.1.1 '@types/minimist@1.2.5': {} @@ -35070,17 +35767,17 @@ snapshots: '@types/node': 22.15.35 form-data: 4.0.4 - '@types/node-forge@1.3.13': + '@types/node-forge@1.3.14': dependencies: '@types/node': 22.15.35 '@types/node@16.18.126': {} - '@types/node@18.19.121': + '@types/node@18.19.130': dependencies: undici-types: 5.26.5 - '@types/node@20.19.22': + '@types/node@20.19.24': dependencies: undici-types: 6.21.0 @@ -35159,7 +35856,7 @@ snapshots: dependencies: '@types/react': 18.2.0 - '@types/react@17.0.87': + '@types/react@17.0.89': dependencies: '@types/prop-types': 15.7.15 '@types/scheduler': 0.16.8 @@ -35187,27 +35884,31 @@ snapshots: '@types/scheduler@0.26.0': {} - '@types/selenium-webdriver@4.1.28': + '@types/selenium-webdriver@4.35.3': dependencies: '@types/node': 22.15.35 '@types/ws': 8.18.1 - '@types/semver@7.7.0': {} + '@types/semver@7.7.1': {} - '@types/send@0.17.5': + '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 '@types/node': 22.15.35 + '@types/send@1.2.1': + dependencies: + '@types/node': 22.15.35 + '@types/serve-index@1.9.4': dependencies: - '@types/express': 4.17.23 + '@types/express': 4.17.25 - '@types/serve-static@1.15.8': + '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 '@types/node': 22.15.35 - '@types/send': 0.17.5 + '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: @@ -35260,11 +35961,11 @@ snapshots: '@types/uuid@9.0.8': {} - '@types/vscode-notebook-renderer@1.72.3': {} + '@types/vscode-notebook-renderer@1.72.4': {} '@types/vscode-webview@1.57.5': {} - '@types/vscode@1.102.0': {} + '@types/vscode@1.105.0': {} '@types/webpack-env@1.18.8': {} @@ -35286,8 +35987,8 @@ snapshots: '@types/webpack@5.28.5': dependencies: '@types/node': 22.15.35 - tapable: 2.2.2 - webpack: 5.101.0(webpack-cli@4.10.0) + tapable: 2.3.0 + webpack: 5.102.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35295,11 +35996,11 @@ snapshots: - webpack-cli optional: true - '@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))': + '@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))': dependencies: '@types/node': 22.15.35 - tapable: 2.2.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + tapable: 2.3.0 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35307,11 +36008,11 @@ snapshots: - webpack-cli optional: true - '@types/webpack@5.28.5(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1)': + '@types/webpack@5.28.5(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1)': dependencies: '@types/node': 22.15.35 - tapable: 2.2.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + tapable: 2.3.0 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35321,25 +36022,25 @@ snapshots: '@types/webpack@5.28.5(webpack-cli@4.10.0)': dependencies: '@types/node': 22.15.35 - tapable: 2.2.2 - webpack: 5.101.0(webpack-cli@4.10.0) + tapable: 2.3.0 + webpack: 5.102.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli + optional: true '@types/webpack@5.28.5(webpack-cli@5.1.4)': dependencies: '@types/node': 22.15.35 - tapable: 2.2.2 - webpack: 5.101.0(webpack-cli@5.1.4) + tapable: 2.3.0 + webpack: 5.102.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli - optional: true '@types/which@3.0.4': {} @@ -35357,7 +36058,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yargs@17.0.33': + '@types/yargs@17.0.34': dependencies: '@types/yargs-parser': 21.0.3 @@ -35380,12 +36081,12 @@ snapshots: '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/type-utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 ignore: 5.3.2 natural-compare-lite: 1.4.0 regexpp: 3.2.0 - semver: 7.7.2 + semver: 7.7.3 tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35394,18 +36095,18 @@ snapshots: '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35414,18 +36115,18 @@ snapshots: '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.33.1(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35434,7 +36135,7 @@ snapshots: '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) @@ -35450,15 +36151,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -35467,15 +36168,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.26.0(jiti@2.5.1) + eslint: 9.26.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -35484,15 +36185,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -35501,15 +36202,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.1 - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -35546,7 +36247,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/types': 5.48.2 '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -35559,7 +36260,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -35572,21 +36273,21 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.5.1) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -35597,32 +36298,32 @@ snapshots: '@typescript-eslint/types': 8.33.1 '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.33.1 '@typescript-eslint/types': 8.33.1 '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.5.1) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.26.0(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.33.1 '@typescript-eslint/types': 8.33.1 '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.5.1) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -35631,16 +36332,16 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) '@typescript-eslint/types': 8.33.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.46.3(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) - '@typescript-eslint/types': 8.39.0 - debug: 4.4.1(supports-color@8.1.1) + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.8.3) + '@typescript-eslint/types': 8.46.3 + debug: 4.4.3(supports-color@8.1.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -35670,16 +36371,16 @@ snapshots: '@typescript-eslint/types': 8.33.1 '@typescript-eslint/visitor-keys': 8.33.1 - '@typescript-eslint/scope-manager@8.39.0': + '@typescript-eslint/scope-manager@8.46.3': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.8.3)': dependencies: typescript: 5.8.3 @@ -35687,7 +36388,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) '@typescript-eslint/utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: @@ -35699,7 +36400,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -35711,7 +36412,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -35719,34 +36420,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.26.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.27.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -35762,16 +36463,16 @@ snapshots: '@typescript-eslint/types@8.33.1': {} - '@typescript-eslint/types@8.39.0': {} + '@typescript-eslint/types@8.46.3': {} '@typescript-eslint/typescript-estree@2.34.0(typescript@3.9.10)': dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) eslint-visitor-keys: 1.3.0 glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.21 - semver: 7.7.2 + semver: 7.7.3 tsutils: 3.21.0(typescript@3.9.10) optionalDependencies: typescript: 3.9.10 @@ -35782,10 +36483,10 @@ snapshots: dependencies: '@typescript-eslint/types': 5.48.2 '@typescript-eslint/visitor-keys': 5.48.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.2 + semver: 7.7.3 tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35796,11 +36497,11 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35811,11 +36512,11 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -35826,11 +36527,11 @@ snapshots: dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -35842,27 +36543,27 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) '@typescript-eslint/types': 8.33.1 '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.39.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.46.3(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.39.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.8.3) - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 - debug: 4.4.1(supports-color@8.1.1) + '@typescript-eslint/project-service': 8.46.3(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.8.3) + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 + debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -35871,35 +36572,35 @@ snapshots: '@typescript-eslint/utils@5.48.2(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/types': 5.48.2 '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) eslint: 8.57.1 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.57.1) - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) eslint: 8.57.1 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) @@ -35908,45 +36609,45 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.26.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.26.0(jiti@2.5.1) + eslint: 9.26.0(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.27.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.27.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.33.1 '@typescript-eslint/types': 8.33.1 '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@8.46.3(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.8.3) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.8.3) eslint: 8.57.1 typescript: 5.8.3 transitivePeerDependencies: @@ -35977,12 +36678,12 @@ snapshots: '@typescript-eslint/types': 8.33.1 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.39.0': + '@typescript-eslint/visitor-keys@8.46.3': dependencies: - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/types': 8.46.3 eslint-visitor-keys: 4.2.1 - '@typespec/ts-http-runtime@0.3.0': + '@typespec/ts-http-runtime@0.3.1': dependencies: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -35992,21 +36693,21 @@ snapshots: '@uiw/codemirror-extensions-basic-setup@4.23.14(@codemirror/lint@6.8.5)': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/commands': 6.10.0 + '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 '@codemirror/search': 6.5.11 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 - '@uiw/react-codemirror@4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@uiw/react-codemirror@4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.2 - '@codemirror/commands': 6.8.1 + '@babel/runtime': 7.28.4 + '@codemirror/commands': 6.10.0 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.3 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@uiw/codemirror-extensions-basic-setup': 4.23.14(@codemirror/lint@6.8.5) codemirror: 6.0.2 react: 18.2.0 @@ -36016,26 +36717,28 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@vercel/oidc@3.0.3': {} + '@vitest/expect@2.0.5': dependencies: '@vitest/spy': 2.0.5 '@vitest/utils': 2.0.5 - chai: 5.2.1 + chai: 5.3.3 tinyrainbow: 1.2.0 '@vitest/expect@3.2.4': dependencies: - '@types/chai': 5.2.2 + '@types/chai': 5.2.3 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.1 + chai: 5.3.3 tinyrainbow: 2.0.0 '@vitest/mocker@3.2.4': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 '@vitest/pretty-format@2.0.5': dependencies: @@ -36055,25 +36758,25 @@ snapshots: '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.3 + tinyspy: 4.0.4 '@vitest/utils@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 3.2.0 + loupe: 3.2.1 tinyrainbow: 1.2.0 '@vitest/utils@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - loupe: 3.2.0 + loupe: 3.2.1 tinyrainbow: 1.2.0 '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.2.0 + loupe: 3.2.1 tinyrainbow: 2.0.0 '@vscode-logging/logger@2.0.0': @@ -36105,13 +36808,13 @@ snapshots: '@vscode/extension-telemetry@1.0.0(tslib@2.8.1)': dependencies: - '@microsoft/1ds-core-js': 4.3.9(tslib@2.8.1) - '@microsoft/1ds-post-js': 4.3.9(tslib@2.8.1) - '@microsoft/applicationinsights-web-basic': 3.3.9(tslib@2.8.1) + '@microsoft/1ds-core-js': 4.3.10(tslib@2.8.1) + '@microsoft/1ds-post-js': 4.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-web-basic': 3.3.10(tslib@2.8.1) transitivePeerDependencies: - tslib - '@vscode/iconv-lite-umd@0.7.0': {} + '@vscode/iconv-lite-umd@0.7.1': {} '@vscode/test-electron@2.5.2': dependencies: @@ -36119,48 +36822,48 @@ snapshots: https-proxy-agent: 7.0.6 jszip: 3.10.1 ora: 8.2.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - '@vscode/vsce-sign-alpine-arm64@2.0.5': + '@vscode/vsce-sign-alpine-arm64@2.0.6': optional: true - '@vscode/vsce-sign-alpine-x64@2.0.5': + '@vscode/vsce-sign-alpine-x64@2.0.6': optional: true - '@vscode/vsce-sign-darwin-arm64@2.0.5': + '@vscode/vsce-sign-darwin-arm64@2.0.2': optional: true - '@vscode/vsce-sign-darwin-x64@2.0.5': + '@vscode/vsce-sign-darwin-x64@2.0.2': optional: true - '@vscode/vsce-sign-linux-arm64@2.0.5': + '@vscode/vsce-sign-linux-arm64@2.0.6': optional: true - '@vscode/vsce-sign-linux-arm@2.0.5': + '@vscode/vsce-sign-linux-arm@2.0.6': optional: true - '@vscode/vsce-sign-linux-x64@2.0.5': + '@vscode/vsce-sign-linux-x64@2.0.6': optional: true - '@vscode/vsce-sign-win32-arm64@2.0.5': + '@vscode/vsce-sign-win32-arm64@2.0.6': optional: true - '@vscode/vsce-sign-win32-x64@2.0.5': + '@vscode/vsce-sign-win32-x64@2.0.6': optional: true - '@vscode/vsce-sign@2.0.6': + '@vscode/vsce-sign@2.0.8': optionalDependencies: - '@vscode/vsce-sign-alpine-arm64': 2.0.5 - '@vscode/vsce-sign-alpine-x64': 2.0.5 - '@vscode/vsce-sign-darwin-arm64': 2.0.5 - '@vscode/vsce-sign-darwin-x64': 2.0.5 - '@vscode/vsce-sign-linux-arm': 2.0.5 - '@vscode/vsce-sign-linux-arm64': 2.0.5 - '@vscode/vsce-sign-linux-x64': 2.0.5 - '@vscode/vsce-sign-win32-arm64': 2.0.5 - '@vscode/vsce-sign-win32-x64': 2.0.5 + '@vscode/vsce-sign-alpine-arm64': 2.0.6 + '@vscode/vsce-sign-alpine-x64': 2.0.6 + '@vscode/vsce-sign-darwin-arm64': 2.0.2 + '@vscode/vsce-sign-darwin-x64': 2.0.2 + '@vscode/vsce-sign-linux-arm': 2.0.6 + '@vscode/vsce-sign-linux-arm64': 2.0.6 + '@vscode/vsce-sign-linux-x64': 2.0.6 + '@vscode/vsce-sign-win32-arm64': 2.0.6 + '@vscode/vsce-sign-win32-x64': 2.0.6 '@vscode/vsce@2.21.1': dependencies: @@ -36177,8 +36880,8 @@ snapshots: minimatch: 3.1.2 parse-semver: 1.1.1 read: 1.0.7 - semver: 7.7.2 - tmp: 0.2.4 + semver: 7.7.3 + tmp: 0.2.5 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.5.0 @@ -36187,13 +36890,14 @@ snapshots: optionalDependencies: keytar: 7.9.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a '@vscode/vsce@2.32.0': dependencies: - '@azure/identity': 4.11.1 - '@vscode/vsce-sign': 2.0.6 + '@azure/identity': 4.13.0 + '@vscode/vsce-sign': 2.0.8 azure-devops-node-api: 12.5.0 chalk: 2.4.2 cheerio: 1.1.2 @@ -36209,8 +36913,8 @@ snapshots: minimatch: 3.1.2 parse-semver: 1.1.1 read: 1.0.7 - semver: 7.7.2 - tmp: 0.2.4 + semver: 7.7.3 + tmp: 0.2.5 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.5.0 @@ -36219,18 +36923,19 @@ snapshots: optionalDependencies: keytar: 7.9.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a - supports-color '@vscode/vsce@3.4.2': dependencies: - '@azure/identity': 4.11.1 + '@azure/identity': 4.13.0 '@secretlint/node': 9.3.4 '@secretlint/secretlint-formatter-sarif': 9.3.4 '@secretlint/secretlint-rule-no-dotenv': 9.3.4 '@secretlint/secretlint-rule-preset-recommend': 9.3.4 - '@vscode/vsce-sign': 2.0.6 + '@vscode/vsce-sign': 2.0.8 azure-devops-node-api: 12.5.0 chalk: 2.4.2 cheerio: 1.1.2 @@ -36247,8 +36952,8 @@ snapshots: parse-semver: 1.1.1 read: 1.0.7 secretlint: 9.3.4 - semver: 7.7.2 - tmp: 0.2.4 + semver: 7.7.3 + tmp: 0.2.5 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.5.0 @@ -36257,6 +36962,7 @@ snapshots: optionalDependencies: keytar: 7.9.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a - supports-color @@ -36353,81 +37059,81 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.101.0)': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.101.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.102.1) - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.102.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: - envinfo: 7.14.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) + envinfo: 7.20.0 + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.101.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.102.1) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.102.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: - webpack-cli: 4.10.0(webpack@5.101.0) + webpack-cli: 4.10.0(webpack@5.102.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.102.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.101.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.102.1) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.101.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.102.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.102.1)': dependencies: - webpack: 5.101.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.102.1) '@xmldom/xmldom@0.7.13': {} - '@xmldom/xmldom@0.8.10': {} + '@xmldom/xmldom@0.8.11': {} '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.25.8)': + '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.25.12)': dependencies: - esbuild: 0.25.8 + esbuild: 0.25.12 tslib: 2.8.1 '@yarnpkg/fslib@2.10.3': @@ -36437,7 +37143,7 @@ snapshots: '@yarnpkg/libzip@2.3.0': dependencies: - '@types/emscripten': 1.40.1 + '@types/emscripten': 1.41.5 tslib: 1.14.1 abab@1.0.4: {} @@ -36516,7 +37222,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -36536,11 +37242,11 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.59(zod@4.1.11): + ai@5.0.87(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 1.0.32(zod@4.1.11) + '@ai-sdk/gateway': 2.0.6(zod@4.1.11) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.11) '@opentelemetry/api': 1.9.0 zod: 4.1.11 @@ -36598,7 +37304,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -36635,7 +37341,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.0.0: + ansi-escapes@7.1.1: dependencies: environment: 1.1.0 @@ -36651,7 +37357,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@2.2.1: {} @@ -36665,7 +37371,7 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} ansi-to-html@0.6.15: dependencies: @@ -36925,8 +37631,8 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 + browserslist: 4.27.0 + caniuse-lite: 1.0.30001753 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -36936,7 +37642,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001731 + caniuse-db: 1.0.30001753 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -36945,7 +37651,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001731 + caniuse-lite: 1.0.30001753 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -36953,8 +37659,8 @@ snapshots: autoprefixer@9.8.8: dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 + browserslist: 4.27.0 + caniuse-lite: 1.0.30001753 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -36973,9 +37679,9 @@ snapshots: aws4fetch@1.0.20: {} - axe-core@4.10.3: {} + axe-core@4.11.0: {} - axios@1.12.0: + axios@1.12.2: dependencies: follow-redirects: 1.15.11 form-data: 4.0.4 @@ -37029,15 +37735,19 @@ snapshots: dependencies: '@babel/core': 7.27.7 + babel-core@7.0.0-bridge.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + babel-eslint@10.1.0(eslint@6.8.0): dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 eslint: 6.8.0 eslint-visitor-keys: 1.3.0 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color @@ -37168,51 +37878,59 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.101.0): + babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.102.1): dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.101.0): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.102.1): dependencies: babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.28.5))(webpack@5.102.1): + dependencies: + babel-core: 7.0.0-bridge.0(@babel/core@7.28.5) + find-cache-dir: 1.0.0 + loader-utils: 1.4.2 + mkdirp: 0.5.6 + webpack: 5.102.1(webpack-cli@4.10.0) + + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.101.0): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.102.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 - schema-utils: 4.3.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + schema-utils: 4.3.3 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.101.0): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.102.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 - schema-utils: 4.3.2 - webpack: 5.101.0(webpack-cli@5.1.4) + schema-utils: 4.3.3 + webpack: 5.102.1(webpack-cli@5.1.4) babel-messages@6.23.0: dependencies: @@ -37272,44 +37990,54 @@ snapshots: babel-plugin-jest-hoist@25.5.0: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@types/babel__traverse': 7.28.0 babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 babel-plugin-macros@2.8.0: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 cosmiconfig: 6.0.0 - resolve: 1.22.10 + resolve: 1.22.11 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 cosmiconfig: 7.1.0 - resolve: 1.22.10 + resolve: 1.22.11 babel-plugin-named-exports-order@0.0.2: {} babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.27.7): dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.28.5 '@babel/core': 7.27.7 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) semver: 6.3.1 transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + babel-plugin-polyfill-corejs3@0.1.7(@babel/core@7.27.7): dependencies: '@babel/core': 7.27.7 '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.27.7) - core-js-compat: 3.45.0 + core-js-compat: 3.46.0 transitivePeerDependencies: - supports-color @@ -37317,9 +38045,18 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) - core-js-compat: 3.45.0 + core-js-compat: 3.46.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.46.0 transitivePeerDependencies: - supports-color + optional: true babel-plugin-polyfill-regenerator@0.0.4(@babel/core@7.27.7): dependencies: @@ -37335,6 +38072,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + optional: true + babel-plugin-react-docgen@4.2.1: dependencies: ast-types: 0.14.2 @@ -37723,16 +38468,17 @@ snapshots: balanced-match@2.0.0: {} - bare-events@2.7.0: {} + bare-events@2.8.1: {} - bare-fs@4.4.4: + bare-fs@4.5.0: dependencies: - bare-events: 2.7.0 + bare-events: 2.8.1 bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.7.0) - bare-url: 2.2.2 + bare-stream: 2.7.0(bare-events@2.8.1) + bare-url: 2.3.2 fast-fifo: 1.3.2 transitivePeerDependencies: + - bare-abort-controller - react-native-b4a optional: true @@ -37744,16 +38490,17 @@ snapshots: bare-os: 3.6.2 optional: true - bare-stream@2.7.0(bare-events@2.7.0): + bare-stream@2.7.0(bare-events@2.8.1): dependencies: streamx: 2.23.0 optionalDependencies: - bare-events: 2.7.0 + bare-events: 2.8.1 transitivePeerDependencies: + - bare-abort-controller - react-native-b4a optional: true - bare-url@2.2.2: + bare-url@2.3.2: dependencies: bare-path: 3.0.0 optional: true @@ -37762,6 +38509,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.23: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -37797,7 +38546,7 @@ snapshots: binaryextensions@6.11.0: dependencies: - editions: 6.21.0 + editions: 6.22.0 bindings@1.5.0: dependencies: @@ -37838,12 +38587,12 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 qs: 6.14.0 - raw-body: 3.0.0 + raw-body: 3.0.1 type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -37857,7 +38606,7 @@ snapshots: boundary@2.0.0: {} - bowser@2.11.0: {} + bowser@2.12.1: {} boxen@1.3.0: dependencies: @@ -37913,20 +38662,21 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001731 - electron-to-chromium: 1.5.198 + caniuse-db: 1.0.30001753 + electron-to-chromium: 1.5.244 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001731 - electron-to-chromium: 1.5.198 + caniuse-lite: 1.0.30001753 + electron-to-chromium: 1.5.244 - browserslist@4.25.1: + browserslist@4.27.0: dependencies: - caniuse-lite: 1.0.30001731 - electron-to-chromium: 1.5.198 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + baseline-browser-mapping: 2.8.23 + caniuse-lite: 1.0.30001753 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) bs-logger@0.2.6: dependencies: @@ -37974,7 +38724,7 @@ snapshots: bundle-name@4.1.0: dependencies: - run-applescript: 7.0.0 + run-applescript: 7.1.0 byline@5.0.0: {} @@ -37992,7 +38742,7 @@ snapshots: foreground-child: 3.3.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 test-exclude: 7.0.1 v8-to-istanbul: 9.3.0 yargs: 17.7.2 @@ -38006,7 +38756,7 @@ snapshots: foreground-child: 2.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 rimraf: 3.0.2 test-exclude: 6.0.0 v8-to-istanbul: 9.3.0 @@ -38080,7 +38830,7 @@ snapshots: http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.2 + normalize-url: 8.1.0 responselike: 3.0.0 cacheable-request@12.0.1: @@ -38090,13 +38840,17 @@ snapshots: http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.2 + normalize-url: 8.1.0 responselike: 3.0.0 - cacheable@1.10.3: + cacheable@2.1.1: dependencies: - hookified: 1.11.0 - keyv: 5.5.0 + '@cacheable/memoize': 2.0.3 + '@cacheable/memory': 2.0.4 + '@cacheable/utils': 2.2.0 + hookified: 1.12.2 + keyv: 5.5.3 + qified: 0.5.1 call-bind-apply-helpers@1.0.2: dependencies: @@ -38160,26 +38914,27 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001731 + caniuse-db: 1.0.30001753 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001731 + browserslist: 4.27.0 + caniuse-lite: 1.0.30001753 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001731: {} + caniuse-db@1.0.30001753: {} - caniuse-lite@1.0.30001731: {} + caniuse-lite@1.0.30001753: {} - canvas@3.1.2: + canvas@3.2.0: dependencies: node-addon-api: 7.1.1 prebuild-install: 7.1.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a optional: true @@ -38216,12 +38971,12 @@ snapshots: pathval: 1.1.1 type-detect: 4.1.0 - chai@5.2.1: + chai@5.3.3: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.2.0 + loupe: 3.2.1 pathval: 2.0.1 chainsaw@0.1.0: @@ -38252,7 +39007,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.5.0: {} + chalk@5.6.2: {} change-case@4.1.2: dependencies: @@ -38315,7 +39070,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.13.0 + undici: 7.16.0 whatwg-mimetype: 4.0.0 chokidar@1.7.0: @@ -38425,10 +39180,10 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - cli-truncate@4.0.0: + cli-truncate@5.1.1: dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 + slice-ansi: 7.1.2 + string-width: 8.1.0 cli-width@2.2.1: {} @@ -38444,6 +39199,13 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 + clipboardy@5.0.0: + dependencies: + execa: 9.6.0 + is-wayland: 0.1.0 + is-wsl: 3.1.0 + is64bit: 2.0.0 + cliui@3.2.0: dependencies: string-width: 1.0.2 @@ -38496,17 +39258,17 @@ snapshots: clsx@2.1.1: {} - cm6-theme-basic-light@0.2.0(@codemirror/language@6.11.2)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1): + cm6-theme-basic-light@0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.3): dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/highlight': 1.2.1 + '@codemirror/view': 6.38.6 + '@lezer/highlight': 1.2.3 cmdk@1.1.1(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -38527,29 +39289,29 @@ snapshots: code-point-at@1.1.0: {} - codemirror-graphql@2.2.4(@codemirror/language@6.11.2)(codemirror@5.65.19)(graphql@16.11.0): + codemirror-graphql@2.2.4(@codemirror/language@6.11.3)(codemirror@5.65.20)(graphql@16.12.0): dependencies: - '@codemirror/language': 6.11.2 + '@codemirror/language': 6.11.3 '@types/codemirror': 0.0.90 - codemirror: 5.65.19 - graphql: 16.11.0 - graphql-language-service: 5.5.0(graphql@16.11.0) + codemirror: 5.65.20 + graphql: 16.12.0 + graphql-language-service: 5.5.0(graphql@16.12.0) - codemirror@5.65.19: {} + codemirror@5.65.20: {} codemirror@6.0.2: dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 - '@codemirror/language': 6.11.2 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/commands': 6.10.0 + '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 '@codemirror/search': 6.5.11 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 collapse-white-space@1.0.6: {} - collect-v8-coverage@1.0.2: {} + collect-v8-coverage@1.0.3: {} color-convert@1.9.3: dependencies: @@ -38559,18 +39321,23 @@ snapshots: dependencies: color-name: 1.1.4 + color-convert@3.1.2: + dependencies: + color-name: 2.0.2 + color-name@1.1.3: {} color-name@1.1.4: {} + color-name@2.0.2: {} + color-string@0.3.0: dependencies: color-name: 1.1.4 - color-string@1.9.1: + color-string@2.1.2: dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + color-name: 2.0.2 color-support@1.1.3: {} @@ -38580,10 +39347,10 @@ snapshots: color-convert: 1.9.3 color-string: 0.3.0 - color@3.2.1: + color@5.0.2: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-convert: 3.1.2 + color-string: 2.1.2 colord@2.9.3: {} @@ -38601,11 +39368,6 @@ snapshots: colors@1.4.0: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -38622,7 +39384,7 @@ snapshots: commander@13.1.0: {} - commander@14.0.0: {} + commander@14.0.2: {} commander@2.13.0: {} @@ -38753,14 +39515,14 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.101.0): + copy-webpack-plugin@13.0.1(webpack@5.102.1): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - tinyglobby: 0.2.14 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + tinyglobby: 0.2.15 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -38772,15 +39534,15 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 - core-js-compat@3.45.0: + core-js-compat@3.46.0: dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 - core-js-pure@3.45.0: {} + core-js-pure@3.46.0: {} core-js@2.6.12: {} - core-js@3.45.0: {} + core-js@3.46.0: {} core-util-is@1.0.2: {} @@ -38881,13 +39643,13 @@ snapshots: dependencies: capture-stack-trace: 1.0.2 - create-jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -38898,9 +39660,9 @@ snapshots: create-require@1.1.1: {} - create-storybook@9.1.1: + create-storybook@9.1.16: dependencies: - semver: 7.7.2 + semver: 7.7.3 crelt@1.0.6: {} @@ -38908,7 +39670,7 @@ snapshots: cron-parser@4.9.0: dependencies: - luxon: 3.7.1 + luxon: 3.7.2 cron-validator@1.3.1: {} @@ -38973,7 +39735,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + css-loader@3.6.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -38988,9 +39750,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - css-loader@3.6.0(webpack@5.101.0): + css-loader@3.6.0(webpack@5.102.1): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -39005,9 +39767,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - css-loader@5.2.7(webpack@5.101.0): + css-loader@5.2.7(webpack@5.102.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -39018,10 +39780,10 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.101.0(webpack-cli@5.1.4) + semver: 7.7.3 + webpack: 5.102.1(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + css-loader@6.11.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39030,11 +39792,11 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - css-loader@6.11.0(webpack@5.101.0): + css-loader@6.11.0(webpack@5.102.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39043,11 +39805,11 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - css-loader@7.1.2(webpack@5.101.0): + css-loader@7.1.2(webpack@5.102.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39056,9 +39818,9 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -39283,7 +40045,7 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.1(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -39318,7 +40080,7 @@ snapshots: dedent@0.7.0: {} - dedent@1.6.0(babel-plugin-macros@3.1.0): + dedent@1.7.0(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -39411,7 +40173,7 @@ snapshots: del-cli@6.0.0: dependencies: - del: 8.0.0 + del: 8.0.1 meow: 13.2.0 del@2.2.2: @@ -39446,13 +40208,14 @@ snapshots: rimraf: 3.0.2 slash: 4.0.0 - del@8.0.0: + del@8.0.1: dependencies: globby: 14.1.0 is-glob: 4.0.3 is-path-cwd: 3.0.0 is-path-inside: 4.0.0 p-map: 7.0.3 + presentable-error: 0.0.1 slash: 5.1.0 delayed-stream@1.0.0: {} @@ -39480,7 +40243,7 @@ snapshots: detect-libc@1.0.3: optional: true - detect-libc@2.0.4: {} + detect-libc@2.1.2: {} detect-newline@3.1.0: {} @@ -39500,7 +40263,7 @@ snapshots: detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -39508,7 +40271,7 @@ snapshots: dependencies: dequal: 2.0.3 - dexie@4.0.11: {} + dexie@4.2.1: {} diagnostic-channel-publishers@0.3.5(diagnostic-channel@0.2.0): dependencies: @@ -39608,6 +40371,10 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.2.6: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 @@ -39643,7 +40410,7 @@ snapshots: downshift@7.6.2(react@18.2.0): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 compute-scroll-into-view: 2.0.4 prop-types: 15.8.1 react: 18.2.0 @@ -39684,9 +40451,9 @@ snapshots: dependencies: safe-buffer: 5.2.1 - editions@6.21.0: + editions@6.22.0: dependencies: - version-range: 4.14.0 + version-range: 4.15.0 ee-first@1.1.1: {} @@ -39694,7 +40461,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.198: {} + electron-to-chromium@1.5.244: {} email-addresses@5.0.0: {} @@ -39704,7 +40471,7 @@ snapshots: emittery@0.13.1: {} - emoji-regex@10.4.0: {} + emoji-regex@10.6.0: {} emoji-regex@7.0.3: {} @@ -39752,7 +40519,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.3.0 enquirer@2.4.1: dependencies: @@ -39769,7 +40536,7 @@ snapshots: env-paths@2.2.1: {} - envinfo@7.14.0: {} + envinfo@7.20.0: {} environment@1.1.0: {} @@ -39781,7 +40548,7 @@ snapshots: dependencies: prr: 1.0.1 - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -39906,7 +40673,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.39.8: {} + es-toolkit@1.41.0: {} es5-ext@0.10.64: dependencies: @@ -39943,41 +40710,41 @@ snapshots: esbuild-plugin-alias@0.2.1: {} - esbuild-register@3.6.0(esbuild@0.25.8): - dependencies: - debug: 4.4.1(supports-color@8.1.1) - esbuild: 0.25.8 - transitivePeerDependencies: - - supports-color - - esbuild@0.25.8: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + esbuild-register@3.6.0(esbuild@0.25.12): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + esbuild: 0.25.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.2.0: {} @@ -40041,7 +40808,7 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.10 + resolve: 1.22.11 eslint-module-utils@2.12.1(eslint@6.8.0): dependencies: @@ -40083,7 +40850,7 @@ snapshots: array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.10.3 + axe-core: 4.11.0 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -40116,21 +40883,21 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.5.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.6.1)): dependencies: - eslint: 9.26.0(jiti@2.5.1) + eslint: 9.26.0(jiti@2.6.1) - eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.5.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): + eslint-plugin-react-refresh@0.4.24(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.20(eslint@9.27.0(jiti@2.5.1)): + eslint-plugin-react-refresh@0.4.24(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) eslint-plugin-react@7.37.5(eslint@6.8.0): dependencies: @@ -40176,26 +40943,26 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@9.1.1(eslint@8.57.1)(storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3): + eslint-plugin-storybook@9.1.16(eslint@8.57.1)(storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.39.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.46.3(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 - storybook: 9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3) + storybook: 9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1)): dependencies: - eslint: 9.26.0(jiti@2.5.1) + eslint: 9.26.0(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) eslint-scope@5.1.1: dependencies: @@ -40239,7 +41006,7 @@ snapshots: ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) doctrine: 3.0.0 eslint-scope: 5.1.1 eslint-utils: 1.4.3 @@ -40277,8 +41044,8 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 @@ -40288,7 +41055,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -40318,26 +41085,26 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.26.0(jiti@2.5.1): + eslint@9.26.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.26.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.20.1 '@eslint/config-helpers': 0.2.3 '@eslint/core': 0.13.0 '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.17.1 + '@modelcontextprotocol/sdk': 1.21.0 '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -40358,21 +41125,22 @@ snapshots: optionator: 0.9.4 zod: 3.25.76 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: + - '@cfworker/json-schema' - supports-color - eslint@9.27.0(jiti@2.5.1): + eslint@9.27.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.27.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.20.1 '@eslint/config-helpers': 0.2.3 '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.27.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -40380,7 +41148,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -40400,7 +41168,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -40449,8 +41217,8 @@ snapshots: estree-to-babel@3.2.1: dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -40491,7 +41259,9 @@ snapshots: events-universal@1.0.1: dependencies: - bare-events: 2.7.0 + bare-events: 2.8.1 + transitivePeerDependencies: + - bare-abort-controller events@3.3.0: {} @@ -40580,6 +41350,21 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + exenv-es6@1.1.1: {} exit@0.1.2: {} @@ -40616,7 +41401,7 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - exponential-backoff@3.1.2: {} + exponential-backoff@3.1.3: {} express-rate-limit@7.5.1(express@5.1.0): dependencies: @@ -40664,7 +41449,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -40711,12 +41496,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-text-webpack-plugin@3.0.2(webpack@5.101.0): + extract-text-webpack-plugin@3.0.2(webpack@5.102.1): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -40779,7 +41564,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fast-xml-parser@5.2.5: dependencies: @@ -40829,7 +41614,7 @@ snapshots: object-assign: 4.1.1 promise: 7.3.1 setimmediate: 1.0.5 - ua-parser-js: 1.0.40 + ua-parser-js: 1.0.41 transitivePeerDependencies: - encoding @@ -40837,7 +41622,7 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -40858,9 +41643,13 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@10.1.3: + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@10.1.4: dependencies: - flat-cache: 6.1.12 + flat-cache: 6.1.18 file-entry-cache@5.0.1: dependencies: @@ -40880,23 +41669,23 @@ snapshots: minimatch: 3.1.2 proper-lockfile: 1.2.0 - file-loader@1.1.5(webpack@5.101.0): + file-loader@1.1.5(webpack@5.102.1): dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + file-loader@6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - file-loader@6.2.0(webpack@5.101.0): + file-loader@6.2.0(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -40962,7 +41751,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -41055,11 +41844,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.12: + flat-cache@6.1.18: dependencies: - cacheable: 1.10.3 + cacheable: 2.1.1 flatted: 3.3.3 - hookified: 1.11.0 + hookified: 1.12.2 flat@5.0.2: {} @@ -41069,7 +41858,7 @@ snapshots: flatten@1.0.3: {} - flow-parser@0.278.0: {} + flow-parser@0.289.0: {} flush-write-stream@1.1.1: dependencies: @@ -41104,7 +41893,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.101.0): + fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.102.1): dependencies: babel-code-frame: 6.26.0 chalk: 1.1.3 @@ -41115,7 +41904,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: @@ -41127,7 +41916,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -41140,14 +41929,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.2 + semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - eslint: 9.26.0(jiti@2.5.1) + eslint: 9.26.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.101.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.102.1): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -41160,14 +41949,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.2 + semver: 7.7.3 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) optionalDependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -41180,14 +41969,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.2 + semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.102.1): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -41200,14 +41989,14 @@ snapshots: memfs: 3.5.3 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.7.2 + semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: - eslint: 9.27.0(jiti@2.5.1) + eslint: 9.27.0(jiti@2.6.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -41219,12 +42008,12 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 + semver: 7.7.3 + tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.101.0): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.102.1): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -41236,12 +42025,12 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 + semver: 7.7.3 + tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.101.0): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.102.1): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -41253,10 +42042,10 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 + semver: 7.7.3 + tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -41317,25 +42106,25 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.1: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@3.0.1: @@ -41360,7 +42149,7 @@ snapshots: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-minipass@2.1.0: @@ -41446,6 +42235,8 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + generator-function@2.0.1: {} + generic-names@4.0.0: dependencies: loader-utils: 3.3.1 @@ -41458,7 +42249,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.3.0: {} + get-east-asian-width@1.4.0: {} get-func-name@2.0.2: {} @@ -41534,7 +42325,7 @@ snapshots: email-addresses: 5.0.0 filenamify: 4.3.0 find-cache-dir: 3.3.2 - fs-extra: 11.3.1 + fs-extra: 11.3.2 globby: 11.1.0 giget@1.2.5: @@ -41573,6 +42364,10 @@ snapshots: '@types/glob': 8.1.0 glob: 7.2.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.3.0: {} glob-to-regexp@0.4.1: {} @@ -41594,7 +42389,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -41744,7 +42539,7 @@ snapshots: got@14.4.7: dependencies: - '@sindresorhus/is': 7.0.2 + '@sindresorhus/is': 7.1.1 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 cacheable-request: 12.0.1 @@ -41774,16 +42569,16 @@ snapshots: graphemer@1.4.0: {} - graphiql-explorer@0.9.0(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + graphiql-explorer@0.9.0(graphql@16.12.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - graphql: 16.11.0 + graphql: 16.12.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - graphiql@3.7.0(@codemirror/language@6.11.2)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + graphiql@3.7.0(@codemirror/language@6.11.3)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.12.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@graphiql/react': 0.26.2(@codemirror/language@6.11.2)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - graphql: 16.11.0 + '@graphiql/react': 0.26.2(@codemirror/language@6.11.3)(@types/node@22.15.35)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.12.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + graphql: 16.12.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -41797,14 +42592,14 @@ snapshots: dependencies: lodash: 4.17.21 - graphql-language-service@5.5.0(graphql@16.11.0): + graphql-language-service@5.5.0(graphql@16.12.0): dependencies: debounce-promise: 3.1.2 - graphql: 16.11.0 + graphql: 16.12.0 nullthrows: 1.1.1 vscode-languageserver-types: 3.17.5 - graphql@16.11.0: {} + graphql@16.12.0: {} growly@1.3.0: {} @@ -41988,7 +42783,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.17 + style-to-js: 1.1.19 unist-util-position: 5.0.0 vfile-message: 4.0.3 transitivePeerDependencies: @@ -42081,7 +42876,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.11.0: {} + hookified@1.12.2: {} hosted-git-info@2.8.9: {} @@ -42134,7 +42929,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.43.1 + terser: 5.44.0 html-minifier@3.5.21: dependencies: @@ -42158,7 +42953,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@2.29.0(webpack@5.101.0): + html-webpack-plugin@2.29.0(webpack@5.102.1): dependencies: bluebird: 3.7.2 html-minifier: 3.5.21 @@ -42166,9 +42961,9 @@ snapshots: lodash: 4.17.21 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + html-webpack-plugin@4.5.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -42179,9 +42974,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - html-webpack-plugin@4.5.2(webpack@5.101.0): + html-webpack-plugin@4.5.2(webpack@5.102.1): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -42192,27 +42987,27 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - html-webpack-plugin@5.6.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + html-webpack-plugin@5.6.4(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.2 + tapable: 2.3.0 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - html-webpack-plugin@5.6.3(webpack@5.101.0): + html-webpack-plugin@5.6.4(webpack@5.102.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 - tapable: 2.2.2 + tapable: 2.3.0 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) htmlparser2@10.0.0: dependencies: @@ -42253,7 +43048,7 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -42261,26 +43056,26 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.23): + http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: - '@types/http-proxy': 1.17.16 + '@types/http-proxy': 1.17.17 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 optionalDependencies: - '@types/express': 4.17.23 + '@types/express': 4.17.25 transitivePeerDependencies: - debug @@ -42303,7 +43098,7 @@ snapshots: mime: 1.6.0 minimist: 1.2.8 opener: 1.5.2 - portfinder: 1.0.37 + portfinder: 1.0.38 secure-compare: 3.0.1 union: 0.5.0 url-join: 4.0.1 @@ -42325,21 +43120,21 @@ snapshots: https-proxy-agent@4.0.0: dependencies: agent-base: 5.1.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -42349,7 +43144,9 @@ snapshots: human-signals@5.0.0: {} - humanize-duration@3.33.0: {} + human-signals@8.0.1: {} + + humanize-duration@3.33.1: {} humanize-ms@1.2.1: dependencies: @@ -42374,6 +43171,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + icss-replace-symbols@1.1.0: {} icss-utils@2.1.0: @@ -42406,7 +43207,7 @@ snapshots: immutable@3.8.2: {} - immutable@5.1.3: {} + immutable@5.1.4: {} import-cwd@3.0.0: dependencies: @@ -42455,7 +43256,7 @@ snapshots: inline-style-parser@0.1.1: {} - inline-style-parser@0.2.4: {} + inline-style-parser@0.2.6: {} inquirer@3.3.0: dependencies: @@ -42504,11 +43305,11 @@ snapshots: intersection-observer@0.10.0: {} - intl-messageformat@10.7.16: + intl-messageformat@10.7.18: dependencies: - '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/ecma402-abstract': 2.3.6 '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 + '@formatjs/icu-messageformat-parser': 2.11.4 tslib: 2.8.1 invariant@2.2.4: @@ -42517,10 +43318,7 @@ snapshots: invert-kv@1.0.0: {} - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ip-address@10.0.1: {} ip-regex@2.1.0: {} @@ -42563,8 +43361,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -42660,11 +43456,9 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.0.0: + is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.4.0 is-function@1.0.2: {} @@ -42672,9 +43466,10 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -42718,7 +43513,7 @@ snapshots: is-negative-zero@2.0.3: {} - is-network-error@1.1.0: {} + is-network-error@1.3.0: {} is-npm@1.0.0: {} @@ -42835,6 +43630,8 @@ snapshots: is-utf8@0.2.1: {} + is-wayland@0.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -42945,7 +43742,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -42955,10 +43752,10 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -42985,7 +43782,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -42995,7 +43792,7 @@ snapshots: dependencies: handlebars: 4.7.8 - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -43020,7 +43817,7 @@ snapshots: istextorbinary@9.5.0: dependencies: binaryextensions: 6.11.0 - editions: 6.21.0 + editions: 6.22.0 textextensions: 6.11.0 iterate-iterator@1.0.2: {} @@ -43078,7 +43875,7 @@ snapshots: '@types/node': 22.15.35 chalk: 4.1.2 co: 4.6.0 - dedent: 1.6.0(babel-plugin-macros@3.1.0) + dedent: 1.7.0(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -43150,16 +43947,16 @@ snapshots: - supports-color - utf-8-validate - jest-cli@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -43223,7 +44020,7 @@ snapshots: - supports-color - utf-8-validate - jest-config@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@babel/core': 7.27.7 '@jest/test-sequencer': 29.7.0 @@ -43249,7 +44046,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.15.35 - ts-node: 10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -43470,7 +44267,7 @@ snapshots: jest-jasmine2@25.5.4: dependencies: - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -43641,7 +44438,7 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@25.5.1) read-pkg-up: 7.0.1 realpath-native: 2.0.0 - resolve: 1.22.10 + resolve: 1.22.11 slash: 3.0.0 jest-resolve@29.7.0: @@ -43652,7 +44449,7 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.10 + resolve: 1.22.11 resolve.exports: 2.0.3 slash: 3.0.0 @@ -43738,7 +44535,7 @@ snapshots: '@jest/types': 25.5.0 '@types/yargs': 15.0.19 chalk: 3.0.0 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -43773,7 +44570,7 @@ snapshots: '@types/node': 22.15.35 chalk: 4.1.2 cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 glob: 7.2.3 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 @@ -43817,7 +44614,7 @@ snapshots: jest-snapshot@25.5.1: dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -43836,10 +44633,10 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -43854,7 +44651,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -44011,12 +44808,12 @@ snapshots: - supports-color - utf-8-validate - jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -44025,7 +44822,7 @@ snapshots: jiti@1.21.7: {} - jiti@2.5.1: {} + jiti@2.6.1: {} joi@17.13.3: dependencies: @@ -44063,25 +44860,23 @@ snapshots: jsbn@0.1.1: {} - jsbn@1.1.0: {} - jschardet@3.1.4: {} jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)): dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.5 '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) chalk: 4.1.2 - flow-parser: 0.278.0 + flow-parser: 0.289.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -44094,7 +44889,34 @@ snapshots: transitivePeerDependencies: - supports-color - jsdoc-type-pratt-parser@4.1.0: {} + jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.5)): + dependencies: + '@babel/core': 7.27.7 + '@babel/parser': 7.28.5 + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) + '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) + '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) + '@babel/register': 7.28.3(@babel/core@7.27.7) + babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) + chalk: 4.1.2 + flow-parser: 0.289.0 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.23.11 + temp: 0.8.4 + write-file-atomic: 2.4.3 + optionalDependencies: + '@babel/preset-env': 7.27.2(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + jsdoc-type-pratt-parser@4.8.0: {} jsdom@11.12.0: dependencies: @@ -44109,12 +44931,12 @@ snapshots: escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 left-pad: 1.3.0 - nwsapi: 2.2.21 + nwsapi: 2.2.22 parse5: 4.0.0 pn: 1.1.0 request: 2.88.2 request-promise-native: 1.0.9(request@2.88.2) - sax: 1.4.1 + sax: 1.4.2 symbol-tree: 3.2.4 tough-cookie: 2.5.0 w3c-hr-time: 1.0.2 @@ -44137,7 +44959,7 @@ snapshots: domexception: 1.0.1 escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 - nwsapi: 2.2.21 + nwsapi: 2.2.22 parse5: 5.1.0 pn: 1.1.0 request: 2.88.2 @@ -44173,7 +44995,7 @@ snapshots: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.21 + nwsapi: 2.2.22 parse5: 7.3.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -44204,7 +45026,7 @@ snapshots: nwmatcher: 1.4.4 parse5: 1.5.1 request: 2.88.2 - sax: 1.4.1 + sax: 1.4.2 symbol-tree: 3.2.4 tough-cookie: 2.5.0 webidl-conversions: 4.0.2 @@ -44216,8 +45038,6 @@ snapshots: jsesc@1.3.0: {} - jsesc@3.0.2: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -44228,7 +45048,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 ts-algebra: 2.0.0 json-schema-traverse@0.3.1: {} @@ -44275,7 +45095,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -44286,7 +45106,7 @@ snapshots: jsonix@3.0.0: dependencies: amdefine: 0.1.1 - xmldom: '@xmldom/xmldom@0.8.10' + xmldom: '@xmldom/xmldom@0.8.11' xmlhttprequest: 1.8.0 jsonwebtoken@9.0.2: @@ -44300,7 +45120,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.2 + semver: 7.7.3 jsprim@1.4.2: dependencies: @@ -44343,6 +45163,7 @@ snapshots: node-addon-api: 4.3.0 prebuild-install: 7.1.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -44350,9 +45171,9 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.0: + keyv@5.5.3: dependencies: - '@keyv/serialize': 1.1.0 + '@keyv/serialize': 1.1.1 kill-port@2.0.1: dependencies: @@ -44385,16 +45206,16 @@ snapshots: dependencies: package-json: 4.0.1 - launch-editor@2.11.0: + launch-editor@2.12.0: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 lazy-universal-dotenv@3.0.1: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 app-root-dir: 1.0.2 - core-js: 3.45.0 + core-js: 3.46.0 dotenv: 8.6.0 dotenv-expand: 5.1.0 @@ -44446,31 +45267,26 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.1.4: + lint-staged@16.2.6: dependencies: - chalk: 5.5.0 - commander: 14.0.0 - debug: 4.4.1(supports-color@8.1.1) - lilconfig: 3.1.3 - listr2: 9.0.1 + commander: 14.0.2 + listr2: 9.0.5 micromatch: 4.0.8 - nano-spawn: 1.0.2 + nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 - transitivePeerDependencies: - - supports-color listenercount@1.0.1: {} - listr2@9.0.1: + listr2@9.0.5: dependencies: - cli-truncate: 4.0.0 + cli-truncate: 5.1.1 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 load-json-file@1.1.0: dependencies: @@ -44480,7 +45296,7 @@ snapshots: pinkie-promise: 2.0.1 strip-bom: 2.0.0 - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} loader-utils@0.2.17: dependencies: @@ -44601,7 +45417,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.5.0 + chalk: 5.6.2 is-unicode-supported: 1.3.0 log-update@2.3.0: @@ -44612,11 +45428,11 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.0.0 + ansi-escapes: 7.1.1 cli-cursor: 5.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 logform@2.7.0: dependencies: @@ -44652,7 +45468,7 @@ snapshots: dependencies: get-func-name: 2.0.2 - loupe@3.2.0: {} + loupe@3.2.1: {} lower-case@1.1.4: {} @@ -44671,7 +45487,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.2: {} lru-cache@4.1.5: dependencies: @@ -44696,7 +45512,7 @@ snapshots: dependencies: react: 18.3.1 - luxon@3.7.1: {} + luxon@3.7.2: {} lz-string@1.5.0: {} @@ -44704,9 +45520,9 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.17: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.5 make-cancellable-promise@1.3.2: {} @@ -44725,7 +45541,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-error@1.3.6: {} @@ -44787,12 +45603,12 @@ snapshots: markdown-table@3.0.4: {} - markdown-to-jsx@7.7.13(react@18.2.0): - dependencies: + markdown-to-jsx@7.7.17(react@18.2.0): + optionalDependencies: react: 18.2.0 - markdown-to-jsx@7.7.13(react@19.1.0): - dependencies: + markdown-to-jsx@7.7.17(react@19.1.0): + optionalDependencies: react: 19.1.0 matches-selector@0.0.1: {} @@ -44827,7 +45643,7 @@ snapshots: mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.2 stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 transitivePeerDependencies: - supports-color @@ -44835,8 +45651,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@1.3.1: dependencies: @@ -44997,7 +45813,7 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 mdast-util-to-hast@10.0.1: dependencies: @@ -45081,11 +45897,13 @@ snapshots: dependencies: fs-monkey: 1.1.0 - memfs@4.36.0: + memfs@4.50.0: dependencies: - '@jsonjoy.com/json-pack': 1.8.0(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - tree-dump: 1.0.3(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 memoizee@0.4.17: @@ -45152,7 +45970,7 @@ snapshots: merge@1.2.1: {} - meros@1.3.1(@types/node@22.15.35): + meros@1.3.2(@types/node@22.15.35): optionalDependencies: '@types/node': 22.15.35 @@ -45535,7 +46353,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.2.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -45557,7 +46375,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -45623,11 +46441,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.3(webpack@5.101.0): + mini-css-extract-plugin@2.9.4(webpack@5.102.1): dependencies: - schema-utils: 4.3.2 - tapable: 2.2.2 - webpack: 5.101.0(webpack-cli@4.10.0) + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.102.1(webpack-cli@4.10.0) minim@0.23.8: dependencies: @@ -45635,7 +46453,7 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.0.3: + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -45731,7 +46549,7 @@ snapshots: mkdirp@3.0.1: {} - mlly@1.7.4: + mlly@1.8.0: dependencies: acorn: 8.15.0 pathe: 2.0.3 @@ -45743,7 +46561,7 @@ snapshots: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -45761,16 +46579,17 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - mocha@11.7.1: + mocha@11.7.4: dependencies: browser-stdout: 1.3.1 chokidar: 4.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) diff: 7.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 10.4.5 he: 1.2.0 + is-path-inside: 3.0.3 js-yaml: 4.1.0 log-symbols: 4.1.0 minimatch: 9.0.5 @@ -45779,7 +46598,7 @@ snapshots: serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 9.3.3 + workerpool: 9.3.4 yargs: 17.7.2 yargs-parser: 21.1.1 yargs-unparser: 2.0.0 @@ -45804,13 +46623,13 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - monaco-page-objects@3.14.1(selenium-webdriver@4.34.0)(typescript@5.8.3): + monaco-page-objects@3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3): dependencies: clipboardy: 4.0.0 clone-deep: 4.0.1 compare-versions: 6.1.1 - fs-extra: 11.3.1 - selenium-webdriver: 4.34.0 + fs-extra: 11.3.2 + selenium-webdriver: 4.38.0 type-fest: 4.41.0 typescript: 5.8.3 @@ -45852,11 +46671,11 @@ snapshots: nan@2.23.0: {} - nano-spawn@1.0.2: {} + nano-spawn@2.0.0: {} nanoid@3.3.11: {} - nanoid@5.1.5: {} + nanoid@5.1.6: {} nanospinner@1.2.2: dependencies: @@ -45897,9 +46716,9 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.75.0: + node-abi@3.80.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-abort-controller@3.1.1: {} @@ -45965,14 +46784,14 @@ snapshots: node-gyp@9.4.1: dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.2 + exponential-backoff: 3.1.3 glob: 7.2.3 graceful-fs: 4.2.11 make-fetch-happen: 10.2.1 nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -45980,15 +46799,15 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.101.0): + node-loader@2.0.0(webpack@5.102.1): dependencies: loader-utils: 2.0.4 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - node-loader@2.1.0(webpack@5.101.0): + node-loader@2.1.0(webpack@5.102.1): dependencies: loader-utils: 2.0.4 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) node-notifier@5.4.5: dependencies: @@ -46007,7 +46826,7 @@ snapshots: which: 1.3.1 optional: true - node-releases@2.0.19: {} + node-releases@2.0.27: {} node-sarif-builder@2.0.3: dependencies: @@ -46036,7 +46855,7 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -46044,13 +46863,13 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -46070,7 +46889,7 @@ snapshots: normalize-url@6.1.0: {} - normalize-url@8.0.2: {} + normalize-url@8.1.0: {} npm-run-path@2.0.2: dependencies: @@ -46084,6 +46903,11 @@ snapshots: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + npmlog@4.1.2: dependencies: are-we-there-yet: 1.1.7 @@ -46117,7 +46941,7 @@ snapshots: nwmatcher@1.4.4: {} - nwsapi@2.2.21: {} + nwsapi@2.2.22: {} nypm@0.5.4: dependencies: @@ -46298,7 +47122,7 @@ snapshots: ora@8.2.0: dependencies: - chalk: 5.5.0 + chalk: 5.6.2 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -46306,7 +47130,7 @@ snapshots: log-symbols: 6.0.0 stdin-discarder: 0.2.2 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 original@1.0.2: dependencies: @@ -46425,7 +47249,7 @@ snapshots: p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.1.0 + is-network-error: 1.3.0 retry: 0.13.1 p-timeout@3.2.0: @@ -46491,23 +47315,25 @@ snapshots: parse-json@2.2.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@7.1.1: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 type-fest: 3.13.1 + parse-ms@4.0.0: {} + parse-passwd@1.0.0: {} parse-semver@1.1.1: @@ -46580,7 +47406,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.2 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -46591,7 +47417,7 @@ snapshots: path-to-regexp@3.3.0: {} - path-to-regexp@8.2.0: {} + path-to-regexp@8.3.0: {} path-type@1.1.0: dependencies: @@ -46629,9 +47455,10 @@ snapshots: pdfjs-dist@4.8.69: optionalDependencies: - canvas: 3.1.2 + canvas: 3.2.0 path2d: 0.2.2 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -46704,7 +47531,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 playwright-core@1.55.1: {} @@ -46742,7 +47569,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 popmotion@11.0.3: dependencies: @@ -46751,10 +47578,10 @@ snapshots: style-value-types: 5.0.0 tslib: 2.8.1 - portfinder@1.0.37: + portfinder@1.0.38: dependencies: async: 3.2.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -46780,7 +47607,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -46793,7 +47620,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -46851,9 +47678,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 - postcss-js@4.0.1(postcss@8.5.6): + postcss-js@4.1.0(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 postcss: 8.5.6 @@ -46865,21 +47692,21 @@ snapshots: postcss-load-options: 1.2.0 postcss-load-plugins: 2.3.0 - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 - yaml: 2.8.1 optionalDependencies: + jiti: 1.21.7 postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) + yaml: 2.8.1 postcss-load-options@1.2.0: dependencies: @@ -46898,34 +47725,34 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 loader-utils: 2.0.4 postcss: 7.0.39 schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + semver: 7.7.3 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.101.0): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.102.1): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 loader-utils: 2.0.4 postcss: 7.0.39 schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + semver: 7.7.3 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.101.0): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) - jiti: 1.21.7 + jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -46955,7 +47782,7 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -46995,7 +47822,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 cssnano-utils: 3.1.0(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -47125,7 +47952,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -47169,7 +47996,7 @@ snapshots: postcss-reduce-initial@5.1.2(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -47266,19 +48093,20 @@ snapshots: prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.75.0 + node-abi: 3.80.0 pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 tar-fs: 3.1.1 tunnel-agent: 0.6.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -47288,6 +48116,8 @@ snapshots: prepend-http@1.0.4: {} + presentable-error@0.0.1: {} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 @@ -47343,6 +48173,10 @@ snapshots: pretty-hrtime@1.0.3: {} + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + prism-react-renderer@2.4.1(react@18.2.0): dependencies: '@types/prismjs': 1.26.5 @@ -47363,7 +48197,7 @@ snapshots: dependencies: chalk: 2.4.2 cli-spinners: 1.3.1 - humanize-duration: 3.33.0 + humanize-duration: 3.33.1 log-update: 2.3.0 progress@2.0.3: {} @@ -47472,7 +48306,7 @@ snapshots: puppeteer-core@2.1.1: dependencies: '@types/mime-types': 2.1.4 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -47490,6 +48324,10 @@ snapshots: q@1.5.1: {} + qified@0.5.1: + dependencies: + hookified: 1.12.2 + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -47545,28 +48383,28 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.0: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + raw-loader@4.0.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - raw-loader@4.0.2(webpack@5.101.0): + raw-loader@4.0.2(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) js-yaml: 4.1.0 json5: 2.2.3 require-from-string: 2.0.2 @@ -47666,8 +48504,8 @@ snapshots: react-docgen@5.4.3: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.0 - '@babel/runtime': 7.28.2 + '@babel/generator': 7.28.5 + '@babel/runtime': 7.28.4 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -47681,30 +48519,30 @@ snapshots: react-docgen@7.1.1: dependencies: '@babel/core': 7.27.7 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.10 - strip-indent: 4.0.0 + resolve: 1.22.11 + strip-indent: 4.1.1 transitivePeerDependencies: - supports-color - react-docgen@8.0.0: + react-docgen@8.0.2: dependencies: - '@babel/core': 7.27.7 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + '@babel/core': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.10 - strip-indent: 4.0.0 + resolve: 1.22.11 + strip-indent: 4.1.1 transitivePeerDependencies: - supports-color @@ -47759,12 +48597,12 @@ snapshots: react-error-boundary@3.1.4(react@18.2.0): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 18.2.0 react-error-boundary@6.0.0(react@19.1.0): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 react: 19.1.0 react-error-overlay@4.0.1: {} @@ -47813,7 +48651,7 @@ snapshots: react-inspector@5.1.1(react@18.2.0): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 is-dom: 1.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -47826,29 +48664,29 @@ snapshots: dependencies: react: 19.1.0 - react-intl@7.1.11(react@18.2.0)(typescript@5.8.3): + react-intl@7.1.14(react@18.2.0)(typescript@5.8.3): dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-messageformat-parser': 2.11.2 - '@formatjs/intl': 3.1.6(typescript@5.8.3) + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/icu-messageformat-parser': 2.11.4 + '@formatjs/intl': 3.1.8(typescript@5.8.3) '@types/hoist-non-react-statics': 3.3.7(@types/react@18.2.0) '@types/react': 18.2.0 hoist-non-react-statics: 3.3.2 - intl-messageformat: 10.7.16 + intl-messageformat: 10.7.18 react: 18.2.0 tslib: 2.8.1 optionalDependencies: typescript: 5.8.3 - react-intl@7.1.11(react@19.1.0)(typescript@4.9.5): + react-intl@7.1.14(react@19.1.0)(typescript@4.9.5): dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-messageformat-parser': 2.11.2 - '@formatjs/intl': 3.1.6(typescript@4.9.5) + '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/icu-messageformat-parser': 2.11.4 + '@formatjs/intl': 3.1.8(typescript@4.9.5) '@types/hoist-non-react-statics': 3.3.7(@types/react@18.2.0) '@types/react': 18.2.0 hoist-non-react-statics: 3.3.2 - intl-messageformat: 10.7.16 + intl-messageformat: 10.7.18 react: 19.1.0 tslib: 2.8.1 optionalDependencies: @@ -47862,9 +48700,9 @@ snapshots: react-is@18.3.1: {} - react-is@19.1.1: {} + react-is@19.2.0: {} - react-json-view-lite@2.4.2(react@18.2.0): + react-json-view-lite@2.5.0(react@18.2.0): dependencies: react: 18.2.0 @@ -47973,6 +48811,7 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -47980,7 +48819,7 @@ snapshots: dependencies: '@types/use-sync-external-store': 0.0.6 react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) + use-sync-external-store: 1.6.0(react@18.2.0) optionalDependencies: '@types/react': 18.2.0 redux: 5.0.1 @@ -48055,22 +48894,22 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - react-scripts-ts@3.1.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): + react-scripts-ts@3.1.0(@swc/core@1.14.0(@swc/helpers@0.5.17))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): dependencies: autoprefixer: 7.1.6 babel-jest: 20.0.3 - babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.101.0) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.102.1) babel-preset-react-app: 3.1.2(babel-runtime@6.26.0) case-sensitive-paths-webpack-plugin: 2.1.1 chalk: 1.1.3 css-loader: 0.28.7 dotenv: 4.0.0 dotenv-expand: 4.2.0 - extract-text-webpack-plugin: 3.0.2(webpack@5.101.0) - file-loader: 1.1.5(webpack@5.101.0) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.101.0) + extract-text-webpack-plugin: 3.0.2(webpack@5.102.1) + file-loader: 1.1.5(webpack@5.102.1) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.102.1) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.101.0) + html-webpack-plugin: 2.29.0(webpack@5.102.1) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48081,7 +48920,7 @@ snapshots: resolve: 1.6.0 source-map-loader: 0.2.4 style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.101.0) + sw-precache-webpack-plugin: 0.11.4(webpack@5.102.1) ts-jest: 22.0.1(jest@20.0.4)(typescript@5.8.3) ts-loader: 2.3.7 tsconfig-paths-webpack-plugin: 2.0.0 @@ -48089,11 +48928,11 @@ snapshots: tslint-config-prettier: 1.18.0 tslint-react: 3.6.0(tslint@5.20.1(typescript@5.8.3))(typescript@5.8.3) typescript: 5.8.3 - uglifyjs-webpack-plugin: 1.2.5(webpack@5.101.0) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.101.0)) - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) - webpack-manifest-plugin: 1.3.2(webpack@5.101.0) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.102.1) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.102.1)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) + webpack-manifest-plugin: 1.3.2(webpack@5.102.1) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48109,22 +48948,22 @@ snapshots: - utf-8-validate - webpack-cli - react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(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.28.5))(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.27.7))(webpack@5.101.0) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.28.5))(webpack@5.102.1) babel-preset-react-app: 3.1.2(babel-runtime@6.26.0) case-sensitive-paths-webpack-plugin: 2.1.1 chalk: 1.1.3 css-loader: 0.28.7 dotenv: 4.0.0 dotenv-expand: 4.2.0 - extract-text-webpack-plugin: 3.0.2(webpack@5.101.0) - file-loader: 1.1.5(webpack@5.101.0) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.101.0) + extract-text-webpack-plugin: 3.0.2(webpack@5.102.1) + file-loader: 1.1.5(webpack@5.102.1) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.102.1) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.101.0) + html-webpack-plugin: 2.29.0(webpack@5.102.1) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -48135,7 +48974,7 @@ snapshots: resolve: 1.6.0 source-map-loader: 0.2.4 style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.101.0) + sw-precache-webpack-plugin: 0.11.4(webpack@5.102.1) ts-jest: 22.0.1(jest@20.0.4)(typescript@5.8.3) ts-loader: 2.3.7 tsconfig-paths-webpack-plugin: 2.0.0 @@ -48143,11 +48982,11 @@ snapshots: tslint-config-prettier: 1.18.0 tslint-react: 3.6.0(tslint@5.20.1(typescript@5.8.3))(typescript@5.8.3) typescript: 5.8.3 - uglifyjs-webpack-plugin: 1.2.5(webpack@5.101.0) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.101.0)) - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-dev-server: 5.2.2(webpack@5.101.0) - webpack-manifest-plugin: 1.3.2(webpack@5.101.0) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.102.1) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.102.1)) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-dev-server: 5.2.2(webpack@5.102.1) + webpack-manifest-plugin: 1.3.2(webpack@5.102.1) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -48204,9 +49043,9 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - react-syntax-highlighter@15.6.1(react@18.2.0): + react-syntax-highlighter@15.6.6(react@18.2.0): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -48217,12 +49056,12 @@ snapshots: react-test-renderer@19.1.1(react@18.2.0): dependencies: react: 18.2.0 - react-is: 19.1.1 + react-is: 19.2.0 scheduler: 0.26.0 react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 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) @@ -48371,15 +49210,15 @@ snapshots: rechoir@0.6.2: dependencies: - resolve: 1.22.10 + resolve: 1.22.11 rechoir@0.7.1: dependencies: - resolve: 1.22.10 + resolve: 1.22.11 rechoir@0.8.0: dependencies: - resolve: 1.22.10 + resolve: 1.22.11 recursive-readdir@2.2.1: dependencies: @@ -48398,7 +49237,7 @@ snapshots: redent@4.0.0: dependencies: indent-string: 5.0.0 - strip-indent: 4.0.0 + strip-indent: 4.1.1 reduce-css-calc@1.3.0: dependencies: @@ -48416,7 +49255,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 redux@5.0.1: {} @@ -48437,7 +49276,7 @@ snapshots: parse-entities: 2.0.0 prismjs: 1.30.0 - regenerate-unicode-properties@10.2.0: + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -48472,14 +49311,14 @@ snapshots: regjsgen: 0.2.0 regjsparser: 0.1.5 - regexpu-core@6.2.0: + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 + regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.12.0 + regjsparser: 0.13.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 + unicode-match-property-value-ecmascript: 2.2.1 registry-auth-token@3.4.0: dependencies: @@ -48498,9 +49337,9 @@ snapshots: dependencies: jsesc: 0.5.0 - regjsparser@0.12.0: + regjsparser@0.13.0: dependencies: - jsesc: 3.0.2 + jsesc: 3.1.0 rehype-raw@6.1.1: dependencies: @@ -48734,7 +49573,7 @@ snapshots: dependencies: path-parse: 1.0.7 - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -48804,16 +49643,16 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup-plugin-import-css@3.5.8(rollup@4.46.2): + rollup-plugin-import-css@3.5.8(rollup@4.52.5): dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.46.2) - rollup: 4.46.2 + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + rollup: 4.52.5 - rollup-plugin-peer-deps-external@2.2.4(rollup@4.46.2): + rollup-plugin-peer-deps-external@2.2.4(rollup@4.52.5): dependencies: - rollup: 4.46.2 + rollup: 4.52.5 - rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -48822,10 +49661,10 @@ snapshots: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) postcss-modules: 4.3.1(postcss@8.5.6) promise.series: 0.2.0 - resolve: 1.22.10 + resolve: 1.22.11 rollup-pluginutils: 2.8.2 safe-identifier: 0.4.2 style-inject: 0.3.0 @@ -48867,13 +49706,13 @@ snapshots: tslib: 2.0.1 typescript: 3.9.10 - rollup-plugin-typescript2@0.36.0(rollup@4.46.2)(typescript@5.8.3): + rollup-plugin-typescript2@0.36.0(rollup@4.52.5)(typescript@5.8.3): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 4.46.2 - semver: 7.7.2 + rollup: 4.52.5 + semver: 7.7.3 tslib: 2.8.1 typescript: 5.8.3 @@ -48892,45 +49731,47 @@ snapshots: '@types/node': 22.15.35 acorn: 7.4.1 - rollup@4.46.2: + rollup@4.52.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.46.2 - '@rollup/rollup-android-arm64': 4.46.2 - '@rollup/rollup-darwin-arm64': 4.46.2 - '@rollup/rollup-darwin-x64': 4.46.2 - '@rollup/rollup-freebsd-arm64': 4.46.2 - '@rollup/rollup-freebsd-x64': 4.46.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 - '@rollup/rollup-linux-arm-musleabihf': 4.46.2 - '@rollup/rollup-linux-arm64-gnu': 4.46.2 - '@rollup/rollup-linux-arm64-musl': 4.46.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 - '@rollup/rollup-linux-ppc64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-gnu': 4.46.2 - '@rollup/rollup-linux-riscv64-musl': 4.46.2 - '@rollup/rollup-linux-s390x-gnu': 4.46.2 - '@rollup/rollup-linux-x64-gnu': 4.46.2 - '@rollup/rollup-linux-x64-musl': 4.46.2 - '@rollup/rollup-win32-arm64-msvc': 4.46.2 - '@rollup/rollup-win32-ia32-msvc': 4.46.2 - '@rollup/rollup-win32-x64-msvc': 4.46.2 + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 router@2.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color rsvp@4.8.5: {} - run-applescript@7.0.0: {} + run-applescript@7.1.0: {} run-async@2.4.1: {} @@ -49015,31 +49856,31 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@13.3.3(sass@1.90.0)(webpack@5.101.0): + sass-loader@13.3.3(sass@1.93.3)(webpack@5.102.1): dependencies: neo-async: 2.6.2 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: - sass: 1.90.0 + sass: 1.93.3 - sass-loader@16.0.5(sass@1.90.0)(webpack@5.101.0): + sass-loader@16.0.6(sass@1.93.3)(webpack@5.102.1): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.90.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + sass: 1.93.3 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - sass@1.90.0: + sass@1.93.3: dependencies: chokidar: 4.0.3 - immutable: 5.1.3 + immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 sax@1.2.4: {} - sax@1.4.1: {} + sax@1.4.2: {} saxes@3.1.11: dependencies: @@ -49082,7 +49923,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -49095,7 +49936,7 @@ snapshots: '@secretlint/formatter': 9.3.4 '@secretlint/node': 9.3.4 '@secretlint/profiler': 9.3.4 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) globby: 14.1.0 read-pkg: 8.1.0 transitivePeerDependencies: @@ -49105,11 +49946,11 @@ snapshots: select-hose@2.0.0: {} - selenium-webdriver@4.34.0: + selenium-webdriver@4.38.0: dependencies: - '@bazel/runfiles': 6.3.1 + '@bazel/runfiles': 6.5.0 jszip: 3.10.1 - tmp: 0.2.4 + tmp: 0.2.5 ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -49117,7 +49958,7 @@ snapshots: selfsigned@2.4.1: dependencies: - '@types/node-forge': 1.3.13 + '@types/node-forge': 1.3.14 node-forge: 1.3.1 semver-diff@2.1.0: @@ -49130,7 +49971,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.3: {} send@0.19.0: dependencies: @@ -49150,7 +49991,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -49273,7 +50114,7 @@ snapshots: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - to-buffer: 1.2.1 + to-buffer: 1.2.2 shallow-clone@3.0.1: dependencies: @@ -49356,21 +50197,17 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - sisteransi@1.0.5: {} size-limit@11.2.0: dependencies: bytes-iec: 3.1.1 chokidar: 4.0.3 - jiti: 2.5.1 + jiti: 2.6.1 lilconfig: 3.1.3 nanospinner: 1.2.2 picocolors: 1.1.1 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 slash@1.0.0: {} @@ -49394,15 +50231,10 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - slice-ansi@5.0.0: + slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - - slice-ansi@7.1.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 slugify@1.6.6: {} @@ -49431,14 +50263,14 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - socks: 2.8.6 + debug: 4.4.3(supports-color@8.1.1) + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.8.6: + socks@2.8.7: dependencies: - ip-address: 9.0.5 + ip-address: 10.0.1 smart-buffer: 4.2.0 sort-keys@1.1.2: @@ -49456,17 +50288,17 @@ snapshots: async: 2.6.4 loader-utils: 1.4.2 - source-map-loader@4.0.2(webpack@5.101.0): + source-map-loader@4.0.2(webpack@5.102.1): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - source-map-loader@5.0.0(webpack@5.101.0): + source-map-loader@5.0.0(webpack@5.102.1): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -49508,7 +50340,7 @@ snapshots: spawn-rx@5.1.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) rxjs: 7.8.2 transitivePeerDependencies: - supports-color @@ -49529,7 +50361,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -49540,7 +50372,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -49550,8 +50382,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - sshpk@1.18.0: dependencies: asn1: 0.2.6 @@ -49645,7 +50475,7 @@ snapshots: - supports-color - utf-8-validate - storybook@9.1.1(@testing-library/dom@10.4.1)(prettier@3.5.3): + storybook@9.1.16(@testing-library/dom@10.4.1)(prettier@3.5.3): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.6.4 @@ -49654,10 +50484,10 @@ snapshots: '@vitest/mocker': 3.2.4 '@vitest/spy': 3.2.4 better-opn: 3.0.2 - esbuild: 0.25.8 - esbuild-register: 3.6.0(esbuild@0.25.8) + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) recast: 0.23.11 - semver: 7.7.2 + semver: 7.7.3 ws: 8.18.3 optionalDependencies: prettier: 3.5.3 @@ -49679,7 +50509,7 @@ snapshots: streamroller@3.1.5: dependencies: date-format: 4.0.14 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -49690,6 +50520,7 @@ snapshots: fast-fifo: 1.3.2 text-decoder: 1.2.3 transitivePeerDependencies: + - bare-abort-controller - react-native-b4a strict-event-emitter@0.4.6: {} @@ -49741,13 +50572,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 string.fromcodepoint@0.2.1: {} @@ -49849,9 +50685,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@2.0.0: dependencies: @@ -49867,6 +50703,8 @@ snapshots: strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-indent@1.0.1: dependencies: get-stdin: 4.0.1 @@ -49875,9 +50713,7 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 + strip-indent@4.1.1: {} strip-json-comments@2.0.1: {} @@ -49905,49 +50741,49 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + style-loader@1.3.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - style-loader@1.3.0(webpack@5.101.0): + style-loader@1.3.0(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - style-loader@2.0.0(webpack@5.101.0): + style-loader@2.0.0(webpack@5.102.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + style-loader@3.3.4(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - style-loader@3.3.4(webpack@5.101.0): + style-loader@3.3.4(webpack@5.102.1): dependencies: - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - style-loader@4.0.0(webpack@5.101.0): + style-loader@4.0.0(webpack@5.102.1): dependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - style-mod@4.1.2: {} + style-mod@4.1.3: {} - style-to-js@1.1.17: + style-to-js@1.1.19: dependencies: - style-to-object: 1.0.9 + style-to-object: 1.0.12 style-to-object@0.3.0: dependencies: inline-style-parser: 0.1.1 - style-to-object@1.0.9: + style-to-object@1.0.12: dependencies: - inline-style-parser: 0.2.4 + inline-style-parser: 0.2.6 style-value-types@5.0.0: dependencies: @@ -49956,35 +50792,35 @@ snapshots: stylehacks@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 postcss: 8.5.6 postcss-selector-parser: 6.1.2 - stylelint-config-recommended@16.0.0(stylelint@16.23.0(typescript@5.8.3)): + stylelint-config-recommended@16.0.0(stylelint@16.25.0(typescript@5.8.3)): dependencies: - stylelint: 16.23.0(typescript@5.8.3) + stylelint: 16.25.0(typescript@5.8.3) - stylelint-config-standard@38.0.0(stylelint@16.23.0(typescript@5.8.3)): + stylelint-config-standard@38.0.0(stylelint@16.25.0(typescript@5.8.3)): dependencies: - stylelint: 16.23.0(typescript@5.8.3) - stylelint-config-recommended: 16.0.0(stylelint@16.23.0(typescript@5.8.3)) + stylelint: 16.25.0(typescript@5.8.3) + stylelint-config-recommended: 16.0.0(stylelint@16.25.0(typescript@5.8.3)) - stylelint@16.23.0(typescript@5.8.3): + stylelint@16.25.0(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) - '@dual-bundle/import-meta-resolve': 4.1.0 + '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.8.3) css-functions-list: 3.2.3 css-tree: 3.1.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.3 + file-entry-cache: 10.1.4 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -50021,7 +50857,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -50071,10 +50907,10 @@ snapshots: svg-tags@1.0.0: {} - svg-url-loader@8.0.0(webpack@5.101.0): + svg-url-loader@8.0.0(webpack@5.102.1): dependencies: - file-loader: 6.2.0(webpack@5.101.0) - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + file-loader: 6.2.0(webpack@5.102.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: @@ -50083,7 +50919,7 @@ snapshots: lodash: 4.17.21 microbuffer: 1.0.0 svgpath: 2.6.0 - xmldom: '@xmldom/xmldom@0.8.10' + xmldom: '@xmldom/xmldom@0.8.11' svg2ttf@6.0.3: dependencies: @@ -50101,7 +50937,7 @@ snapshots: glob: 7.2.3 neatequal: 1.0.0 readable-stream: 3.6.2 - sax: 1.4.1 + sax: 1.4.2 svg-pathdata: 6.0.3 svgicons2svgfont@5.0.2: @@ -50109,7 +50945,7 @@ snapshots: commander: 2.20.3 neatequal: 1.0.0 readable-stream: 2.3.8 - sax: 1.4.1 + sax: 1.4.2 string.fromcodepoint: 0.2.1 string.prototype.codepointat: 0.2.1 svg-pathdata: 1.0.4 @@ -50136,12 +50972,12 @@ snapshots: svgpath@2.6.0: {} - sw-precache-webpack-plugin@0.11.4(webpack@5.101.0): + sw-precache-webpack-plugin@0.11.4(webpack@5.102.1): dependencies: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -50161,15 +50997,15 @@ snapshots: path-to-regexp: 1.9.0 serviceworker-cache-polyfill: 4.0.0 - swagger-client@3.35.6: + swagger-client@3.36.0: dependencies: - '@babel/runtime-corejs3': 7.28.2 + '@babel/runtime-corejs3': 7.28.4 '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.0.0-beta.45 - '@swagger-api/apidom-error': 1.0.0-beta.45 - '@swagger-api/apidom-json-pointer': 1.0.0-beta.45 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.45 - '@swagger-api/apidom-reference': 1.0.0-beta.45 + '@swagger-api/apidom-core': 1.0.0-rc.1 + '@swagger-api/apidom-error': 1.0.0-rc.1 + '@swagger-api/apidom-json-pointer': 1.0.0-rc.1 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.1 + '@swagger-api/apidom-reference': 1.0.0-rc.1 '@swaggerexpert/cookie': 2.0.2 deepmerge: 4.3.1 fast-json-patch: 3.1.1 @@ -50186,7 +51022,7 @@ snapshots: swagger-ui-react@5.21.0(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime-corejs3': 7.28.2 + '@babel/runtime-corejs3': 7.28.4 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -50209,14 +51045,14 @@ snapshots: react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-inspector: 6.0.2(react@18.2.0) react-redux: 9.2.0(@types/react@18.2.0)(react@18.2.0)(redux@5.0.1) - react-syntax-highlighter: 15.6.1(react@18.2.0) + react-syntax-highlighter: 15.6.6(react@18.2.0) redux: 5.0.1 redux-immutable: 4.0.0(immutable@3.8.2) remarkable: 2.0.1 reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.35.6 + swagger-client: 3.36.0 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 @@ -50225,15 +51061,16 @@ snapshots: - '@types/react' - debug - swagger-ui-react@5.27.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + swagger-ui-react@5.30.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime-corejs3': 7.28.2 + '@babel/runtime-corejs3': 7.28.4 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 + buffer: 6.0.3 classnames: 2.5.1 css.escape: 1.5.1 deep-extend: 0.6.0 - dompurify: 3.2.4 + dompurify: 3.2.6 ieee754: 1.2.1 immutable: 3.8.2 js-file-download: 0.4.12 @@ -50250,14 +51087,14 @@ snapshots: react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-inspector: 6.0.2(react@18.2.0) react-redux: 9.2.0(@types/react@18.2.0)(react@18.2.0)(redux@5.0.1) - react-syntax-highlighter: 15.6.1(react@18.2.0) + react-syntax-highlighter: 15.6.6(react@18.2.0) redux: 5.0.1 redux-immutable: 4.0.0(immutable@3.8.2) remarkable: 2.0.1 reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.35.6 + swagger-client: 3.36.0 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 @@ -50266,17 +51103,17 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.6(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + swc-loader@0.2.6(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - swc-loader@0.2.6(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0): + swc-loader@0.2.6(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1): dependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) symbol-tree@3.2.4: {} @@ -50296,7 +51133,7 @@ snapshots: tabbable@5.3.3: {} - tabbable@6.2.0: {} + tabbable@6.3.0: {} table@5.4.6: dependencies: @@ -50315,7 +51152,7 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + tailwindcss@3.4.18(yaml@2.8.1): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -50333,31 +51170,33 @@ snapshots: picocolors: 1.1.1 postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 - resolve: 1.22.10 + resolve: 1.22.11 sucrase: 3.35.0 transitivePeerDependencies: - - ts-node + - tsx + - yaml - tailwindcss@4.1.11: {} + tailwindcss@4.1.16: {} tapable@0.2.9: {} tapable@1.1.3: {} - tapable@2.2.2: {} + tapable@2.3.0: {} tar-fs@3.1.1: dependencies: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.4.4 + bare-fs: 4.5.0 bare-path: 3.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -50367,6 +51206,7 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.23.0 transitivePeerDependencies: + - bare-abort-controller - react-native-b4a tar@2.2.2: @@ -50388,6 +51228,7 @@ snapshots: dependencies: tar-fs: 3.1.1 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -50436,7 +51277,7 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@4.2.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + terser-webpack-plugin@4.2.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50445,11 +51286,11 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.43.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + terser: 5.44.0 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) webpack-sources: 1.4.3 - terser-webpack-plugin@4.2.3(webpack@5.101.0): + terser-webpack-plugin@4.2.3(webpack@5.102.1): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -50458,31 +51299,31 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.43.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + terser: 5.44.0 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + terser-webpack-plugin@5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + terser: 5.44.0 + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) - terser-webpack-plugin@5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0): + terser-webpack-plugin@5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1): dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.101.0(webpack-cli@5.1.4) + terser: 5.44.0 + webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) terser@4.8.1: dependencies: @@ -50490,9 +51331,9 @@ snapshots: source-map: 0.6.1 source-map-support: 0.5.21 - terser@5.43.1: + terser@5.44.0: dependencies: - '@jridgewell/source-map': 0.3.10 + '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -50529,7 +51370,7 @@ snapshots: textextensions@6.11.0: dependencies: - editions: 6.21.0 + editions: 6.22.0 thenify-all@1.6.0: dependencies: @@ -50539,7 +51380,7 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.8.1): + thingies@2.5.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -50583,9 +51424,9 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 tinyrainbow@1.2.0: {} @@ -50594,17 +51435,17 @@ snapshots: tinyspy@3.0.2: {} - tinyspy@4.0.3: {} + tinyspy@4.0.4: {} tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - tmp@0.2.4: {} + tmp@0.2.5: {} tmpl@1.0.5: {} - to-buffer@1.2.1: + to-buffer@1.2.2: dependencies: isarray: 2.0.5 safe-buffer: 5.2.1 @@ -50672,7 +51513,7 @@ snapshots: traverse@0.3.9: {} - tree-dump@1.0.3(tslib@2.8.1): + tree-dump@1.1.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -50768,17 +51609,17 @@ snapshots: typescript: 3.9.10 yargs-parser: 18.1.3 - ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.2 + semver: 7.7.3 type-fest: 4.41.0 typescript: 5.8.3 yargs-parser: 21.1.1 @@ -50795,15 +51636,15 @@ snapshots: loader-utils: 1.4.2 semver: 5.7.2 - ts-loader@9.5.2(typescript@5.8.3)(webpack@5.101.0): + ts-loader@9.5.4(typescript@5.8.3)(webpack@5.102.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 micromatch: 4.0.8 - semver: 7.7.2 + semver: 7.7.3 source-map: 0.7.6 typescript: 5.8.3 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) ts-mixer@6.0.4: {} @@ -50817,7 +51658,7 @@ snapshots: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 - ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.18)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -50835,9 +51676,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.14.0(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -50855,7 +51696,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) + '@swc/core': 1.14.0(@swc/helpers@0.5.17) optional: true ts-pnp@1.2.0(typescript@4.9.5): @@ -50890,10 +51731,10 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-module-imports': 7.27.1 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.5 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.5 '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.7)(@types/babel__core@7.20.5)(rollup@1.32.1) '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) '@rollup/plugin-json': 4.1.0(rollup@1.32.1) @@ -50938,7 +51779,7 @@ snapshots: rollup-plugin-terser: 5.3.1(rollup@1.32.1) rollup-plugin-typescript2: 0.27.3(rollup@1.32.1)(typescript@3.9.10) sade: 1.8.1 - semver: 7.7.2 + semver: 7.7.3 shelljs: 0.8.5 tiny-glob: 0.2.9 ts-jest: 25.5.1(jest@25.5.4)(typescript@3.9.10) @@ -51022,7 +51863,7 @@ snapshots: js-yaml: 3.14.1 minimatch: 3.1.2 mkdirp: 0.5.6 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 tslib: 1.14.1 tsutils: 2.29.0(typescript@4.9.5) @@ -51039,7 +51880,7 @@ snapshots: js-yaml: 3.14.1 minimatch: 3.1.2 mkdirp: 0.5.6 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 tslib: 1.14.1 tsutils: 2.29.0(typescript@5.8.3) @@ -51208,7 +52049,7 @@ snapshots: typescript@5.8.3: {} - ua-parser-js@1.0.40: {} + ua-parser-js@1.0.41: {} uc.micro@1.0.6: {} @@ -51228,7 +52069,7 @@ snapshots: commander: 2.19.0 source-map: 0.6.1 - uglifyjs-webpack-plugin@1.2.5(webpack@5.101.0): + uglifyjs-webpack-plugin@1.2.5(webpack@5.102.1): dependencies: cacache: 10.0.4 find-cache-dir: 1.0.0 @@ -51236,7 +52077,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -51253,7 +52094,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.13.0: {} + undici@7.16.0: {} unfetch@4.2.0: {} @@ -51267,11 +52108,11 @@ snapshots: unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 + unicode-property-aliases-ecmascript: 2.2.0 - unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-property-aliases-ecmascript@2.2.0: {} unicorn-magic@0.1.0: {} @@ -51358,7 +52199,7 @@ snapshots: dependencies: '@types/unist': 2.0.11 - unist-util-is@6.0.0: + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -51402,10 +52243,10 @@ snapshots: '@types/unist': 2.0.11 unist-util-is: 5.2.1 - unist-util-visit-parents@6.0.1: + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 unist-util-visit@2.0.3: dependencies: @@ -51422,8 +52263,8 @@ snapshots: unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 unit-compare@1.0.1: dependencies: @@ -51470,15 +52311,15 @@ snapshots: dependencies: bluebird: 3.7.2 duplexer2: 0.1.4 - fs-extra: 11.3.1 + fs-extra: 11.3.2 graceful-fs: 4.2.11 node-int64: 0.4.0 upath@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.1.4(browserslist@4.27.0): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -51515,30 +52356,30 @@ snapshots: url-join@4.0.1: {} - url-loader@0.6.2(file-loader@1.1.5(webpack@5.101.0)): + url-loader@0.6.2(file-loader@1.1.5(webpack@5.102.1)): dependencies: - file-loader: 1.1.5(webpack@5.101.0) + file-loader: 1.1.5(webpack@5.102.1) loader-utils: 1.4.2 mime: 1.6.0 schema-utils: 0.3.0 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optionalDependencies: - file-loader: 6.2.0(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + file-loader: 6.2.0(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) - url-loader@4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) optionalDependencies: - file-loader: 6.2.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.102.1) url-parse-lax@1.0.0: dependencies: @@ -51630,11 +52471,11 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - use-sync-external-store@1.5.0(react@18.2.0): + use-sync-external-store@1.6.0(react@18.2.0): dependencies: react: 18.2.0 - use-sync-external-store@1.5.0(react@19.1.0): + use-sync-external-store@1.6.0(react@19.1.0): dependencies: react: 19.1.0 @@ -51655,7 +52496,7 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.2.0 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-typed-array: 1.1.15 which-typed-array: 1.1.19 @@ -51692,7 +52533,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -51715,7 +52556,7 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - version-range@4.14.0: {} + version-range@4.15.0: {} vfile-location@3.2.0: {} @@ -51755,13 +52596,14 @@ snapshots: parse-semver: 1.1.1 read: 1.0.7 semver: 5.7.2 - tmp: 0.2.4 + tmp: 0.2.5 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.4.23 yauzl: 2.10.0 yazl: 2.5.1 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - react-native-b4a @@ -51780,59 +52622,61 @@ snapshots: dependencies: applicationinsights: 1.7.4 - vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.34.0)(typescript@5.8.3))(selenium-webdriver@4.34.0): + vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0): dependencies: - monaco-page-objects: 3.14.1(selenium-webdriver@4.34.0)(typescript@5.8.3) - selenium-webdriver: 4.34.0 + monaco-page-objects: 3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3) + selenium-webdriver: 4.38.0 vscode-extension-tester@5.10.0(mocha@10.8.2)(typescript@5.8.3): dependencies: - '@types/selenium-webdriver': 4.1.28 + '@types/selenium-webdriver': 4.35.3 '@vscode/vsce': 2.32.0 commander: 11.1.0 compare-versions: 6.1.1 - fs-extra: 11.3.1 + fs-extra: 11.3.2 glob: 10.4.5 got: 13.0.0 hpagent: 1.2.0 js-yaml: 4.1.0 mocha: 10.8.2 - monaco-page-objects: 3.14.1(selenium-webdriver@4.34.0)(typescript@5.8.3) + monaco-page-objects: 3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3) sanitize-filename: 1.6.3 - selenium-webdriver: 4.34.0 + selenium-webdriver: 4.38.0 targz: 1.0.1 typescript: 5.8.3 unzipper: 0.10.14 - vscode-extension-tester-locators: 3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.34.0)(typescript@5.8.3))(selenium-webdriver@4.34.0) + vscode-extension-tester-locators: 3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0) transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil - react-native-b4a - supports-color - utf-8-validate - vscode-extension-tester@8.14.1(mocha@11.7.1)(typescript@5.8.3): + vscode-extension-tester@8.14.1(mocha@11.7.4)(typescript@5.8.3): dependencies: - '@redhat-developer/locators': 1.15.0(@redhat-developer/page-objects@1.15.0(selenium-webdriver@4.34.0)(typescript@5.8.3))(selenium-webdriver@4.34.0) - '@redhat-developer/page-objects': 1.15.0(selenium-webdriver@4.34.0)(typescript@5.8.3) - '@types/selenium-webdriver': 4.1.28 + '@redhat-developer/locators': 1.17.0(@redhat-developer/page-objects@1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0) + '@redhat-developer/page-objects': 1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3) + '@types/selenium-webdriver': 4.35.3 '@vscode/vsce': 3.4.2 c8: 10.1.3 commander: 13.1.0 compare-versions: 6.1.1 find-up: 7.0.0 - fs-extra: 11.3.1 + fs-extra: 11.3.2 glob: 11.0.3 got: 14.4.7 hpagent: 1.2.0 js-yaml: 4.1.0 - mocha: 11.7.1 + mocha: 11.7.4 sanitize-filename: 1.6.3 - selenium-webdriver: 4.34.0 + selenium-webdriver: 4.38.0 targz: 1.0.1 typescript: 5.8.3 unzipper: 0.12.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil - monocart-coverage-reports @@ -51851,19 +52695,19 @@ snapshots: vscode-languageclient@7.0.0: dependencies: minimatch: 3.1.2 - semver: 7.7.2 + semver: 7.7.3 vscode-languageserver-protocol: 3.16.0 vscode-languageclient@8.1.0: dependencies: minimatch: 5.1.6 - semver: 7.7.2 + semver: 7.7.3 vscode-languageserver-protocol: 3.17.3 vscode-languageclient@9.0.1: dependencies: minimatch: 5.1.6 - semver: 7.7.2 + semver: 7.7.3 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-protocol@3.16.0: @@ -51920,7 +52764,7 @@ snapshots: vscode-uri@3.1.0: {} - vscode-ws-jsonrpc@3.4.0: + vscode-ws-jsonrpc@3.5.0: dependencies: vscode-jsonrpc: 8.2.1 @@ -51991,10 +52835,10 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0): + webpack-cli@4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.101.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.102.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.2) colorette: 2.0.20 @@ -52004,15 +52848,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.102.1) - webpack-cli@4.10.0(webpack@5.101.0): + webpack-cli@4.10.0(webpack@5.102.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.101.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.102.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0) colorette: 2.0.20 @@ -52022,100 +52866,100 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0): + webpack-cli@5.1.4(webpack-dev-server@5.2.2)(webpack@5.102.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.101.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.102.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.102.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.102.1) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 - envinfo: 7.14.0 + envinfo: 7.20.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.102.1) - webpack-cli@5.1.4(webpack@5.101.0): + webpack-cli@5.1.4(webpack@5.102.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.101.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.102.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.102.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.102.1) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 - envinfo: 7.14.0 + envinfo: 7.20.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0): + webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.102.1) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.102.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.102.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 - envinfo: 7.14.0 + envinfo: 7.20.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1) - webpack-cli@6.0.1(webpack@5.101.0): + webpack-cli@6.0.1(webpack@5.102.1): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.102.1) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.102.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.102.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 - envinfo: 7.14.0 + envinfo: 7.20.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.101.0(webpack-cli@6.0.1) + webpack: 5.102.1(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + webpack-dev-middleware@3.7.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) webpack-log: 2.0.0 - webpack-dev-middleware@3.7.3(webpack@5.101.0): + webpack-dev-middleware@3.7.3(webpack@5.102.1): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-log: 2.0.0 - webpack-dev-middleware@4.3.0(webpack@5.101.0): + webpack-dev-middleware@4.3.0(webpack@5.102.1): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -52123,59 +52967,59 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + webpack-dev-middleware@6.1.3(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - webpack-dev-middleware@6.1.3(webpack@5.101.0): + webpack-dev-middleware@6.1.3(webpack@5.102.1): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + webpack-dev-middleware@7.4.5(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: colorette: 2.0.20 - memfs: 4.36.0 - mime-types: 2.1.35 + memfs: 4.50.0 + mime-types: 3.0.1 on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) optional: true - webpack-dev-middleware@7.4.2(webpack@5.101.0): + webpack-dev-middleware@7.4.5(webpack@5.102.1): dependencies: colorette: 2.0.20 - memfs: 4.36.0 - mime-types: 2.1.35 + memfs: 4.50.0 + mime-types: 3.0.1 on-finished: 2.4.1 range-parser: 1.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 optionalDependencies: - webpack: 5.101.0(webpack-cli@5.1.4) + webpack: 5.102.1(webpack-cli@5.1.4) - webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.101.0): + webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.102.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -52186,35 +53030,36 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 - launch-editor: 2.11.0 + launch-editor: 2.12.0 open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.0) + webpack-dev-middleware: 7.4.5(webpack@5.102.1) ws: 8.18.3 optionalDependencies: - webpack: 5.101.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate + optional: true - webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.0): + webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.102.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -52225,35 +53070,35 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 - launch-editor: 2.11.0 + launch-editor: 2.12.0 open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.0) + webpack-dev-middleware: 7.4.5(webpack@5.102.1) ws: 8.18.3 optionalDependencies: - webpack: 5.101.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack: 5.102.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.102.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.101.0): + webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.102.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -52264,35 +53109,35 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 - launch-editor: 2.11.0 + launch-editor: 2.12.0 open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.0) + webpack-dev-middleware: 7.4.5(webpack@5.102.1) ws: 8.18.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + webpack-dev-server@5.2.2(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -52303,20 +53148,20 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 - launch-editor: 2.11.0 + launch-editor: 2.12.0 open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + webpack-dev-middleware: 7.4.5(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) ws: 8.18.3 optionalDependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) transitivePeerDependencies: - bufferutil - debug @@ -52324,14 +53169,14 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.2(webpack@5.101.0): + webpack-dev-server@5.2.2(webpack@5.102.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -52342,33 +53187,33 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 - launch-editor: 2.11.0 + launch-editor: 2.12.0 open: 10.2.0 p-retry: 6.2.1 - schema-utils: 4.3.2 + schema-utils: 4.3.3 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.0) + webpack-dev-middleware: 7.4.5(webpack@5.102.1) ws: 8.18.3 optionalDependencies: - webpack: 5.101.0(webpack-cli@4.10.0) + webpack: 5.102.1(webpack-cli@4.10.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))): + webpack-filter-warnings-plugin@1.2.1(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))): dependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)) - webpack-filter-warnings-plugin@1.2.1(webpack@5.101.0): + webpack-filter-warnings-plugin@1.2.1(webpack@5.102.1): dependencies: - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -52381,18 +53226,18 @@ snapshots: ansi-colors: 3.2.4 uuid: 3.4.0 - webpack-manifest-plugin@1.3.2(webpack@5.101.0): + webpack-manifest-plugin@1.3.2(webpack@5.102.1): dependencies: fs-extra: 0.30.0 lodash: 4.17.21 - webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-merge-and-include-globally@2.3.4(webpack@5.101.0): + webpack-merge-and-include-globally@2.3.4(webpack@5.102.1): dependencies: es6-promisify: 6.1.1 glob: 7.2.3 rev-hash: 3.0.0 - webpack: 5.101.0(webpack-cli@6.0.1) + webpack: 5.102.1(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -52427,7 +53272,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)): + webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52437,7 +53282,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -52446,12 +53291,12 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -52459,7 +53304,7 @@ snapshots: - esbuild - uglify-js - webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@5.1.4): + webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52469,7 +53314,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -52478,22 +53323,22 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack-cli: 5.1.4(webpack@5.102.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1): + webpack@5.102.1(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52503,7 +53348,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -52512,22 +53357,22 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.101.0(webpack-cli@4.10.0): + webpack@5.102.1(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52537,7 +53382,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -52546,22 +53391,22 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.102.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.101.0(webpack-cli@5.1.4): + webpack@5.102.1(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52571,7 +53416,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -52580,22 +53425,22 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.101.0) + webpack-cli: 5.1.4(webpack@5.102.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.101.0(webpack-cli@6.0.1): + webpack@5.102.1(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -52605,7 +53450,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -52614,16 +53459,16 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(@swc/core@1.14.0(@swc/helpers@0.5.17))(webpack@5.102.1) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.101.0) + webpack-cli: 6.0.1(webpack@5.102.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -52702,7 +53547,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -52766,7 +53611,7 @@ snapshots: winston@3.11.0: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + '@dabh/diagnostics': 2.0.8 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -52791,7 +53636,7 @@ snapshots: workerpool@6.5.1: {} - workerpool@9.3.3: {} + workerpool@9.3.4: {} wrap-ansi@2.1.0: dependencies: @@ -52817,15 +53662,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 - wrap-ansi@9.0.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -52884,7 +53729,7 @@ snapshots: xml-js@1.6.11: dependencies: - sax: 1.4.1 + sax: 1.4.2 xml-name-validator@2.0.1: {} @@ -52894,17 +53739,17 @@ snapshots: xml2js@0.4.23: dependencies: - sax: 1.4.1 + sax: 1.4.2 xmlbuilder: 11.0.1 xml2js@0.5.0: dependencies: - sax: 1.4.1 + sax: 1.4.2 xmlbuilder: 11.0.1 xml2js@0.6.2: dependencies: - sax: 1.4.1 + sax: 1.4.2 xmlbuilder: 11.0.1 xml@1.0.1: {} @@ -53049,6 +53894,8 @@ snapshots: yocto-queue@1.2.1: {} + yoctocolors@2.1.2: {} + yup@1.4.0: dependencies: property-expr: 2.0.6 @@ -53073,17 +53920,17 @@ snapshots: zod@4.1.11: {} - zustand@5.0.7(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.5.0(react@18.2.0)): + zustand@5.0.8(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)): optionalDependencies: '@types/react': 18.2.0 react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) + use-sync-external-store: 1.6.0(react@18.2.0) - zustand@5.0.7(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): + zustand@5.0.8(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): optionalDependencies: '@types/react': 18.2.0 react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) zwitch@1.0.5: {} diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 7c9882cc01a..6272a281089 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -966,21 +966,21 @@ "description": "design-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f199" + "fontCharacter": "\\f19a" } }, "distro-start": { "description": "start", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f20f" + "fontCharacter": "\\f210" } }, "distro-debug": { "description": "debug", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f194" + "fontCharacter": "\\f195" } }, "distro-source-view": { @@ -994,7 +994,7 @@ "description": "persist-diagram", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f1ea" + "fontCharacter": "\\f1eb" } }, "distro-cached-rounded": { diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index 8d94ec3fba4..03f7fc8fe6c 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -81,6 +81,7 @@ "webpack": "^5.99.8", "@types/react-lottie": "^1.2.5", "@types/lodash.debounce": "^4.0.6", + "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.2.1" }, "author": "wso2", diff --git a/workspaces/choreo/choreo-extension/package.json b/workspaces/choreo/choreo-extension/package.json index 60109d9edf8..93809206609 100644 --- a/workspaces/choreo/choreo-extension/package.json +++ b/workspaces/choreo/choreo-extension/package.json @@ -158,7 +158,7 @@ "description": "choreo-2", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f17f" + "fontCharacter": "\\f180" } } } diff --git a/workspaces/mcp-inspector/mcp-inspector-extension/package.json b/workspaces/mcp-inspector/mcp-inspector-extension/package.json index 2e7ea66d54e..843f6bcb4e4 100644 --- a/workspaces/mcp-inspector/mcp-inspector-extension/package.json +++ b/workspaces/mcp-inspector/mcp-inspector-extension/package.json @@ -82,7 +82,7 @@ "copy-webpack-plugin": "^13.0.0", "ts-loader": "^9.5.2", "webpack": "^5.99.8", - "webpack-cli": "^6.0.1" + "webpack-cli": "^5.1.4" }, "dependencies": { "@modelcontextprotocol/inspector": "^0.17.2" diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index 741a3a18504..c211615f305 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -932,14 +932,14 @@ "description": "design-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f199" + "fontCharacter": "\\f19a" } }, "distro-build-package": { "description": "build-package", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f174" + "fontCharacter": "\\f175" } } } From 36a74fd58afbe105498bf248386db6282aeff2ae Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 4 Nov 2025 08:03:49 +0530 Subject: [PATCH 654/730] Update to get expression diagnostics only for non-empty values in fields on initial render --- .../src/components/editors/ExpressionEditor.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx index a4206965e99..3528b40e056 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx @@ -387,8 +387,9 @@ export const ExpressionEditor = (props: ExpressionEditorProps) => { fetchedInitialDiagnostics: true, diagnosticsFetchedTargetLineRange: targetLineRange }; + // Only validate on initial render if the field has a non-empty value getExpressionEditorDiagnostics( - (required ?? !field.optional) || fieldValue !== '', + fieldValue !== '', fieldValue, key, getPropertyFromFormField(field) From 3381b13c030aea8f0e3509ff615240209c472730 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 4 Nov 2025 08:24:18 +0530 Subject: [PATCH 655/730] Set chunker as advanced property in knowledge base form --- .../BI/Forms/KnowledgeBaseForm/index.tsx | 30 ++----------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/KnowledgeBaseForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/KnowledgeBaseForm/index.tsx index 310b3dbc999..81bb50466c5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/KnowledgeBaseForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/KnowledgeBaseForm/index.tsx @@ -114,14 +114,6 @@ export function KnowledgeBaseForm(props: KnowledgeBaseFormProps) { const [knowledgeBaseFormValues, setKnowledgeBaseFormValues] = useState({}); const [saving, setSaving] = useState(false); - const CONNECTIONS_FILE = "connections.bal"; - const projectPath = useRef(""); - const targetLineRangeRef = useRef({ - startLine: { line: 0, offset: 0 }, - endLine: { line: 0, offset: 0 } - }); - const connectionsFilePath = useRef(""); - useEffect(() => { initializeForm(); handleFormOpen(); @@ -179,27 +171,11 @@ export function KnowledgeBaseForm(props: KnowledgeBaseFormProps) { if (originalName === "chunker") { // hack: set default value for chunker field field.defaultValue = DEFAULT_CHUNKER_VALUE; - field.value ??= field.defaultValue; + field.advanced = true; } }); setKnowledgeBaseFields(fields); setFormImports(getImportsForFormFields(fields)); - - projectPath.current = await rpcClient.getVisualizerLocation().then((location) => location.projectUri); - connectionsFilePath.current = Utils.joinPath(URI.file(projectPath.current), CONNECTIONS_FILE).fsPath; - const endPosition = await rpcClient.getBIDiagramRpcClient().getEndOfFile({ - filePath: connectionsFilePath.current - }); - targetLineRangeRef.current = { - startLine: { - line: endPosition.line, - offset: endPosition.offset - }, - endLine: { - line: endPosition.line, - offset: endPosition.offset - } - } }; const updateNodePropertyValue = (fieldKey: string, value: any): void => { @@ -236,8 +212,8 @@ export function KnowledgeBaseForm(props: KnowledgeBaseFormProps) { Date: Tue, 4 Nov 2025 10:42:11 +0530 Subject: [PATCH 656/730] implement selection replace for new expression editor --- .../ChipExpressionBaseComponent.tsx | 43 +++-- .../components/TextElement.tsx | 35 ++-- .../ChipExpressionEditor/types.ts | 9 +- .../ChipExpressionEditor/utils.ts | 150 +++++++++++++++--- 4 files changed, 185 insertions(+), 52 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/ChipExpressionBaseComponent.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/ChipExpressionBaseComponent.tsx index 8da55c98475..6f7d464258f 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/ChipExpressionBaseComponent.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/ChipExpressionBaseComponent.tsx @@ -165,6 +165,13 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr ) => { const updatedValue = getTextValueFromExpressionModel(updatedModel); + if (lastTypedText === FOCUS_MARKER) { + setExpressionModel(updatedModel); + setChipClicked(null); + setIsHelperPaneOpen(true); + return; + } + // Calculate cursor movement const cursorPositionBeforeUpdate = getAbsoluteCaretPositionFromModel(expressionModel); const cursorPositionAfterUpdate = getAbsoluteCaretPositionFromModel(updatedModel); @@ -184,11 +191,6 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr const wordBeforeCursor = getWordBeforeCursor(updatedModel); const valueBeforeCursor = updatedValue.substring(0, cursorPositionAfterUpdate); - // Handle chip click reset on focus - if (lastTypedText === FOCUS_MARKER) { - setChipClicked(null); - } - // Handle helper pane and completions visibility handleHelperPaneVisibility(updatedValue, valueBeforeCursor, wordBeforeCursor); @@ -245,17 +247,12 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr const isNavigationKey = (lastTypedText?: string): boolean => { return lastTypedText === ARROW_LEFT_MARKER - || lastTypedText === ARROW_RIGHT_MARKER - || lastTypedText === FOCUS_MARKER; + || lastTypedText === ARROW_RIGHT_MARKER; }; const handleNavigationKey = (cursorPosition: number, lastTypedText?: string) => { pendingCursorPositionUpdateRef.current = cursorPosition; fetchInitialTokens(props.value); - - if (lastTypedText === FOCUS_MARKER) { - setIsHelperPaneOpen(true); - } }; const shouldFetchNewTokens = (lastTypedText?: string): boolean => { @@ -315,7 +312,7 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr let absoluteCaretPosition = 0; for (let i = 0; i < expressionModel?.length; i++) { if (expressionModel && expressionModel[i].isFocused) { - absoluteCaretPosition += expressionModel[i]?.focusOffset || 0; + absoluteCaretPosition += expressionModel[i]?.focusOffsetStart || 0; break; } absoluteCaretPosition += expressionModel ? expressionModel[i].value.length : 0; @@ -338,10 +335,22 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr } } else { + const selectedElement = expressionModel.find(el => el.isFocused); + let shouldReplaceEntireValue = false; + if (!selectedElement) return; + if (selectedElement.focusOffsetStart !== selectedElement.focusOffsetEnd) { + // If there's a selection, replace the selected text + const newValue = selectedElement.value.substring(0, selectedElement.focusOffsetStart) + + value + + selectedElement.value.substring(selectedElement.focusOffsetEnd); + value = newValue; + shouldReplaceEntireValue = true; + + } const absoluteCaretPosition = getAbsoluteCaretPositionFromModel(expressionModel); - const updatedExpressionModelInfo = updateExpressionModelWithHelperValue(expressionModel, absoluteCaretPosition, value); + const updatedExpressionModelInfo = updateExpressionModelWithHelperValue(expressionModel, absoluteCaretPosition, value, shouldReplaceEntireValue); if (updatedExpressionModelInfo) { - const { updatedModel, updatedValue, newCursorPosition } = updatedExpressionModelInfo; + const { updatedModel, newCursorPosition } = updatedExpressionModelInfo; const textValue = getTextValueFromExpressionModel(updatedModel || []); const updatedTokens = await fetchUpdatedFilteredTokens(textValue); @@ -414,7 +423,7 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr if (chipId && expressionModel) { const updatedExpressionModel = expressionModel.map(model => { if (model.id === chipId) { - return { ...model, isFocused: true, focusOffset: Math.max(model.length - 1, 0) }; + return { ...model, isFocused: true, focusOffsetStart: Math.max(model.length - 1, 0) }; } return { ...model, isFocused: false }; }); @@ -430,9 +439,9 @@ export const ChipExpressionBaseComponent = (props: ChipExpressionBaseComponentPr if (chipId && expressionModel) { const updatedExpressionModel = expressionModel.map(model => { if (model.id === chipId) { - return { ...model, isFocused: true, focusOffset: 0 }; + return { ...model, isFocused: true, focusOffsetStart: 0, focusOffsetEnd: 0 }; } - return { ...model, isFocused: false, focusOffset: undefined }; + return { ...model, isFocused: false, focusOffsetStart: undefined, focusOffsetEnd: undefined }; }); setExpressionModel(updatedExpressionModel); } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/components/TextElement.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/components/TextElement.tsx index a24a75625eb..e65e2fe42d5 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/components/TextElement.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/MultiModeExpressionEditor/ChipExpressionEditor/components/TextElement.tsx @@ -17,7 +17,7 @@ */ import React, { useEffect, useLayoutEffect, useRef } from "react"; -import { getCaretOffsetWithin, getAbsoluteCaretPosition, setCaretPosition, handleKeyDownInTextElement, getAbsoluteCaretPositionFromModel, hasTextSelection } from "../utils"; +import { getCaretOffsetWithin, getAbsoluteCaretPosition, setCaretPosition, handleKeyDownInTextElement, getAbsoluteCaretPositionFromModel, hasTextSelection, getSelectionOffsets, setSelectionRange } from "../utils"; import { ExpressionModel } from "../types"; import { InvisibleSpan } from "../styles"; import { FOCUS_MARKER } from "../constants"; @@ -62,11 +62,14 @@ export const TextElement = (props: { const updateFocusOffset = (host: HTMLSpanElement) => { if (!onExpressionChange) return; - const offset = getCaretOffsetWithin(host); + + // Get selection offsets (handles both caret position and selection range) + const { start, end } = getSelectionOffsets(host); + const updatedModel = props.expressionModel.map((el, i) => i === props.index - ? { ...el, isFocused: true, focusOffset: offset } - : { ...el, isFocused: false, focusOffset: undefined } + ? { ...el, isFocused: true, focusOffsetStart: start, focusOffsetEnd: end } + : { ...el, isFocused: false, focusOffsetStart: undefined, focusOffsetEnd: undefined } ); const newCursorPosition = getAbsoluteCaretPosition(updatedModel); onExpressionChange(updatedModel, newCursorPosition, FOCUS_MARKER); @@ -94,7 +97,7 @@ export const TextElement = (props: { const cursorDelta = rawNewValue.length - oldValue.length; - const currentFocusOffset = props.element.focusOffset ?? oldValue.length; + const currentFocusOffset = props.element.focusOffsetStart ?? oldValue.length; let pendingOffset: number | null = null; if (host) { @@ -127,7 +130,8 @@ export const TextElement = (props: { value: newValue, length: newValue.length, isFocused: true, - focusOffset: newFocusOffset + focusOffsetStart: newFocusOffset, + focusOffsetEnd: newFocusOffset }; const enteredText = newValue.substring( currentFocusOffset, @@ -151,25 +155,32 @@ export const TextElement = (props: { if (!onExpressionChange || !props.expressionModel) return; const updatedModel = props.expressionModel.map((element, index) => { if (index === props.index) { - return { ...element, isFocused: true, focusOffset: getCaretOffsetWithin(e.currentTarget) }; + return { ...element, isFocused: true, focusOffsetStart: getCaretOffsetWithin(e.currentTarget), focusOffsetEnd: getCaretOffsetWithin(e.currentTarget) }; } else { - return { ...element, isFocused: false, focusOffset: undefined }; + return { ...element, isFocused: false, focusOffsetStart: undefined, focusOffsetEnd: undefined }; } }) const newCursorPosition = getAbsoluteCaretPosition(updatedModel); onExpressionChange(updatedModel, newCursorPosition, FOCUS_MARKER); } - // If this element is marked as focused, focus it and set the caret to focusOffset + // If this element is marked as focused, focus it and set the caret/selection to focusOffset useEffect(() => { if (props.element.isFocused && spanRef.current) { const host = spanRef.current; isProgrammaticFocusRef.current = true; host.focus(); - const offset = props.element.focusOffset ?? (host.textContent?.length || 0); - setCaretPosition(host, offset); + + const startOffset = props.element.focusOffsetStart ?? (host.textContent?.length || 0); + const endOffset = props.element.focusOffsetEnd ?? startOffset; + + if (startOffset !== endOffset) { + setSelectionRange(host, startOffset, endOffset); + } else { + setCaretPosition(host, startOffset); + } } - }, [props.element.isFocused, props.element.focusOffset]); + }, [props.element.isFocused, props.element.focusOffsetStart, props.element.focusOffsetEnd]); return ( 0 && expressionModel[0].isToken) { expressionModel.unshift({ - id: String(idCounter++), + id: '0', value: '', isToken: false, startColumn: 0, @@ -289,7 +289,7 @@ export const createExpressionModelFromTokens = ( const endColumnBase = getAbsoluteColumnOffset(value, endLine, 0); const endColumn = (typeof endColumnBase === 'number') ? (value.length - endColumnBase) : 0; expressionModel.push({ - id: String(idCounter++), + id: '0', value: '', isToken: false, startColumn: endColumn, @@ -299,6 +299,11 @@ export const createExpressionModelFromTokens = ( }); } + // Renumber all ids to match their final positions (1-indexed) + expressionModel.forEach((el, index) => { + el.id = String(index + 1); + }); + return expressionModel; }; @@ -340,6 +345,55 @@ export const hasTextSelection = (el: HTMLElement): boolean => { return !range.collapsed; }; +export const getSelectionOffsets = (el: HTMLElement): { start: number; end: number } => { + const selection = window.getSelection(); + if (!selection || selection.rangeCount === 0) { + const offset = getCaretOffsetWithin(el); + return { start: offset, end: offset }; + } + + const range = selection.getRangeAt(0); + + if (!el.contains(range.startContainer) || !el.contains(range.endContainer)) { + const elId = el.id ? `id: ${el.id}` : `tag: ${el.tagName}`; + throw new Error(`Selection is not within the specified element (${elId})`); + } + if (range.collapsed) { + const offset = getCaretOffsetWithin(el); + return { start: offset, end: offset }; + } + + let startOffset = 0; + let endOffset = 0; + + const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null); + let current: Node | null = walker.nextNode(); + + while (current) { + const textLength = (current.textContent || '').length; + + // Calculate start offset + if (current === range.startContainer) { + startOffset += range.startOffset; + } else if (current.compareDocumentPosition(range.startContainer) & Node.DOCUMENT_POSITION_FOLLOWING) { + // startContainer comes after current node + startOffset += textLength; + } + + // Calculate end offset + if (current === range.endContainer) { + endOffset += range.endOffset; + break; + } else { + endOffset += textLength; + } + + current = walker.nextNode(); + } + + return { start: startOffset, end: endOffset }; +}; + export const getAbsoluteCaretPosition = (model: ExpressionModel[] | undefined): number => { if (!model || model.length === 0) return 0; const active = document.activeElement as HTMLElement | null; @@ -366,7 +420,7 @@ export const getAbsoluteCaretPositionFromModel = (expressionModel: ExpressionMod for (const element of expressionModel) { if (element.isFocused) { - absolutePosition += element.focusOffset ?? 0; + absolutePosition += element.focusOffsetStart ?? 0; break; } absolutePosition += element.length; @@ -507,7 +561,8 @@ export const updateExpressionModelWithHelperValue = ( length: 0, type: 'literal', isFocused: false, - focusOffset: 0 + focusOffsetStart: 0, + focusOffsetEnd: 0 }] } else { @@ -602,7 +657,7 @@ export const setFocusInExpressionModel = ( const boundedOffset = Math.max(0, Math.min(exprModel[editableIndex].length, mapped.offset)); return exprModel.map((m, i) => ( i === editableIndex - ? { ...m, isFocused: true, focusOffset: boundedOffset } + ? { ...m, isFocused: true, focusOffsetStart: boundedOffset, focusOffsetEnd: boundedOffset } : { ...m, isFocused: false } )); } @@ -653,6 +708,58 @@ export const setCaretPosition = (el: HTMLElement, position: number) => { } }; +export const setSelectionRange = (el: HTMLElement, start: number, end: number) => { + if (!el.firstChild) { + el.appendChild(document.createTextNode("")); + } + + // Helper function to find text node and position + const findPosition = (position: number) => { + let remaining = Math.max(0, position); + const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null); + let textNode: Text | null = null; + let posInNode = 0; + let node = walker.nextNode() as Text | null; + + while (node) { + const len = node.textContent ? node.textContent.length : 0; + if (remaining <= len) { + textNode = node; + posInNode = remaining; + break; + } + remaining -= len; + node = walker.nextNode() as Text | null; + } + + if (!textNode) { + const last = el.lastChild; + if (last && last.nodeType === Node.TEXT_NODE) { + textNode = last as Text; + posInNode = (textNode.textContent || "").length; + } else { + textNode = el.firstChild as Text; + posInNode = 0; + } + } + + return { textNode, posInNode }; + }; + + const startPos = findPosition(start); + const endPos = findPosition(end); + + const range = document.createRange(); + range.setStart(startPos.textNode, Math.max(0, Math.min(startPos.posInNode, (startPos.textNode.textContent || "").length))); + range.setEnd(endPos.textNode, Math.max(0, Math.min(endPos.posInNode, (endPos.textNode.textContent || "").length))); + + const sel = window.getSelection(); + if (sel) { + sel.removeAllRanges(); + sel.addRange(range); + } +}; + export const handleKeyDownInTextElement = ( e: React.KeyboardEvent, expressionModel: ExpressionModel[], @@ -746,7 +853,7 @@ const mergeWithPreviousElement = ( const newExpressionModel = expressionModel .map((el, idx) => { if (idx === previousIndex) { - return { ...el, isFocused: true, focusOffset: el.length }; + return { ...el, isFocused: true, focusOffsetStart: el.length }; } return el; }) @@ -819,7 +926,7 @@ const deleteFirstCharFromNextElement = ( const newExpressionModel = expressionModel .map((el, idx) => { if (idx === currentIndex) { - return { ...el, isFocused: true, focusOffset: el.length }; + return { ...el, isFocused: true, focusOffsetStart: el.length }; } else if (idx === nextIndex && !shouldRemoveNext) { return { ...el, value: updatedNextValue, length: updatedNextValue.length }; } @@ -863,9 +970,9 @@ const moveToNextElement = ( if (!expressionModel[i].isToken) { const newExpressionModel = expressionModel.map((el, idx) => { if (idx === i) { - return { ...el, isFocused: true, focusOffset: 0 }; + return { ...el, isFocused: true, focusOffsetStart: 0 }; } else if (idx === index) { - return { ...el, isFocused: false, focusOffset: undefined }; + return { ...el, isFocused: false, focusOffsetStart: undefined }; } return el; }); @@ -885,7 +992,7 @@ const moveCaretForward = ( ) => { const newExpressionModel = expressionModel.map((el, idx) => { if (idx === index) { - return { ...el, isFocused: true, focusOffset: Math.max(0, caretOffset + 1) }; + return { ...el, isFocused: true, focusOffsetStart: Math.max(0, caretOffset + 1) }; } return el; }); @@ -923,9 +1030,9 @@ const moveToPreviousElement = ( if (!expressionModel[i].isToken) { const newExpressionModel = expressionModel.map((el, idx) => { if (idx === i) { - return { ...el, isFocused: true, focusOffset: el.length }; + return { ...el, isFocused: true, focusOffsetStart: el.length }; } else if (idx === index) { - return { ...el, isFocused: false, focusOffset: undefined }; + return { ...el, isFocused: false, focusOffsetStart: undefined }; } return el; }); @@ -945,7 +1052,7 @@ const moveCaretBackward = ( ) => { const newExpressionModel = expressionModel.map((el, idx) => { if (idx === index) { - return { ...el, isFocused: true, focusOffset: Math.max(0, caretOffset - 1) }; + return { ...el, isFocused: true, focusOffsetStart: Math.max(0, caretOffset - 1) }; } return el; }); @@ -992,7 +1099,8 @@ export const setCursorPositionToExpressionModel = (expressionModel: ExpressionMo newExpressionModel.push({ id: element.id + "1", isFocused: true, - focusOffset: 0, + focusOffsetStart: 0, + focusOffsetEnd: 0, value: ' ', isToken: element.isToken, startColumn: element.startColumn, @@ -1007,12 +1115,14 @@ export const setCursorPositionToExpressionModel = (expressionModel: ExpressionMo newExpressionModel.push({ ...element, isFocused: false, - focusOffset: undefined + focusOffsetStart: undefined, + focusOffsetEnd: undefined }); newExpressionModel.push({ ...nextElement, isFocused: true, - focusOffset: 0 + focusOffsetStart: 0, + focusOffsetEnd: 0 }); i += 2; } @@ -1021,7 +1131,8 @@ export const setCursorPositionToExpressionModel = (expressionModel: ExpressionMo newExpressionModel.push({ ...element, isFocused: true, - focusOffset: cursorPosition + focusOffsetStart: cursorPosition, + focusOffsetEnd: cursorPosition }); i += 1; } @@ -1030,7 +1141,8 @@ export const setCursorPositionToExpressionModel = (expressionModel: ExpressionMo newExpressionModel.push({ ...element, isFocused: false, - focusOffset: undefined + focusOffsetStart: undefined, + focusOffsetEnd: undefined }); i += 1; if (!foundTarget) { From 0c04edd35a3125df7c85957ce73f1a88a925ddf9 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Tue, 4 Nov 2025 10:45:10 +0530 Subject: [PATCH 657/730] Correct the passing value --- .../src/views/BI/Forms/FormGenerator/index.tsx | 8 ++++---- .../src/views/BI/Forms/FormGeneratorNew/index.tsx | 10 +++++----- .../src/views/BI/TypeEditor/index.tsx | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx index f36fb1c1d83..27badb7a3d3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -1217,10 +1217,10 @@ export const FormGenerator = forwardRef(func }); }; - const getDefaultValue = () => { + const getDefaultValue = (typeName?: string) => { return ({ type: { - name: "MyType", + name: typeName || "MyType", members: [] as Member[], editable: true, metadata: { @@ -1238,8 +1238,8 @@ export const FormGenerator = forwardRef(func }) } - const getNewTypeCreateForm = () => { - pushTypeStack(getDefaultValue()); + const getNewTypeCreateForm = (typeName?: string) => { + pushTypeStack(getDefaultValue(typeName)); } // handle if node form diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx index 1b049d56b01..e3a0b3dc3f0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx @@ -310,10 +310,10 @@ export function FormGeneratorNew(props: FormProps) { closePopup: closeModal } - const defaultType = (): Type => { + const defaultType = (typeName?: string): Type => { if (!isGraphqlEditor || typeEditorState.field?.type === 'PARAM_MANAGER') { return { - name: typeEditorState.newTypeValue || "MyType", + name: typeName || typeEditorState.newTypeValue || "MyType", editable: true, metadata: { label: "", @@ -328,7 +328,7 @@ export function FormGeneratorNew(props: FormProps) { allowAdditionalFields: false }; } return { - name: typeEditorState.newTypeValue || "MyType", + name: typeName || typeEditorState.newTypeValue || "MyType", editable: true, metadata: { label: "", @@ -818,9 +818,9 @@ export function FormGeneratorNew(props: FormProps) { setTypeEditorState({ ...typeEditorState, isOpen: state }); } - const getNewTypeCreateForm = () => { + const getNewTypeCreateForm = (typeName?: string) => { pushTypeStack({ - type: defaultType(), + type: defaultType(typeName), isDirty: false }) } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx index 2343c285c26..d595569bbdd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/TypeEditor/index.tsx @@ -47,7 +47,7 @@ type FormTypeEditorProps = { isGraphql?: boolean; onCloseCompletions?: () => void; onTypeCreate: (typeName?: string) => void; - getNewTypeCreateForm: () => void; + getNewTypeCreateForm: (typeName?: string) => void; onSaveType: (type: Type | string) => void refetchTypes: boolean; isPopupTypeForm: boolean; @@ -239,7 +239,7 @@ export const FormTypeEditor = (props: FormTypeEditorProps) => { }; const handleTypeCreate = (typeName?: string) => { - getNewTypeCreateForm(); + getNewTypeCreateForm(typeName); }; return ( From 3fc6c8e57e778867a84c2ccaf77b66bead4a9058 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Tue, 4 Nov 2025 11:38:25 +0530 Subject: [PATCH 658/730] fix service config attach listner popup overlap --- .../ballerina-visualizer/src/Context.tsx | 1 + .../ServiceDesigner/ServiceConfigureView.tsx | 34 +++++++------------ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/Context.tsx b/workspaces/ballerina/ballerina-visualizer/src/Context.tsx index bcde06cdec3..c14ce41fec9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/Context.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/Context.tsx @@ -139,6 +139,7 @@ export const POPUP_IDS = { CONFIGURABLES: "CONFIGURABLES", RECORD_CONFIG: "RECORD_CONFIG", LIBRARY_BROWSER: "LIBRARY_BROWSER", + ATTACH_LISTNER: "ATTACH_LISTNER", } as const; type ModalStackItem = { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx index ea67d1682ea..0ce3b885937 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx @@ -29,6 +29,7 @@ import { LoadingContainer } from "../../styles"; import { LoadingRing } from "../../../components/Loader"; import DynamicModal from "../../../components/Modal"; import { getReadableListenerName } from "./utils"; +import { POPUP_IDS, useModalStack } from "../../../Context"; const Container = styled.div` width: 100%; @@ -199,14 +200,15 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { const [serviceModel, setServiceModel] = useState(undefined); const [listeners, setListeners] = useState([]); - const [showAttachListenerModal, setShowAttachListenerModal] = useState(false); - const [isSaving, setIsSaving] = useState(false); const [hasChanges, setHasChanges] = useState(false); const [selectedListener, setSelectedListener] = useState(null); const [changeMap, setChangeMap] = useState<{ [key: string]: ChangeMap }>({}); + + const { addModal, closeModal } = useModalStack() + // Helper function to create key from filePath and position const getChangeKey = (filePath: string, position: NodePosition) => { return `${filePath}:${position.startLine}:${position.startColumn}:${position.endLine}:${position.endColumn}`; @@ -496,7 +498,7 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { const res = await rpcClient.getServiceDesignerRpcClient().updateServiceSourceCode({ filePath: props.filePath, service: serviceModel }); const updatedArtifact = res.artifacts.at(0); await fetchService(updatedArtifact.position); - setShowAttachListenerModal(false); + closeModal(POPUP_IDS.ATTACH_LISTNER); setChangeMap({}); } @@ -738,26 +740,16 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { {/* Add a button to attach a new listener and when clicked, open a new modal to select a listener if multiple listener are allowed */} {listenerType === "MULTIPLE" && ( { - setShowAttachListenerModal(true); + addModal( + listener.name)} + /> + , POPUP_IDS.ATTACH_LISTNER, "Attach Listener", 600, 500); }}> Attach Listener )} - - - listener.name)} - /> -
)} From 7f56b2e489ee7a37c1faf0630df6f0335bae14c9 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Tue, 4 Nov 2025 11:47:26 +0530 Subject: [PATCH 659/730] address PR suggestions --- workspaces/ballerina/ballerina-visualizer/src/Context.tsx | 2 +- .../src/views/BI/ServiceDesigner/ServiceConfigureView.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/Context.tsx b/workspaces/ballerina/ballerina-visualizer/src/Context.tsx index c14ce41fec9..04d5591d8e5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/Context.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/Context.tsx @@ -139,7 +139,7 @@ export const POPUP_IDS = { CONFIGURABLES: "CONFIGURABLES", RECORD_CONFIG: "RECORD_CONFIG", LIBRARY_BROWSER: "LIBRARY_BROWSER", - ATTACH_LISTNER: "ATTACH_LISTNER", + ATTACH_LISTENER: "ATTACH_LISTENER", } as const; type ModalStackItem = { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx index 0ce3b885937..c1de965ef5c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx @@ -498,7 +498,7 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { const res = await rpcClient.getServiceDesignerRpcClient().updateServiceSourceCode({ filePath: props.filePath, service: serviceModel }); const updatedArtifact = res.artifacts.at(0); await fetchService(updatedArtifact.position); - closeModal(POPUP_IDS.ATTACH_LISTNER); + closeModal(POPUP_IDS.ATTACH_LISTENER); setChangeMap({}); } @@ -747,7 +747,7 @@ export function ServiceConfigureView(props: ServiceConfigureProps) { onAttachListener={handleOnAttachListener} attachedListeners={listeners.map(listener => listener.name)} /> - , POPUP_IDS.ATTACH_LISTNER, "Attach Listener", 600, 500); + , POPUP_IDS.ATTACH_LISTENER, "Attach Listener", 600, 500); }}> Attach Listener )}
From a5b1d9fd933ca1bbb968d2c1f100e9ecc03b035a Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Tue, 4 Nov 2025 11:48:09 +0530 Subject: [PATCH 660/730] remove unused imports --- .../src/views/BI/ServiceDesigner/ServiceConfigureView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx index c1de965ef5c..53acb4a176d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/ServiceConfigureView.tsx @@ -27,7 +27,6 @@ import ListenerConfigForm from "./Forms/ListenerConfigForm"; import { ServiceEditView } from "./ServiceEditView"; import { LoadingContainer } from "../../styles"; import { LoadingRing } from "../../../components/Loader"; -import DynamicModal from "../../../components/Modal"; import { getReadableListenerName } from "./utils"; import { POPUP_IDS, useModalStack } from "../../../Context"; From 030d379dc98183ab54735931e77f9c53f2b2b6fc Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 4 Nov 2025 12:03:32 +0530 Subject: [PATCH 661/730] Fix model provider list auto close issue when creating a new model --- .../src/views/BI/FlowDiagram/index.tsx | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 82837067016..10653d41ded 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -898,29 +898,27 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }; const updateArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { - const currentArtifact = await rpcClient.getVisualizerRpcClient().updateCurrentArtifactLocation(artifacts); - if (currentArtifact) { - console.log(">>> currentArtifact", currentArtifact); - if (isCreatingNewModelProvider.current) { - isCreatingNewModelProvider.current = false; - await handleModelProviderAdded(); - return; - } - if (isCreatingNewVectorStore.current) { - isCreatingNewVectorStore.current = false; - await handleVectorStoreAdded(); - return; - } - if (isCreatingNewEmbeddingProvider.current) { - isCreatingNewEmbeddingProvider.current = false; - await handleEmbeddingProviderAdded(); - return; - } - if (isCreatingNewVectorKnowledgeBase.current) { - isCreatingNewVectorKnowledgeBase.current = false; - await handleVectorKnowledgeBaseAdded(); - return; - } + await rpcClient.getVisualizerRpcClient().updateCurrentArtifactLocation(artifacts); + + if (isCreatingNewModelProvider.current) { + isCreatingNewModelProvider.current = false; + await handleModelProviderAdded(); + return; + } + if (isCreatingNewVectorStore.current) { + isCreatingNewVectorStore.current = false; + await handleVectorStoreAdded(); + return; + } + if (isCreatingNewEmbeddingProvider.current) { + isCreatingNewEmbeddingProvider.current = false; + await handleEmbeddingProviderAdded(); + return; + } + if (isCreatingNewVectorKnowledgeBase.current) { + isCreatingNewVectorKnowledgeBase.current = false; + await handleVectorKnowledgeBaseAdded(); + return; } if (isCreatingNewDataLoader.current) { isCreatingNewDataLoader.current = false; @@ -1265,6 +1263,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { isFunctionNodeUpdate: dataMapperMode !== DataMapperDisplayMode.NONE, }) .then(async (response) => { + console.log(">>> Source code update response", response); if (response.artifacts.length > 0) { if (updatedNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER || (updatedNode?.codedata?.node === "AGENT_CALL" && updatedNode?.properties?.model?.value === "")) { From c5cfc40c3d379cfd4a1fd6d7351c1207f6028fac Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 4 Nov 2025 12:08:51 +0530 Subject: [PATCH 662/730] Fix styling to ensure full width display in knowledge base form --- .../src/components/editors/ActionExpressionEditor.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionExpressionEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionExpressionEditor.tsx index e7916549762..e585412f381 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionExpressionEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionExpressionEditor.tsx @@ -26,6 +26,7 @@ const Row = styled.div` display: flex; flex-direction: column; margin: 0; + width: 100%; `; const actionButtonStyles = { From ddf2cd4d8e4413a18fd30d2e1a173387d374d636 Mon Sep 17 00:00:00 2001 From: madushajg Date: Tue, 4 Nov 2025 12:28:24 +0530 Subject: [PATCH 663/730] Enhance BIRunAdapter to determine project root and set working directory for task execution --- .../src/features/debugger/config-provider.ts | 99 +++++++++++-------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts index d08c9c2e45f..01fc886e955 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts @@ -26,7 +26,8 @@ import { TaskExecution, DebugAdapterTrackerFactory, DebugAdapterTracker, - ViewColumn + ViewColumn, + TaskScope } from 'vscode'; import * as child_process from "child_process"; import { getPortPromise } from 'portfinder'; @@ -530,7 +531,7 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa }); } - if (session.configuration.noDebug && StateMachine.context().isBI) { + if (session.configuration.noDebug) { return new Promise((resolve) => { resolve(new DebugAdapterInlineImplementation(new BIRunAdapter())); }); @@ -640,51 +641,67 @@ class BIRunAdapter extends LoggingDebugSession { taskTerminationListener: Disposable | null = null; protected launchRequest(response: DebugProtocol.LaunchResponse, args: DebugProtocol.LaunchRequestArguments, request?: DebugProtocol.Request): void { - const taskDefinition: TaskDefinition = { - type: 'shell', - task: 'run' - }; - - let runCommand: string = `${extension.ballerinaExtInstance.getBallerinaCmd()} run`; + getCurrentProjectRoot().then((projectRoot) => { + const taskDefinition: TaskDefinition = { + type: 'shell', + task: 'run' + }; - const programArgs = (args as any).programArgs; - if (programArgs && programArgs.length > 0) { - runCommand = `${runCommand} -- ${programArgs.join(' ')}`; - } + let runCommand: string = `${extension.ballerinaExtInstance.getBallerinaCmd()} run`; - if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { - runCommand = `${runCommand} --experimental`; - } + const programArgs = (args as any).programArgs; + if (programArgs && programArgs.length > 0) { + runCommand = `${runCommand} -- ${programArgs.join(' ')}`; + } - // Use the current process environment which should have the updated PATH - const env = process.env; - debugLog(`[BIRunAdapter] Creating shell execution with env. PATH length: ${env.PATH?.length || 0}`); - const execution = new ShellExecution(runCommand, { env: env as { [key: string]: string } }); - const task = new Task( - taskDefinition, - workspace.workspaceFolders![0], // Assumes at least one workspace folder is open - 'Ballerina Run', - 'ballerina', - execution - ); + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { + runCommand = `${runCommand} --experimental`; + } - try { - tasks.executeTask(task).then((taskExecution) => { - this.task = taskExecution; + // Use the current process environment which should have the updated PATH + const env = process.env; + debugLog(`[BIRunAdapter] Creating shell execution with env. PATH length: ${env.PATH?.length || 0}`); + + // Determine the correct working directory for the task + // If projectRoot is a file (single file project), use its directory + // Otherwise, use the projectRoot itself (which is the project directory) + const cwd = fs.statSync(projectRoot).isFile() ? path.dirname(projectRoot) : projectRoot; + debugLog(`[BIRunAdapter] Setting cwd to project root: ${cwd}`); + + const execution = new ShellExecution(runCommand, { + env: env as { [key: string]: string }, + cwd: cwd + }); + const task = new Task( + taskDefinition, + TaskScope.Workspace, + 'Ballerina Run', + 'ballerina', + execution + ); + + try { + tasks.executeTask(task).then((taskExecution) => { + this.task = taskExecution; + + // Add task termination listener + this.taskTerminationListener = tasks.onDidEndTaskProcess(e => { + if (e.execution === this.task) { + this.sendEvent(new TerminatedEvent()); + } + }); - // Add task termination listener - this.taskTerminationListener = tasks.onDidEndTaskProcess(e => { - if (e.execution === this.task) { - this.sendEvent(new TerminatedEvent()); - } + response.success = true; + this.sendResponse(response); }); - - response.success = true; - this.sendResponse(response); - }); - } catch (error) { - window.showErrorMessage(`Failed to run Ballerina package: ${error}`); - } + } catch (error) { + window.showErrorMessage(`Failed to run Ballerina package: ${error}`); + } + }).catch((error) => { + window.showErrorMessage(`Failed to determine project root: ${error}`); + response.success = false; + this.sendResponse(response); + }); } protected disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments, request?: DebugProtocol.Request): void { From 39c9f104a12237913c90a9a6d074ab3e00209e2d Mon Sep 17 00:00:00 2001 From: madushajg Date: Tue, 4 Nov 2025 12:45:06 +0530 Subject: [PATCH 664/730] Refactor project root retrieval by exporting getCurrentProjectRoot function for improved workspace handling in TryIt feature --- .../src/features/debugger/config-provider.ts | 2 +- .../src/features/tryit/activator.ts | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts index 01fc886e955..93f8e6c0d34 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts @@ -758,7 +758,7 @@ async function stopRunFast(root: string): Promise { }); } -async function getCurrentProjectRoot(): Promise { +export async function getCurrentProjectRoot(): Promise { // 1. Check if the project path is already set in the state machine context let currentProjectRoot = StateMachine.context().projectUri; if (currentProjectRoot) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts index 30b030a1b75..1ee43ee97a9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts @@ -29,6 +29,7 @@ import { startDebugging } from "../editor-support/activator"; import { v4 as uuidv4 } from "uuid"; import { createGraphqlView } from "../../views/graphql"; import { StateMachine } from "../../stateMachine"; +import { getCurrentProjectRoot } from "../debugger"; // File constants const FILE_NAMES = { @@ -66,9 +67,17 @@ async function openTryItView(withNotice: boolean = false, resourceMetadata?: Res throw new Error('Ballerina Language Server is not connected'); } - const projectPath = StateMachine.context().projectUri; + let projectPath = StateMachine.context().projectUri; if (!projectPath) { - throw new Error('Please open a workspace first'); + const currentProjectRoot = await getCurrentProjectRoot(); + if (!currentProjectRoot) { + throw new Error('Please open a workspace first'); + } + // If currentProjectRoot is a file (single file project), use its directory + // Otherwise, use the current project root + projectPath = fs.statSync(currentProjectRoot).isFile() + ? path.dirname(currentProjectRoot) + : currentProjectRoot; } let services: ServiceInfo[] | null = await getAvailableServices(projectPath); From 9a6febb6a450d9c7a96d84558f4b70221eca6ce6 Mon Sep 17 00:00:00 2001 From: Senith Uthsara Date: Tue, 4 Nov 2025 13:24:47 +0530 Subject: [PATCH 665/730] remove mode switcher and keep only text mode from foreach node collection field by special casing it --- .../src/components/Form/index.tsx | 5 ++++- .../components/editors/ExpressionEditor.tsx | 21 ++++++++++++------- .../ballerina-side-panel/src/context/form.tsx | 5 ++++- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx index e291c10d651..0ac8b2f5895 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -613,7 +613,10 @@ export const Form = forwardRef((props: FormProps) => { }, targetLineRange, fileName, - popupManager: popupManager + popupManager: popupManager, + nodeInfo: { + kind: selectedNode, + } }; // Find the first editable field diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx index 3528b40e056..c3a82b4b268 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpressionEditor.tsx @@ -367,6 +367,8 @@ export const ExpressionEditor = (props: ExpressionEditorProps) => { const exprRef = useRef(null); const anchorRef = useRef(null); + const { nodeInfo } = useFormContext(); + // Use to fetch initial diagnostics const previousDiagnosticsFetchContext = useRef({ fetchedInitialDiagnostics: false, @@ -532,6 +534,13 @@ export const ExpressionEditor = (props: ExpressionEditorProps) => { : `${field.documentation}.` : ''; + const isModeSwitcherAvailable = () => { + if (nodeInfo?.kind === "FOREACH") return false; + if (!(focused || isExpressionEditorHovered)) return false; + if (!getInputModeFromTypes(field.valueTypeConstraint)) return false; + return true; + } + return ( {
- {(focused || isExpressionEditorHovered) - && getInputModeFromTypes(field.valueTypeConstraint) - && ( - )} diff --git a/workspaces/ballerina/ballerina-side-panel/src/context/form.tsx b/workspaces/ballerina/ballerina-side-panel/src/context/form.tsx index 4087070dc51..37bac4fcb63 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/context/form.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/context/form.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { LineRange } from '@wso2/ballerina-core'; +import { LineRange, NodeKind } from '@wso2/ballerina-core'; import React, { createContext, FC, useContext } from 'react'; import { Control, @@ -52,6 +52,9 @@ export interface FormContext { removeLastPopup: () => void; closePopup: (id: string) => void; + }, + nodeInfo: { + kind: NodeKind } } From 89811d3c6e11084a6218876aa0c8a033f301962e Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Tue, 4 Nov 2025 13:30:52 +0530 Subject: [PATCH 666/730] Resolve the unfocusing issue --- .../src/TypeEditor/Tabs/TypeCreatorTab.tsx | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx index 9ee34534a82..c18132123d3 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx @@ -193,6 +193,9 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) { default: setSelectedTypeKind(TypeKind.RECORD); } + + // Ensure tempName is initialized when editing a new type (prevents focus loss due to replacing the main type on each keystroke) + setTempName(editingType.name); } setIsNewType(newType); @@ -420,10 +423,24 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) { } const handleOnTypeNameChange = (value: string) => { + if (isNewType) { + setTempName(value); + validateTypeName(value); + return; + } handleSetType({ ...type, name: value }); validateTypeName(value); } + const commitNewTypeName = () => { + if (!isNewType) { + return; + } + if (tempName && tempName !== type.name) { + handleSetType({ ...type, name: tempName } as Type); + } + }; + // Function to validate before saving to verify names created in nested forms const handleSaveWithValidation = async (typeToSave: Type) => { @@ -600,13 +617,18 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) { { + // commit local name into type on blur and validate + commitNewTypeName(); + handleOnBlur(e); + }} onChange={(e) => handleOnTypeNameChange(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { - handleOnTypeNameChange((e.target as HTMLInputElement).value); + // commit on Enter + commitNewTypeName(); } }} onFocus={(e) => { e.target.select(); validateTypeName(e.target.value) }} @@ -622,7 +644,11 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) {