From ff356f0c8c78eacafeba403a0444aef743808e92 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 29 Oct 2024 22:20:26 +0800 Subject: [PATCH 01/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/[provider]/[...path]/route.ts=20=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=20=20=20app/api/auth.ts=20=09=E6=96=B0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=9A=20=20=20app/api/bedrock.ts=20=09?= =?UTF-8?q?=E6=96=B0=E6=96=87=E4=BB=B6=EF=BC=9A=20=20=20app/api/bedrock/mo?= =?UTF-8?q?dels.ts=20=09=E6=96=B0=E6=96=87=E4=BB=B6=EF=BC=9A=20=20=20app/a?= =?UTF-8?q?pi/bedrock/utils.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/client/api.ts=20=09=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=9A=20=20=20app/client/platforms/bedrock.ts=20=09?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/components/settin?= =?UTF-8?q?gs.tsx=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/confi?= =?UTF-8?q?g/server.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/?= =?UTF-8?q?constant.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/?= =?UTF-8?q?locales/cn.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20ap?= =?UTF-8?q?p/locales/en.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20?= =?UTF-8?q?app/store/access.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/utils.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20?= =?UTF-8?q?=20package.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/[provider]/[...path]/route.ts | 4 + app/api/auth.ts | 22 ++ app/api/bedrock.ts | 288 ++++++++++++++++++++++++++ app/api/bedrock/models.ts | 280 +++++++++++++++++++++++++ app/api/bedrock/utils.ts | 218 +++++++++++++++++++ app/client/api.ts | 43 +++- app/client/platforms/bedrock.ts | 223 ++++++++++++++++++++ app/components/settings.tsx | 71 ++++++- app/config/server.ts | 10 +- app/constant.ts | 36 ++++ app/locales/cn.ts | 26 +++ app/locales/en.ts | 26 +++ app/store/access.ts | 21 ++ app/utils.ts | 3 + package.json | 3 +- 15 files changed, 1261 insertions(+), 13 deletions(-) create mode 100644 app/api/bedrock.ts create mode 100644 app/api/bedrock/models.ts create mode 100644 app/api/bedrock/utils.ts create mode 100644 app/client/platforms/bedrock.ts diff --git a/app/api/[provider]/[...path]/route.ts b/app/api/[provider]/[...path]/route.ts index 5ac248d0c87..100c4371429 100644 --- a/app/api/[provider]/[...path]/route.ts +++ b/app/api/[provider]/[...path]/route.ts @@ -1,6 +1,7 @@ import { ApiPath } from "@/app/constant"; import { NextRequest } from "next/server"; import { handle as openaiHandler } from "../../openai"; +import { handle as bedrockHandler } from "../../bedrock"; import { handle as azureHandler } from "../../azure"; import { handle as googleHandler } from "../../google"; import { handle as anthropicHandler } from "../../anthropic"; @@ -20,12 +21,15 @@ async function handle( const apiPath = `/api/${params.provider}`; console.log(`[${params.provider} Route] params `, params); switch (apiPath) { + case ApiPath.Bedrock: + return bedrockHandler(req, { params }); case ApiPath.Azure: return azureHandler(req, { params }); case ApiPath.Google: return googleHandler(req, { params }); case ApiPath.Anthropic: return anthropicHandler(req, { params }); + case ApiPath.Baidu: return baiduHandler(req, { params }); case ApiPath.ByteDance: diff --git a/app/api/auth.ts b/app/api/auth.ts index d4ac66a113b..1a0ae0b432e 100644 --- a/app/api/auth.ts +++ b/app/api/auth.ts @@ -52,6 +52,28 @@ export function auth(req: NextRequest, modelProvider: ModelProvider) { msg: "you are not allowed to access with your own api key", }; } + // Special handling for Bedrock + if (modelProvider === ModelProvider.Bedrock) { + const region = req.headers.get("X-Region"); + const accessKeyId = req.headers.get("X-Access-Key"); + const secretKey = req.headers.get("X-Secret-Key"); + + console.log("[Auth] Bedrock credentials:", { + region, + accessKeyId: accessKeyId ? "***" : undefined, + secretKey: secretKey ? "***" : undefined, + }); + + // Check if AWS credentials are provided + if (!region || !accessKeyId || !secretKey) { + return { + error: true, + msg: "Missing AWS credentials. Please configure Region, Access Key ID, and Secret Access Key in settings.", + }; + } + + return { error: false }; + } // if user does not provide an api key, inject system api key if (!apiKey) { diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts new file mode 100644 index 00000000000..e2d212817b1 --- /dev/null +++ b/app/api/bedrock.ts @@ -0,0 +1,288 @@ +import { ModelProvider } from "../constant"; +import { prettyObject } from "../utils/format"; +import { NextRequest, NextResponse } from "next/server"; +import { auth } from "./auth"; +import { + BedrockRuntimeClient, + InvokeModelCommand, + ValidationException, +} from "@aws-sdk/client-bedrock-runtime"; +import { validateModelId } from "./bedrock/utils"; +import { + ConverseRequest, + formatRequestBody, + parseModelResponse, +} from "./bedrock/models"; + +interface ContentItem { + type: string; + text?: string; + image_url?: { + url: string; + }; +} + +const ALLOWED_PATH = new Set(["invoke", "converse"]); + +export async function handle( + req: NextRequest, + { params }: { params: { path: string[] } }, +) { + console.log("[Bedrock Route] params ", params); + + if (req.method === "OPTIONS") { + return NextResponse.json({ body: "OK" }, { status: 200 }); + } + + const subpath = params.path.join("/"); + + if (!ALLOWED_PATH.has(subpath)) { + console.log("[Bedrock Route] forbidden path ", subpath); + return NextResponse.json( + { + error: true, + msg: "you are not allowed to request " + subpath, + }, + { + status: 403, + }, + ); + } + + const authResult = auth(req, ModelProvider.Bedrock); + if (authResult.error) { + return NextResponse.json(authResult, { + status: 401, + }); + } + + try { + if (subpath === "converse") { + const response = await handleConverseRequest(req); + return response; + } else { + const response = await handleInvokeRequest(req); + return response; + } + } catch (e) { + console.error("[Bedrock] ", e); + + // Handle specific error cases + if (e instanceof ValidationException) { + return NextResponse.json( + { + error: true, + message: + "Model validation error. If using a Llama model, please provide a valid inference profile ARN.", + details: e.message, + }, + { status: 400 }, + ); + } + + return NextResponse.json( + { + error: true, + message: e instanceof Error ? e.message : "Unknown error", + details: prettyObject(e), + }, + { status: 500 }, + ); + } +} + +async function handleConverseRequest(req: NextRequest) { + const controller = new AbortController(); + + const region = req.headers.get("X-Region") || "us-east-1"; + const accessKeyId = req.headers.get("X-Access-Key") || ""; + const secretAccessKey = req.headers.get("X-Secret-Key") || ""; + const sessionToken = req.headers.get("X-Session-Token"); + + if (!accessKeyId || !secretAccessKey) { + return NextResponse.json( + { + error: true, + message: "Missing AWS credentials", + }, + { + status: 401, + }, + ); + } + + console.log("[Bedrock] Using region:", region); + + const client = new BedrockRuntimeClient({ + region, + credentials: { + accessKeyId, + secretAccessKey, + sessionToken: sessionToken || undefined, + }, + }); + + const timeoutId = setTimeout( + () => { + controller.abort(); + }, + 10 * 60 * 1000, + ); + + try { + const body = (await req.json()) as ConverseRequest; + const { modelId } = body; + + // Validate model ID + const validationError = validateModelId(modelId); + if (validationError) { + throw new ValidationException({ + message: validationError, + $metadata: {}, + }); + } + + console.log("[Bedrock] Invoking model:", modelId); + console.log("[Bedrock] Messages:", body.messages); + + const requestBody = formatRequestBody(body); + + const jsonString = JSON.stringify(requestBody); + const input = { + modelId, + contentType: "application/json", + accept: "application/json", + body: Uint8Array.from(Buffer.from(jsonString)), + }; + + console.log("[Bedrock] Request input:", { + ...input, + body: requestBody, + }); + + const command = new InvokeModelCommand(input); + const response = await client.send(command); + + console.log("[Bedrock] Got response"); + + // Parse and format the response based on model type + const responseBody = new TextDecoder().decode(response.body); + const formattedResponse = parseModelResponse(responseBody, modelId); + + return NextResponse.json(formattedResponse); + } catch (e) { + console.error("[Bedrock] Request error:", e); + throw e; // Let the main error handler deal with it + } finally { + clearTimeout(timeoutId); + } +} + +async function handleInvokeRequest(req: NextRequest) { + const controller = new AbortController(); + + const region = req.headers.get("X-Region") || "us-east-1"; + const accessKeyId = req.headers.get("X-Access-Key") || ""; + const secretAccessKey = req.headers.get("X-Secret-Key") || ""; + const sessionToken = req.headers.get("X-Session-Token"); + + if (!accessKeyId || !secretAccessKey) { + return NextResponse.json( + { + error: true, + message: "Missing AWS credentials", + }, + { + status: 401, + }, + ); + } + + const client = new BedrockRuntimeClient({ + region, + credentials: { + accessKeyId, + secretAccessKey, + sessionToken: sessionToken || undefined, + }, + }); + + const timeoutId = setTimeout( + () => { + controller.abort(); + }, + 10 * 60 * 1000, + ); + + try { + const body = await req.json(); + const { messages, model } = body; + + // Validate model ID + const validationError = validateModelId(model); + if (validationError) { + throw new ValidationException({ + message: validationError, + $metadata: {}, + }); + } + + console.log("[Bedrock] Invoking model:", model); + console.log("[Bedrock] Messages:", messages); + + const requestBody = formatRequestBody({ + modelId: model, + messages, + inferenceConfig: { + maxTokens: 2048, + temperature: 0.7, + topP: 0.9, + }, + }); + + const jsonString = JSON.stringify(requestBody); + const input = { + modelId: model, + contentType: "application/json", + accept: "application/json", + body: Uint8Array.from(Buffer.from(jsonString)), + }; + + console.log("[Bedrock] Request input:", { + ...input, + body: requestBody, + }); + + const command = new InvokeModelCommand(input); + const response = await client.send(command); + + console.log("[Bedrock] Got response"); + + // Parse and format the response + const responseBody = new TextDecoder().decode(response.body); + const formattedResponse = parseModelResponse(responseBody, model); + + // Extract text content from the response + let textContent = ""; + if (formattedResponse.content && Array.isArray(formattedResponse.content)) { + textContent = formattedResponse.content + .filter((item: ContentItem) => item.type === "text") + .map((item: ContentItem) => item.text || "") + .join(""); + } else if (typeof formattedResponse.content === "string") { + textContent = formattedResponse.content; + } + + // Return plain text response + return new NextResponse(textContent, { + headers: { + "Content-Type": "text/plain", + }, + }); + } catch (e) { + console.error("[Bedrock] Request error:", e); + throw e; + } finally { + clearTimeout(timeoutId); + } +} diff --git a/app/api/bedrock/models.ts b/app/api/bedrock/models.ts new file mode 100644 index 00000000000..b9a0fee5099 --- /dev/null +++ b/app/api/bedrock/models.ts @@ -0,0 +1,280 @@ +import { + Message, + validateMessageOrder, + processDocumentContent, + BedrockTextBlock, + BedrockImageBlock, + BedrockDocumentBlock, +} from "./utils"; + +export interface ConverseRequest { + modelId: string; + messages: Message[]; + inferenceConfig?: { + maxTokens?: number; + temperature?: number; + topP?: number; + }; + system?: string; + tools?: Array<{ + type: "function"; + function: { + name: string; + description: string; + parameters: { + type: string; + properties: Record; + required: string[]; + }; + }; + }>; +} + +interface ContentItem { + type: string; + text?: string; + image_url?: { + url: string; + }; + document?: { + format: string; + name: string; + source: { + bytes: string; + }; + }; +} + +type ProcessedContent = + | ContentItem + | BedrockTextBlock + | BedrockImageBlock + | BedrockDocumentBlock + | { + type: string; + source: { type: string; media_type: string; data: string }; + }; + +// Helper function to format request body based on model type +export function formatRequestBody(request: ConverseRequest) { + const baseModel = request.modelId; + const messages = validateMessageOrder(request.messages).map((msg) => ({ + role: msg.role, + content: Array.isArray(msg.content) + ? msg.content.map((item: ContentItem) => { + if (item.type === "image_url" && item.image_url?.url) { + // If it's a base64 image URL + const base64Match = item.image_url.url.match( + /^data:image\/([a-zA-Z]*);base64,([^"]*)$/, + ); + if (base64Match) { + return { + type: "image", + source: { + type: "base64", + media_type: `image/${base64Match[1]}`, + data: base64Match[2], + }, + }; + } + // If it's not a base64 URL, return as is + return item; + } + if ("document" in item) { + try { + return processDocumentContent(item); + } catch (error) { + console.error("Error processing document:", error); + return { + type: "text", + text: `[Document: ${item.document?.name || "Unknown"}]`, + }; + } + } + return { type: "text", text: item.text }; + }) + : [{ type: "text", text: msg.content }], + })); + + const systemPrompt = request.system + ? [{ type: "text", text: request.system }] + : undefined; + + const baseConfig = { + max_tokens: request.inferenceConfig?.maxTokens || 2048, + temperature: request.inferenceConfig?.temperature || 0.7, + top_p: request.inferenceConfig?.topP || 0.9, + }; + + if (baseModel.startsWith("anthropic.claude")) { + return { + messages, + system: systemPrompt, + anthropic_version: "bedrock-2023-05-31", + ...baseConfig, + ...(request.tools && { tools: request.tools }), + }; + } else if ( + baseModel.startsWith("meta.llama") || + baseModel.startsWith("mistral.") + ) { + return { + messages: messages.map((m) => ({ + role: m.role, + content: Array.isArray(m.content) + ? m.content.map((c: ProcessedContent) => { + if ("text" in c) return { type: "text", text: c.text || "" }; + if ("image_url" in c) + return { + type: "text", + text: `[Image: ${c.image_url?.url || "URL not provided"}]`, + }; + if ("document" in c) + return { + type: "text", + text: `[Document: ${c.document?.name || "Unknown"}]`, + }; + return { type: "text", text: "" }; + }) + : [{ type: "text", text: m.content }], + })), + ...baseConfig, + stop_sequences: ["\n\nHuman:", "\n\nAssistant:"], + }; + } else if (baseModel.startsWith("amazon.titan")) { + const formattedText = messages.map((m) => ({ + role: m.role, + content: [ + { + type: "text", + text: `${m.role === "user" ? "Human" : "Assistant"}: ${ + Array.isArray(m.content) + ? m.content + .map((c: ProcessedContent) => { + if ("text" in c) return c.text || ""; + if ("image_url" in c) + return `[Image: ${ + c.image_url?.url || "URL not provided" + }]`; + if ("document" in c) + return `[Document: ${c.document?.name || "Unknown"}]`; + return ""; + }) + .join("") + : m.content + }`, + }, + ], + })); + + return { + messages: formattedText, + textGenerationConfig: { + maxTokenCount: baseConfig.max_tokens, + temperature: baseConfig.temperature, + topP: baseConfig.top_p, + stopSequences: ["Human:", "Assistant:"], + }, + }; + } + + throw new Error(`Unsupported model: ${baseModel}`); +} + +// Helper function to parse and format response based on model type +export function parseModelResponse(responseBody: string, modelId: string): any { + const baseModel = modelId; + + try { + const response = JSON.parse(responseBody); + + // Common response format for all models + const formatResponse = (content: string | any[]) => ({ + role: "assistant", + content: Array.isArray(content) + ? content.map((item) => { + if (typeof item === "string") { + return { type: "text", text: item }; + } + // Handle different content types + if ("text" in item) { + return { type: "text", text: item.text || "" }; + } + if ("image" in item) { + return { + type: "image_url", + image_url: { + url: `data:image/${ + item.source?.media_type || "image/png" + };base64,${item.source?.data || ""}`, + }, + }; + } + // Document responses are converted to text + if ("document" in item) { + return { + type: "text", + text: `[Document Content]\n${item.text || ""}`, + }; + } + return { type: "text", text: item.text || "" }; + }) + : [{ type: "text", text: content }], + stop_reason: response.stop_reason || response.stopReason || "end_turn", + usage: response.usage || { + input_tokens: 0, + output_tokens: 0, + total_tokens: 0, + }, + }); + + if (baseModel.startsWith("anthropic.claude")) { + // Handle the new Converse API response format + if (response.output?.message) { + return { + role: response.output.message.role, + content: response.output.message.content.map((item: any) => { + if ("text" in item) return { type: "text", text: item.text || "" }; + if ("image" in item) { + return { + type: "image_url", + image_url: { + url: `data:${item.source?.media_type || "image/png"};base64,${ + item.source?.data || "" + }`, + }, + }; + } + return { type: "text", text: item.text || "" }; + }), + stop_reason: response.stopReason, + usage: response.usage, + }; + } + // Fallback for older format + return formatResponse( + response.content || + (response.completion + ? [{ type: "text", text: response.completion }] + : []), + ); + } else if (baseModel.startsWith("meta.llama")) { + return formatResponse(response.generation || response.completion || ""); + } else if (baseModel.startsWith("amazon.titan")) { + return formatResponse(response.results?.[0]?.outputText || ""); + } else if (baseModel.startsWith("mistral.")) { + return formatResponse( + response.outputs?.[0]?.text || response.response || "", + ); + } + + throw new Error(`Unsupported model: ${baseModel}`); + } catch (e) { + console.error("[Bedrock] Failed to parse response:", e); + // Return raw text as fallback + return { + role: "assistant", + content: [{ type: "text", text: responseBody }], + }; + } +} diff --git a/app/api/bedrock/utils.ts b/app/api/bedrock/utils.ts new file mode 100644 index 00000000000..85cd517b439 --- /dev/null +++ b/app/api/bedrock/utils.ts @@ -0,0 +1,218 @@ +import { MultimodalContent } from "../../client/api"; + +export interface Message { + role: string; + content: string | MultimodalContent[]; +} + +export interface ImageSource { + bytes: string; // base64 encoded image bytes +} + +export interface DocumentSource { + bytes: string; // base64 encoded document bytes +} + +export interface BedrockImageBlock { + image: { + format: "png" | "jpeg" | "gif" | "webp"; + source: ImageSource; + }; +} + +export interface BedrockDocumentBlock { + document: { + format: + | "pdf" + | "csv" + | "doc" + | "docx" + | "xls" + | "xlsx" + | "html" + | "txt" + | "md"; + name: string; + source: DocumentSource; + }; +} + +export interface BedrockTextBlock { + text: string; +} + +export type BedrockContentBlock = + | BedrockTextBlock + | BedrockImageBlock + | BedrockDocumentBlock; + +export interface BedrockResponse { + content?: any[]; + completion?: string; + stop_reason?: string; + usage?: { + input_tokens: number; + output_tokens: number; + total_tokens: number; + }; + tool_calls?: any[]; +} + +// Helper function to get the base model type from modelId +export function getModelType(modelId: string): string { + if (modelId.includes("inference-profile")) { + const match = modelId.match(/us\.(meta\.llama.+?)$/); + if (match) return match[1]; + } + return modelId; +} + +// Helper function to validate model ID +export function validateModelId(modelId: string): string | null { + // Check if model requires inference profile + if ( + modelId.startsWith("meta.llama") && + !modelId.includes("inference-profile") + ) { + return "Llama models require an inference profile. Please use the full inference profile ARN."; + } + return null; +} + +// Helper function to process document content for Bedrock +export function processDocumentContent(content: any): BedrockContentBlock { + if ( + !content?.document?.format || + !content?.document?.name || + !content?.document?.source?.bytes + ) { + throw new Error("Invalid document content format"); + } + + const format = content.document.format.toLowerCase(); + if ( + !["pdf", "csv", "doc", "docx", "xls", "xlsx", "html", "txt", "md"].includes( + format, + ) + ) { + throw new Error(`Unsupported document format: ${format}`); + } + + return { + document: { + format: format as BedrockDocumentBlock["document"]["format"], + name: sanitizeDocumentName(content.document.name), + source: { + bytes: content.document.source.bytes, + }, + }, + }; +} + +// Helper function to format content for Bedrock +export function formatContent( + content: string | MultimodalContent[], +): BedrockContentBlock[] { + if (typeof content === "string") { + return [{ text: content }]; + } + + const formattedContent: BedrockContentBlock[] = []; + + for (const item of content) { + if (item.type === "text" && item.text) { + formattedContent.push({ text: item.text }); + } else if (item.type === "image_url" && item.image_url?.url) { + // Extract base64 data from data URL + const base64Match = item.image_url.url.match( + /^data:image\/([a-zA-Z]*);base64,([^"]*)$/, + ); + if (base64Match) { + const format = base64Match[1].toLowerCase(); + if (["png", "jpeg", "gif", "webp"].includes(format)) { + formattedContent.push({ + image: { + format: format as "png" | "jpeg" | "gif" | "webp", + source: { + bytes: base64Match[2], + }, + }, + }); + } + } + } else if ("document" in item) { + try { + formattedContent.push(processDocumentContent(item)); + } catch (error) { + console.error("Error processing document:", error); + // Convert document to text as fallback + formattedContent.push({ + text: `[Document: ${(item as any).document?.name || "Unknown"}]`, + }); + } + } + } + + return formattedContent; +} + +// Helper function to ensure messages alternate between user and assistant +export function validateMessageOrder(messages: Message[]): Message[] { + const validatedMessages: Message[] = []; + let lastRole = ""; + + for (const message of messages) { + if (message.role === lastRole) { + // Skip duplicate roles to maintain alternation + continue; + } + validatedMessages.push(message); + lastRole = message.role; + } + + return validatedMessages; +} + +// Helper function to sanitize document names according to Bedrock requirements +function sanitizeDocumentName(name: string): string { + // Remove any characters that aren't alphanumeric, whitespace, hyphens, or parentheses + let sanitized = name.replace(/[^a-zA-Z0-9\s\-\(\)\[\]]/g, ""); + // Replace multiple whitespace characters with a single space + sanitized = sanitized.replace(/\s+/g, " "); + // Trim whitespace from start and end + return sanitized.trim(); +} + +// Helper function to convert Bedrock response back to MultimodalContent format +export function convertBedrockResponseToMultimodal( + response: BedrockResponse, +): string | MultimodalContent[] { + if (response.completion) { + return response.completion; + } + + if (!response.content) { + return ""; + } + + return response.content.map((block) => { + if ("text" in block) { + return { + type: "text", + text: block.text, + }; + } else if ("image" in block) { + return { + type: "image_url", + image_url: { + url: `data:image/${block.image.format};base64,${block.image.source.bytes}`, + }, + }; + } + // Document responses are converted to text content + return { + type: "text", + text: block.text || "", + }; + }); +} diff --git a/app/client/api.ts b/app/client/api.ts index 4238c2a264b..e547bea0a94 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -12,6 +12,7 @@ import { useChatStore, } from "../store"; import { ChatGPTApi, DalleRequestPayload } from "./platforms/openai"; +import { BedrockApi } from "./platforms/bedrock"; import { GeminiProApi } from "./platforms/google"; import { ClaudeApi } from "./platforms/anthropic"; import { ErnieApi } from "./platforms/baidu"; @@ -129,6 +130,9 @@ export class ClientApi { constructor(provider: ModelProvider = ModelProvider.GPT) { switch (provider) { + case ModelProvider.Bedrock: + this.llm = new BedrockApi(); + break; case ModelProvider.GeminiPro: this.llm = new GeminiProApi(); break; @@ -235,6 +239,7 @@ export function getHeaders(ignoreHeaders: boolean = false) { function getConfig() { const modelConfig = chatStore.currentSession().mask.modelConfig; + const isBedrock = modelConfig.providerName === ServiceProvider.Bedrock; const isGoogle = modelConfig.providerName === ServiceProvider.Google; const isAzure = modelConfig.providerName === ServiceProvider.Azure; const isAnthropic = modelConfig.providerName === ServiceProvider.Anthropic; @@ -247,6 +252,8 @@ export function getHeaders(ignoreHeaders: boolean = false) { const isEnabledAccessControl = accessStore.enabledAccessControl(); const apiKey = isGoogle ? accessStore.googleApiKey + : isBedrock + ? accessStore.awsAccessKeyId // Use AWS access key for Bedrock : isAzure ? accessStore.azureApiKey : isAnthropic @@ -265,6 +272,7 @@ export function getHeaders(ignoreHeaders: boolean = false) { : "" : accessStore.openaiApiKey; return { + isBedrock, isGoogle, isAzure, isAnthropic, @@ -286,10 +294,13 @@ export function getHeaders(ignoreHeaders: boolean = false) { ? "x-api-key" : isGoogle ? "x-goog-api-key" + : isBedrock + ? "x-api-key" : "Authorization"; } const { + isBedrock, isGoogle, isAzure, isAnthropic, @@ -302,17 +313,27 @@ export function getHeaders(ignoreHeaders: boolean = false) { const authHeader = getAuthHeader(); - const bearerToken = getBearerToken( - apiKey, - isAzure || isAnthropic || isGoogle, - ); - - if (bearerToken) { - headers[authHeader] = bearerToken; - } else if (isEnabledAccessControl && validString(accessStore.accessCode)) { - headers["Authorization"] = getBearerToken( - ACCESS_CODE_PREFIX + accessStore.accessCode, + if (isBedrock) { + // Add AWS credentials for Bedrock + headers["X-Region"] = accessStore.awsRegion; + headers["X-Access-Key"] = accessStore.awsAccessKeyId; + headers["X-Secret-Key"] = accessStore.awsSecretAccessKey; + if (accessStore.awsSessionToken) { + headers["X-Session-Token"] = accessStore.awsSessionToken; + } + } else { + const bearerToken = getBearerToken( + apiKey, + isAzure || isAnthropic || isGoogle, ); + + if (bearerToken) { + headers[authHeader] = bearerToken; + } else if (isEnabledAccessControl && validString(accessStore.accessCode)) { + headers["Authorization"] = getBearerToken( + ACCESS_CODE_PREFIX + accessStore.accessCode, + ); + } } return headers; @@ -320,6 +341,8 @@ export function getHeaders(ignoreHeaders: boolean = false) { export function getClientApi(provider: ServiceProvider): ClientApi { switch (provider) { + case ServiceProvider.Bedrock: + return new ClientApi(ModelProvider.Bedrock); case ServiceProvider.Google: return new ClientApi(ModelProvider.GeminiPro); case ServiceProvider.Anthropic: diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts new file mode 100644 index 00000000000..f8954f9d774 --- /dev/null +++ b/app/client/platforms/bedrock.ts @@ -0,0 +1,223 @@ +import { ApiPath } from "../../constant"; +import { ChatOptions, getHeaders, LLMApi, SpeechOptions } from "../api"; +import { + useAccessStore, + useAppConfig, + useChatStore, + usePluginStore, +} from "../../store"; +import { preProcessImageContent, stream } from "../../utils/chat"; +import Locale from "../../locales"; + +export interface BedrockChatRequest { + model: string; + messages: Array<{ + role: string; + content: + | string + | Array<{ + type: string; + text?: string; + image_url?: { url: string }; + document?: { + format: string; + name: string; + source: { + bytes: string; + }; + }; + }>; + }>; + temperature?: number; + top_p?: number; + max_tokens?: number; + stream?: boolean; +} + +export class BedrockApi implements LLMApi { + speech(options: SpeechOptions): Promise { + throw new Error("Method not implemented."); + } + + extractMessage(res: any) { + console.log("[Response] bedrock response: ", res); + return res; + } + + async chat(options: ChatOptions): Promise { + const shouldStream = !!options.config.stream; + + const modelConfig = { + ...useAppConfig.getState().modelConfig, + ...useChatStore.getState().currentSession().mask.modelConfig, + ...{ + model: options.config.model, + }, + }; + + const accessStore = useAccessStore.getState(); + + if ( + !accessStore.awsRegion || + !accessStore.awsAccessKeyId || + !accessStore.awsSecretAccessKey + ) { + console.log("AWS credentials are not set"); + let responseText = ""; + const responseTexts = [responseText]; + responseTexts.push(Locale.Error.Unauthorized); + responseText = responseTexts.join("\n\n"); + options.onFinish(responseText); + return; + } + + // Process messages to handle image and document content + const messages = await Promise.all( + options.messages.map(async (v) => { + const content = await preProcessImageContent(v.content); + // If content is an array (multimodal), ensure each item is properly formatted + if (Array.isArray(content)) { + return { + role: v.role, + content: content.map((item) => { + if (item.type === "image_url" && item.image_url?.url) { + // If the URL is a base64 data URL, use it directly + if (item.image_url.url.startsWith("data:image/")) { + return item; + } + // Otherwise, it's a regular URL that needs to be converted to base64 + // The conversion should have been handled by preProcessImageContent + return item; + } + if ("document" in item) { + // Handle document content + const doc = item as any; + if ( + doc?.document?.format && + doc?.document?.name && + doc?.document?.source?.bytes + ) { + return { + type: "document", + document: { + format: doc.document.format, + name: doc.document.name, + source: { + bytes: doc.document.source.bytes, + }, + }, + }; + } + } + return item; + }), + }; + } + // If content is a string, return it as is + return { + role: v.role, + content, + }; + }), + ); + + const requestBody: BedrockChatRequest = { + messages, + stream: shouldStream, + model: modelConfig.model, + max_tokens: modelConfig.max_tokens, + temperature: modelConfig.temperature, + top_p: modelConfig.top_p, + }; + + console.log("[Bedrock] Request:", { + model: modelConfig.model, + messages: messages, + }); + + const controller = new AbortController(); + options.onController?.(controller); + + const headers: Record = { + ...getHeaders(), + "X-Region": accessStore.awsRegion, + "X-Access-Key": accessStore.awsAccessKeyId, + "X-Secret-Key": accessStore.awsSecretAccessKey, + }; + + if (accessStore.awsSessionToken) { + headers["X-Session-Token"] = accessStore.awsSessionToken; + } + + try { + if (shouldStream) { + let responseText = ""; + const pluginStore = usePluginStore.getState(); + const currentSession = useChatStore.getState().currentSession(); + const [tools, funcs] = pluginStore.getAsTools( + currentSession.mask?.plugin || [], + ); + + await stream( + `${ApiPath.Bedrock}/invoke`, + requestBody, + headers, + Array.isArray(tools) ? tools : [], + funcs || {}, + controller, + (chunk: string) => { + try { + responseText += chunk; + return chunk; + } catch (e) { + console.error("[Request] parse error", chunk, e); + return ""; + } + }, + ( + requestPayload: any, + toolCallMessage: any, + toolCallResult: any[], + ) => { + console.log("[Bedrock] processToolMessage", { + requestPayload, + toolCallMessage, + toolCallResult, + }); + }, + options, + ); + } else { + const response = await fetch(`${ApiPath.Bedrock}/invoke`, { + method: "POST", + headers, + body: JSON.stringify(requestBody), + signal: controller.signal, + }); + + if (!response.ok) { + const error = await response.text(); + console.error("[Bedrock] Error response:", error); + throw new Error(`Bedrock API error: ${error}`); + } + + const text = await response.text(); + options.onFinish(text); + } + } catch (e) { + console.error("[Bedrock] Chat error:", e); + options.onError?.(e as Error); + } + } + + async usage() { + return { + used: 0, + total: 0, + }; + } + + async models() { + return []; + } +} diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 666caece838..9c6d9793c00 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -963,7 +963,75 @@ export function Settings() { ); - + const bedrockConfigComponent = accessStore.provider === + ServiceProvider.Bedrock && ( + <> + + + accessStore.update( + (access) => (access.awsRegion = e.currentTarget.value), + ) + } + /> + + + { + accessStore.update( + (access) => (access.awsAccessKeyId = e.currentTarget.value), + ); + }} + /> + + + { + accessStore.update( + (access) => (access.awsSecretAccessKey = e.currentTarget.value), + ); + }} + /> + + + { + accessStore.update( + (access) => (access.awsSessionToken = e.currentTarget.value), + ); + }} + /> + + + ); const baiduConfigComponent = accessStore.provider === ServiceProvider.Baidu && ( <> @@ -1682,6 +1750,7 @@ export function Settings() { {openAIConfigComponent} + {bedrockConfigComponent} {azureConfigComponent} {googleConfigComponent} {anthropicConfigComponent} diff --git a/app/config/server.ts b/app/config/server.ts index eac4ba0cf33..7e130aa0e32 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -12,6 +12,10 @@ declare global { BASE_URL?: string; OPENAI_ORG_ID?: string; // openai only + // bedrock only + BEDROCK_URL?: string; + BEDROCK_API_KEY?: string; + VERCEL?: string; BUILD_MODE?: "standalone" | "export"; BUILD_APP?: string; // is building desktop app @@ -139,7 +143,7 @@ export const getServerSideConfig = () => { } const isStability = !!process.env.STABILITY_API_KEY; - + const isBedrock = !!process.env.BEDROCK_API_KEY; const isAzure = !!process.env.AZURE_URL; const isGoogle = !!process.env.GOOGLE_API_KEY; const isAnthropic = !!process.env.ANTHROPIC_API_KEY; @@ -168,6 +172,10 @@ export const getServerSideConfig = () => { apiKey: getApiKey(process.env.OPENAI_API_KEY), openaiOrgId: process.env.OPENAI_ORG_ID, + isBedrock, + bedrockUrl: process.env.BEDROCK_URL, + bedrockApiKey: getApiKey(process.env.BEDROCK_API_KEY), + isStability, stabilityUrl: process.env.STABILITY_URL, stabilityApiKey: getApiKey(process.env.STABILITY_API_KEY), diff --git a/app/constant.ts b/app/constant.ts index 9774bb594dd..0a90398783d 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -12,6 +12,8 @@ export const RUNTIME_CONFIG_DOM = "danger-runtime-config"; export const STABILITY_BASE_URL = "https://api.stability.ai"; export const OPENAI_BASE_URL = "https://api.openai.com"; +export const BEDROCK_BASE_URL = + "https://bedrock-runtime.us-west-2.amazonaws.com"; export const ANTHROPIC_BASE_URL = "https://api.anthropic.com"; export const GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/"; @@ -49,6 +51,7 @@ export enum Path { export enum ApiPath { Cors = "", + Bedrock = "/api/bedrock", Azure = "/api/azure", OpenAI = "/api/openai", Anthropic = "/api/anthropic", @@ -115,6 +118,7 @@ export enum ServiceProvider { Stability = "Stability", Iflytek = "Iflytek", XAI = "XAI", + Bedrock = "Bedrock", } // Google API safety settings, see https://ai.google.dev/gemini-api/docs/safety-settings @@ -128,6 +132,7 @@ export enum GoogleSafetySettingsThreshold { export enum ModelProvider { Stability = "Stability", + Bedrock = "Bedrock", GPT = "GPT", GeminiPro = "GeminiPro", Claude = "Claude", @@ -304,6 +309,26 @@ const openaiModels = [ "o1-preview", ]; +const bedrockModels = [ + // Claude Models + "anthropic.claude-3-haiku-20240307-v1:0", + "anthropic.claude-3-sonnet-20240229-v1:0", + "anthropic.claude-3-opus-20240229-v1:0", + "anthropic.claude-3-5-sonnet-20240620-v1:0", + "anthropic.claude-3-5-sonnet-20241022-v2:0", + // Amazon Titan Models + "amazon.titan-text-express-v1", + "amazon.titan-text-lite-v1", + // Meta Llama Models + "meta.llama3-2-1b-instruct-v1:0", + "meta.llama3-2-3b-instruct-v1:0", + "meta.llama3-2-11b-instruct-v1:0", + //Mistral + "mistral.mistral-7b-instruct-v0:2", + "mistral.mixtral-8x7b-instruct-v0:1", + "mistral.mistral-large-2407-v1:0", +]; + const googleModels = [ "gemini-1.0-pro", "gemini-1.5-pro-latest", @@ -499,6 +524,17 @@ export const DEFAULT_MODELS = [ sorted: 11, }, })), + ...bedrockModels.map((name) => ({ + name, + available: true, + sorted: seq++, + provider: { + id: "bedrock", + providerName: "Bedrock", + providerType: "bedrock", + sorted: 12, + }, + })), ] as const; export const CHAT_PAGE_SIZE = 15; diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 006fc81620d..573969be7b1 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -342,6 +342,32 @@ const cn = { SubTitle: "除默认地址外,必须包含 http(s)://", }, }, + Bedrock: { + Region: { + Title: "AWS Region", + SubTitle: "The AWS region where Bedrock service is located", + Placeholder: "us-west-2", + }, + AccessKey: { + Title: "AWS Access Key ID", + SubTitle: "Your AWS access key ID for Bedrock service", + Placeholder: "AKIA...", + }, + SecretKey: { + Title: "AWS Secret Access Key", + SubTitle: "Your AWS secret access key for Bedrock service", + Placeholder: "****", + }, + SessionToken: { + Title: "AWS Session Token (Optional)", + SubTitle: "Your AWS session token if using temporary credentials", + Placeholder: "Optional session token", + }, + Endpoint: { + Title: "AWS Bedrock Endpoint", + SubTitle: "Custom endpoint for AWS Bedrock API. Default: ", + }, + }, Azure: { ApiKey: { Title: "接口密钥", diff --git a/app/locales/en.ts b/app/locales/en.ts index 7204bd94696..9d3097ef822 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -346,6 +346,32 @@ const en: LocaleType = { SubTitle: "Must start with http(s):// or use /api/openai as default", }, }, + Bedrock: { + Region: { + Title: "AWS Region", + SubTitle: "The AWS region where Bedrock service is located", + Placeholder: "us-west-2", + }, + AccessKey: { + Title: "AWS Access Key ID", + SubTitle: "Your AWS access key ID for Bedrock service", + Placeholder: "AKIA...", + }, + SecretKey: { + Title: "AWS Secret Access Key", + SubTitle: "Your AWS secret access key for Bedrock service", + Placeholder: "****", + }, + SessionToken: { + Title: "AWS Session Token (Optional)", + SubTitle: "Your AWS session token if using temporary credentials", + Placeholder: "Optional session token", + }, + Endpoint: { + Title: "AWS Bedrock Endpoint", + SubTitle: "Custom endpoint for AWS Bedrock API. Default: ", + }, + }, Azure: { ApiKey: { Title: "Azure Api Key", diff --git a/app/store/access.ts b/app/store/access.ts index b3d412a2daf..11127cbed15 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -4,6 +4,7 @@ import { StoreKey, ApiPath, OPENAI_BASE_URL, + BEDROCK_BASE_URL, ANTHROPIC_BASE_URL, GEMINI_BASE_URL, BAIDU_BASE_URL, @@ -26,6 +27,7 @@ let fetchState = 0; // 0 not fetch, 1 fetching, 2 done const isApp = getClientConfig()?.buildMode === "export"; const DEFAULT_OPENAI_URL = isApp ? OPENAI_BASE_URL : ApiPath.OpenAI; +const DEFAULT_BEDROCK_URL = isApp ? BEDROCK_BASE_URL : ApiPath.Bedrock; const DEFAULT_GOOGLE_URL = isApp ? GEMINI_BASE_URL : ApiPath.Google; @@ -57,6 +59,16 @@ const DEFAULT_ACCESS_STATE = { openaiUrl: DEFAULT_OPENAI_URL, openaiApiKey: "", + // bedrock + bedrockUrl: DEFAULT_BEDROCK_URL, + bedrockApiKey: "", + awsRegion: "", + awsAccessKeyId: "", + awsSecretAccessKey: "", + awsSessionToken: "", + awsCognitoUser: false, + awsInferenceProfile: "", // Added inference profile field + // azure azureUrl: "", azureApiKey: "", @@ -141,6 +153,14 @@ export const useAccessStore = createPersistStore( return ensure(get(), ["openaiApiKey"]); }, + isValidBedrock() { + return ensure(get(), [ + "awsAccessKeyId", + "awsSecretAccessKey", + "awsRegion", + ]); + }, + isValidAzure() { return ensure(get(), ["azureUrl", "azureApiKey", "azureApiVersion"]); }, @@ -186,6 +206,7 @@ export const useAccessStore = createPersistStore( // has token or has code or disabled access control return ( this.isValidOpenAI() || + this.isValidBedrock() || this.isValidAzure() || this.isValidGoogle() || this.isValidAnthropic() || diff --git a/app/utils.ts b/app/utils.ts index d8fc46330d1..78cfe5a0e74 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -285,6 +285,9 @@ export function showPlugins(provider: ServiceProvider, model: string) { if (provider == ServiceProvider.Anthropic && !model.includes("claude-2")) { return true; } + if (provider == ServiceProvider.Bedrock && !model.includes("claude-2")) { + return true; + } if (provider == ServiceProvider.Google && !model.includes("vision")) { return true; } diff --git a/package.json b/package.json index 5bca3b327f6..d1c8e8278bf 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,8 @@ "sass": "^1.59.2", "spark-md5": "^3.0.2", "use-debounce": "^9.0.4", - "zustand": "^4.3.8" + "zustand": "^4.3.8", + "@aws-sdk/client-bedrock-runtime": "^3.679.0" }, "devDependencies": { "@tauri-apps/api": "^1.6.0", From dca4a0e48f13598cca97be008007abe65e0a4ef6 Mon Sep 17 00:00:00 2001 From: glay Date: Thu, 31 Oct 2024 14:23:38 +0800 Subject: [PATCH 02/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/api/bedrock/models.ts=20=09=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20app/api/bedrock/utils.ts=20=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=20=20=20app/client/api.ts=20=09?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/client/platforms/?= =?UTF-8?q?bedrock.ts=20=09=E6=96=B0=E6=96=87=E4=BB=B6=EF=BC=9A=20=20=20ap?= =?UTF-8?q?p/components/chat-actions.tsx=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A?= =?UTF-8?q?=20=20=20=20=20app/components/chat.module.scss=20=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=20=20=20app/components/chat.tsx=20=09?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/constant.ts=20=09?= =?UTF-8?q?=E6=96=B0=E6=96=87=E4=BB=B6=EF=BC=9A=20=20=20app/icons/document?= =?UTF-8?q?.svg=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/locales?= =?UTF-8?q?/cn.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/local?= =?UTF-8?q?es/en.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 339 +++++++++--------- app/api/bedrock/models.ts | 591 +++++++++++++++++++------------- app/api/bedrock/utils.ts | 338 +++++++++++++----- app/client/api.ts | 10 +- app/client/platforms/bedrock.ts | 478 ++++++++++++++++++-------- app/components/chat-actions.tsx | 188 ++++++++++ app/components/chat.module.scss | 13 +- app/components/chat.tsx | 95 ++++- app/constant.ts | 10 +- app/icons/document.svg | 7 + app/locales/cn.ts | 1 + app/locales/en.ts | 1 + 12 files changed, 1424 insertions(+), 647 deletions(-) create mode 100644 app/components/chat-actions.tsx create mode 100644 app/icons/document.svg diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index e2d212817b1..9d7ddb4faaa 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -4,25 +4,17 @@ import { NextRequest, NextResponse } from "next/server"; import { auth } from "./auth"; import { BedrockRuntimeClient, - InvokeModelCommand, + ConverseStreamOutput, ValidationException, + ModelStreamErrorException, + ThrottlingException, + ServiceUnavailableException, + InternalServerException, } from "@aws-sdk/client-bedrock-runtime"; import { validateModelId } from "./bedrock/utils"; -import { - ConverseRequest, - formatRequestBody, - parseModelResponse, -} from "./bedrock/models"; - -interface ContentItem { - type: string; - text?: string; - image_url?: { - url: string; - }; -} +import { ConverseRequest, createConverseStreamCommand } from "./bedrock/models"; -const ALLOWED_PATH = new Set(["invoke", "converse"]); +const ALLOWED_PATH = new Set(["converse"]); export async function handle( req: NextRequest, @@ -57,29 +49,10 @@ export async function handle( } try { - if (subpath === "converse") { - const response = await handleConverseRequest(req); - return response; - } else { - const response = await handleInvokeRequest(req); - return response; - } + const response = await handleConverseRequest(req); + return response; } catch (e) { console.error("[Bedrock] ", e); - - // Handle specific error cases - if (e instanceof ValidationException) { - return NextResponse.json( - { - error: true, - message: - "Model validation error. If using a Llama model, please provide a valid inference profile ARN.", - details: e.message, - }, - { status: 400 }, - ); - } - return NextResponse.json( { error: true, @@ -92,9 +65,7 @@ export async function handle( } async function handleConverseRequest(req: NextRequest) { - const controller = new AbortController(); - - const region = req.headers.get("X-Region") || "us-east-1"; + const region = req.headers.get("X-Region") || "us-west-2"; const accessKeyId = req.headers.get("X-Access-Key") || ""; const secretAccessKey = req.headers.get("X-Secret-Key") || ""; const sessionToken = req.headers.get("X-Session-Token"); @@ -111,8 +82,6 @@ async function handleConverseRequest(req: NextRequest) { ); } - console.log("[Bedrock] Using region:", region); - const client = new BedrockRuntimeClient({ region, credentials: { @@ -122,167 +91,171 @@ async function handleConverseRequest(req: NextRequest) { }, }); - const timeoutId = setTimeout( - () => { - controller.abort(); - }, - 10 * 60 * 1000, - ); - try { const body = (await req.json()) as ConverseRequest; const { modelId } = body; - // Validate model ID const validationError = validateModelId(modelId); if (validationError) { - throw new ValidationException({ - message: validationError, - $metadata: {}, - }); + throw new Error(validationError); } console.log("[Bedrock] Invoking model:", modelId); - console.log("[Bedrock] Messages:", body.messages); - - const requestBody = formatRequestBody(body); - const jsonString = JSON.stringify(requestBody); - const input = { - modelId, - contentType: "application/json", - accept: "application/json", - body: Uint8Array.from(Buffer.from(jsonString)), - }; - - console.log("[Bedrock] Request input:", { - ...input, - body: requestBody, - }); - - const command = new InvokeModelCommand(input); + const command = createConverseStreamCommand(body); const response = await client.send(command); - console.log("[Bedrock] Got response"); - - // Parse and format the response based on model type - const responseBody = new TextDecoder().decode(response.body); - const formattedResponse = parseModelResponse(responseBody, modelId); - - return NextResponse.json(formattedResponse); - } catch (e) { - console.error("[Bedrock] Request error:", e); - throw e; // Let the main error handler deal with it - } finally { - clearTimeout(timeoutId); - } -} - -async function handleInvokeRequest(req: NextRequest) { - const controller = new AbortController(); - - const region = req.headers.get("X-Region") || "us-east-1"; - const accessKeyId = req.headers.get("X-Access-Key") || ""; - const secretAccessKey = req.headers.get("X-Secret-Key") || ""; - const sessionToken = req.headers.get("X-Session-Token"); - - if (!accessKeyId || !secretAccessKey) { - return NextResponse.json( - { - error: true, - message: "Missing AWS credentials", - }, - { - status: 401, - }, - ); - } - - const client = new BedrockRuntimeClient({ - region, - credentials: { - accessKeyId, - secretAccessKey, - sessionToken: sessionToken || undefined, - }, - }); - - const timeoutId = setTimeout( - () => { - controller.abort(); - }, - 10 * 60 * 1000, - ); - - try { - const body = await req.json(); - const { messages, model } = body; - - // Validate model ID - const validationError = validateModelId(model); - if (validationError) { - throw new ValidationException({ - message: validationError, - $metadata: {}, - }); + if (!response.stream) { + throw new Error("No stream in response"); } - console.log("[Bedrock] Invoking model:", model); - console.log("[Bedrock] Messages:", messages); - - const requestBody = formatRequestBody({ - modelId: model, - messages, - inferenceConfig: { - maxTokens: 2048, - temperature: 0.7, - topP: 0.9, + // Create a ReadableStream for the response + const stream = new ReadableStream({ + async start(controller) { + try { + const responseStream = response.stream; + if (!responseStream) { + throw new Error("No stream in response"); + } + + for await (const event of responseStream) { + const output = event as ConverseStreamOutput; + + if ("messageStart" in output && output.messageStart?.role) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "messageStart", + role: output.messageStart.role, + })}\n\n`, + ); + } else if ( + "contentBlockStart" in output && + output.contentBlockStart + ) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "contentBlockStart", + index: output.contentBlockStart.contentBlockIndex, + start: output.contentBlockStart.start, + })}\n\n`, + ); + } else if ( + "contentBlockDelta" in output && + output.contentBlockDelta?.delta + ) { + if ("text" in output.contentBlockDelta.delta) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "text", + content: output.contentBlockDelta.delta.text, + })}\n\n`, + ); + } else if ("toolUse" in output.contentBlockDelta.delta) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "toolUse", + input: output.contentBlockDelta.delta.toolUse?.input, + })}\n\n`, + ); + } + } else if ( + "contentBlockStop" in output && + output.contentBlockStop + ) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "contentBlockStop", + index: output.contentBlockStop.contentBlockIndex, + })}\n\n`, + ); + } else if ("messageStop" in output && output.messageStop) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "messageStop", + stopReason: output.messageStop.stopReason, + additionalModelResponseFields: + output.messageStop.additionalModelResponseFields, + })}\n\n`, + ); + } else if ("metadata" in output && output.metadata) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "metadata", + usage: output.metadata.usage, + metrics: output.metadata.metrics, + trace: output.metadata.trace, + })}\n\n`, + ); + } + } + controller.close(); + } catch (error) { + if (error instanceof ValidationException) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "error", + error: "ValidationException", + message: error.message, + })}\n\n`, + ); + } else if (error instanceof ModelStreamErrorException) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "error", + error: "ModelStreamErrorException", + message: error.message, + originalStatusCode: error.originalStatusCode, + originalMessage: error.originalMessage, + })}\n\n`, + ); + } else if (error instanceof ThrottlingException) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "error", + error: "ThrottlingException", + message: error.message, + })}\n\n`, + ); + } else if (error instanceof ServiceUnavailableException) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "error", + error: "ServiceUnavailableException", + message: error.message, + })}\n\n`, + ); + } else if (error instanceof InternalServerException) { + controller.enqueue( + `data: ${JSON.stringify({ + type: "error", + error: "InternalServerException", + message: error.message, + })}\n\n`, + ); + } else { + controller.enqueue( + `data: ${JSON.stringify({ + type: "error", + error: "UnknownError", + message: + error instanceof Error ? error.message : "Unknown error", + })}\n\n`, + ); + } + controller.close(); + } }, }); - const jsonString = JSON.stringify(requestBody); - const input = { - modelId: model, - contentType: "application/json", - accept: "application/json", - body: Uint8Array.from(Buffer.from(jsonString)), - }; - - console.log("[Bedrock] Request input:", { - ...input, - body: requestBody, - }); - - const command = new InvokeModelCommand(input); - const response = await client.send(command); - - console.log("[Bedrock] Got response"); - - // Parse and format the response - const responseBody = new TextDecoder().decode(response.body); - const formattedResponse = parseModelResponse(responseBody, model); - - // Extract text content from the response - let textContent = ""; - if (formattedResponse.content && Array.isArray(formattedResponse.content)) { - textContent = formattedResponse.content - .filter((item: ContentItem) => item.type === "text") - .map((item: ContentItem) => item.text || "") - .join(""); - } else if (typeof formattedResponse.content === "string") { - textContent = formattedResponse.content; - } - - // Return plain text response - return new NextResponse(textContent, { + return new Response(stream, { headers: { - "Content-Type": "text/plain", + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", }, }); - } catch (e) { - console.error("[Bedrock] Request error:", e); - throw e; - } finally { - clearTimeout(timeoutId); + } catch (error) { + console.error("[Bedrock] Request error:", error); + throw error; } } diff --git a/app/api/bedrock/models.ts b/app/api/bedrock/models.ts index b9a0fee5099..f6bb297d268 100644 --- a/app/api/bedrock/models.ts +++ b/app/api/bedrock/models.ts @@ -1,280 +1,405 @@ import { - Message, - validateMessageOrder, - processDocumentContent, - BedrockTextBlock, - BedrockImageBlock, - BedrockDocumentBlock, -} from "./utils"; + ConverseStreamCommand, + type ConverseStreamCommandInput, + type Message, + type ContentBlock, + type SystemContentBlock, + type Tool, + type ToolChoice, + type ToolResultContentBlock, +} from "@aws-sdk/client-bedrock-runtime"; export interface ConverseRequest { modelId: string; - messages: Message[]; + messages: { + role: "user" | "assistant" | "system"; + content: string | ContentItem[]; + }[]; inferenceConfig?: { maxTokens?: number; temperature?: number; topP?: number; + stopSequences?: string[]; + }; + toolConfig?: { + tools: Tool[]; + toolChoice?: ToolChoice; }; - system?: string; - tools?: Array<{ - type: "function"; - function: { - name: string; - description: string; - parameters: { - type: string; - properties: Record; - required: string[]; - }; - }; - }>; } interface ContentItem { - type: string; + type: "text" | "image_url" | "document" | "tool_use" | "tool_result"; text?: string; image_url?: { - url: string; + url: string; // base64 data URL }; document?: { - format: string; + format: + | "pdf" + | "csv" + | "doc" + | "docx" + | "xls" + | "xlsx" + | "html" + | "txt" + | "md"; name: string; source: { - bytes: string; + bytes: string; // base64 }; }; + tool_use?: { + tool_use_id: string; + name: string; + input: any; + }; + tool_result?: { + tool_use_id: string; + content: ToolResultItem[]; + status: "success" | "error"; + }; } -type ProcessedContent = - | ContentItem - | BedrockTextBlock - | BedrockImageBlock - | BedrockDocumentBlock - | { - type: string; - source: { type: string; media_type: string; data: string }; +interface ToolResultItem { + type: "text" | "image" | "document" | "json"; + text?: string; + image?: { + format: "png" | "jpeg" | "gif" | "webp"; + source: { + bytes: string; // base64 }; + }; + document?: { + format: + | "pdf" + | "csv" + | "doc" + | "docx" + | "xls" + | "xlsx" + | "html" + | "txt" + | "md"; + name: string; + source: { + bytes: string; // base64 + }; + }; + json?: any; +} -// Helper function to format request body based on model type -export function formatRequestBody(request: ConverseRequest) { - const baseModel = request.modelId; - const messages = validateMessageOrder(request.messages).map((msg) => ({ - role: msg.role, - content: Array.isArray(msg.content) - ? msg.content.map((item: ContentItem) => { - if (item.type === "image_url" && item.image_url?.url) { - // If it's a base64 image URL - const base64Match = item.image_url.url.match( - /^data:image\/([a-zA-Z]*);base64,([^"]*)$/, - ); - if (base64Match) { - return { - type: "image", - source: { - type: "base64", - media_type: `image/${base64Match[1]}`, - data: base64Match[2], - }, - }; - } - // If it's not a base64 URL, return as is - return item; - } - if ("document" in item) { - try { - return processDocumentContent(item); - } catch (error) { - console.error("Error processing document:", error); - return { - type: "text", - text: `[Document: ${item.document?.name || "Unknown"}]`, - }; - } - } - return { type: "text", text: item.text }; - }) - : [{ type: "text", text: msg.content }], - })); - - const systemPrompt = request.system - ? [{ type: "text", text: request.system }] - : undefined; +function convertContentToAWSBlock(item: ContentItem): ContentBlock | null { + if (item.type === "text" && item.text) { + return { text: item.text }; + } - const baseConfig = { - max_tokens: request.inferenceConfig?.maxTokens || 2048, - temperature: request.inferenceConfig?.temperature || 0.7, - top_p: request.inferenceConfig?.topP || 0.9, - }; + if (item.type === "image_url" && item.image_url?.url) { + const base64Match = item.image_url.url.match( + /^data:image\/([a-zA-Z]*);base64,([^"]*)/, + ); + if (base64Match) { + const format = base64Match[1].toLowerCase(); + if ( + format === "png" || + format === "jpeg" || + format === "gif" || + format === "webp" + ) { + const base64Data = base64Match[2]; + return { + image: { + format: format as "png" | "jpeg" | "gif" | "webp", + source: { + bytes: Uint8Array.from(Buffer.from(base64Data, "base64")), + }, + }, + }; + } + } + } - if (baseModel.startsWith("anthropic.claude")) { + if (item.type === "document" && item.document) { return { - messages, - system: systemPrompt, - anthropic_version: "bedrock-2023-05-31", - ...baseConfig, - ...(request.tools && { tools: request.tools }), + document: { + format: item.document.format, + name: item.document.name, + source: { + bytes: Uint8Array.from( + Buffer.from(item.document.source.bytes, "base64"), + ), + }, + }, }; - } else if ( - baseModel.startsWith("meta.llama") || - baseModel.startsWith("mistral.") - ) { + } + + if (item.type === "tool_use" && item.tool_use) { return { - messages: messages.map((m) => ({ - role: m.role, - content: Array.isArray(m.content) - ? m.content.map((c: ProcessedContent) => { - if ("text" in c) return { type: "text", text: c.text || "" }; - if ("image_url" in c) - return { - type: "text", - text: `[Image: ${c.image_url?.url || "URL not provided"}]`, - }; - if ("document" in c) - return { - type: "text", - text: `[Document: ${c.document?.name || "Unknown"}]`, - }; - return { type: "text", text: "" }; - }) - : [{ type: "text", text: m.content }], - })), - ...baseConfig, - stop_sequences: ["\n\nHuman:", "\n\nAssistant:"], + toolUse: { + toolUseId: item.tool_use.tool_use_id, + name: item.tool_use.name, + input: item.tool_use.input, + }, }; - } else if (baseModel.startsWith("amazon.titan")) { - const formattedText = messages.map((m) => ({ - role: m.role, - content: [ - { - type: "text", - text: `${m.role === "user" ? "Human" : "Assistant"}: ${ - Array.isArray(m.content) - ? m.content - .map((c: ProcessedContent) => { - if ("text" in c) return c.text || ""; - if ("image_url" in c) - return `[Image: ${ - c.image_url?.url || "URL not provided" - }]`; - if ("document" in c) - return `[Document: ${c.document?.name || "Unknown"}]`; - return ""; - }) - .join("") - : m.content - }`, - }, - ], - })); + } + + if (item.type === "tool_result" && item.tool_result) { + const toolResultContent = item.tool_result.content + .map((resultItem) => { + if (resultItem.type === "text" && resultItem.text) { + return { text: resultItem.text } as ToolResultContentBlock; + } + if (resultItem.type === "image" && resultItem.image) { + return { + image: { + format: resultItem.image.format, + source: { + bytes: Uint8Array.from( + Buffer.from(resultItem.image.source.bytes, "base64"), + ), + }, + }, + } as ToolResultContentBlock; + } + if (resultItem.type === "document" && resultItem.document) { + return { + document: { + format: resultItem.document.format, + name: resultItem.document.name, + source: { + bytes: Uint8Array.from( + Buffer.from(resultItem.document.source.bytes, "base64"), + ), + }, + }, + } as ToolResultContentBlock; + } + if (resultItem.type === "json" && resultItem.json) { + return { json: resultItem.json } as ToolResultContentBlock; + } + return null; + }) + .filter((content): content is ToolResultContentBlock => content !== null); + + if (toolResultContent.length === 0) { + return null; + } return { - messages: formattedText, - textGenerationConfig: { - maxTokenCount: baseConfig.max_tokens, - temperature: baseConfig.temperature, - topP: baseConfig.top_p, - stopSequences: ["Human:", "Assistant:"], + toolResult: { + toolUseId: item.tool_result.tool_use_id, + content: toolResultContent, + status: item.tool_result.status, }, }; } - throw new Error(`Unsupported model: ${baseModel}`); + return null; } -// Helper function to parse and format response based on model type -export function parseModelResponse(responseBody: string, modelId: string): any { - const baseModel = modelId; +function convertContentToAWS(content: string | ContentItem[]): ContentBlock[] { + if (typeof content === "string") { + return [{ text: content }]; + } - try { - const response = JSON.parse(responseBody); + // Filter out null blocks and ensure each content block is valid + const blocks = content + .map(convertContentToAWSBlock) + .filter((block): block is ContentBlock => block !== null); - // Common response format for all models - const formatResponse = (content: string | any[]) => ({ - role: "assistant", - content: Array.isArray(content) - ? content.map((item) => { - if (typeof item === "string") { - return { type: "text", text: item }; - } - // Handle different content types - if ("text" in item) { - return { type: "text", text: item.text || "" }; - } - if ("image" in item) { - return { - type: "image_url", - image_url: { - url: `data:image/${ - item.source?.media_type || "image/png" - };base64,${item.source?.data || ""}`, - }, - }; - } - // Document responses are converted to text - if ("document" in item) { - return { - type: "text", - text: `[Document Content]\n${item.text || ""}`, - }; - } - return { type: "text", text: item.text || "" }; - }) - : [{ type: "text", text: content }], - stop_reason: response.stop_reason || response.stopReason || "end_turn", - usage: response.usage || { - input_tokens: 0, - output_tokens: 0, - total_tokens: 0, - }, - }); + // If no valid blocks, provide a default text block + if (blocks.length === 0) { + return [{ text: "" }]; + } - if (baseModel.startsWith("anthropic.claude")) { - // Handle the new Converse API response format - if (response.output?.message) { - return { - role: response.output.message.role, - content: response.output.message.content.map((item: any) => { - if ("text" in item) return { type: "text", text: item.text || "" }; - if ("image" in item) { - return { - type: "image_url", - image_url: { - url: `data:${item.source?.media_type || "image/png"};base64,${ - item.source?.data || "" - }`, - }, - }; - } - return { type: "text", text: item.text || "" }; - }), - stop_reason: response.stopReason, - usage: response.usage, - }; + return blocks; +} + +function formatMessages(messages: ConverseRequest["messages"]): { + messages: Message[]; + systemPrompt?: SystemContentBlock[]; +} { + // Extract system messages + const systemMessages = messages.filter((msg) => msg.role === "system"); + const nonSystemMessages = messages.filter((msg) => msg.role !== "system"); + + // Convert system messages to SystemContentBlock array + const systemPrompt = + systemMessages.length > 0 + ? systemMessages.map((msg) => { + if (typeof msg.content === "string") { + return { text: msg.content } as SystemContentBlock; + } + // For multimodal content, convert each content item + const blocks = convertContentToAWS(msg.content); + return blocks[0] as SystemContentBlock; // Take first block as system content + }) + : undefined; + + // Format remaining messages + const formattedMessages = nonSystemMessages.reduce( + (acc: Message[], curr, idx) => { + // Skip if same role as previous message + if (idx > 0 && curr.role === nonSystemMessages[idx - 1].role) { + return acc; } - // Fallback for older format - return formatResponse( - response.content || - (response.completion - ? [{ type: "text", text: response.completion }] - : []), - ); - } else if (baseModel.startsWith("meta.llama")) { - return formatResponse(response.generation || response.completion || ""); - } else if (baseModel.startsWith("amazon.titan")) { - return formatResponse(response.results?.[0]?.outputText || ""); - } else if (baseModel.startsWith("mistral.")) { - return formatResponse( - response.outputs?.[0]?.text || response.response || "", - ); - } - throw new Error(`Unsupported model: ${baseModel}`); - } catch (e) { - console.error("[Bedrock] Failed to parse response:", e); - // Return raw text as fallback + const content = convertContentToAWS(curr.content); + if (content.length > 0) { + acc.push({ + role: curr.role as "user" | "assistant", + content, + }); + } + return acc; + }, + [], + ); + + // Ensure conversation starts with user + if (formattedMessages.length === 0 || formattedMessages[0].role !== "user") { + formattedMessages.unshift({ + role: "user", + content: [{ text: "Hello" }], + }); + } + + // Ensure conversation ends with user + if (formattedMessages[formattedMessages.length - 1].role !== "user") { + formattedMessages.push({ + role: "user", + content: [{ text: "Continue" }], + }); + } + + return { messages: formattedMessages, systemPrompt }; +} + +export function formatRequestBody( + request: ConverseRequest, +): ConverseStreamCommandInput { + const { messages, systemPrompt } = formatMessages(request.messages); + const input: ConverseStreamCommandInput = { + modelId: request.modelId, + messages, + ...(systemPrompt && { system: systemPrompt }), + }; + + if (request.inferenceConfig) { + input.inferenceConfig = { + maxTokens: request.inferenceConfig.maxTokens, + temperature: request.inferenceConfig.temperature, + topP: request.inferenceConfig.topP, + stopSequences: request.inferenceConfig.stopSequences, + }; + } + + if (request.toolConfig) { + input.toolConfig = { + tools: request.toolConfig.tools, + toolChoice: request.toolConfig.toolChoice, + }; + } + + // Create a clean version of the input for logging + const logInput = { + ...input, + messages: messages.map((msg) => ({ + role: msg.role, + content: msg.content?.map((content) => { + if ("image" in content && content.image) { + return { + image: { + format: content.image.format, + source: { bytes: "[BINARY]" }, + }, + }; + } + if ("document" in content && content.document) { + return { + document: { ...content.document, source: { bytes: "[BINARY]" } }, + }; + } + return content; + }), + })), + }; + + console.log( + "[Bedrock] Formatted request:", + JSON.stringify(logInput, null, 2), + ); + return input; +} + +export function createConverseStreamCommand(request: ConverseRequest) { + const input = formatRequestBody(request); + return new ConverseStreamCommand(input); +} + +export interface StreamResponse { + type: + | "messageStart" + | "contentBlockStart" + | "contentBlockDelta" + | "contentBlockStop" + | "messageStop" + | "metadata" + | "error"; + role?: string; + index?: number; + start?: any; + delta?: any; + stopReason?: string; + additionalModelResponseFields?: any; + usage?: any; + metrics?: any; + trace?: any; + error?: string; + message?: string; + originalStatusCode?: number; + originalMessage?: string; +} + +export function parseStreamResponse(chunk: any): StreamResponse | null { + if (chunk.messageStart) { + return { type: "messageStart", role: chunk.messageStart.role }; + } + if (chunk.contentBlockStart) { + return { + type: "contentBlockStart", + index: chunk.contentBlockStart.contentBlockIndex, + start: chunk.contentBlockStart.start, + }; + } + if (chunk.contentBlockDelta) { + return { + type: "contentBlockDelta", + index: chunk.contentBlockDelta.contentBlockIndex, + delta: chunk.contentBlockDelta.delta, + }; + } + if (chunk.contentBlockStop) { + return { + type: "contentBlockStop", + index: chunk.contentBlockStop.contentBlockIndex, + }; + } + if (chunk.messageStop) { + return { + type: "messageStop", + stopReason: chunk.messageStop.stopReason, + additionalModelResponseFields: + chunk.messageStop.additionalModelResponseFields, + }; + } + if (chunk.metadata) { return { - role: "assistant", - content: [{ type: "text", text: responseBody }], + type: "metadata", + usage: chunk.metadata.usage, + metrics: chunk.metadata.metrics, + trace: chunk.metadata.trace, }; } + return null; } diff --git a/app/api/bedrock/utils.ts b/app/api/bedrock/utils.ts index 85cd517b439..c58808a01cd 100644 --- a/app/api/bedrock/utils.ts +++ b/app/api/bedrock/utils.ts @@ -11,43 +11,149 @@ export interface ImageSource { export interface DocumentSource { bytes: string; // base64 encoded document bytes + media_type?: string; // MIME type of the document } +export type DocumentFormat = + | "pdf" + | "csv" + | "doc" + | "docx" + | "xls" + | "xlsx" + | "html" + | "txt" + | "md"; +export type ImageFormat = "png" | "jpeg" | "gif" | "webp"; + export interface BedrockImageBlock { + type: "image"; image: { - format: "png" | "jpeg" | "gif" | "webp"; - source: ImageSource; + format: ImageFormat; + source: { + bytes: string; + }; }; } export interface BedrockDocumentBlock { + type: "document"; document: { - format: - | "pdf" - | "csv" - | "doc" - | "docx" - | "xls" - | "xlsx" - | "html" - | "txt" - | "md"; + format: string; name: string; - source: DocumentSource; + source: { + bytes: string; + media_type?: string; + }; }; } export interface BedrockTextBlock { + type: "text"; text: string; } -export type BedrockContentBlock = +export interface BedrockToolCallBlock { + type: "tool_calls"; + tool_calls: BedrockToolCall[]; +} + +export interface BedrockToolResultBlock { + type: "tool_result"; + tool_result: BedrockToolResult; +} + +export type BedrockContent = | BedrockTextBlock | BedrockImageBlock - | BedrockDocumentBlock; + | BedrockDocumentBlock + | BedrockToolCallBlock + | BedrockToolResultBlock; + +export interface BedrockToolSpec { + type: string; + function: { + name: string; + description: string; + parameters: Record; + }; +} + +export interface BedrockToolCall { + type: string; + function: { + name: string; + arguments: string; + }; +} + +export interface BedrockToolResult { + type: string; + output: string; +} + +export interface ContentItem { + type: string; + text?: string; + image_url?: { + url: string; + }; + document?: { + format: string; + name: string; + source: { + bytes: string; + media_type?: string; + }; + }; + tool_calls?: BedrockToolCall[]; + tool_result?: BedrockToolResult; +} + +export interface StreamEvent { + messageStart?: { role: string }; + contentBlockStart?: { index: number }; + contentBlockDelta?: { + delta: { + type?: string; + text?: string; + tool_calls?: BedrockToolCall[]; + tool_result?: BedrockToolResult; + }; + contentBlockIndex: number; + }; + contentBlockStop?: { index: number }; + messageStop?: { stopReason: string }; + metadata?: { + usage: { + inputTokens: number; + outputTokens: number; + totalTokens: number; + }; + metrics: { + latencyMs: number; + }; + }; +} + +export interface ConverseRequest { + modelId: string; + messages: Message[]; + inferenceConfig?: { + maxTokens?: number; + temperature?: number; + topP?: number; + stopSequences?: string[]; + stream?: boolean; + }; + system?: { text: string }[]; + tools?: BedrockToolSpec[]; + additionalModelRequestFields?: Record; + additionalModelResponseFieldPaths?: string[]; +} export interface BedrockResponse { - content?: any[]; + content: BedrockContent[]; completion?: string; stop_reason?: string; usage?: { @@ -55,7 +161,7 @@ export interface BedrockResponse { output_tokens: number; total_tokens: number; }; - tool_calls?: any[]; + tool_calls?: BedrockToolCall[]; } // Helper function to get the base model type from modelId @@ -79,8 +185,59 @@ export function validateModelId(modelId: string): string | null { return null; } +// Helper function to validate document name +export function validateDocumentName(name: string): boolean { + const validPattern = /^[a-zA-Z0-9\s\-\(\)\[\]]+$/; + const noMultipleSpaces = !/\s{2,}/.test(name); + return validPattern.test(name) && noMultipleSpaces; +} + +// Helper function to validate document format +export function validateDocumentFormat( + format: string, +): format is DocumentFormat { + const validFormats: DocumentFormat[] = [ + "pdf", + "csv", + "doc", + "docx", + "xls", + "xlsx", + "html", + "txt", + "md", + ]; + return validFormats.includes(format as DocumentFormat); +} + +// Helper function to validate image size and dimensions +export function validateImageSize(base64Data: string): boolean { + // Check size (3.75 MB limit) + const sizeInBytes = (base64Data.length * 3) / 4; // Approximate size of decoded base64 + const maxSize = 3.75 * 1024 * 1024; // 3.75 MB in bytes + + if (sizeInBytes > maxSize) { + throw new Error("Image size exceeds 3.75 MB limit"); + } + + return true; +} + +// Helper function to validate document size +export function validateDocumentSize(base64Data: string): boolean { + // Check size (4.5 MB limit) + const sizeInBytes = (base64Data.length * 3) / 4; // Approximate size of decoded base64 + const maxSize = 4.5 * 1024 * 1024; // 4.5 MB in bytes + + if (sizeInBytes > maxSize) { + throw new Error("Document size exceeds 4.5 MB limit"); + } + + return true; +} + // Helper function to process document content for Bedrock -export function processDocumentContent(content: any): BedrockContentBlock { +export function processDocumentContent(content: any): BedrockDocumentBlock { if ( !content?.document?.format || !content?.document?.name || @@ -90,70 +247,90 @@ export function processDocumentContent(content: any): BedrockContentBlock { } const format = content.document.format.toLowerCase(); - if ( - !["pdf", "csv", "doc", "docx", "xls", "xlsx", "html", "txt", "md"].includes( - format, - ) - ) { + if (!validateDocumentFormat(format)) { throw new Error(`Unsupported document format: ${format}`); } + if (!validateDocumentName(content.document.name)) { + throw new Error( + `Invalid document name: ${content.document.name}. Only alphanumeric characters, single spaces, hyphens, parentheses, and square brackets are allowed.`, + ); + } + + // Validate document size + if (!validateDocumentSize(content.document.source.bytes)) { + throw new Error("Document size validation failed"); + } + return { + type: "document", document: { - format: format as BedrockDocumentBlock["document"]["format"], - name: sanitizeDocumentName(content.document.name), + format: format, + name: content.document.name, source: { bytes: content.document.source.bytes, + media_type: content.document.source.media_type, }, }, }; } -// Helper function to format content for Bedrock -export function formatContent( - content: string | MultimodalContent[], -): BedrockContentBlock[] { - if (typeof content === "string") { - return [{ text: content }]; - } +// Helper function to process image content for Bedrock +export function processImageContent(content: any): BedrockImageBlock { + if (content.type === "image_url" && content.image_url?.url) { + const base64Match = content.image_url.url.match( + /^data:image\/([a-zA-Z]*);base64,([^"]*)$/, + ); + if (base64Match) { + const format = base64Match[1].toLowerCase(); + if (["png", "jpeg", "gif", "webp"].includes(format)) { + // Validate image size + if (!validateImageSize(base64Match[2])) { + throw new Error("Image size validation failed"); + } - const formattedContent: BedrockContentBlock[] = []; - - for (const item of content) { - if (item.type === "text" && item.text) { - formattedContent.push({ text: item.text }); - } else if (item.type === "image_url" && item.image_url?.url) { - // Extract base64 data from data URL - const base64Match = item.image_url.url.match( - /^data:image\/([a-zA-Z]*);base64,([^"]*)$/, - ); - if (base64Match) { - const format = base64Match[1].toLowerCase(); - if (["png", "jpeg", "gif", "webp"].includes(format)) { - formattedContent.push({ - image: { - format: format as "png" | "jpeg" | "gif" | "webp", - source: { - bytes: base64Match[2], - }, + return { + type: "image", + image: { + format: format as ImageFormat, + source: { + bytes: base64Match[2], }, - }); - } - } - } else if ("document" in item) { - try { - formattedContent.push(processDocumentContent(item)); - } catch (error) { - console.error("Error processing document:", error); - // Convert document to text as fallback - formattedContent.push({ - text: `[Document: ${(item as any).document?.name || "Unknown"}]`, - }); + }, + }; } } } + throw new Error("Invalid image content format"); +} - return formattedContent; +// Helper function to validate message content restrictions +export function validateMessageContent(message: Message): void { + if (Array.isArray(message.content)) { + // Count images and documents in user messages + if (message.role === "user") { + const imageCount = message.content.filter( + (item) => item.type === "image_url", + ).length; + const documentCount = message.content.filter( + (item) => item.type === "document", + ).length; + + if (imageCount > 20) { + throw new Error("User messages can include up to 20 images"); + } + + if (documentCount > 5) { + throw new Error("User messages can include up to 5 documents"); + } + } else if ( + message.role === "assistant" && + (message.content.some((item) => item.type === "image_url") || + message.content.some((item) => item.type === "document")) + ) { + throw new Error("Assistant messages cannot include images or documents"); + } + } } // Helper function to ensure messages alternate between user and assistant @@ -162,6 +339,9 @@ export function validateMessageOrder(messages: Message[]): Message[] { let lastRole = ""; for (const message of messages) { + // Validate content restrictions for each message + validateMessageContent(message); + if (message.role === lastRole) { // Skip duplicate roles to maintain alternation continue; @@ -173,16 +353,6 @@ export function validateMessageOrder(messages: Message[]): Message[] { return validatedMessages; } -// Helper function to sanitize document names according to Bedrock requirements -function sanitizeDocumentName(name: string): string { - // Remove any characters that aren't alphanumeric, whitespace, hyphens, or parentheses - let sanitized = name.replace(/[^a-zA-Z0-9\s\-\(\)\[\]]/g, ""); - // Replace multiple whitespace characters with a single space - sanitized = sanitized.replace(/\s+/g, " "); - // Trim whitespace from start and end - return sanitized.trim(); -} - // Helper function to convert Bedrock response back to MultimodalContent format export function convertBedrockResponseToMultimodal( response: BedrockResponse, @@ -196,23 +366,35 @@ export function convertBedrockResponseToMultimodal( } return response.content.map((block) => { - if ("text" in block) { + if (block.type === "text") { return { type: "text", text: block.text, }; - } else if ("image" in block) { + } else if (block.type === "image") { return { type: "image_url", image_url: { url: `data:image/${block.image.format};base64,${block.image.source.bytes}`, }, }; + } else if (block.type === "document") { + return { + type: "document", + document: { + format: block.document.format, + name: block.document.name, + source: { + bytes: block.document.source.bytes, + media_type: block.document.source.media_type, + }, + }, + }; } - // Document responses are converted to text content + // Fallback to text content return { type: "text", - text: block.text || "", + text: "", }; }); } diff --git a/app/client/api.ts b/app/client/api.ts index e547bea0a94..05ce8a236dc 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -31,11 +31,19 @@ export const TTSModels = ["tts-1", "tts-1-hd"] as const; export type ChatModel = ModelType; export interface MultimodalContent { - type: "text" | "image_url"; + type: "text" | "image_url" | "document"; text?: string; image_url?: { url: string; }; + document?: { + format: string; + name: string; + source: { + bytes: string; + media_type?: string; + }; + }; } export interface RequestMessage { diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index f8954f9d774..e2197565064 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,62 +1,167 @@ import { ApiPath } from "../../constant"; -import { ChatOptions, getHeaders, LLMApi, SpeechOptions } from "../api"; import { - useAccessStore, - useAppConfig, - useChatStore, - usePluginStore, -} from "../../store"; -import { preProcessImageContent, stream } from "../../utils/chat"; + ChatOptions, + getHeaders, + LLMApi, + LLMUsage, + MultimodalContent, + SpeechOptions, +} from "../api"; +import { useAccessStore, useAppConfig } from "../../store"; import Locale from "../../locales"; +import { + getMessageImages, + getMessageTextContent, + isVisionModel, +} from "../../utils"; +import { fetch } from "../../utils/stream"; -export interface BedrockChatRequest { - model: string; - messages: Array<{ - role: string; - content: - | string - | Array<{ - type: string; - text?: string; - image_url?: { url: string }; - document?: { - format: string; - name: string; - source: { - bytes: string; - }; - }; - }>; - }>; - temperature?: number; - top_p?: number; - max_tokens?: number; - stream?: boolean; -} +const MAX_IMAGE_SIZE = 1024 * 1024 * 4; // 4MB limit export class BedrockApi implements LLMApi { speech(options: SpeechOptions): Promise { - throw new Error("Method not implemented."); + throw new Error("Speech not implemented for Bedrock."); } extractMessage(res: any) { console.log("[Response] bedrock response: ", res); + if (Array.isArray(res?.content)) { + return res.content; + } return res; } - async chat(options: ChatOptions): Promise { - const shouldStream = !!options.config.stream; + async processDocument( + file: File, + ): Promise<{ display: string; content: MultimodalContent }> { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = async () => { + try { + const arrayBuffer = reader.result as ArrayBuffer; + const format = file.name.split(".").pop()?.toLowerCase(); + + if (!format) { + throw new Error("Could not determine file format"); + } + + // Format file size + const size = file.size; + let sizeStr = ""; + if (size < 1024) { + sizeStr = size + " B"; + } else if (size < 1024 * 1024) { + sizeStr = (size / 1024).toFixed(2) + " KB"; + } else { + sizeStr = (size / (1024 * 1024)).toFixed(2) + " MB"; + } + // Create display text + const displayText = `Document: ${file.name} (${sizeStr})`; + + // Create actual content + const content: MultimodalContent = { + type: "document", + document: { + format: format as + | "pdf" + | "csv" + | "doc" + | "docx" + | "xls" + | "xlsx" + | "html" + | "txt" + | "md", + name: file.name, + source: { + bytes: Buffer.from(arrayBuffer).toString("base64"), + }, + }, + }; + + resolve({ + display: displayText, + content: content, + }); + } catch (e) { + reject(e); + } + }; + reader.onerror = () => reject(reader.error); + reader.readAsArrayBuffer(file); + }); + } + + async processImage(url: string): Promise { + if (url.startsWith("data:")) { + const base64Match = url.match(/^data:image\/([a-zA-Z]*);base64,([^"]*)/); + if (base64Match) { + const format = base64Match[1].toLowerCase(); + const base64Data = base64Match[2]; + + // Check base64 size + const binarySize = atob(base64Data).length; + if (binarySize > MAX_IMAGE_SIZE) { + throw new Error( + `Image size (${(binarySize / (1024 * 1024)).toFixed( + 2, + )}MB) exceeds maximum allowed size of 4MB`, + ); + } + + return { + type: "image_url", + image_url: { + url: url, + }, + }; + } + throw new Error("Invalid data URL format"); + } + + // For non-data URLs, fetch and convert to base64 + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch image: ${response.statusText}`); + } + + const blob = await response.blob(); + if (blob.size > MAX_IMAGE_SIZE) { + throw new Error( + `Image size (${(blob.size / (1024 * 1024)).toFixed( + 2, + )}MB) exceeds maximum allowed size of 4MB`, + ); + } + + const reader = new FileReader(); + const base64 = await new Promise((resolve, reject) => { + reader.onloadend = () => resolve(reader.result as string); + reader.onerror = () => reject(new Error("Failed to read image data")); + reader.readAsDataURL(blob); + }); + + return { + type: "image_url", + image_url: { + url: base64, + }, + }; + } catch (error) { + console.error("[Bedrock] Image processing error:", error); + throw error; + } + } + + async chat(options: ChatOptions): Promise { + const accessStore = useAccessStore.getState(); const modelConfig = { ...useAppConfig.getState().modelConfig, - ...useChatStore.getState().currentSession().mask.modelConfig, - ...{ - model: options.config.model, - }, + ...options.config, }; - const accessStore = useAccessStore.getState(); - if ( !accessStore.awsRegion || !accessStore.awsAccessKeyId || @@ -71,70 +176,6 @@ export class BedrockApi implements LLMApi { return; } - // Process messages to handle image and document content - const messages = await Promise.all( - options.messages.map(async (v) => { - const content = await preProcessImageContent(v.content); - // If content is an array (multimodal), ensure each item is properly formatted - if (Array.isArray(content)) { - return { - role: v.role, - content: content.map((item) => { - if (item.type === "image_url" && item.image_url?.url) { - // If the URL is a base64 data URL, use it directly - if (item.image_url.url.startsWith("data:image/")) { - return item; - } - // Otherwise, it's a regular URL that needs to be converted to base64 - // The conversion should have been handled by preProcessImageContent - return item; - } - if ("document" in item) { - // Handle document content - const doc = item as any; - if ( - doc?.document?.format && - doc?.document?.name && - doc?.document?.source?.bytes - ) { - return { - type: "document", - document: { - format: doc.document.format, - name: doc.document.name, - source: { - bytes: doc.document.source.bytes, - }, - }, - }; - } - } - return item; - }), - }; - } - // If content is a string, return it as is - return { - role: v.role, - content, - }; - }), - ); - - const requestBody: BedrockChatRequest = { - messages, - stream: shouldStream, - model: modelConfig.model, - max_tokens: modelConfig.max_tokens, - temperature: modelConfig.temperature, - top_p: modelConfig.top_p, - }; - - console.log("[Bedrock] Request:", { - model: modelConfig.model, - messages: messages, - }); - const controller = new AbortController(); options.onController?.(controller); @@ -150,45 +191,196 @@ export class BedrockApi implements LLMApi { } try { - if (shouldStream) { - let responseText = ""; - const pluginStore = usePluginStore.getState(); - const currentSession = useChatStore.getState().currentSession(); - const [tools, funcs] = pluginStore.getAsTools( - currentSession.mask?.plugin || [], - ); + // Process messages to handle multimodal content + const messages = await Promise.all( + options.messages.map(async (msg) => { + if (Array.isArray(msg.content)) { + // For vision models, include both text and images + if (isVisionModel(options.config.model)) { + const images = getMessageImages(msg); + const content: MultimodalContent[] = []; - await stream( - `${ApiPath.Bedrock}/invoke`, - requestBody, - headers, - Array.isArray(tools) ? tools : [], - funcs || {}, - controller, - (chunk: string) => { - try { - responseText += chunk; - return chunk; - } catch (e) { - console.error("[Request] parse error", chunk, e); - return ""; + // Process documents first + for (const item of msg.content) { + // Check for document content + if (item && typeof item === "object") { + if ("file" in item && item.file instanceof File) { + try { + console.log( + "[Bedrock] Processing document:", + item.file.name, + ); + const { content: docContent } = + await this.processDocument(item.file); + content.push(docContent); + } catch (e) { + console.error("[Bedrock] Failed to process document:", e); + } + } else if ("document" in item && item.document) { + // If document content is already processed, include it directly + content.push(item as MultimodalContent); + } + } + } + + // Add text content if it's not a document display text + const text = getMessageTextContent(msg); + if (text && !text.startsWith("Document: ")) { + content.push({ type: "text", text }); + } + + // Process images with size check and error handling + for (const url of images) { + try { + const imageContent = await this.processImage(url); + content.push(imageContent); + } catch (e) { + console.error("[Bedrock] Failed to process image:", e); + // Add error message as text content + content.push({ + type: "text", + text: `Error processing image: ${e.message}`, + }); + } + } + + // Only return content if there is any + if (content.length > 0) { + return { ...msg, content }; + } } + // For non-vision models, only include text + return { ...msg, content: getMessageTextContent(msg) }; + } + return msg; + }), + ); + + // Filter out empty messages + const filteredMessages = messages.filter((msg) => { + if (Array.isArray(msg.content)) { + return msg.content.length > 0; + } + return msg.content !== ""; + }); + + const requestBody = { + messages: filteredMessages, + modelId: options.config.model, + inferenceConfig: { + maxTokens: modelConfig.max_tokens, + temperature: modelConfig.temperature, + topP: modelConfig.top_p, + stopSequences: [], + }, + }; + + console.log( + "[Bedrock] Request body:", + JSON.stringify( + { + ...requestBody, + messages: requestBody.messages.map((msg) => ({ + ...msg, + content: Array.isArray(msg.content) + ? msg.content.map((c) => ({ + type: c.type, + ...(c.document + ? { + document: { + format: c.document.format, + name: c.document.name, + }, + } + : {}), + ...(c.image_url ? { image_url: { url: "[BINARY]" } } : {}), + ...(c.text ? { text: c.text } : {}), + })) + : msg.content, + })), }, - ( - requestPayload: any, - toolCallMessage: any, - toolCallResult: any[], - ) => { - console.log("[Bedrock] processToolMessage", { - requestPayload, - toolCallMessage, - toolCallResult, - }); + null, + 2, + ), + ); + + const shouldStream = !!options.config.stream; + const conversePath = `${ApiPath.Bedrock}/converse`; + + if (shouldStream) { + let response = await fetch(conversePath, { + method: "POST", + headers: { + ...headers, + "X-Stream": "true", }, - options, - ); + body: JSON.stringify(requestBody), + signal: controller.signal, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Bedrock API error: ${error}`); + } + + let buffer = ""; + const reader = response.body?.getReader(); + if (!reader) { + throw new Error("No response body reader available"); + } + + let currentContent = ""; + let isFirstMessage = true; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + // Convert the chunk to text and add to buffer + const chunk = new TextDecoder().decode(value); + buffer += chunk; + + // Process complete messages from buffer + let newlineIndex; + while ((newlineIndex = buffer.indexOf("\n")) !== -1) { + const line = buffer.slice(0, newlineIndex).trim(); + buffer = buffer.slice(newlineIndex + 1); + + if (line.startsWith("data: ")) { + try { + const event = JSON.parse(line.slice(6)); + + if (event.type === "messageStart") { + if (isFirstMessage) { + isFirstMessage = false; + } + continue; + } + + if (event.type === "text" && event.content) { + currentContent += event.content; + options.onUpdate?.(currentContent, event.content); + } + + if (event.type === "messageStop") { + options.onFinish(currentContent); + return; + } + + if (event.type === "error") { + throw new Error(event.message || "Unknown error"); + } + } catch (e) { + console.error("[Bedrock] Failed to parse stream event:", e); + } + } + } + } + + // If we reach here without a messageStop event, finish with current content + options.onFinish(currentContent); } else { - const response = await fetch(`${ApiPath.Bedrock}/invoke`, { + const response = await fetch(conversePath, { method: "POST", headers, body: JSON.stringify(requestBody), @@ -197,12 +389,12 @@ export class BedrockApi implements LLMApi { if (!response.ok) { const error = await response.text(); - console.error("[Bedrock] Error response:", error); throw new Error(`Bedrock API error: ${error}`); } - const text = await response.text(); - options.onFinish(text); + const responseBody = await response.json(); + const content = this.extractMessage(responseBody); + options.onFinish(content); } } catch (e) { console.error("[Bedrock] Chat error:", e); @@ -210,7 +402,8 @@ export class BedrockApi implements LLMApi { } } - async usage() { + async usage(): Promise { + // Bedrock usage is tracked through AWS billing return { used: 0, total: 0, @@ -218,6 +411,7 @@ export class BedrockApi implements LLMApi { } async models() { + // Return empty array as models are configured through AWS console return []; } } diff --git a/app/components/chat-actions.tsx b/app/components/chat-actions.tsx new file mode 100644 index 00000000000..25cdfe16d8b --- /dev/null +++ b/app/components/chat-actions.tsx @@ -0,0 +1,188 @@ +import { ChatActions as Actions } from "./chat"; +import DocumentIcon from "../icons/document.svg"; +import LoadingButtonIcon from "../icons/loading.svg"; +import { ServiceProvider } from "../constant"; +import { useChatStore } from "../store"; +import { showToast } from "./ui-lib"; +import { MultimodalContent, MessageRole } from "../client/api"; +import { ChatMessage } from "../store/chat"; + +export function ChatActions(props: Parameters[0]) { + const chatStore = useChatStore(); + const currentProviderName = + chatStore.currentSession().mask.modelConfig?.providerName; + const isBedrockProvider = currentProviderName === ServiceProvider.Bedrock; + + async function uploadDocument() { + const fileInput = document.createElement("input"); + fileInput.type = "file"; + fileInput.accept = ".pdf,.csv,.doc,.docx,.xls,.xlsx,.html,.txt,.md"; + fileInput.onchange = async (event: any) => { + const file = event.target.files[0]; + if (!file) return; + + props.setUploading(true); + try { + // Get file extension and MIME type + const format = file.name.split(".").pop()?.toLowerCase() || ""; + const supportedFormats = [ + "pdf", + "csv", + "doc", + "docx", + "xls", + "xlsx", + "html", + "txt", + "md", + ]; + + if (!supportedFormats.includes(format)) { + throw new Error("Unsupported file format"); + } + + // Map file extensions to MIME types + const mimeTypes: { [key: string]: string } = { + pdf: "application/pdf", + csv: "text/csv", + doc: "application/msword", + docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + xls: "application/vnd.ms-excel", + xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + html: "text/html", + txt: "text/plain", + md: "text/markdown", + }; + + // Convert file to base64 + const base64 = await new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (e) => { + if (!e.target?.result) return reject("Failed to read file"); + // Get just the base64 data without the data URL prefix + const base64 = (e.target.result as string).split(",")[1]; + resolve(base64); + }; + reader.onerror = reject; + reader.readAsDataURL(file); + }); + + // Format file size + const size = file.size; + let sizeStr = ""; + if (size < 1024) { + sizeStr = size + " B"; + } else if (size < 1024 * 1024) { + sizeStr = (size / 1024).toFixed(2) + " KB"; + } else { + sizeStr = (size / (1024 * 1024)).toFixed(2) + " MB"; + } + + // Create document content + const content: MultimodalContent[] = [ + { + type: "text", + text: `Document: ${file.name} (${sizeStr})`, + }, + { + type: "document", + document: { + format, + name: file.name, + source: { + bytes: base64, + media_type: mimeTypes[format] || `application/${format}`, + }, + }, + }, + ]; + + // Send content to Bedrock + const session = chatStore.currentSession(); + const modelConfig = session.mask.modelConfig; + const api = await import("../client/api").then((m) => + m.getClientApi(modelConfig.providerName), + ); + + // Create user message + const userMessage: ChatMessage = { + id: Date.now().toString(), + role: "user" as MessageRole, + content, + date: new Date().toLocaleString(), + isError: false, + }; + + // Create bot message + const botMessage: ChatMessage = { + id: (Date.now() + 1).toString(), + role: "assistant" as MessageRole, + content: "", + date: new Date().toLocaleString(), + streaming: true, + isError: false, + }; + + // Add messages to session + chatStore.updateCurrentSession((session) => { + session.messages.push(userMessage, botMessage); + }); + + // Make request + api.llm.chat({ + messages: [userMessage], + config: { ...modelConfig, stream: true }, + onUpdate(message) { + botMessage.streaming = true; + if (message) { + botMessage.content = message; + } + chatStore.updateCurrentSession((session) => { + session.messages = session.messages.concat(); + }); + }, + onFinish(message) { + botMessage.streaming = false; + if (message) { + botMessage.content = message; + chatStore.onNewMessage(botMessage); + } + }, + onError(error) { + botMessage.content = error.message; + botMessage.streaming = false; + userMessage.isError = true; + botMessage.isError = true; + chatStore.updateCurrentSession((session) => { + session.messages = session.messages.concat(); + }); + console.error("[Chat] failed ", error); + }, + }); + } catch (error) { + console.error("Failed to upload document:", error); + showToast("Failed to upload document"); + } finally { + props.setUploading(false); + } + }; + fileInput.click(); + } + + return ( +
+ {/* Original actions */} + + + {/* Document upload button (only for Bedrock) */} + {isBedrockProvider && ( +
+
+ {props.uploading ? : } +
+
Upload Document
+
+ )} +
+ ); +} diff --git a/app/components/chat.module.scss b/app/components/chat.module.scss index 73542fc67f1..7f168942b3b 100644 --- a/app/components/chat.module.scss +++ b/app/components/chat.module.scss @@ -75,6 +75,17 @@ pointer-events: none; } + .icon { + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 16px; + height: 16px; + } + } + &:hover { --delay: 0.5s; width: var(--full-width); @@ -393,8 +404,8 @@ button { padding: 7px; - } } +} /* Specific styles for iOS devices */ @media screen and (max-device-width: 812px) and (-webkit-min-device-pixel-ratio: 2) { diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 3d5b6a4f2c4..c4d11e31876 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -8,7 +8,7 @@ import React, { Fragment, RefObject, } from "react"; - +import DocumentIcon from "../icons/document.svg"; import SendWhiteIcon from "../icons/send-white.svg"; import BrainIcon from "../icons/brain.svg"; import RenameIcon from "../icons/rename.svg"; @@ -548,6 +548,91 @@ export function ChatActions(props: { ); } }, [chatStore, currentModel, models]); + const isBedrockProvider = currentProviderName === ServiceProvider.Bedrock; + + // ... (rest of the existing state and functions) + + async function uploadDocument() { + const fileInput = document.createElement("input"); + fileInput.type = "file"; + fileInput.accept = ".pdf,.csv,.doc,.docx,.xls,.xlsx,.html,.txt,.md"; + fileInput.onchange = async (event: any) => { + const file = event.target.files[0]; + if (!file) return; + + props.setUploading(true); + try { + // Convert file to base64 + const base64 = await new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (e) => { + if (!e.target?.result) return reject("Failed to read file"); + const base64 = (e.target.result as string).split(",")[1]; + resolve(base64); + }; + reader.onerror = reject; + reader.readAsDataURL(file); + }); + + // Get file extension + const format = file.name.split(".").pop()?.toLowerCase() || ""; + const supportedFormats = [ + "pdf", + "csv", + "doc", + "docx", + "xls", + "xlsx", + "html", + "txt", + "md", + ]; + + if (!supportedFormats.includes(format)) { + throw new Error("Unsupported file format"); + } + + // Format file size + const size = file.size; + let sizeStr = ""; + if (size < 1024) { + sizeStr = size + " B"; + } else if (size < 1024 * 1024) { + sizeStr = (size / 1024).toFixed(2) + " KB"; + } else { + sizeStr = (size / (1024 * 1024)).toFixed(2) + " MB"; + } + + // Create document content with only filename and size + const documentContent = { + type: "document", + document: { + format, + name: file.name, + size: sizeStr, + source: { + bytes: base64, + }, + }, + }; + + // Submit the document content as a JSON string but only display filename and size + const displayContent = `Document: ${file.name} (${sizeStr})`; + chatStore.onUserInput(displayContent); + + // Store the actual document content separately if needed + // chatStore.updateCurrentSession((session) => { + // session.lastDocument = documentContent; + // }); + } catch (error) { + console.error("Failed to upload document:", error); + showToast("Failed to upload document"); + } finally { + props.setUploading(false); + } + }; + fileInput.click(); + } return (
@@ -580,6 +665,14 @@ export function ChatActions(props: { icon={props.uploading ? : } /> )} + {/* Add document upload button for Bedrock */} + {isBedrockProvider && ( + : } + /> + )} + + + + + + diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 573969be7b1..cdf99f19791 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -81,6 +81,7 @@ const cn = { Clear: "清除聊天", Settings: "对话设置", UploadImage: "上传图片", + UploadDocument: "上传文档", }, Rename: "重命名对话", Typing: "正在输入…", diff --git a/app/locales/en.ts b/app/locales/en.ts index 9d3097ef822..12107ac7cda 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -82,6 +82,7 @@ const en: LocaleType = { Clear: "Clear Context", Settings: "Settings", UploadImage: "Upload Images", + UploadDocument: "Upload Documents", }, Rename: "Rename Chat", Typing: "Typing…", From fc391168e9c3cdbffac91893798b41b544c3ecc7 Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 4 Nov 2024 16:24:10 +0800 Subject: [PATCH 03/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E5=88=A0=E9=99=A4=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/api/bedrock/models.ts=20=09=E5=88=A0=E9=99=A4?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20app/api/bedrock/utils.ts=20=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=20=20=20app/client/platforms/bedrock.t?= =?UTF-8?q?s=20=09=E5=88=A0=E9=99=A4=EF=BC=9A=20=20=20=20=20app/components?= =?UTF-8?q?/chat-actions.tsx=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20?= =?UTF-8?q?=20app/components/chat.tsx=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20?= =?UTF-8?q?=20=20=20=20app/constant.ts=20=09=E5=88=A0=E9=99=A4=EF=BC=9A=20?= =?UTF-8?q?=20=20=20=20app/icons/document.svg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 410 +++++++++++++++++++++++++++----- app/api/bedrock/models.ts | 405 ------------------------------- app/api/bedrock/utils.ts | 400 ------------------------------- app/client/platforms/bedrock.ts | 2 +- app/components/chat-actions.tsx | 188 --------------- app/components/chat.tsx | 95 +------- app/constant.ts | 6 +- app/icons/document.svg | 7 - 8 files changed, 355 insertions(+), 1158 deletions(-) delete mode 100644 app/api/bedrock/models.ts delete mode 100644 app/api/bedrock/utils.ts delete mode 100644 app/components/chat-actions.tsx delete mode 100644 app/icons/document.svg diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 9d7ddb4faaa..e3ca645bd7a 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -4,18 +4,350 @@ import { NextRequest, NextResponse } from "next/server"; import { auth } from "./auth"; import { BedrockRuntimeClient, + ConverseStreamCommand, + ConverseStreamCommandInput, ConverseStreamOutput, - ValidationException, ModelStreamErrorException, - ThrottlingException, - ServiceUnavailableException, - InternalServerException, + type Message, + type ContentBlock, + type SystemContentBlock, + type Tool, + type ToolChoice, + type ToolResultContentBlock, } from "@aws-sdk/client-bedrock-runtime"; -import { validateModelId } from "./bedrock/utils"; -import { ConverseRequest, createConverseStreamCommand } from "./bedrock/models"; +// Constants and Types const ALLOWED_PATH = new Set(["converse"]); +export interface ConverseRequest { + modelId: string; + messages: { + role: "user" | "assistant" | "system"; + content: string | ContentItem[]; + }[]; + inferenceConfig?: { + maxTokens?: number; + temperature?: number; + topP?: number; + stopSequences?: string[]; + }; + toolConfig?: { + tools: Tool[]; + toolChoice?: ToolChoice; + }; +} + +interface ContentItem { + type: "text" | "image_url" | "document" | "tool_use" | "tool_result"; + text?: string; + image_url?: { + url: string; // base64 data URL + }; + document?: { + format: DocumentFormat; + name: string; + source: { + bytes: string; // base64 + }; + }; + tool_use?: { + tool_use_id: string; + name: string; + input: any; + }; + tool_result?: { + tool_use_id: string; + content: ToolResultItem[]; + status: "success" | "error"; + }; +} + +interface ToolResultItem { + type: "text" | "image" | "document" | "json"; + text?: string; + image?: { + format: "png" | "jpeg" | "gif" | "webp"; + source: { + bytes: string; // base64 + }; + }; + document?: { + format: DocumentFormat; + name: string; + source: { + bytes: string; // base64 + }; + }; + json?: any; +} + +type DocumentFormat = + | "pdf" + | "csv" + | "doc" + | "docx" + | "xls" + | "xlsx" + | "html" + | "txt" + | "md"; + +// Validation Functions +function validateModelId(modelId: string): string | null { + if ( + modelId.startsWith("meta.llama") && + !modelId.includes("inference-profile") + ) { + return "Llama models require an inference profile. Please use the full inference profile ARN."; + } + return null; +} + +function validateDocumentSize(base64Data: string): boolean { + const sizeInBytes = (base64Data.length * 3) / 4; + const maxSize = 4.5 * 1024 * 1024; + if (sizeInBytes > maxSize) { + throw new Error("Document size exceeds 4.5 MB limit"); + } + return true; +} + +function validateImageSize(base64Data: string): boolean { + const sizeInBytes = (base64Data.length * 3) / 4; + const maxSize = 3.75 * 1024 * 1024; + if (sizeInBytes > maxSize) { + throw new Error("Image size exceeds 3.75 MB limit"); + } + return true; +} + +// Content Processing Functions +function convertContentToAWSBlock(item: ContentItem): ContentBlock | null { + if (item.type === "text" && item.text) { + return { text: item.text }; + } + + if (item.type === "image_url" && item.image_url?.url) { + const base64Match = item.image_url.url.match( + /^data:image\/([a-zA-Z]*);base64,([^"]*)/, + ); + if (base64Match) { + const format = base64Match[1].toLowerCase(); + if (["png", "jpeg", "gif", "webp"].includes(format)) { + validateImageSize(base64Match[2]); + return { + image: { + format: format as "png" | "jpeg" | "gif" | "webp", + source: { + bytes: Uint8Array.from(Buffer.from(base64Match[2], "base64")), + }, + }, + }; + } + } + } + + if (item.type === "document" && item.document) { + validateDocumentSize(item.document.source.bytes); + return { + document: { + format: item.document.format, + name: item.document.name, + source: { + bytes: Uint8Array.from( + Buffer.from(item.document.source.bytes, "base64"), + ), + }, + }, + }; + } + + if (item.type === "tool_use" && item.tool_use) { + return { + toolUse: { + toolUseId: item.tool_use.tool_use_id, + name: item.tool_use.name, + input: item.tool_use.input, + }, + }; + } + + if (item.type === "tool_result" && item.tool_result) { + const toolResultContent = item.tool_result.content + .map((resultItem) => { + if (resultItem.type === "text" && resultItem.text) { + return { text: resultItem.text } as ToolResultContentBlock; + } + if (resultItem.type === "image" && resultItem.image) { + return { + image: { + format: resultItem.image.format, + source: { + bytes: Uint8Array.from( + Buffer.from(resultItem.image.source.bytes, "base64"), + ), + }, + }, + } as ToolResultContentBlock; + } + if (resultItem.type === "document" && resultItem.document) { + return { + document: { + format: resultItem.document.format, + name: resultItem.document.name, + source: { + bytes: Uint8Array.from( + Buffer.from(resultItem.document.source.bytes, "base64"), + ), + }, + }, + } as ToolResultContentBlock; + } + if (resultItem.type === "json" && resultItem.json) { + return { json: resultItem.json } as ToolResultContentBlock; + } + return null; + }) + .filter((content): content is ToolResultContentBlock => content !== null); + + if (toolResultContent.length === 0) { + return null; + } + + return { + toolResult: { + toolUseId: item.tool_result.tool_use_id, + content: toolResultContent, + status: item.tool_result.status, + }, + }; + } + + return null; +} + +function convertContentToAWS(content: string | ContentItem[]): ContentBlock[] { + if (typeof content === "string") { + return [{ text: content }]; + } + + const blocks = content + .map(convertContentToAWSBlock) + .filter((block): block is ContentBlock => block !== null); + + return blocks.length > 0 ? blocks : [{ text: "" }]; +} + +function formatMessages(messages: ConverseRequest["messages"]): { + messages: Message[]; + systemPrompt?: SystemContentBlock[]; +} { + const systemMessages = messages.filter((msg) => msg.role === "system"); + const nonSystemMessages = messages.filter((msg) => msg.role !== "system"); + + const systemPrompt = + systemMessages.length > 0 + ? systemMessages.map((msg) => { + if (typeof msg.content === "string") { + return { text: msg.content } as SystemContentBlock; + } + const blocks = convertContentToAWS(msg.content); + return blocks[0] as SystemContentBlock; + }) + : undefined; + + const formattedMessages = nonSystemMessages.reduce( + (acc: Message[], curr, idx) => { + if (idx > 0 && curr.role === nonSystemMessages[idx - 1].role) { + return acc; + } + + const content = convertContentToAWS(curr.content); + if (content.length > 0) { + acc.push({ + role: curr.role as "user" | "assistant", + content, + }); + } + return acc; + }, + [], + ); + + if (formattedMessages.length === 0 || formattedMessages[0].role !== "user") { + formattedMessages.unshift({ + role: "user", + content: [{ text: "Hello" }], + }); + } + + if (formattedMessages[formattedMessages.length - 1].role !== "user") { + formattedMessages.push({ + role: "user", + content: [{ text: "Continue" }], + }); + } + + return { messages: formattedMessages, systemPrompt }; +} + +function formatRequestBody( + request: ConverseRequest, +): ConverseStreamCommandInput { + const { messages, systemPrompt } = formatMessages(request.messages); + const input: ConverseStreamCommandInput = { + modelId: request.modelId, + messages, + ...(systemPrompt && { system: systemPrompt }), + }; + + if (request.inferenceConfig) { + input.inferenceConfig = { + maxTokens: request.inferenceConfig.maxTokens, + temperature: request.inferenceConfig.temperature, + topP: request.inferenceConfig.topP, + stopSequences: request.inferenceConfig.stopSequences, + }; + } + + if (request.toolConfig) { + input.toolConfig = { + tools: request.toolConfig.tools, + toolChoice: request.toolConfig.toolChoice, + }; + } + + const logInput = { + ...input, + messages: messages.map((msg) => ({ + role: msg.role, + content: msg.content?.map((content) => { + if ("image" in content && content.image) { + return { + image: { + format: content.image.format, + source: { bytes: "[BINARY]" }, + }, + }; + } + if ("document" in content && content.document) { + return { + document: { ...content.document, source: { bytes: "[BINARY]" } }, + }; + } + return content; + }), + })), + }; + + console.log( + "[Bedrock] Formatted request:", + JSON.stringify(logInput, null, 2), + ); + return input; +} + +// Main Request Handler export async function handle( req: NextRequest, { params }: { params: { path: string[] } }, @@ -102,14 +434,13 @@ async function handleConverseRequest(req: NextRequest) { console.log("[Bedrock] Invoking model:", modelId); - const command = createConverseStreamCommand(body); + const command = new ConverseStreamCommand(formatRequestBody(body)); const response = await client.send(command); if (!response.stream) { throw new Error("No stream in response"); } - // Create a ReadableStream for the response const stream = new ReadableStream({ async start(controller) { try { @@ -190,58 +521,17 @@ async function handleConverseRequest(req: NextRequest) { } controller.close(); } catch (error) { - if (error instanceof ValidationException) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "error", - error: "ValidationException", - message: error.message, - })}\n\n`, - ); - } else if (error instanceof ModelStreamErrorException) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "error", - error: "ModelStreamErrorException", - message: error.message, - originalStatusCode: error.originalStatusCode, - originalMessage: error.originalMessage, - })}\n\n`, - ); - } else if (error instanceof ThrottlingException) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "error", - error: "ThrottlingException", - message: error.message, - })}\n\n`, - ); - } else if (error instanceof ServiceUnavailableException) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "error", - error: "ServiceUnavailableException", - message: error.message, - })}\n\n`, - ); - } else if (error instanceof InternalServerException) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "error", - error: "InternalServerException", - message: error.message, - })}\n\n`, - ); - } else { - controller.enqueue( - `data: ${JSON.stringify({ - type: "error", - error: "UnknownError", - message: - error instanceof Error ? error.message : "Unknown error", - })}\n\n`, - ); - } + const errorResponse = { + type: "error", + error: + error instanceof Error ? error.constructor.name : "UnknownError", + message: error instanceof Error ? error.message : "Unknown error", + ...(error instanceof ModelStreamErrorException && { + originalStatusCode: error.originalStatusCode, + originalMessage: error.originalMessage, + }), + }; + controller.enqueue(`data: ${JSON.stringify(errorResponse)}\n\n`); controller.close(); } }, diff --git a/app/api/bedrock/models.ts b/app/api/bedrock/models.ts deleted file mode 100644 index f6bb297d268..00000000000 --- a/app/api/bedrock/models.ts +++ /dev/null @@ -1,405 +0,0 @@ -import { - ConverseStreamCommand, - type ConverseStreamCommandInput, - type Message, - type ContentBlock, - type SystemContentBlock, - type Tool, - type ToolChoice, - type ToolResultContentBlock, -} from "@aws-sdk/client-bedrock-runtime"; - -export interface ConverseRequest { - modelId: string; - messages: { - role: "user" | "assistant" | "system"; - content: string | ContentItem[]; - }[]; - inferenceConfig?: { - maxTokens?: number; - temperature?: number; - topP?: number; - stopSequences?: string[]; - }; - toolConfig?: { - tools: Tool[]; - toolChoice?: ToolChoice; - }; -} - -interface ContentItem { - type: "text" | "image_url" | "document" | "tool_use" | "tool_result"; - text?: string; - image_url?: { - url: string; // base64 data URL - }; - document?: { - format: - | "pdf" - | "csv" - | "doc" - | "docx" - | "xls" - | "xlsx" - | "html" - | "txt" - | "md"; - name: string; - source: { - bytes: string; // base64 - }; - }; - tool_use?: { - tool_use_id: string; - name: string; - input: any; - }; - tool_result?: { - tool_use_id: string; - content: ToolResultItem[]; - status: "success" | "error"; - }; -} - -interface ToolResultItem { - type: "text" | "image" | "document" | "json"; - text?: string; - image?: { - format: "png" | "jpeg" | "gif" | "webp"; - source: { - bytes: string; // base64 - }; - }; - document?: { - format: - | "pdf" - | "csv" - | "doc" - | "docx" - | "xls" - | "xlsx" - | "html" - | "txt" - | "md"; - name: string; - source: { - bytes: string; // base64 - }; - }; - json?: any; -} - -function convertContentToAWSBlock(item: ContentItem): ContentBlock | null { - if (item.type === "text" && item.text) { - return { text: item.text }; - } - - if (item.type === "image_url" && item.image_url?.url) { - const base64Match = item.image_url.url.match( - /^data:image\/([a-zA-Z]*);base64,([^"]*)/, - ); - if (base64Match) { - const format = base64Match[1].toLowerCase(); - if ( - format === "png" || - format === "jpeg" || - format === "gif" || - format === "webp" - ) { - const base64Data = base64Match[2]; - return { - image: { - format: format as "png" | "jpeg" | "gif" | "webp", - source: { - bytes: Uint8Array.from(Buffer.from(base64Data, "base64")), - }, - }, - }; - } - } - } - - if (item.type === "document" && item.document) { - return { - document: { - format: item.document.format, - name: item.document.name, - source: { - bytes: Uint8Array.from( - Buffer.from(item.document.source.bytes, "base64"), - ), - }, - }, - }; - } - - if (item.type === "tool_use" && item.tool_use) { - return { - toolUse: { - toolUseId: item.tool_use.tool_use_id, - name: item.tool_use.name, - input: item.tool_use.input, - }, - }; - } - - if (item.type === "tool_result" && item.tool_result) { - const toolResultContent = item.tool_result.content - .map((resultItem) => { - if (resultItem.type === "text" && resultItem.text) { - return { text: resultItem.text } as ToolResultContentBlock; - } - if (resultItem.type === "image" && resultItem.image) { - return { - image: { - format: resultItem.image.format, - source: { - bytes: Uint8Array.from( - Buffer.from(resultItem.image.source.bytes, "base64"), - ), - }, - }, - } as ToolResultContentBlock; - } - if (resultItem.type === "document" && resultItem.document) { - return { - document: { - format: resultItem.document.format, - name: resultItem.document.name, - source: { - bytes: Uint8Array.from( - Buffer.from(resultItem.document.source.bytes, "base64"), - ), - }, - }, - } as ToolResultContentBlock; - } - if (resultItem.type === "json" && resultItem.json) { - return { json: resultItem.json } as ToolResultContentBlock; - } - return null; - }) - .filter((content): content is ToolResultContentBlock => content !== null); - - if (toolResultContent.length === 0) { - return null; - } - - return { - toolResult: { - toolUseId: item.tool_result.tool_use_id, - content: toolResultContent, - status: item.tool_result.status, - }, - }; - } - - return null; -} - -function convertContentToAWS(content: string | ContentItem[]): ContentBlock[] { - if (typeof content === "string") { - return [{ text: content }]; - } - - // Filter out null blocks and ensure each content block is valid - const blocks = content - .map(convertContentToAWSBlock) - .filter((block): block is ContentBlock => block !== null); - - // If no valid blocks, provide a default text block - if (blocks.length === 0) { - return [{ text: "" }]; - } - - return blocks; -} - -function formatMessages(messages: ConverseRequest["messages"]): { - messages: Message[]; - systemPrompt?: SystemContentBlock[]; -} { - // Extract system messages - const systemMessages = messages.filter((msg) => msg.role === "system"); - const nonSystemMessages = messages.filter((msg) => msg.role !== "system"); - - // Convert system messages to SystemContentBlock array - const systemPrompt = - systemMessages.length > 0 - ? systemMessages.map((msg) => { - if (typeof msg.content === "string") { - return { text: msg.content } as SystemContentBlock; - } - // For multimodal content, convert each content item - const blocks = convertContentToAWS(msg.content); - return blocks[0] as SystemContentBlock; // Take first block as system content - }) - : undefined; - - // Format remaining messages - const formattedMessages = nonSystemMessages.reduce( - (acc: Message[], curr, idx) => { - // Skip if same role as previous message - if (idx > 0 && curr.role === nonSystemMessages[idx - 1].role) { - return acc; - } - - const content = convertContentToAWS(curr.content); - if (content.length > 0) { - acc.push({ - role: curr.role as "user" | "assistant", - content, - }); - } - return acc; - }, - [], - ); - - // Ensure conversation starts with user - if (formattedMessages.length === 0 || formattedMessages[0].role !== "user") { - formattedMessages.unshift({ - role: "user", - content: [{ text: "Hello" }], - }); - } - - // Ensure conversation ends with user - if (formattedMessages[formattedMessages.length - 1].role !== "user") { - formattedMessages.push({ - role: "user", - content: [{ text: "Continue" }], - }); - } - - return { messages: formattedMessages, systemPrompt }; -} - -export function formatRequestBody( - request: ConverseRequest, -): ConverseStreamCommandInput { - const { messages, systemPrompt } = formatMessages(request.messages); - const input: ConverseStreamCommandInput = { - modelId: request.modelId, - messages, - ...(systemPrompt && { system: systemPrompt }), - }; - - if (request.inferenceConfig) { - input.inferenceConfig = { - maxTokens: request.inferenceConfig.maxTokens, - temperature: request.inferenceConfig.temperature, - topP: request.inferenceConfig.topP, - stopSequences: request.inferenceConfig.stopSequences, - }; - } - - if (request.toolConfig) { - input.toolConfig = { - tools: request.toolConfig.tools, - toolChoice: request.toolConfig.toolChoice, - }; - } - - // Create a clean version of the input for logging - const logInput = { - ...input, - messages: messages.map((msg) => ({ - role: msg.role, - content: msg.content?.map((content) => { - if ("image" in content && content.image) { - return { - image: { - format: content.image.format, - source: { bytes: "[BINARY]" }, - }, - }; - } - if ("document" in content && content.document) { - return { - document: { ...content.document, source: { bytes: "[BINARY]" } }, - }; - } - return content; - }), - })), - }; - - console.log( - "[Bedrock] Formatted request:", - JSON.stringify(logInput, null, 2), - ); - return input; -} - -export function createConverseStreamCommand(request: ConverseRequest) { - const input = formatRequestBody(request); - return new ConverseStreamCommand(input); -} - -export interface StreamResponse { - type: - | "messageStart" - | "contentBlockStart" - | "contentBlockDelta" - | "contentBlockStop" - | "messageStop" - | "metadata" - | "error"; - role?: string; - index?: number; - start?: any; - delta?: any; - stopReason?: string; - additionalModelResponseFields?: any; - usage?: any; - metrics?: any; - trace?: any; - error?: string; - message?: string; - originalStatusCode?: number; - originalMessage?: string; -} - -export function parseStreamResponse(chunk: any): StreamResponse | null { - if (chunk.messageStart) { - return { type: "messageStart", role: chunk.messageStart.role }; - } - if (chunk.contentBlockStart) { - return { - type: "contentBlockStart", - index: chunk.contentBlockStart.contentBlockIndex, - start: chunk.contentBlockStart.start, - }; - } - if (chunk.contentBlockDelta) { - return { - type: "contentBlockDelta", - index: chunk.contentBlockDelta.contentBlockIndex, - delta: chunk.contentBlockDelta.delta, - }; - } - if (chunk.contentBlockStop) { - return { - type: "contentBlockStop", - index: chunk.contentBlockStop.contentBlockIndex, - }; - } - if (chunk.messageStop) { - return { - type: "messageStop", - stopReason: chunk.messageStop.stopReason, - additionalModelResponseFields: - chunk.messageStop.additionalModelResponseFields, - }; - } - if (chunk.metadata) { - return { - type: "metadata", - usage: chunk.metadata.usage, - metrics: chunk.metadata.metrics, - trace: chunk.metadata.trace, - }; - } - return null; -} diff --git a/app/api/bedrock/utils.ts b/app/api/bedrock/utils.ts deleted file mode 100644 index c58808a01cd..00000000000 --- a/app/api/bedrock/utils.ts +++ /dev/null @@ -1,400 +0,0 @@ -import { MultimodalContent } from "../../client/api"; - -export interface Message { - role: string; - content: string | MultimodalContent[]; -} - -export interface ImageSource { - bytes: string; // base64 encoded image bytes -} - -export interface DocumentSource { - bytes: string; // base64 encoded document bytes - media_type?: string; // MIME type of the document -} - -export type DocumentFormat = - | "pdf" - | "csv" - | "doc" - | "docx" - | "xls" - | "xlsx" - | "html" - | "txt" - | "md"; -export type ImageFormat = "png" | "jpeg" | "gif" | "webp"; - -export interface BedrockImageBlock { - type: "image"; - image: { - format: ImageFormat; - source: { - bytes: string; - }; - }; -} - -export interface BedrockDocumentBlock { - type: "document"; - document: { - format: string; - name: string; - source: { - bytes: string; - media_type?: string; - }; - }; -} - -export interface BedrockTextBlock { - type: "text"; - text: string; -} - -export interface BedrockToolCallBlock { - type: "tool_calls"; - tool_calls: BedrockToolCall[]; -} - -export interface BedrockToolResultBlock { - type: "tool_result"; - tool_result: BedrockToolResult; -} - -export type BedrockContent = - | BedrockTextBlock - | BedrockImageBlock - | BedrockDocumentBlock - | BedrockToolCallBlock - | BedrockToolResultBlock; - -export interface BedrockToolSpec { - type: string; - function: { - name: string; - description: string; - parameters: Record; - }; -} - -export interface BedrockToolCall { - type: string; - function: { - name: string; - arguments: string; - }; -} - -export interface BedrockToolResult { - type: string; - output: string; -} - -export interface ContentItem { - type: string; - text?: string; - image_url?: { - url: string; - }; - document?: { - format: string; - name: string; - source: { - bytes: string; - media_type?: string; - }; - }; - tool_calls?: BedrockToolCall[]; - tool_result?: BedrockToolResult; -} - -export interface StreamEvent { - messageStart?: { role: string }; - contentBlockStart?: { index: number }; - contentBlockDelta?: { - delta: { - type?: string; - text?: string; - tool_calls?: BedrockToolCall[]; - tool_result?: BedrockToolResult; - }; - contentBlockIndex: number; - }; - contentBlockStop?: { index: number }; - messageStop?: { stopReason: string }; - metadata?: { - usage: { - inputTokens: number; - outputTokens: number; - totalTokens: number; - }; - metrics: { - latencyMs: number; - }; - }; -} - -export interface ConverseRequest { - modelId: string; - messages: Message[]; - inferenceConfig?: { - maxTokens?: number; - temperature?: number; - topP?: number; - stopSequences?: string[]; - stream?: boolean; - }; - system?: { text: string }[]; - tools?: BedrockToolSpec[]; - additionalModelRequestFields?: Record; - additionalModelResponseFieldPaths?: string[]; -} - -export interface BedrockResponse { - content: BedrockContent[]; - completion?: string; - stop_reason?: string; - usage?: { - input_tokens: number; - output_tokens: number; - total_tokens: number; - }; - tool_calls?: BedrockToolCall[]; -} - -// Helper function to get the base model type from modelId -export function getModelType(modelId: string): string { - if (modelId.includes("inference-profile")) { - const match = modelId.match(/us\.(meta\.llama.+?)$/); - if (match) return match[1]; - } - return modelId; -} - -// Helper function to validate model ID -export function validateModelId(modelId: string): string | null { - // Check if model requires inference profile - if ( - modelId.startsWith("meta.llama") && - !modelId.includes("inference-profile") - ) { - return "Llama models require an inference profile. Please use the full inference profile ARN."; - } - return null; -} - -// Helper function to validate document name -export function validateDocumentName(name: string): boolean { - const validPattern = /^[a-zA-Z0-9\s\-\(\)\[\]]+$/; - const noMultipleSpaces = !/\s{2,}/.test(name); - return validPattern.test(name) && noMultipleSpaces; -} - -// Helper function to validate document format -export function validateDocumentFormat( - format: string, -): format is DocumentFormat { - const validFormats: DocumentFormat[] = [ - "pdf", - "csv", - "doc", - "docx", - "xls", - "xlsx", - "html", - "txt", - "md", - ]; - return validFormats.includes(format as DocumentFormat); -} - -// Helper function to validate image size and dimensions -export function validateImageSize(base64Data: string): boolean { - // Check size (3.75 MB limit) - const sizeInBytes = (base64Data.length * 3) / 4; // Approximate size of decoded base64 - const maxSize = 3.75 * 1024 * 1024; // 3.75 MB in bytes - - if (sizeInBytes > maxSize) { - throw new Error("Image size exceeds 3.75 MB limit"); - } - - return true; -} - -// Helper function to validate document size -export function validateDocumentSize(base64Data: string): boolean { - // Check size (4.5 MB limit) - const sizeInBytes = (base64Data.length * 3) / 4; // Approximate size of decoded base64 - const maxSize = 4.5 * 1024 * 1024; // 4.5 MB in bytes - - if (sizeInBytes > maxSize) { - throw new Error("Document size exceeds 4.5 MB limit"); - } - - return true; -} - -// Helper function to process document content for Bedrock -export function processDocumentContent(content: any): BedrockDocumentBlock { - if ( - !content?.document?.format || - !content?.document?.name || - !content?.document?.source?.bytes - ) { - throw new Error("Invalid document content format"); - } - - const format = content.document.format.toLowerCase(); - if (!validateDocumentFormat(format)) { - throw new Error(`Unsupported document format: ${format}`); - } - - if (!validateDocumentName(content.document.name)) { - throw new Error( - `Invalid document name: ${content.document.name}. Only alphanumeric characters, single spaces, hyphens, parentheses, and square brackets are allowed.`, - ); - } - - // Validate document size - if (!validateDocumentSize(content.document.source.bytes)) { - throw new Error("Document size validation failed"); - } - - return { - type: "document", - document: { - format: format, - name: content.document.name, - source: { - bytes: content.document.source.bytes, - media_type: content.document.source.media_type, - }, - }, - }; -} - -// Helper function to process image content for Bedrock -export function processImageContent(content: any): BedrockImageBlock { - if (content.type === "image_url" && content.image_url?.url) { - const base64Match = content.image_url.url.match( - /^data:image\/([a-zA-Z]*);base64,([^"]*)$/, - ); - if (base64Match) { - const format = base64Match[1].toLowerCase(); - if (["png", "jpeg", "gif", "webp"].includes(format)) { - // Validate image size - if (!validateImageSize(base64Match[2])) { - throw new Error("Image size validation failed"); - } - - return { - type: "image", - image: { - format: format as ImageFormat, - source: { - bytes: base64Match[2], - }, - }, - }; - } - } - } - throw new Error("Invalid image content format"); -} - -// Helper function to validate message content restrictions -export function validateMessageContent(message: Message): void { - if (Array.isArray(message.content)) { - // Count images and documents in user messages - if (message.role === "user") { - const imageCount = message.content.filter( - (item) => item.type === "image_url", - ).length; - const documentCount = message.content.filter( - (item) => item.type === "document", - ).length; - - if (imageCount > 20) { - throw new Error("User messages can include up to 20 images"); - } - - if (documentCount > 5) { - throw new Error("User messages can include up to 5 documents"); - } - } else if ( - message.role === "assistant" && - (message.content.some((item) => item.type === "image_url") || - message.content.some((item) => item.type === "document")) - ) { - throw new Error("Assistant messages cannot include images or documents"); - } - } -} - -// Helper function to ensure messages alternate between user and assistant -export function validateMessageOrder(messages: Message[]): Message[] { - const validatedMessages: Message[] = []; - let lastRole = ""; - - for (const message of messages) { - // Validate content restrictions for each message - validateMessageContent(message); - - if (message.role === lastRole) { - // Skip duplicate roles to maintain alternation - continue; - } - validatedMessages.push(message); - lastRole = message.role; - } - - return validatedMessages; -} - -// Helper function to convert Bedrock response back to MultimodalContent format -export function convertBedrockResponseToMultimodal( - response: BedrockResponse, -): string | MultimodalContent[] { - if (response.completion) { - return response.completion; - } - - if (!response.content) { - return ""; - } - - return response.content.map((block) => { - if (block.type === "text") { - return { - type: "text", - text: block.text, - }; - } else if (block.type === "image") { - return { - type: "image_url", - image_url: { - url: `data:image/${block.image.format};base64,${block.image.source.bytes}`, - }, - }; - } else if (block.type === "document") { - return { - type: "document", - document: { - format: block.document.format, - name: block.document.name, - source: { - bytes: block.document.source.bytes, - media_type: block.document.source.media_type, - }, - }, - }; - } - // Fallback to text content - return { - type: "text", - text: "", - }; - }); -} diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index e2197565064..043fa7aa240 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -239,7 +239,7 @@ export class BedrockApi implements LLMApi { // Add error message as text content content.push({ type: "text", - text: `Error processing image: ${e.message}`, + text: `Error processing image: ${e}`, }); } } diff --git a/app/components/chat-actions.tsx b/app/components/chat-actions.tsx deleted file mode 100644 index 25cdfe16d8b..00000000000 --- a/app/components/chat-actions.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { ChatActions as Actions } from "./chat"; -import DocumentIcon from "../icons/document.svg"; -import LoadingButtonIcon from "../icons/loading.svg"; -import { ServiceProvider } from "../constant"; -import { useChatStore } from "../store"; -import { showToast } from "./ui-lib"; -import { MultimodalContent, MessageRole } from "../client/api"; -import { ChatMessage } from "../store/chat"; - -export function ChatActions(props: Parameters[0]) { - const chatStore = useChatStore(); - const currentProviderName = - chatStore.currentSession().mask.modelConfig?.providerName; - const isBedrockProvider = currentProviderName === ServiceProvider.Bedrock; - - async function uploadDocument() { - const fileInput = document.createElement("input"); - fileInput.type = "file"; - fileInput.accept = ".pdf,.csv,.doc,.docx,.xls,.xlsx,.html,.txt,.md"; - fileInput.onchange = async (event: any) => { - const file = event.target.files[0]; - if (!file) return; - - props.setUploading(true); - try { - // Get file extension and MIME type - const format = file.name.split(".").pop()?.toLowerCase() || ""; - const supportedFormats = [ - "pdf", - "csv", - "doc", - "docx", - "xls", - "xlsx", - "html", - "txt", - "md", - ]; - - if (!supportedFormats.includes(format)) { - throw new Error("Unsupported file format"); - } - - // Map file extensions to MIME types - const mimeTypes: { [key: string]: string } = { - pdf: "application/pdf", - csv: "text/csv", - doc: "application/msword", - docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - xls: "application/vnd.ms-excel", - xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - html: "text/html", - txt: "text/plain", - md: "text/markdown", - }; - - // Convert file to base64 - const base64 = await new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = (e) => { - if (!e.target?.result) return reject("Failed to read file"); - // Get just the base64 data without the data URL prefix - const base64 = (e.target.result as string).split(",")[1]; - resolve(base64); - }; - reader.onerror = reject; - reader.readAsDataURL(file); - }); - - // Format file size - const size = file.size; - let sizeStr = ""; - if (size < 1024) { - sizeStr = size + " B"; - } else if (size < 1024 * 1024) { - sizeStr = (size / 1024).toFixed(2) + " KB"; - } else { - sizeStr = (size / (1024 * 1024)).toFixed(2) + " MB"; - } - - // Create document content - const content: MultimodalContent[] = [ - { - type: "text", - text: `Document: ${file.name} (${sizeStr})`, - }, - { - type: "document", - document: { - format, - name: file.name, - source: { - bytes: base64, - media_type: mimeTypes[format] || `application/${format}`, - }, - }, - }, - ]; - - // Send content to Bedrock - const session = chatStore.currentSession(); - const modelConfig = session.mask.modelConfig; - const api = await import("../client/api").then((m) => - m.getClientApi(modelConfig.providerName), - ); - - // Create user message - const userMessage: ChatMessage = { - id: Date.now().toString(), - role: "user" as MessageRole, - content, - date: new Date().toLocaleString(), - isError: false, - }; - - // Create bot message - const botMessage: ChatMessage = { - id: (Date.now() + 1).toString(), - role: "assistant" as MessageRole, - content: "", - date: new Date().toLocaleString(), - streaming: true, - isError: false, - }; - - // Add messages to session - chatStore.updateCurrentSession((session) => { - session.messages.push(userMessage, botMessage); - }); - - // Make request - api.llm.chat({ - messages: [userMessage], - config: { ...modelConfig, stream: true }, - onUpdate(message) { - botMessage.streaming = true; - if (message) { - botMessage.content = message; - } - chatStore.updateCurrentSession((session) => { - session.messages = session.messages.concat(); - }); - }, - onFinish(message) { - botMessage.streaming = false; - if (message) { - botMessage.content = message; - chatStore.onNewMessage(botMessage); - } - }, - onError(error) { - botMessage.content = error.message; - botMessage.streaming = false; - userMessage.isError = true; - botMessage.isError = true; - chatStore.updateCurrentSession((session) => { - session.messages = session.messages.concat(); - }); - console.error("[Chat] failed ", error); - }, - }); - } catch (error) { - console.error("Failed to upload document:", error); - showToast("Failed to upload document"); - } finally { - props.setUploading(false); - } - }; - fileInput.click(); - } - - return ( -
- {/* Original actions */} - - - {/* Document upload button (only for Bedrock) */} - {isBedrockProvider && ( -
-
- {props.uploading ? : } -
-
Upload Document
-
- )} -
- ); -} diff --git a/app/components/chat.tsx b/app/components/chat.tsx index c4d11e31876..3d5b6a4f2c4 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -8,7 +8,7 @@ import React, { Fragment, RefObject, } from "react"; -import DocumentIcon from "../icons/document.svg"; + import SendWhiteIcon from "../icons/send-white.svg"; import BrainIcon from "../icons/brain.svg"; import RenameIcon from "../icons/rename.svg"; @@ -548,91 +548,6 @@ export function ChatActions(props: { ); } }, [chatStore, currentModel, models]); - const isBedrockProvider = currentProviderName === ServiceProvider.Bedrock; - - // ... (rest of the existing state and functions) - - async function uploadDocument() { - const fileInput = document.createElement("input"); - fileInput.type = "file"; - fileInput.accept = ".pdf,.csv,.doc,.docx,.xls,.xlsx,.html,.txt,.md"; - fileInput.onchange = async (event: any) => { - const file = event.target.files[0]; - if (!file) return; - - props.setUploading(true); - try { - // Convert file to base64 - const base64 = await new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = (e) => { - if (!e.target?.result) return reject("Failed to read file"); - const base64 = (e.target.result as string).split(",")[1]; - resolve(base64); - }; - reader.onerror = reject; - reader.readAsDataURL(file); - }); - - // Get file extension - const format = file.name.split(".").pop()?.toLowerCase() || ""; - const supportedFormats = [ - "pdf", - "csv", - "doc", - "docx", - "xls", - "xlsx", - "html", - "txt", - "md", - ]; - - if (!supportedFormats.includes(format)) { - throw new Error("Unsupported file format"); - } - - // Format file size - const size = file.size; - let sizeStr = ""; - if (size < 1024) { - sizeStr = size + " B"; - } else if (size < 1024 * 1024) { - sizeStr = (size / 1024).toFixed(2) + " KB"; - } else { - sizeStr = (size / (1024 * 1024)).toFixed(2) + " MB"; - } - - // Create document content with only filename and size - const documentContent = { - type: "document", - document: { - format, - name: file.name, - size: sizeStr, - source: { - bytes: base64, - }, - }, - }; - - // Submit the document content as a JSON string but only display filename and size - const displayContent = `Document: ${file.name} (${sizeStr})`; - chatStore.onUserInput(displayContent); - - // Store the actual document content separately if needed - // chatStore.updateCurrentSession((session) => { - // session.lastDocument = documentContent; - // }); - } catch (error) { - console.error("Failed to upload document:", error); - showToast("Failed to upload document"); - } finally { - props.setUploading(false); - } - }; - fileInput.click(); - } return (
@@ -665,14 +580,6 @@ export function ChatActions(props: { icon={props.uploading ? : } /> )} - {/* Add document upload button for Bedrock */} - {isBedrockProvider && ( - : } - /> - )} - - - - - - From 0f276f59bb2580eb0059620b10748546881ce092 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 10:34:33 +0800 Subject: [PATCH 04/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/client/platforms/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/client/platforms/bedrock.ts | 577 +++++++++++++------------------- 1 file changed, 233 insertions(+), 344 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 043fa7aa240..5e1f9f0a252 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -3,22 +3,49 @@ import { ChatOptions, getHeaders, LLMApi, + LLMModel, LLMUsage, - MultimodalContent, SpeechOptions, } from "../api"; -import { useAccessStore, useAppConfig } from "../../store"; -import Locale from "../../locales"; import { - getMessageImages, - getMessageTextContent, - isVisionModel, -} from "../../utils"; + useAccessStore, + useAppConfig, + usePluginStore, + useChatStore, + ChatMessageTool, +} from "../../store"; +import { getMessageTextContent, isVisionModel } from "../../utils"; import { fetch } from "../../utils/stream"; - -const MAX_IMAGE_SIZE = 1024 * 1024 * 4; // 4MB limit +import { preProcessImageContent, stream } from "../../utils/chat"; + +export type MultiBlockContent = { + type: "image" | "text"; + source?: { + type: string; + media_type: string; + data: string; + }; + text?: string; +}; + +export type AnthropicMessage = { + role: (typeof ClaudeMapper)[keyof typeof ClaudeMapper]; + content: string | MultiBlockContent[]; +}; + +const ClaudeMapper = { + assistant: "assistant", + user: "user", + system: "user", +} as const; export class BedrockApi implements LLMApi { + usage(): Promise { + throw new Error("Method not implemented."); + } + models(): Promise { + throw new Error("Method not implemented."); + } speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); } @@ -31,154 +58,17 @@ export class BedrockApi implements LLMApi { return res; } - async processDocument( - file: File, - ): Promise<{ display: string; content: MultimodalContent }> { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = async () => { - try { - const arrayBuffer = reader.result as ArrayBuffer; - const format = file.name.split(".").pop()?.toLowerCase(); - - if (!format) { - throw new Error("Could not determine file format"); - } - - // Format file size - const size = file.size; - let sizeStr = ""; - if (size < 1024) { - sizeStr = size + " B"; - } else if (size < 1024 * 1024) { - sizeStr = (size / 1024).toFixed(2) + " KB"; - } else { - sizeStr = (size / (1024 * 1024)).toFixed(2) + " MB"; - } - - // Create display text - const displayText = `Document: ${file.name} (${sizeStr})`; - - // Create actual content - const content: MultimodalContent = { - type: "document", - document: { - format: format as - | "pdf" - | "csv" - | "doc" - | "docx" - | "xls" - | "xlsx" - | "html" - | "txt" - | "md", - name: file.name, - source: { - bytes: Buffer.from(arrayBuffer).toString("base64"), - }, - }, - }; - - resolve({ - display: displayText, - content: content, - }); - } catch (e) { - reject(e); - } - }; - reader.onerror = () => reject(reader.error); - reader.readAsArrayBuffer(file); - }); - } - - async processImage(url: string): Promise { - if (url.startsWith("data:")) { - const base64Match = url.match(/^data:image\/([a-zA-Z]*);base64,([^"]*)/); - if (base64Match) { - const format = base64Match[1].toLowerCase(); - const base64Data = base64Match[2]; - - // Check base64 size - const binarySize = atob(base64Data).length; - if (binarySize > MAX_IMAGE_SIZE) { - throw new Error( - `Image size (${(binarySize / (1024 * 1024)).toFixed( - 2, - )}MB) exceeds maximum allowed size of 4MB`, - ); - } - - return { - type: "image_url", - image_url: { - url: url, - }, - }; - } - throw new Error("Invalid data URL format"); - } - - // For non-data URLs, fetch and convert to base64 - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to fetch image: ${response.statusText}`); - } - - const blob = await response.blob(); - if (blob.size > MAX_IMAGE_SIZE) { - throw new Error( - `Image size (${(blob.size / (1024 * 1024)).toFixed( - 2, - )}MB) exceeds maximum allowed size of 4MB`, - ); - } - - const reader = new FileReader(); - const base64 = await new Promise((resolve, reject) => { - reader.onloadend = () => resolve(reader.result as string); - reader.onerror = () => reject(new Error("Failed to read image data")); - reader.readAsDataURL(blob); - }); - - return { - type: "image_url", - image_url: { - url: base64, - }, - }; - } catch (error) { - console.error("[Bedrock] Image processing error:", error); - throw error; - } - } - async chat(options: ChatOptions): Promise { + const visionModel = isVisionModel(options.config.model); const accessStore = useAccessStore.getState(); + const shouldStream = !!options.config.stream; const modelConfig = { ...useAppConfig.getState().modelConfig, - ...options.config, + ...useChatStore.getState().currentSession().mask.modelConfig, + ...{ + model: options.config.model, + }, }; - - if ( - !accessStore.awsRegion || - !accessStore.awsAccessKeyId || - !accessStore.awsSecretAccessKey - ) { - console.log("AWS credentials are not set"); - let responseText = ""; - const responseTexts = [responseText]; - responseTexts.push(Locale.Error.Unauthorized); - responseText = responseTexts.join("\n\n"); - options.onFinish(responseText); - return; - } - - const controller = new AbortController(); - options.onController?.(controller); - const headers: Record = { ...getHeaders(), "X-Region": accessStore.awsRegion, @@ -186,200 +76,212 @@ export class BedrockApi implements LLMApi { "X-Secret-Key": accessStore.awsSecretAccessKey, }; - if (accessStore.awsSessionToken) { - headers["X-Session-Token"] = accessStore.awsSessionToken; + // try get base64image from local cache image_url + const messages: ChatOptions["messages"] = []; + for (const v of options.messages) { + const content = await preProcessImageContent(v.content); + messages.push({ role: v.role, content }); } - try { - // Process messages to handle multimodal content - const messages = await Promise.all( - options.messages.map(async (msg) => { - if (Array.isArray(msg.content)) { - // For vision models, include both text and images - if (isVisionModel(options.config.model)) { - const images = getMessageImages(msg); - const content: MultimodalContent[] = []; - - // Process documents first - for (const item of msg.content) { - // Check for document content - if (item && typeof item === "object") { - if ("file" in item && item.file instanceof File) { - try { - console.log( - "[Bedrock] Processing document:", - item.file.name, - ); - const { content: docContent } = - await this.processDocument(item.file); - content.push(docContent); - } catch (e) { - console.error("[Bedrock] Failed to process document:", e); - } - } else if ("document" in item && item.document) { - // If document content is already processed, include it directly - content.push(item as MultimodalContent); - } - } - } - - // Add text content if it's not a document display text - const text = getMessageTextContent(msg); - if (text && !text.startsWith("Document: ")) { - content.push({ type: "text", text }); - } - - // Process images with size check and error handling - for (const url of images) { - try { - const imageContent = await this.processImage(url); - content.push(imageContent); - } catch (e) { - console.error("[Bedrock] Failed to process image:", e); - // Add error message as text content - content.push({ - type: "text", - text: `Error processing image: ${e}`, - }); - } - } - - // Only return content if there is any - if (content.length > 0) { - return { ...msg, content }; - } - } - // For non-vision models, only include text - return { ...msg, content: getMessageTextContent(msg) }; - } - return msg; - }), - ); - - // Filter out empty messages - const filteredMessages = messages.filter((msg) => { - if (Array.isArray(msg.content)) { - return msg.content.length > 0; - } - return msg.content !== ""; - }); + const keys = ["system", "user"]; - const requestBody = { - messages: filteredMessages, - modelId: options.config.model, - inferenceConfig: { - maxTokens: modelConfig.max_tokens, - temperature: modelConfig.temperature, - topP: modelConfig.top_p, - stopSequences: [], - }, - }; + // roles must alternate between "user" and "assistant" in claude, so add a fake assistant message between two user messages + for (let i = 0; i < messages.length - 1; i++) { + const message = messages[i]; + const nextMessage = messages[i + 1]; - console.log( - "[Bedrock] Request body:", - JSON.stringify( + if (keys.includes(message.role) && keys.includes(nextMessage.role)) { + messages[i] = [ + message, { - ...requestBody, - messages: requestBody.messages.map((msg) => ({ - ...msg, - content: Array.isArray(msg.content) - ? msg.content.map((c) => ({ - type: c.type, - ...(c.document - ? { - document: { - format: c.document.format, - name: c.document.name, - }, - } - : {}), - ...(c.image_url ? { image_url: { url: "[BINARY]" } } : {}), - ...(c.text ? { text: c.text } : {}), - })) - : msg.content, - })), + role: "assistant", + content: ";", }, - null, - 2, - ), - ); - - const shouldStream = !!options.config.stream; - const conversePath = `${ApiPath.Bedrock}/converse`; - - if (shouldStream) { - let response = await fetch(conversePath, { - method: "POST", - headers: { - ...headers, - "X-Stream": "true", - }, - body: JSON.stringify(requestBody), - signal: controller.signal, - }); - - if (!response.ok) { - const error = await response.text(); - throw new Error(`Bedrock API error: ${error}`); - } + ] as any; + } + } - let buffer = ""; - const reader = response.body?.getReader(); - if (!reader) { - throw new Error("No response body reader available"); + const prompt = messages + .flat() + .filter((v) => { + if (!v.content) return false; + if (typeof v.content === "string" && !v.content.trim()) return false; + return true; + }) + .map((v) => { + const { role, content } = v; + const insideRole = ClaudeMapper[role] ?? "user"; + + if (!visionModel || typeof content === "string") { + return { + role: insideRole, + content: getMessageTextContent(v), + }; } + return { + role: insideRole, + content: content + .filter((v) => v.image_url || v.text) + .map(({ type, text, image_url }) => { + if (type === "text") { + return { + type, + text: text!, + }; + } + const { url = "" } = image_url || {}; + const colonIndex = url.indexOf(":"); + const semicolonIndex = url.indexOf(";"); + const comma = url.indexOf(","); + + const mimeType = url.slice(colonIndex + 1, semicolonIndex); + const encodeType = url.slice(semicolonIndex + 1, comma); + const data = url.slice(comma + 1); + + return { + type: "image" as const, + source: { + type: encodeType, + media_type: mimeType, + data, + }, + }; + }), + }; + }); - let currentContent = ""; - let isFirstMessage = true; - - while (true) { - const { done, value } = await reader.read(); - if (done) break; + if (prompt[0]?.role === "assistant") { + prompt.unshift({ + role: "user", + content: ";", + }); + } - // Convert the chunk to text and add to buffer - const chunk = new TextDecoder().decode(value); - buffer += chunk; + const [tools, funcs] = usePluginStore + .getState() + .getAsTools(useChatStore.getState().currentSession().mask?.plugin || []); + + const requestBody = { + modelId: options.config.model, + messages: messages.filter((msg) => msg.content.length > 0), + inferenceConfig: { + maxTokens: modelConfig.max_tokens, + temperature: modelConfig.temperature, + topP: modelConfig.top_p, + stopSequences: [], + }, + toolConfig: + Array.isArray(tools) && tools.length > 0 + ? { + tools: tools.map((tool: any) => ({ + toolSpec: { + name: tool?.function?.name, + description: tool?.function?.description, + inputSchema: { + json: tool?.function?.parameters, + }, + }, + })), + toolChoice: { auto: {} }, + } + : undefined, + }; - // Process complete messages from buffer - let newlineIndex; - while ((newlineIndex = buffer.indexOf("\n")) !== -1) { - const line = buffer.slice(0, newlineIndex).trim(); - buffer = buffer.slice(newlineIndex + 1); + const conversePath = `${ApiPath.Bedrock}/converse`; + const controller = new AbortController(); + options.onController?.(controller); - if (line.startsWith("data: ")) { - try { - const event = JSON.parse(line.slice(6)); + if (shouldStream) { + let currentToolUse: ChatMessageTool | null = null; + return stream( + conversePath, + requestBody, + headers, + Array.isArray(tools) + ? tools.map((tool: any) => ({ + name: tool?.function?.name, + description: tool?.function?.description, + input_schema: tool?.function?.parameters, + })) + : [], + funcs, + controller, + // parseSSE + (text: string, runTools: ChatMessageTool[]) => { + const event = JSON.parse(text); + + if (event.type === "messageStart") { + return ""; + } - if (event.type === "messageStart") { - if (isFirstMessage) { - isFirstMessage = false; - } - continue; - } + if (event.type === "contentBlockStart" && event.start?.toolUse) { + const { toolUseId, name } = event.start.toolUse; + currentToolUse = { + id: toolUseId, + type: "function", + function: { + name, + arguments: "", + }, + }; + runTools.push(currentToolUse); + return ""; + } - if (event.type === "text" && event.content) { - currentContent += event.content; - options.onUpdate?.(currentContent, event.content); - } + if (event.type === "text" && event.content) { + return event.content; + } - if (event.type === "messageStop") { - options.onFinish(currentContent); - return; - } + if ( + event.type === "toolUse" && + event.input && + currentToolUse?.function + ) { + currentToolUse.function.arguments += event.input; + return ""; + } - if (event.type === "error") { - throw new Error(event.message || "Unknown error"); - } - } catch (e) { - console.error("[Bedrock] Failed to parse stream event:", e); - } - } + if (event.type === "error") { + throw new Error(event.message || "Unknown error"); } - } - // If we reach here without a messageStop event, finish with current content - options.onFinish(currentContent); - } else { + return ""; + }, + // processToolMessage + (requestPayload: any, toolCallMessage: any, toolCallResult: any[]) => { + currentToolUse = null; + requestPayload?.messages?.splice( + requestPayload?.messages?.length, + 0, + { + role: "assistant", + content: toolCallMessage.tool_calls.map( + (tool: ChatMessageTool) => ({ + type: "tool_use", + id: tool.id, + name: tool?.function?.name, + input: tool?.function?.arguments + ? JSON.parse(tool?.function?.arguments) + : {}, + }), + ), + }, + ...toolCallResult.map((result) => ({ + role: "user", + content: [ + { + type: "tool_result", + tool_use_id: result.tool_call_id, + content: result.content, + }, + ], + })), + ); + }, + options, + ); + } else { + try { const response = await fetch(conversePath, { method: "POST", headers, @@ -395,23 +297,10 @@ export class BedrockApi implements LLMApi { const responseBody = await response.json(); const content = this.extractMessage(responseBody); options.onFinish(content); + } catch (e: any) { + console.error("[Bedrock] Chat error:", e); + throw e; } - } catch (e) { - console.error("[Bedrock] Chat error:", e); - options.onError?.(e as Error); } } - - async usage(): Promise { - // Bedrock usage is tracked through AWS billing - return { - used: 0, - total: 0, - }; - } - - async models() { - // Return empty array as models are configured through AWS console - return []; - } } From afbf5eb541f4f4f3a53ba4aeeeb26e541cd0753c Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 14:27:52 +0800 Subject: [PATCH 05/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20.env.template=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/auth.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/client/api.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20?= =?UTF-8?q?=20=20=20=20app/client/platforms/bedrock.ts=20=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=20=20=20app/components/settings.tsx=20?= =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/config/server.?= =?UTF-8?q?ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/constant.?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.template | 7 +- app/api/auth.ts | 10 +- app/api/bedrock.ts | 215 +++++++++++++++++--------------- app/client/api.ts | 15 ++- app/client/platforms/bedrock.ts | 53 ++++---- app/components/settings.tsx | 8 +- app/config/server.ts | 8 +- app/constant.ts | 8 +- app/store/access.ts | 13 +- 9 files changed, 184 insertions(+), 153 deletions(-) diff --git a/.env.template b/.env.template index 82f44216ab8..8c0c4c1cc5e 100644 --- a/.env.template +++ b/.env.template @@ -66,4 +66,9 @@ ANTHROPIC_API_VERSION= ANTHROPIC_URL= ### (optional) -WHITE_WEBDAV_ENDPOINTS= \ No newline at end of file +WHITE_WEBDAV_ENDPOINTS= + +### bedrock (optional) +AWS_REGION= +AWS_ACCESS_KEY= +AWS_SECRET_KEY= \ No newline at end of file diff --git a/app/api/auth.ts b/app/api/auth.ts index 1a0ae0b432e..bb8ee147445 100644 --- a/app/api/auth.ts +++ b/app/api/auth.ts @@ -54,18 +54,18 @@ export function auth(req: NextRequest, modelProvider: ModelProvider) { } // Special handling for Bedrock if (modelProvider === ModelProvider.Bedrock) { - const region = req.headers.get("X-Region"); - const accessKeyId = req.headers.get("X-Access-Key"); - const secretKey = req.headers.get("X-Secret-Key"); + const region = serverConfig.awsRegion; + const accessKeyId = serverConfig.awsAccessKey; + const secretAccessKey = serverConfig.awsSecretKey; console.log("[Auth] Bedrock credentials:", { region, accessKeyId: accessKeyId ? "***" : undefined, - secretKey: secretKey ? "***" : undefined, + secretKey: secretAccessKey ? "***" : undefined, }); // Check if AWS credentials are provided - if (!region || !accessKeyId || !secretKey) { + if (!region || !accessKeyId || !secretAccessKey) { return { error: true, msg: "Missing AWS credentials. Please configure Region, Access Key ID, and Secret Access Key in settings.", diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index e3ca645bd7a..8b5ddc47ec5 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,7 +1,6 @@ -import { ModelProvider } from "../constant"; +import { getServerSideConfig } from "../config/server"; import { prettyObject } from "../utils/format"; import { NextRequest, NextResponse } from "next/server"; -import { auth } from "./auth"; import { BedrockRuntimeClient, ConverseStreamCommand, @@ -16,6 +15,15 @@ import { type ToolResultContentBlock, } from "@aws-sdk/client-bedrock-runtime"; +// 解密函数 +function decrypt(str: string): string { + try { + return Buffer.from(str, "base64").toString().split("").reverse().join(""); + } catch { + return ""; + } +} + // Constants and Types const ALLOWED_PATH = new Set(["converse"]); @@ -92,26 +100,6 @@ type DocumentFormat = | "txt" | "md"; -// Validation Functions -function validateModelId(modelId: string): string | null { - if ( - modelId.startsWith("meta.llama") && - !modelId.includes("inference-profile") - ) { - return "Llama models require an inference profile. Please use the full inference profile ARN."; - } - return null; -} - -function validateDocumentSize(base64Data: string): boolean { - const sizeInBytes = (base64Data.length * 3) / 4; - const maxSize = 4.5 * 1024 * 1024; - if (sizeInBytes > maxSize) { - throw new Error("Document size exceeds 4.5 MB limit"); - } - return true; -} - function validateImageSize(base64Data: string): boolean { const sizeInBytes = (base64Data.length * 3) / 4; const maxSize = 3.75 * 1024 * 1024; @@ -147,21 +135,6 @@ function convertContentToAWSBlock(item: ContentItem): ContentBlock | null { } } - if (item.type === "document" && item.document) { - validateDocumentSize(item.document.source.bytes); - return { - document: { - format: item.document.format, - name: item.document.name, - source: { - bytes: Uint8Array.from( - Buffer.from(item.document.source.bytes, "base64"), - ), - }, - }, - }; - } - if (item.type === "tool_use" && item.tool_use) { return { toolUse: { @@ -373,65 +346,70 @@ export async function handle( ); } - const authResult = auth(req, ModelProvider.Bedrock); - if (authResult.error) { - return NextResponse.json(authResult, { - status: 401, - }); + const serverConfig = getServerSideConfig(); + + // 首先尝试使用环境变量中的凭证 + let region = serverConfig.awsRegion; + let accessKeyId = serverConfig.awsAccessKey; + let secretAccessKey = serverConfig.awsSecretKey; + let sessionToken = undefined; + + // 如果环境变量中没有配置,则尝试使用前端传来的加密凭证 + if (!region || !accessKeyId || !secretAccessKey) { + // 解密前端传来的凭证 + region = decrypt(req.headers.get("X-Region") ?? ""); + accessKeyId = decrypt(req.headers.get("X-Access-Key") ?? ""); + secretAccessKey = decrypt(req.headers.get("X-Secret-Key") ?? ""); + sessionToken = req.headers.get("X-Session-Token") + ? decrypt(req.headers.get("X-Session-Token") ?? "") + : undefined; } - try { - const response = await handleConverseRequest(req); - return response; - } catch (e) { - console.error("[Bedrock] ", e); + if (!region || !accessKeyId || !secretAccessKey) { return NextResponse.json( { error: true, - message: e instanceof Error ? e.message : "Unknown error", - details: prettyObject(e), + msg: "AWS credentials not found in environment variables or request headers", + }, + { + status: 401, }, - { status: 500 }, ); } -} -async function handleConverseRequest(req: NextRequest) { - const region = req.headers.get("X-Region") || "us-west-2"; - const accessKeyId = req.headers.get("X-Access-Key") || ""; - const secretAccessKey = req.headers.get("X-Secret-Key") || ""; - const sessionToken = req.headers.get("X-Session-Token"); + try { + const client = new BedrockRuntimeClient({ + region, + credentials: { + accessKeyId, + secretAccessKey, + sessionToken, + }, + }); - if (!accessKeyId || !secretAccessKey) { + const response = await handleConverseRequest(req, client); + return response; + } catch (e) { + console.error("[Bedrock] ", e); return NextResponse.json( { error: true, - message: "Missing AWS credentials", - }, - { - status: 401, + message: e instanceof Error ? e.message : "Unknown error", + details: prettyObject(e), }, + { status: 500 }, ); } +} - const client = new BedrockRuntimeClient({ - region, - credentials: { - accessKeyId, - secretAccessKey, - sessionToken: sessionToken || undefined, - }, - }); - +async function handleConverseRequest( + req: NextRequest, + client: BedrockRuntimeClient, +) { try { const body = (await req.json()) as ConverseRequest; const { modelId } = body; - const validationError = validateModelId(modelId); - if (validationError) { - throw new Error(validationError); - } - console.log("[Bedrock] Invoking model:", modelId); const command = new ConverseStreamCommand(formatRequestBody(body)); @@ -455,8 +433,9 @@ async function handleConverseRequest(req: NextRequest) { if ("messageStart" in output && output.messageStart?.role) { controller.enqueue( `data: ${JSON.stringify({ - type: "messageStart", - role: output.messageStart.role, + stream: { + messageStart: { role: output.messageStart.role }, + }, })}\n\n`, ); } else if ( @@ -465,9 +444,13 @@ async function handleConverseRequest(req: NextRequest) { ) { controller.enqueue( `data: ${JSON.stringify({ - type: "contentBlockStart", - index: output.contentBlockStart.contentBlockIndex, - start: output.contentBlockStart.start, + stream: { + contentBlockStart: { + contentBlockIndex: + output.contentBlockStart.contentBlockIndex, + start: output.contentBlockStart.start, + }, + }, })}\n\n`, ); } else if ( @@ -477,15 +460,30 @@ async function handleConverseRequest(req: NextRequest) { if ("text" in output.contentBlockDelta.delta) { controller.enqueue( `data: ${JSON.stringify({ - type: "text", - content: output.contentBlockDelta.delta.text, + stream: { + contentBlockDelta: { + delta: { text: output.contentBlockDelta.delta.text }, + contentBlockIndex: + output.contentBlockDelta.contentBlockIndex, + }, + }, })}\n\n`, ); } else if ("toolUse" in output.contentBlockDelta.delta) { controller.enqueue( `data: ${JSON.stringify({ - type: "toolUse", - input: output.contentBlockDelta.delta.toolUse?.input, + stream: { + contentBlockDelta: { + delta: { + toolUse: { + input: + output.contentBlockDelta.delta.toolUse?.input, + }, + }, + contentBlockIndex: + output.contentBlockDelta.contentBlockIndex, + }, + }, })}\n\n`, ); } @@ -495,26 +493,36 @@ async function handleConverseRequest(req: NextRequest) { ) { controller.enqueue( `data: ${JSON.stringify({ - type: "contentBlockStop", - index: output.contentBlockStop.contentBlockIndex, + stream: { + contentBlockStop: { + contentBlockIndex: + output.contentBlockStop.contentBlockIndex, + }, + }, })}\n\n`, ); } else if ("messageStop" in output && output.messageStop) { controller.enqueue( `data: ${JSON.stringify({ - type: "messageStop", - stopReason: output.messageStop.stopReason, - additionalModelResponseFields: - output.messageStop.additionalModelResponseFields, + stream: { + messageStop: { + stopReason: output.messageStop.stopReason, + additionalModelResponseFields: + output.messageStop.additionalModelResponseFields, + }, + }, })}\n\n`, ); } else if ("metadata" in output && output.metadata) { controller.enqueue( `data: ${JSON.stringify({ - type: "metadata", - usage: output.metadata.usage, - metrics: output.metadata.metrics, - trace: output.metadata.trace, + stream: { + metadata: { + usage: output.metadata.usage, + metrics: output.metadata.metrics, + trace: output.metadata.trace, + }, + }, })}\n\n`, ); } @@ -522,14 +530,17 @@ async function handleConverseRequest(req: NextRequest) { controller.close(); } catch (error) { const errorResponse = { - type: "error", - error: - error instanceof Error ? error.constructor.name : "UnknownError", - message: error instanceof Error ? error.message : "Unknown error", - ...(error instanceof ModelStreamErrorException && { - originalStatusCode: error.originalStatusCode, - originalMessage: error.originalMessage, - }), + stream: { + error: + error instanceof Error + ? error.constructor.name + : "UnknownError", + message: error instanceof Error ? error.message : "Unknown error", + ...(error instanceof ModelStreamErrorException && { + originalStatusCode: error.originalStatusCode, + originalMessage: error.originalMessage, + }), + }, }; controller.enqueue(`data: ${JSON.stringify(errorResponse)}\n\n`); controller.close(); diff --git a/app/client/api.ts b/app/client/api.ts index 05ce8a236dc..e7ba2fd5ddf 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -261,7 +261,7 @@ export function getHeaders(ignoreHeaders: boolean = false) { const apiKey = isGoogle ? accessStore.googleApiKey : isBedrock - ? accessStore.awsAccessKeyId // Use AWS access key for Bedrock + ? accessStore.awsAccessKey // Use AWS access key for Bedrock : isAzure ? accessStore.azureApiKey : isAnthropic @@ -322,12 +322,15 @@ export function getHeaders(ignoreHeaders: boolean = false) { const authHeader = getAuthHeader(); if (isBedrock) { - // Add AWS credentials for Bedrock - headers["X-Region"] = accessStore.awsRegion; - headers["X-Access-Key"] = accessStore.awsAccessKeyId; - headers["X-Secret-Key"] = accessStore.awsSecretAccessKey; + // 简单加密 AWS credentials + const encrypt = (str: string) => + Buffer.from(str.split("").reverse().join("")).toString("base64"); + + headers["X-Region"] = encrypt(accessStore.awsRegion); + headers["X-Access-Key"] = encrypt(accessStore.awsAccessKey); + headers["X-Secret-Key"] = encrypt(accessStore.awsSecretKey); if (accessStore.awsSessionToken) { - headers["X-Session-Token"] = accessStore.awsSessionToken; + headers["X-Session-Token"] = encrypt(accessStore.awsSessionToken); } } else { const bearerToken = getBearerToken( diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 5e1f9f0a252..b440703528e 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -8,7 +8,6 @@ import { SpeechOptions, } from "../api"; import { - useAccessStore, useAppConfig, usePluginStore, useChatStore, @@ -60,7 +59,6 @@ export class BedrockApi implements LLMApi { async chat(options: ChatOptions): Promise { const visionModel = isVisionModel(options.config.model); - const accessStore = useAccessStore.getState(); const shouldStream = !!options.config.stream; const modelConfig = { ...useAppConfig.getState().modelConfig, @@ -69,12 +67,6 @@ export class BedrockApi implements LLMApi { model: options.config.model, }, }; - const headers: Record = { - ...getHeaders(), - "X-Region": accessStore.awsRegion, - "X-Access-Key": accessStore.awsAccessKeyId, - "X-Secret-Key": accessStore.awsSecretAccessKey, - }; // try get base64image from local cache image_url const messages: ChatOptions["messages"] = []; @@ -196,7 +188,7 @@ export class BedrockApi implements LLMApi { return stream( conversePath, requestBody, - headers, + getHeaders(), Array.isArray(tools) ? tools.map((tool: any) => ({ name: tool?.function?.name, @@ -208,14 +200,20 @@ export class BedrockApi implements LLMApi { controller, // parseSSE (text: string, runTools: ChatMessageTool[]) => { - const event = JSON.parse(text); + const parsed = JSON.parse(text); + const event = parsed.stream; + + if (!event) { + console.warn("[Bedrock] Unexpected event format:", parsed); + return ""; + } - if (event.type === "messageStart") { + if (event.messageStart) { return ""; } - if (event.type === "contentBlockStart" && event.start?.toolUse) { - const { toolUseId, name } = event.start.toolUse; + if (event.contentBlockStart?.start?.toolUse) { + const { toolUseId, name } = event.contentBlockStart.start.toolUse; currentToolUse = { id: toolUseId, type: "function", @@ -228,21 +226,34 @@ export class BedrockApi implements LLMApi { return ""; } - if (event.type === "text" && event.content) { - return event.content; + if (event.contentBlockDelta?.delta?.text) { + return event.contentBlockDelta.delta.text; } if ( - event.type === "toolUse" && - event.input && + event.contentBlockDelta?.delta?.toolUse?.input && currentToolUse?.function ) { - currentToolUse.function.arguments += event.input; + currentToolUse.function.arguments += + event.contentBlockDelta.delta.toolUse.input; return ""; } - if (event.type === "error") { - throw new Error(event.message || "Unknown error"); + if ( + event.internalServerException || + event.modelStreamErrorException || + event.validationException || + event.throttlingException || + event.serviceUnavailableException + ) { + const errorMessage = + event.internalServerException?.message || + event.modelStreamErrorException?.message || + event.validationException?.message || + event.throttlingException?.message || + event.serviceUnavailableException?.message || + "Unknown error"; + throw new Error(errorMessage); } return ""; @@ -284,7 +295,7 @@ export class BedrockApi implements LLMApi { try { const response = await fetch(conversePath, { method: "POST", - headers, + headers: getHeaders(), body: JSON.stringify(requestBody), signal: controller.signal, }); diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 9c6d9793c00..ddd6a5c155f 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -988,12 +988,12 @@ export function Settings() { > { accessStore.update( - (access) => (access.awsAccessKeyId = e.currentTarget.value), + (access) => (access.awsAccessKey = e.currentTarget.value), ); }} /> @@ -1004,12 +1004,12 @@ export function Settings() { > { accessStore.update( - (access) => (access.awsSecretAccessKey = e.currentTarget.value), + (access) => (access.awsSecretKey = e.currentTarget.value), ); }} /> diff --git a/app/config/server.ts b/app/config/server.ts index 7e130aa0e32..5250b061083 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -13,8 +13,9 @@ declare global { OPENAI_ORG_ID?: string; // openai only // bedrock only - BEDROCK_URL?: string; + BEDROCK_REGION?: string; BEDROCK_API_KEY?: string; + BEDROCK_API_SECRET?: string; VERCEL?: string; BUILD_MODE?: "standalone" | "export"; @@ -173,8 +174,9 @@ export const getServerSideConfig = () => { openaiOrgId: process.env.OPENAI_ORG_ID, isBedrock, - bedrockUrl: process.env.BEDROCK_URL, - bedrockApiKey: getApiKey(process.env.BEDROCK_API_KEY), + awsRegion: process.env.AWS_REGION, + awsAccessKey: process.env.AWS_ACCESS_KEY, + awsSecretKey: process.env.AWS_SECRET_KEY, isStability, stabilityUrl: process.env.STABILITY_URL, diff --git a/app/constant.ts b/app/constant.ts index 7d7e099cd21..1b8aa49d887 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -230,6 +230,10 @@ export const XAI = { ChatPath: "v1/chat/completions", }; +export const Bedrock = { + ChatPath: "converse", +}; + export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang // export const DEFAULT_SYSTEM_TEMPLATE = ` // You are ChatGPT, a large language model trained by {{ServiceProvider}}. @@ -312,9 +316,11 @@ const openaiModels = [ const bedrockModels = [ // Claude Models "anthropic.claude-3-haiku-20240307-v1:0", + "anthropic.claude-3-5-haiku-20241022-v1:0", "anthropic.claude-3-sonnet-20240229-v1:0", - "anthropic.claude-3-opus-20240229-v1:0", "anthropic.claude-3-5-sonnet-20241022-v2:0", + "anthropic.claude-3-opus-20240229-v1:0", + // Meta Llama Models "us.meta.llama3-2-11b-instruct-v1:0", "us.meta.llama3-2-90b-instruct-v1:0", diff --git a/app/store/access.ts b/app/store/access.ts index 11127cbed15..b5f765cfc2c 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -60,14 +60,11 @@ const DEFAULT_ACCESS_STATE = { openaiApiKey: "", // bedrock - bedrockUrl: DEFAULT_BEDROCK_URL, - bedrockApiKey: "", awsRegion: "", - awsAccessKeyId: "", - awsSecretAccessKey: "", + awsAccessKey: "", + awsSecretKey: "", awsSessionToken: "", awsCognitoUser: false, - awsInferenceProfile: "", // Added inference profile field // azure azureUrl: "", @@ -154,11 +151,7 @@ export const useAccessStore = createPersistStore( }, isValidBedrock() { - return ensure(get(), [ - "awsAccessKeyId", - "awsSecretAccessKey", - "awsRegion", - ]); + return ensure(get(), ["awsAccessKey", "awsSecretKey", "awsRegion"]); }, isValidAzure() { From 58837f6deccea7d09b09611d646549ba8b20cc0f Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 17:28:19 +0800 Subject: [PATCH 06/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/client/platforms/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 531 +++++++------------------------- app/client/platforms/bedrock.ts | 179 +++++------ 2 files changed, 184 insertions(+), 526 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 8b5ddc47ec5..aeee8eb55ca 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -5,17 +5,13 @@ import { BedrockRuntimeClient, ConverseStreamCommand, ConverseStreamCommandInput, + Message, + ContentBlock, ConverseStreamOutput, - ModelStreamErrorException, - type Message, - type ContentBlock, - type SystemContentBlock, - type Tool, - type ToolChoice, - type ToolResultContentBlock, } from "@aws-sdk/client-bedrock-runtime"; -// 解密函数 +const ALLOWED_PATH = new Set(["converse"]); + function decrypt(str: string): string { try { return Buffer.from(str, "base64").toString().split("").reverse().join(""); @@ -24,14 +20,11 @@ function decrypt(str: string): string { } } -// Constants and Types -const ALLOWED_PATH = new Set(["converse"]); - export interface ConverseRequest { modelId: string; messages: { role: "user" | "assistant" | "system"; - content: string | ContentItem[]; + content: string | any[]; }[]; inferenceConfig?: { maxTokens?: number; @@ -39,324 +32,89 @@ export interface ConverseRequest { topP?: number; stopSequences?: string[]; }; - toolConfig?: { - tools: Tool[]; - toolChoice?: ToolChoice; - }; -} - -interface ContentItem { - type: "text" | "image_url" | "document" | "tool_use" | "tool_result"; - text?: string; - image_url?: { - url: string; // base64 data URL - }; - document?: { - format: DocumentFormat; - name: string; - source: { - bytes: string; // base64 - }; - }; - tool_use?: { - tool_use_id: string; - name: string; - input: any; - }; - tool_result?: { - tool_use_id: string; - content: ToolResultItem[]; - status: "success" | "error"; - }; -} - -interface ToolResultItem { - type: "text" | "image" | "document" | "json"; - text?: string; - image?: { - format: "png" | "jpeg" | "gif" | "webp"; - source: { - bytes: string; // base64 - }; - }; - document?: { - format: DocumentFormat; - name: string; - source: { - bytes: string; // base64 - }; - }; - json?: any; -} - -type DocumentFormat = - | "pdf" - | "csv" - | "doc" - | "docx" - | "xls" - | "xlsx" - | "html" - | "txt" - | "md"; - -function validateImageSize(base64Data: string): boolean { - const sizeInBytes = (base64Data.length * 3) / 4; - const maxSize = 3.75 * 1024 * 1024; - if (sizeInBytes > maxSize) { - throw new Error("Image size exceeds 3.75 MB limit"); - } - return true; } -// Content Processing Functions -function convertContentToAWSBlock(item: ContentItem): ContentBlock | null { - if (item.type === "text" && item.text) { - return { text: item.text }; - } - - if (item.type === "image_url" && item.image_url?.url) { - const base64Match = item.image_url.url.match( - /^data:image\/([a-zA-Z]*);base64,([^"]*)/, - ); - if (base64Match) { - const format = base64Match[1].toLowerCase(); - if (["png", "jpeg", "gif", "webp"].includes(format)) { - validateImageSize(base64Match[2]); - return { - image: { - format: format as "png" | "jpeg" | "gif" | "webp", - source: { - bytes: Uint8Array.from(Buffer.from(base64Match[2], "base64")), - }, - }, - }; - } - } - } - - if (item.type === "tool_use" && item.tool_use) { - return { - toolUse: { - toolUseId: item.tool_use.tool_use_id, - name: item.tool_use.name, - input: item.tool_use.input, - }, - }; - } - - if (item.type === "tool_result" && item.tool_result) { - const toolResultContent = item.tool_result.content - .map((resultItem) => { - if (resultItem.type === "text" && resultItem.text) { - return { text: resultItem.text } as ToolResultContentBlock; - } - if (resultItem.type === "image" && resultItem.image) { - return { - image: { - format: resultItem.image.format, - source: { - bytes: Uint8Array.from( - Buffer.from(resultItem.image.source.bytes, "base64"), - ), +function formatRequestBody( + request: ConverseRequest, +): ConverseStreamCommandInput { + const messages: Message[] = request.messages.map((msg) => ({ + role: msg.role === "system" ? "user" : msg.role, + content: Array.isArray(msg.content) + ? msg.content.map((item) => { + if (item.type === "tool_use") { + return { + toolUse: { + toolUseId: item.id, + name: item.name, + input: item.input || "{}", }, - }, - } as ToolResultContentBlock; - } - if (resultItem.type === "document" && resultItem.document) { - return { - document: { - format: resultItem.document.format, - name: resultItem.document.name, - source: { - bytes: Uint8Array.from( - Buffer.from(resultItem.document.source.bytes, "base64"), - ), + } as ContentBlock; + } + if (item.type === "tool_result") { + return { + toolResult: { + toolUseId: item.tool_use_id, + content: [{ text: item.content || ";" }], + status: "success", }, - }, - } as ToolResultContentBlock; - } - if (resultItem.type === "json" && resultItem.json) { - return { json: resultItem.json } as ToolResultContentBlock; - } - return null; - }) - .filter((content): content is ToolResultContentBlock => content !== null); - - if (toolResultContent.length === 0) { - return null; - } - - return { - toolResult: { - toolUseId: item.tool_result.tool_use_id, - content: toolResultContent, - status: item.tool_result.status, - }, - }; - } - - return null; -} - -function convertContentToAWS(content: string | ContentItem[]): ContentBlock[] { - if (typeof content === "string") { - return [{ text: content }]; - } - - const blocks = content - .map(convertContentToAWSBlock) - .filter((block): block is ContentBlock => block !== null); - - return blocks.length > 0 ? blocks : [{ text: "" }]; -} - -function formatMessages(messages: ConverseRequest["messages"]): { - messages: Message[]; - systemPrompt?: SystemContentBlock[]; -} { - const systemMessages = messages.filter((msg) => msg.role === "system"); - const nonSystemMessages = messages.filter((msg) => msg.role !== "system"); - - const systemPrompt = - systemMessages.length > 0 - ? systemMessages.map((msg) => { - if (typeof msg.content === "string") { - return { text: msg.content } as SystemContentBlock; + } as ContentBlock; } - const blocks = convertContentToAWS(msg.content); - return blocks[0] as SystemContentBlock; + if (item.type === "text") { + return { text: item.text || ";" } as ContentBlock; + } + if (item.type === "image") { + return { + image: { + format: item.source.media_type.split("/")[1] as + | "png" + | "jpeg" + | "gif" + | "webp", + source: { + bytes: Uint8Array.from( + Buffer.from(item.source.data, "base64"), + ), + }, + }, + } as ContentBlock; + } + return { text: ";" } as ContentBlock; }) - : undefined; + : [{ text: msg.content || ";" } as ContentBlock], + })); - const formattedMessages = nonSystemMessages.reduce( - (acc: Message[], curr, idx) => { - if (idx > 0 && curr.role === nonSystemMessages[idx - 1].role) { - return acc; - } - - const content = convertContentToAWS(curr.content); - if (content.length > 0) { - acc.push({ - role: curr.role as "user" | "assistant", - content, - }); - } - return acc; - }, - [], - ); - - if (formattedMessages.length === 0 || formattedMessages[0].role !== "user") { - formattedMessages.unshift({ - role: "user", - content: [{ text: "Hello" }], - }); - } - - if (formattedMessages[formattedMessages.length - 1].role !== "user") { - formattedMessages.push({ - role: "user", - content: [{ text: "Continue" }], - }); - } - - return { messages: formattedMessages, systemPrompt }; -} - -function formatRequestBody( - request: ConverseRequest, -): ConverseStreamCommandInput { - const { messages, systemPrompt } = formatMessages(request.messages); - const input: ConverseStreamCommandInput = { + return { modelId: request.modelId, messages, - ...(systemPrompt && { system: systemPrompt }), + ...(request.inferenceConfig && { + inferenceConfig: request.inferenceConfig, + }), }; - - if (request.inferenceConfig) { - input.inferenceConfig = { - maxTokens: request.inferenceConfig.maxTokens, - temperature: request.inferenceConfig.temperature, - topP: request.inferenceConfig.topP, - stopSequences: request.inferenceConfig.stopSequences, - }; - } - - if (request.toolConfig) { - input.toolConfig = { - tools: request.toolConfig.tools, - toolChoice: request.toolConfig.toolChoice, - }; - } - - const logInput = { - ...input, - messages: messages.map((msg) => ({ - role: msg.role, - content: msg.content?.map((content) => { - if ("image" in content && content.image) { - return { - image: { - format: content.image.format, - source: { bytes: "[BINARY]" }, - }, - }; - } - if ("document" in content && content.document) { - return { - document: { ...content.document, source: { bytes: "[BINARY]" } }, - }; - } - return content; - }), - })), - }; - - console.log( - "[Bedrock] Formatted request:", - JSON.stringify(logInput, null, 2), - ); - return input; } -// Main Request Handler export async function handle( req: NextRequest, { params }: { params: { path: string[] } }, ) { - console.log("[Bedrock Route] params ", params); - if (req.method === "OPTIONS") { return NextResponse.json({ body: "OK" }, { status: 200 }); } const subpath = params.path.join("/"); - if (!ALLOWED_PATH.has(subpath)) { - console.log("[Bedrock Route] forbidden path ", subpath); return NextResponse.json( - { - error: true, - msg: "you are not allowed to request " + subpath, - }, - { - status: 403, - }, + { error: true, msg: "Path not allowed: " + subpath }, + { status: 403 }, ); } const serverConfig = getServerSideConfig(); - - // 首先尝试使用环境变量中的凭证 let region = serverConfig.awsRegion; let accessKeyId = serverConfig.awsAccessKey; let secretAccessKey = serverConfig.awsSecretKey; let sessionToken = undefined; - // 如果环境变量中没有配置,则尝试使用前端传来的加密凭证 if (!region || !accessKeyId || !secretAccessKey) { - // 解密前端传来的凭证 region = decrypt(req.headers.get("X-Region") ?? ""); accessKeyId = decrypt(req.headers.get("X-Access-Key") ?? ""); secretAccessKey = decrypt(req.headers.get("X-Secret-Key") ?? ""); @@ -367,50 +125,19 @@ export async function handle( if (!region || !accessKeyId || !secretAccessKey) { return NextResponse.json( - { - error: true, - msg: "AWS credentials not found in environment variables or request headers", - }, - { - status: 401, - }, + { error: true, msg: "Missing AWS credentials" }, + { status: 401 }, ); } try { const client = new BedrockRuntimeClient({ region, - credentials: { - accessKeyId, - secretAccessKey, - sessionToken, - }, + credentials: { accessKeyId, secretAccessKey, sessionToken }, }); - const response = await handleConverseRequest(req, client); - return response; - } catch (e) { - console.error("[Bedrock] ", e); - return NextResponse.json( - { - error: true, - message: e instanceof Error ? e.message : "Unknown error", - details: prettyObject(e), - }, - { status: 500 }, - ); - } -} - -async function handleConverseRequest( - req: NextRequest, - client: BedrockRuntimeClient, -) { - try { const body = (await req.json()) as ConverseRequest; - const { modelId } = body; - - console.log("[Bedrock] Invoking model:", modelId); + console.log("[Bedrock] Request:", body.modelId); const command = new ConverseStreamCommand(formatRequestBody(body)); const response = await client.send(command); @@ -422,128 +149,71 @@ async function handleConverseRequest( const stream = new ReadableStream({ async start(controller) { try { - const responseStream = response.stream; - if (!responseStream) { - throw new Error("No stream in response"); - } - + const responseStream = + response.stream as AsyncIterable; for await (const event of responseStream) { - const output = event as ConverseStreamOutput; - - if ("messageStart" in output && output.messageStart?.role) { - controller.enqueue( - `data: ${JSON.stringify({ - stream: { - messageStart: { role: output.messageStart.role }, - }, - })}\n\n`, - ); - } else if ( - "contentBlockStart" in output && - output.contentBlockStart + if ( + "contentBlockStart" in event && + event.contentBlockStart?.start?.toolUse && + event.contentBlockStart.contentBlockIndex !== undefined ) { controller.enqueue( `data: ${JSON.stringify({ - stream: { - contentBlockStart: { - contentBlockIndex: - output.contentBlockStart.contentBlockIndex, - start: output.contentBlockStart.start, - }, + type: "content_block", + content_block: { + type: "tool_use", + id: event.contentBlockStart.start.toolUse.toolUseId, + name: event.contentBlockStart.start.toolUse.name, }, + index: event.contentBlockStart.contentBlockIndex, })}\n\n`, ); } else if ( - "contentBlockDelta" in output && - output.contentBlockDelta?.delta + "contentBlockDelta" in event && + event.contentBlockDelta?.delta && + event.contentBlockDelta.contentBlockIndex !== undefined ) { - if ("text" in output.contentBlockDelta.delta) { + const delta = event.contentBlockDelta.delta; + + if ("text" in delta && delta.text) { controller.enqueue( `data: ${JSON.stringify({ - stream: { - contentBlockDelta: { - delta: { text: output.contentBlockDelta.delta.text }, - contentBlockIndex: - output.contentBlockDelta.contentBlockIndex, - }, + type: "content_block_delta", + delta: { + type: "text_delta", + text: delta.text, }, + index: event.contentBlockDelta.contentBlockIndex, })}\n\n`, ); - } else if ("toolUse" in output.contentBlockDelta.delta) { + } else if ("toolUse" in delta && delta.toolUse?.input) { controller.enqueue( `data: ${JSON.stringify({ - stream: { - contentBlockDelta: { - delta: { - toolUse: { - input: - output.contentBlockDelta.delta.toolUse?.input, - }, - }, - contentBlockIndex: - output.contentBlockDelta.contentBlockIndex, - }, + type: "content_block_delta", + delta: { + type: "input_json_delta", + partial_json: delta.toolUse.input, }, + index: event.contentBlockDelta.contentBlockIndex, })}\n\n`, ); } } else if ( - "contentBlockStop" in output && - output.contentBlockStop + "contentBlockStop" in event && + event.contentBlockStop?.contentBlockIndex !== undefined ) { controller.enqueue( `data: ${JSON.stringify({ - stream: { - contentBlockStop: { - contentBlockIndex: - output.contentBlockStop.contentBlockIndex, - }, - }, - })}\n\n`, - ); - } else if ("messageStop" in output && output.messageStop) { - controller.enqueue( - `data: ${JSON.stringify({ - stream: { - messageStop: { - stopReason: output.messageStop.stopReason, - additionalModelResponseFields: - output.messageStop.additionalModelResponseFields, - }, - }, - })}\n\n`, - ); - } else if ("metadata" in output && output.metadata) { - controller.enqueue( - `data: ${JSON.stringify({ - stream: { - metadata: { - usage: output.metadata.usage, - metrics: output.metadata.metrics, - trace: output.metadata.trace, - }, - }, + type: "content_block_stop", + index: event.contentBlockStop.contentBlockIndex, })}\n\n`, ); } } controller.close(); } catch (error) { - const errorResponse = { - stream: { - error: - error instanceof Error - ? error.constructor.name - : "UnknownError", - message: error instanceof Error ? error.message : "Unknown error", - ...(error instanceof ModelStreamErrorException && { - originalStatusCode: error.originalStatusCode, - originalMessage: error.originalMessage, - }), - }, - }; - controller.enqueue(`data: ${JSON.stringify(errorResponse)}\n\n`); - controller.close(); + console.error("[Bedrock] Stream error:", error); + controller.error(error); } }, }); @@ -555,8 +225,15 @@ async function handleConverseRequest( Connection: "keep-alive", }, }); - } catch (error) { - console.error("[Bedrock] Request error:", error); - throw error; + } catch (e) { + console.error("[Bedrock] Error:", e); + return NextResponse.json( + { + error: true, + message: e instanceof Error ? e.message : "Unknown error", + details: prettyObject(e), + }, + { status: 500 }, + ); } } diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index b440703528e..a2324b81845 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -16,6 +16,7 @@ import { import { getMessageTextContent, isVisionModel } from "../../utils"; import { fetch } from "../../utils/stream"; import { preProcessImageContent, stream } from "../../utils/chat"; +import { RequestPayload } from "./openai"; export type MultiBlockContent = { type: "image" | "text"; @@ -39,12 +40,6 @@ const ClaudeMapper = { } as const; export class BedrockApi implements LLMApi { - usage(): Promise { - throw new Error("Method not implemented."); - } - models(): Promise { - throw new Error("Method not implemented."); - } speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); } @@ -149,34 +144,15 @@ export class BedrockApi implements LLMApi { }); } - const [tools, funcs] = usePluginStore - .getState() - .getAsTools(useChatStore.getState().currentSession().mask?.plugin || []); - const requestBody = { modelId: options.config.model, - messages: messages.filter((msg) => msg.content.length > 0), + messages: prompt, inferenceConfig: { maxTokens: modelConfig.max_tokens, temperature: modelConfig.temperature, topP: modelConfig.top_p, stopSequences: [], }, - toolConfig: - Array.isArray(tools) && tools.length > 0 - ? { - tools: tools.map((tool: any) => ({ - toolSpec: { - name: tool?.function?.name, - description: tool?.function?.description, - inputSchema: { - json: tool?.function?.parameters, - }, - }, - })), - toolChoice: { auto: {} }, - } - : undefined, }; const conversePath = `${ApiPath.Bedrock}/converse`; @@ -185,83 +161,80 @@ export class BedrockApi implements LLMApi { if (shouldStream) { let currentToolUse: ChatMessageTool | null = null; + let index = -1; + const [tools, funcs] = usePluginStore + .getState() + .getAsTools( + useChatStore.getState().currentSession().mask?.plugin || [], + ); return stream( conversePath, requestBody, getHeaders(), - Array.isArray(tools) - ? tools.map((tool: any) => ({ - name: tool?.function?.name, - description: tool?.function?.description, - input_schema: tool?.function?.parameters, - })) - : [], + // @ts-ignore + tools.map((tool) => ({ + name: tool?.function?.name, + description: tool?.function?.description, + input_schema: tool?.function?.parameters, + })), funcs, controller, // parseSSE + // parseSSE (text: string, runTools: ChatMessageTool[]) => { - const parsed = JSON.parse(text); - const event = parsed.stream; - - if (!event) { - console.warn("[Bedrock] Unexpected event format:", parsed); - return ""; - } - - if (event.messageStart) { - return ""; - } + // console.log("parseSSE", text, runTools); + let chunkJson: + | undefined + | { + type: "content_block_delta" | "content_block_stop"; + content_block?: { + type: "tool_use"; + id: string; + name: string; + }; + delta?: { + type: "text_delta" | "input_json_delta"; + text?: string; + partial_json?: string; + }; + index: number; + }; + chunkJson = JSON.parse(text); - if (event.contentBlockStart?.start?.toolUse) { - const { toolUseId, name } = event.contentBlockStart.start.toolUse; - currentToolUse = { - id: toolUseId, + if (chunkJson?.content_block?.type == "tool_use") { + index += 1; + const id = chunkJson?.content_block.id; + const name = chunkJson?.content_block.name; + runTools.push({ + id, type: "function", function: { name, arguments: "", }, - }; - runTools.push(currentToolUse); - return ""; + }); } - - if (event.contentBlockDelta?.delta?.text) { - return event.contentBlockDelta.delta.text; - } - if ( - event.contentBlockDelta?.delta?.toolUse?.input && - currentToolUse?.function + chunkJson?.delta?.type == "input_json_delta" && + chunkJson?.delta?.partial_json ) { - currentToolUse.function.arguments += - event.contentBlockDelta.delta.toolUse.input; - return ""; + // @ts-ignore + runTools[index]["function"]["arguments"] += + chunkJson?.delta?.partial_json; } - - if ( - event.internalServerException || - event.modelStreamErrorException || - event.validationException || - event.throttlingException || - event.serviceUnavailableException - ) { - const errorMessage = - event.internalServerException?.message || - event.modelStreamErrorException?.message || - event.validationException?.message || - event.throttlingException?.message || - event.serviceUnavailableException?.message || - "Unknown error"; - throw new Error(errorMessage); - } - - return ""; + return chunkJson?.delta?.text; }, - // processToolMessage - (requestPayload: any, toolCallMessage: any, toolCallResult: any[]) => { - currentToolUse = null; + // processToolMessage, include tool_calls message and tool call results + ( + requestPayload: RequestPayload, + toolCallMessage: any, + toolCallResult: any[], + ) => { + // reset index value + index = -1; + // @ts-ignore requestPayload?.messages?.splice( + // @ts-ignore requestPayload?.messages?.length, 0, { @@ -277,6 +250,7 @@ export class BedrockApi implements LLMApi { }), ), }, + // @ts-ignore ...toolCallResult.map((result) => ({ role: "user", content: [ @@ -292,26 +266,33 @@ export class BedrockApi implements LLMApi { options, ); } else { + const payload = { + method: "POST", + body: JSON.stringify(requestBody), + signal: controller.signal, + headers: { + ...getHeaders(), // get common headers + }, + }; + try { - const response = await fetch(conversePath, { - method: "POST", - headers: getHeaders(), - body: JSON.stringify(requestBody), - signal: controller.signal, - }); + controller.signal.onabort = () => options.onFinish(""); - if (!response.ok) { - const error = await response.text(); - throw new Error(`Bedrock API error: ${error}`); - } + const res = await fetch(conversePath, payload); + const resJson = await res.json(); - const responseBody = await response.json(); - const content = this.extractMessage(responseBody); - options.onFinish(content); - } catch (e: any) { - console.error("[Bedrock] Chat error:", e); - throw e; + const message = this.extractMessage(resJson); + options.onFinish(message); + } catch (e) { + console.error("failed to chat", e); + options.onError?.(e as Error); } } } + usage(): Promise { + throw new Error("Method not implemented."); + } + models(): Promise { + throw new Error("Method not implemented."); + } } From f532731e2a7bceb46809ca98d1a4de522358dc79 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 17:32:52 +0800 Subject: [PATCH 07/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/client/platforms/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/client/platforms/bedrock.ts | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index a2324b81845..130b30d3103 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,12 +1,5 @@ import { ApiPath } from "../../constant"; -import { - ChatOptions, - getHeaders, - LLMApi, - LLMModel, - LLMUsage, - SpeechOptions, -} from "../api"; +import { ChatOptions, getHeaders, LLMApi, SpeechOptions } from "../api"; import { useAppConfig, usePluginStore, @@ -289,10 +282,13 @@ export class BedrockApi implements LLMApi { } } } - usage(): Promise { - throw new Error("Method not implemented."); + async usage() { + return { + used: 0, + total: 0, + }; } - models(): Promise { - throw new Error("Method not implemented."); + async models() { + return []; } } From e3c18bb12335bbc631828a78e662b7468ad74681 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 18:53:12 +0800 Subject: [PATCH 08/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index aeee8eb55ca..57ab082e322 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -32,6 +32,11 @@ export interface ConverseRequest { topP?: number; stopSequences?: string[]; }; + tools?: { + name: string; + description?: string; + input_schema: any; + }[]; } function formatRequestBody( @@ -83,13 +88,31 @@ function formatRequestBody( : [{ text: msg.content || ";" } as ContentBlock], })); - return { + const input: ConverseStreamCommandInput = { modelId: request.modelId, messages, ...(request.inferenceConfig && { inferenceConfig: request.inferenceConfig, }), }; + + // 添加工具配置 + if (request.tools?.length) { + input.toolConfig = { + tools: request.tools.map((tool) => ({ + toolSpec: { + name: tool.name, + description: tool.description, + inputSchema: { + json: tool.input_schema, // 直接使用对象,不需要 JSON.stringify + }, + }, + })), + toolChoice: { auto: {} }, + }; + } + + return input; } export async function handle( @@ -137,8 +160,6 @@ export async function handle( }); const body = (await req.json()) as ConverseRequest; - console.log("[Bedrock] Request:", body.modelId); - const command = new ConverseStreamCommand(formatRequestBody(body)); const response = await client.send(command); From d55c752e1e2b39353797bfb41964f3146d63486b Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 19:13:32 +0800 Subject: [PATCH 09/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/utils.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 14 +++++++++++--- app/utils.ts | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 57ab082e322..4cad53da15d 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -39,6 +39,14 @@ export interface ConverseRequest { }[]; } +function supportsToolUse(modelId: string): boolean { + // llama和mistral模型不支持工具调用 + return ( + modelId.toLowerCase().includes("claude-3") && + modelId.toLowerCase().includes("claude-3-5") + ); +} + function formatRequestBody( request: ConverseRequest, ): ConverseStreamCommandInput { @@ -96,15 +104,15 @@ function formatRequestBody( }), }; - // 添加工具配置 - if (request.tools?.length) { + // 只有在支持工具调用的模型上才添加toolConfig + if (request.tools?.length && supportsToolUse(request.modelId)) { input.toolConfig = { tools: request.tools.map((tool) => ({ toolSpec: { name: tool.name, description: tool.description, inputSchema: { - json: tool.input_schema, // 直接使用对象,不需要 JSON.stringify + json: tool.input_schema, }, }, })), diff --git a/app/utils.ts b/app/utils.ts index 78cfe5a0e74..50cb4b0da51 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -285,7 +285,7 @@ export function showPlugins(provider: ServiceProvider, model: string) { if (provider == ServiceProvider.Anthropic && !model.includes("claude-2")) { return true; } - if (provider == ServiceProvider.Bedrock && !model.includes("claude-2")) { + if (provider == ServiceProvider.Bedrock && model.includes("claude-3")) { return true; } if (provider == ServiceProvider.Google && !model.includes("vision")) { From 1998cf5ced81c8313541c01a408594eef564bbc5 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 20:20:20 +0800 Subject: [PATCH 10/72] Merge feature/update-bedrock-api into main --- app/api/bedrock.ts | 5 +---- app/client/platforms/bedrock.ts | 14 ++++++-------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 4cad53da15d..5465477c8ef 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -41,10 +41,7 @@ export interface ConverseRequest { function supportsToolUse(modelId: string): boolean { // llama和mistral模型不支持工具调用 - return ( - modelId.toLowerCase().includes("claude-3") && - modelId.toLowerCase().includes("claude-3-5") - ); + return modelId.toLowerCase().includes("claude-3"); } function formatRequestBody( diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 130b30d3103..6d236344e5c 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -38,11 +38,9 @@ export class BedrockApi implements LLMApi { } extractMessage(res: any) { - console.log("[Response] bedrock response: ", res); - if (Array.isArray(res?.content)) { - return res.content; - } - return res; + console.log("[Response] claude response: ", res); + + return res?.content?.[0]?.text; } async chat(options: ChatOptions): Promise { @@ -173,7 +171,6 @@ export class BedrockApi implements LLMApi { funcs, controller, // parseSSE - // parseSSE (text: string, runTools: ChatMessageTool[]) => { // console.log("parseSSE", text, runTools); let chunkJson: @@ -269,13 +266,14 @@ export class BedrockApi implements LLMApi { }; try { - controller.signal.onabort = () => options.onFinish(""); + controller.signal.onabort = () => + options.onFinish("", new Response(null, { status: 400 })); const res = await fetch(conversePath, payload); const resJson = await res.json(); const message = this.extractMessage(resJson); - options.onFinish(message); + options.onFinish(message, res); } catch (e) { console.error("failed to chat", e); options.onError?.(e as Error); From 045adc3567ec33cac13df1c5136e6cd8f46c490b Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 23:28:07 +0800 Subject: [PATCH 11/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 5465477c8ef..d238eb688a5 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -40,7 +40,6 @@ export interface ConverseRequest { } function supportsToolUse(modelId: string): boolean { - // llama和mistral模型不支持工具调用 return modelId.toLowerCase().includes("claude-3"); } From 1f66d3779c8f985a8f8bf50171618484b5e1a96e Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 5 Nov 2024 23:32:24 +0800 Subject: [PATCH 12/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index d238eb688a5..7ad8fd4b13f 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -100,7 +100,6 @@ function formatRequestBody( }), }; - // 只有在支持工具调用的模型上才添加toolConfig if (request.tools?.length && supportsToolUse(request.modelId)) { input.toolConfig = { tools: request.tools.map((tool) => ({ From cae20af24d85fd30bbf04da8da95aef32fc92fd5 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 6 Nov 2024 00:21:30 +0800 Subject: [PATCH 13/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/client/api.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20?= =?UTF-8?q?=20=20=20=20app/store/access.ts=20=09=E6=96=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=9A=20=20=20app/utils/encryption.ts=20=09?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20package.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 36 +- app/client/api.ts | 7 +- app/store/access.ts | 63 +- app/utils/encryption.ts | 22 + package.json | 6 +- yarn.lock | 3645 +++++++++++++++++++++++---------------- 6 files changed, 2293 insertions(+), 1486 deletions(-) create mode 100644 app/utils/encryption.ts diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 7ad8fd4b13f..4a2a1fc5d13 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,6 +1,7 @@ import { getServerSideConfig } from "../config/server"; import { prettyObject } from "../utils/format"; import { NextRequest, NextResponse } from "next/server"; +import { decrypt } from "../utils/encryption"; import { BedrockRuntimeClient, ConverseStreamCommand, @@ -12,12 +13,20 @@ import { const ALLOWED_PATH = new Set(["converse"]); -function decrypt(str: string): string { - try { - return Buffer.from(str, "base64").toString().split("").reverse().join(""); - } catch { - return ""; - } +// AWS Credential Validation Function +function validateAwsCredentials( + region: string, + accessKeyId: string, + secretAccessKey: string, +): boolean { + const regionRegex = /^[a-z]{2}-[a-z]+-\d+$/; + const accessKeyRegex = /^(AKIA|A3T|ASIA)[A-Z0-9]{16}$/; + + return ( + regionRegex.test(region) && + accessKeyRegex.test(accessKeyId) && + secretAccessKey.length === 40 + ); } export interface ConverseRequest { @@ -140,6 +149,7 @@ export async function handle( let secretAccessKey = serverConfig.awsSecretKey; let sessionToken = undefined; + // Attempt to get credentials from headers if not in server config if (!region || !accessKeyId || !secretAccessKey) { region = decrypt(req.headers.get("X-Region") ?? ""); accessKeyId = decrypt(req.headers.get("X-Access-Key") ?? ""); @@ -149,9 +159,13 @@ export async function handle( : undefined; } - if (!region || !accessKeyId || !secretAccessKey) { + // Validate AWS credentials + if (!validateAwsCredentials(region, accessKeyId, secretAccessKey)) { return NextResponse.json( - { error: true, msg: "Missing AWS credentials" }, + { + error: true, + msg: "Invalid AWS credentials. Please check your region, access key, and secret key.", + }, { status: 401 }, ); } @@ -159,7 +173,11 @@ export async function handle( try { const client = new BedrockRuntimeClient({ region, - credentials: { accessKeyId, secretAccessKey, sessionToken }, + credentials: { + accessKeyId, + secretAccessKey, + sessionToken, + }, }); const body = (await req.json()) as ConverseRequest; diff --git a/app/client/api.ts b/app/client/api.ts index 3079a9276a9..260252df810 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -23,6 +23,7 @@ import { MoonshotApi } from "./platforms/moonshot"; import { SparkApi } from "./platforms/iflytek"; import { XAIApi } from "./platforms/xai"; import { ChatGLMApi } from "./platforms/glm"; +import { encrypt } from "../utils/encryption"; export const ROLES = ["system", "user", "assistant"] as const; export type MessageRole = (typeof ROLES)[number]; @@ -330,13 +331,11 @@ export function getHeaders(ignoreHeaders: boolean = false) { const authHeader = getAuthHeader(); if (isBedrock) { - // 简单加密 AWS credentials - const encrypt = (str: string) => - Buffer.from(str.split("").reverse().join("")).toString("base64"); - + // Secure encryption of AWS credentials using the new encryption utility headers["X-Region"] = encrypt(accessStore.awsRegion); headers["X-Access-Key"] = encrypt(accessStore.awsAccessKey); headers["X-Secret-Key"] = encrypt(accessStore.awsSecretKey); + if (accessStore.awsSessionToken) { headers["X-Session-Token"] = encrypt(accessStore.awsSessionToken); } diff --git a/app/store/access.ts b/app/store/access.ts index 7c8f64da871..3703978fbc5 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -22,6 +22,7 @@ import { getClientConfig } from "../config/client"; import { createPersistStore } from "../utils/store"; import { ensure } from "../utils/clone"; import { DEFAULT_CONFIG } from "./config"; +import { encrypt, decrypt } from "../utils/encryption"; let fetchState = 0; // 0 not fetch, 1 fetching, 2 done @@ -137,6 +138,9 @@ const DEFAULT_ACCESS_STATE = { edgeTTSVoiceName: "zh-CN-YunxiNeural", }; +type AccessState = typeof DEFAULT_ACCESS_STATE; +type BedrockCredentialKey = "awsAccessKey" | "awsSecretKey" | "awsSessionToken"; + export const useAccessStore = createPersistStore( { ...DEFAULT_ACCESS_STATE }, @@ -158,7 +162,43 @@ export const useAccessStore = createPersistStore( }, isValidBedrock() { - return ensure(get(), ["awsAccessKey", "awsSecretKey", "awsRegion"]); + const state = get(); + return ( + ensure(state, ["awsAccessKey", "awsSecretKey", "awsRegion"]) && + this.validateAwsCredentials( + this.getDecryptedAwsCredential("awsAccessKey"), + this.getDecryptedAwsCredential("awsSecretKey"), + state.awsRegion, + ) + ); + }, + + validateAwsCredentials( + accessKey: string, + secretKey: string, + region: string, + ) { + // Comprehensive AWS credential validation + const accessKeyRegex = /^(AKIA|A3T|ASIA)[A-Z0-9]{16}$/; + const regionRegex = /^[a-z]{2}-[a-z]+-\d+$/; + + return ( + accessKeyRegex.test(accessKey) && // Validate access key format + secretKey.length === 40 && // Validate secret key length + regionRegex.test(region) && // Validate region format + accessKey !== "" && + secretKey !== "" && + region !== "" + ); + }, + + setEncryptedAwsCredential(key: BedrockCredentialKey, value: string) { + set({ [key]: encrypt(value) }); + }, + + getDecryptedAwsCredential(key: BedrockCredentialKey): string { + const encryptedValue = get()[key]; + return encryptedValue ? decrypt(encryptedValue) : ""; }, isValidAzure() { @@ -226,6 +266,7 @@ export const useAccessStore = createPersistStore( (this.enabledAccessControl() && ensure(get(), ["accessCode"])) ); }, + fetch() { if (fetchState > 0 || getClientConfig()?.buildMode === "export") return; fetchState = 1; @@ -247,9 +288,25 @@ export const useAccessStore = createPersistStore( return res; }) - .then((res: DangerConfig) => { + + .then((res: Partial) => { console.log("[Config] got config from server", res); - set(() => ({ ...res })); + // Encrypt Bedrock-related sensitive data before storing + const encryptedRes = { ...res }; + const keysToEncrypt: BedrockCredentialKey[] = [ + "awsAccessKey", + "awsSecretKey", + "awsSessionToken", + ]; + + keysToEncrypt.forEach((key) => { + const value = encryptedRes[key]; + if (value) { + (encryptedRes[key] as string) = encrypt(value as string); + } + }); + + set(() => ({ ...encryptedRes })); }) .catch(() => { console.error("[Config] failed to fetch config"); diff --git a/app/utils/encryption.ts b/app/utils/encryption.ts new file mode 100644 index 00000000000..0fb8439fea0 --- /dev/null +++ b/app/utils/encryption.ts @@ -0,0 +1,22 @@ +import { AES, enc } from "crypto-js"; + +const SECRET_KEY = "your-secret-key"; // Replace this with a secure, randomly generated key + +export function encrypt(data: string): string { + try { + return AES.encrypt(data, SECRET_KEY).toString(); + } catch (error) { + console.error("Encryption failed:", error); + return data; // Fallback to unencrypted data if encryption fails + } +} + +export function decrypt(encryptedData: string): string { + try { + const bytes = AES.decrypt(encryptedData, SECRET_KEY); + return bytes.toString(enc.Utf8); + } catch (error) { + console.error("Decryption failed:", error); + return encryptedData; // Fallback to the original data if decryption fails + } +} diff --git a/package.json b/package.json index 69196b10a16..f912f0dc8bc 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,16 @@ "test:ci": "jest --ci" }, "dependencies": { + "@aws-sdk/client-bedrock-runtime": "^3.679.0", "@fortaine/fetch-event-source": "^3.0.6", "@hello-pangea/dnd": "^16.5.0", "@next/third-parties": "^14.1.0", "@svgr/webpack": "^6.5.1", + "@types/crypto-js": "^4.2.2", "@vercel/analytics": "^0.1.11", "@vercel/speed-insights": "^1.0.2", "axios": "^1.7.5", + "crypto-js": "^4.2.0", "emoji-picker-react": "^4.9.2", "fuse.js": "^7.0.0", "heic2any": "^0.0.4", @@ -51,8 +54,7 @@ "sass": "^1.59.2", "spark-md5": "^3.0.2", "use-debounce": "^9.0.4", - "zustand": "^4.3.8", - "@aws-sdk/client-bedrock-runtime": "^3.679.0" + "zustand": "^4.3.8" }, "devDependencies": { "@tauri-apps/api": "^1.6.0", diff --git a/yarn.lock b/yarn.lock index 16b8b872ee9..5378e1068aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,49 +4,452 @@ "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@adobe/css-tools@^4.4.0": version "4.4.0" - resolved "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + resolved "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.4.0.tgz" integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== "@ampproject/remapping@^2.2.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@^5.2.0", "@aws-crypto/sha256-js@5.2.0": + version "5.2.0" + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + dependencies: + tslib "^2.6.2" + +"@aws-crypto/util@^5.2.0": + version "5.2.0" + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-bedrock-runtime@^3.679.0": + version "3.679.0" + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.679.0" + "@aws-sdk/client-sts" "3.679.0" + "@aws-sdk/core" "3.679.0" + "@aws-sdk/credential-provider-node" "3.679.0" + "@aws-sdk/middleware-host-header" "3.679.0" + "@aws-sdk/middleware-logger" "3.679.0" + "@aws-sdk/middleware-recursion-detection" "3.679.0" + "@aws-sdk/middleware-user-agent" "3.679.0" + "@aws-sdk/region-config-resolver" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@aws-sdk/util-endpoints" "3.679.0" + "@aws-sdk/util-user-agent-browser" "3.679.0" + "@aws-sdk/util-user-agent-node" "3.679.0" + "@smithy/config-resolver" "^3.0.9" + "@smithy/core" "^2.4.8" + "@smithy/eventstream-serde-browser" "^3.0.10" + "@smithy/eventstream-serde-config-resolver" "^3.0.7" + "@smithy/eventstream-serde-node" "^3.0.9" + "@smithy/fetch-http-handler" "^3.2.9" + "@smithy/hash-node" "^3.0.7" + "@smithy/invalid-dependency" "^3.0.7" + "@smithy/middleware-content-length" "^3.0.9" + "@smithy/middleware-endpoint" "^3.1.4" + "@smithy/middleware-retry" "^3.0.23" + "@smithy/middleware-serde" "^3.0.7" + "@smithy/middleware-stack" "^3.0.7" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/node-http-handler" "^3.2.4" + "@smithy/protocol-http" "^4.1.4" + "@smithy/smithy-client" "^3.4.0" + "@smithy/types" "^3.5.0" + "@smithy/url-parser" "^3.0.7" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.23" + "@smithy/util-defaults-mode-node" "^3.0.23" + "@smithy/util-endpoints" "^2.1.3" + "@smithy/util-middleware" "^3.0.7" + "@smithy/util-retry" "^3.0.7" + "@smithy/util-stream" "^3.1.9" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso-oidc@^3.679.0", "@aws-sdk/client-sso-oidc@3.679.0": + version "3.679.0" + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.679.0" + "@aws-sdk/credential-provider-node" "3.679.0" + "@aws-sdk/middleware-host-header" "3.679.0" + "@aws-sdk/middleware-logger" "3.679.0" + "@aws-sdk/middleware-recursion-detection" "3.679.0" + "@aws-sdk/middleware-user-agent" "3.679.0" + "@aws-sdk/region-config-resolver" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@aws-sdk/util-endpoints" "3.679.0" + "@aws-sdk/util-user-agent-browser" "3.679.0" + "@aws-sdk/util-user-agent-node" "3.679.0" + "@smithy/config-resolver" "^3.0.9" + "@smithy/core" "^2.4.8" + "@smithy/fetch-http-handler" "^3.2.9" + "@smithy/hash-node" "^3.0.7" + "@smithy/invalid-dependency" "^3.0.7" + "@smithy/middleware-content-length" "^3.0.9" + "@smithy/middleware-endpoint" "^3.1.4" + "@smithy/middleware-retry" "^3.0.23" + "@smithy/middleware-serde" "^3.0.7" + "@smithy/middleware-stack" "^3.0.7" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/node-http-handler" "^3.2.4" + "@smithy/protocol-http" "^4.1.4" + "@smithy/smithy-client" "^3.4.0" + "@smithy/types" "^3.5.0" + "@smithy/url-parser" "^3.0.7" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.23" + "@smithy/util-defaults-mode-node" "^3.0.23" + "@smithy/util-endpoints" "^2.1.3" + "@smithy/util-middleware" "^3.0.7" + "@smithy/util-retry" "^3.0.7" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.679.0": + version "3.679.0" + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.679.0" + "@aws-sdk/middleware-host-header" "3.679.0" + "@aws-sdk/middleware-logger" "3.679.0" + "@aws-sdk/middleware-recursion-detection" "3.679.0" + "@aws-sdk/middleware-user-agent" "3.679.0" + "@aws-sdk/region-config-resolver" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@aws-sdk/util-endpoints" "3.679.0" + "@aws-sdk/util-user-agent-browser" "3.679.0" + "@aws-sdk/util-user-agent-node" "3.679.0" + "@smithy/config-resolver" "^3.0.9" + "@smithy/core" "^2.4.8" + "@smithy/fetch-http-handler" "^3.2.9" + "@smithy/hash-node" "^3.0.7" + "@smithy/invalid-dependency" "^3.0.7" + "@smithy/middleware-content-length" "^3.0.9" + "@smithy/middleware-endpoint" "^3.1.4" + "@smithy/middleware-retry" "^3.0.23" + "@smithy/middleware-serde" "^3.0.7" + "@smithy/middleware-stack" "^3.0.7" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/node-http-handler" "^3.2.4" + "@smithy/protocol-http" "^4.1.4" + "@smithy/smithy-client" "^3.4.0" + "@smithy/types" "^3.5.0" + "@smithy/url-parser" "^3.0.7" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.23" + "@smithy/util-defaults-mode-node" "^3.0.23" + "@smithy/util-endpoints" "^2.1.3" + "@smithy/util-middleware" "^3.0.7" + "@smithy/util-retry" "^3.0.7" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@^3.679.0", "@aws-sdk/client-sts@3.679.0": + version "3.679.0" + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.679.0" + "@aws-sdk/core" "3.679.0" + "@aws-sdk/credential-provider-node" "3.679.0" + "@aws-sdk/middleware-host-header" "3.679.0" + "@aws-sdk/middleware-logger" "3.679.0" + "@aws-sdk/middleware-recursion-detection" "3.679.0" + "@aws-sdk/middleware-user-agent" "3.679.0" + "@aws-sdk/region-config-resolver" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@aws-sdk/util-endpoints" "3.679.0" + "@aws-sdk/util-user-agent-browser" "3.679.0" + "@aws-sdk/util-user-agent-node" "3.679.0" + "@smithy/config-resolver" "^3.0.9" + "@smithy/core" "^2.4.8" + "@smithy/fetch-http-handler" "^3.2.9" + "@smithy/hash-node" "^3.0.7" + "@smithy/invalid-dependency" "^3.0.7" + "@smithy/middleware-content-length" "^3.0.9" + "@smithy/middleware-endpoint" "^3.1.4" + "@smithy/middleware-retry" "^3.0.23" + "@smithy/middleware-serde" "^3.0.7" + "@smithy/middleware-stack" "^3.0.7" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/node-http-handler" "^3.2.4" + "@smithy/protocol-http" "^4.1.4" + "@smithy/smithy-client" "^3.4.0" + "@smithy/types" "^3.5.0" + "@smithy/url-parser" "^3.0.7" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.23" + "@smithy/util-defaults-mode-node" "^3.0.23" + "@smithy/util-endpoints" "^2.1.3" + "@smithy/util-middleware" "^3.0.7" + "@smithy/util-retry" "^3.0.7" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/core" "^2.4.8" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/property-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.4" + "@smithy/signature-v4" "^4.2.0" + "@smithy/smithy-client" "^3.4.0" + "@smithy/types" "^3.5.0" + "@smithy/util-middleware" "^3.0.7" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/core" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/core" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/fetch-http-handler" "^3.2.9" + "@smithy/node-http-handler" "^3.2.4" + "@smithy/property-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.4" + "@smithy/smithy-client" "^3.4.0" + "@smithy/types" "^3.5.0" + "@smithy/util-stream" "^3.1.9" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/core" "3.679.0" + "@aws-sdk/credential-provider-env" "3.679.0" + "@aws-sdk/credential-provider-http" "3.679.0" + "@aws-sdk/credential-provider-process" "3.679.0" + "@aws-sdk/credential-provider-sso" "3.679.0" + "@aws-sdk/credential-provider-web-identity" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/credential-provider-imds" "^3.2.4" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/credential-provider-env" "3.679.0" + "@aws-sdk/credential-provider-http" "3.679.0" + "@aws-sdk/credential-provider-ini" "3.679.0" + "@aws-sdk/credential-provider-process" "3.679.0" + "@aws-sdk/credential-provider-sso" "3.679.0" + "@aws-sdk/credential-provider-web-identity" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/credential-provider-imds" "^3.2.4" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/core" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/client-sso" "3.679.0" + "@aws-sdk/core" "3.679.0" + "@aws-sdk/token-providers" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/core" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/protocol-http" "^4.1.4" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/protocol-http" "^4.1.4" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/core" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@aws-sdk/util-endpoints" "3.679.0" + "@smithy/core" "^2.4.8" + "@smithy/protocol-http" "^4.1.4" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/types" "^3.5.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.7" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/property-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.8" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/types@^3.222.0", "@aws-sdk/types@3.679.0": + version "3.679.0" + dependencies: + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/types" "^3.5.0" + "@smithy/util-endpoints" "^2.1.3" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.679.0" + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/types" "3.679.0" + "@smithy/types" "^3.5.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.679.0": + version "3.679.0" + dependencies: + "@aws-sdk/middleware-user-agent" "3.679.0" + "@aws-sdk/types" "3.679.0" + "@smithy/node-config-provider" "^3.1.8" + "@smithy/types" "^3.5.0" + tslib "^2.6.2" + +"@babel/code-frame@^7.0.0": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.10.4": - version "7.26.0" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815" - integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/code-frame@^7.22.13": version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: "@babel/highlight" "^7.22.13" @@ -54,17 +457,38 @@ "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz" integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== "@babel/compat-data@^7.25.2": version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.25.2.tgz" integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.19.6", "@babel/core@^7.4.0-0": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz" + integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.3" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.3" + "@babel/types" "^7.21.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/core@^7.11.6", "@babel/core@^7.8.0": version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" @@ -83,30 +507,51 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.19.6": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== +"@babel/core@^7.12.3": + version "7.25.2" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.23.9": + version "7.25.2" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" "@babel/generator@^7.21.3": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz" integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== dependencies: "@babel/types" "^7.21.3" @@ -116,7 +561,7 @@ "@babel/generator@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz" integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: "@babel/types" "^7.23.0" @@ -126,7 +571,7 @@ "@babel/generator@^7.25.0", "@babel/generator@^7.7.2": version "7.25.0" - resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.25.0.tgz" integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== dependencies: "@babel/types" "^7.25.0" @@ -136,14 +581,14 @@ "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== dependencies: "@babel/helper-explode-assignable-expression" "^7.18.6" @@ -151,7 +596,7 @@ "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: "@babel/compat-data" "^7.20.5" @@ -162,7 +607,7 @@ "@babel/helper-compilation-targets@^7.25.2": version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz" integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: "@babel/compat-data" "^7.25.2" @@ -173,7 +618,7 @@ "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz" integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -187,7 +632,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz" integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -195,7 +640,7 @@ "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" @@ -207,24 +652,24 @@ "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== dependencies: "@babel/types" "^7.18.6" "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: "@babel/template" "^7.20.7" @@ -232,7 +677,7 @@ "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -240,35 +685,35 @@ "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== dependencies: "@babel/types" "^7.21.0" "@babel/helper-module-imports@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-imports@^7.24.7": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz" integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: "@babel/traverse" "^7.24.7" @@ -276,7 +721,7 @@ "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -290,7 +735,7 @@ "@babel/helper-module-transforms@^7.25.2": version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz" integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: "@babel/helper-module-imports" "^7.24.7" @@ -300,24 +745,24 @@ "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-plugin-utils@^7.24.7": version "7.24.8" - resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -327,7 +772,7 @@ "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -339,14 +784,14 @@ "@babel/helper-simple-access@^7.20.2": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: "@babel/types" "^7.20.2" "@babel/helper-simple-access@^7.24.7": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz" integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: "@babel/traverse" "^7.24.7" @@ -354,73 +799,68 @@ "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.19.4": version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-string-parser@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== "@babel/helper-string-parser@^7.24.8": version "7.24.8" - resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-validator-option@^7.24.8": version "7.24.8" - resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" @@ -430,7 +870,7 @@ "@babel/helpers@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: "@babel/template" "^7.20.7" @@ -439,7 +879,7 @@ "@babel/helpers@^7.25.0": version "7.25.0" - resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.25.0.tgz" integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== dependencies: "@babel/template" "^7.25.0" @@ -447,7 +887,7 @@ "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" @@ -456,7 +896,7 @@ "@babel/highlight@^7.22.13": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz" integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: "@babel/helper-validator-identifier" "^7.22.20" @@ -465,7 +905,7 @@ "@babel/highlight@^7.24.7": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.7.tgz" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: "@babel/helper-validator-identifier" "^7.24.7" @@ -475,31 +915,36 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3": version "7.25.3" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.3.tgz" integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== dependencies: "@babel/types" "^7.25.2" -"@babel/parser@^7.20.7", "@babel/parser@^7.21.3": +"@babel/parser@^7.20.7": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz" + integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== + +"@babel/parser@^7.21.3": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz" integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -508,7 +953,7 @@ "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -518,7 +963,7 @@ "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -526,7 +971,7 @@ "@babel/plugin-proposal-class-static-block@^7.18.6": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: "@babel/helper-create-class-features-plugin" "^7.21.0" @@ -535,7 +980,7 @@ "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -543,7 +988,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" @@ -551,7 +996,7 @@ "@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -559,7 +1004,7 @@ "@babel/plugin-proposal-logical-assignment-operators@^7.18.9": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -567,7 +1012,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -575,7 +1020,7 @@ "@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -583,7 +1028,7 @@ "@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: "@babel/compat-data" "^7.20.5" @@ -594,7 +1039,7 @@ "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -602,7 +1047,7 @@ "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -611,7 +1056,7 @@ "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -619,7 +1064,7 @@ "@babel/plugin-proposal-private-property-in-object@^7.18.6": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -629,7 +1074,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -637,161 +1082,161 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz" integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-typescript@^7.7.2": version "7.24.7" - resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz" integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-async-to-generator@^7.18.6": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" @@ -800,21 +1245,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.20.2": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.20.2": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -829,7 +1274,7 @@ "@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -837,14 +1282,14 @@ "@babel/plugin-transform-destructuring@^7.20.2": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -852,14 +1297,14 @@ "@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" @@ -867,14 +1312,14 @@ "@babel/plugin-transform-for-of@^7.18.8": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: "@babel/helper-compilation-targets" "^7.18.9" @@ -883,21 +1328,21 @@ "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.19.6": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: "@babel/helper-module-transforms" "^7.20.11" @@ -905,7 +1350,7 @@ "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== dependencies: "@babel/helper-module-transforms" "^7.21.2" @@ -914,7 +1359,7 @@ "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" @@ -924,7 +1369,7 @@ "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: "@babel/helper-module-transforms" "^7.18.6" @@ -932,7 +1377,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.20.5" @@ -940,14 +1385,14 @@ "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -955,42 +1400,42 @@ "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.18.12": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz#b32a5556100d424b25e388dd689050d78396884d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz" integrity sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-jsx-development@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz" integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz" integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -1001,7 +1446,7 @@ "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz" integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -1009,7 +1454,7 @@ "@babel/plugin-transform-regenerator@^7.18.6": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -1017,21 +1462,21 @@ "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.19.0": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -1039,28 +1484,28 @@ "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.21.0": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -1070,14 +1515,14 @@ "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -1085,7 +1530,7 @@ "@babel/preset-env@^7.19.4": version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== dependencies: "@babel/compat-data" "^7.20.1" @@ -1166,7 +1611,7 @@ "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1177,7 +1622,7 @@ "@babel/preset-react@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz" integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -1189,7 +1634,7 @@ "@babel/preset-typescript@^7.18.6": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz#bcbbca513e8213691fe5d4b23d9251e01f00ebff" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz" integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -1198,19 +1643,24 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.20.7", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.23.6" + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.21.0": version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz" integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== dependencies: regenerator-runtime "^0.14.0" "@babel/template@^7.18.10", "@babel/template@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" @@ -1219,16 +1669,25 @@ "@babel/template@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: "@babel/code-frame" "^7.22.13" "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/template@^7.25.0", "@babel/template@^7.3.3": +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.0.tgz" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/template@^7.3.3": version "7.25.0" - resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.0.tgz" integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: "@babel/code-frame" "^7.24.7" @@ -1237,7 +1696,7 @@ "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" @@ -1253,7 +1712,7 @@ "@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": version "7.25.3" - resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.3.tgz" integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== dependencies: "@babel/code-frame" "^7.24.7" @@ -1264,9 +1723,9 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3": +"@babel/types@^7.0.0": version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz" integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== dependencies: "@babel/helper-string-parser" "^7.24.8" @@ -1275,7 +1734,7 @@ "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.4.4": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz" integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== dependencies: "@babel/helper-string-parser" "^7.19.4" @@ -1284,160 +1743,59 @@ "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz" integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3": + version "7.25.2" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz" + integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@braintree/sanitize-url@^6.0.1": version "6.0.4" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + resolved "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - "@esbuild/darwin-arm64@0.21.5": version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz" integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== "@eslint/eslintrc@^2.1.2": version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" @@ -1452,17 +1810,17 @@ "@eslint/js@8.49.0": version "8.49.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz" integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== "@fortaine/fetch-event-source@^3.0.6": version "3.0.6" - resolved "https://registry.npmmirror.com/@fortaine/fetch-event-source/-/fetch-event-source-3.0.6.tgz#b8552a2ca2c5202f5699b93a92be0188d422b06e" + resolved "https://registry.npmmirror.com/@fortaine/fetch-event-source/-/fetch-event-source-3.0.6.tgz" integrity sha512-621GAuLMvKtyZQ3IA6nlDWhV1V/7PGOTNIGLUifxt0KzM+dZIweJ6F3XvQF3QnqeNfS1N7WQ0Kil1Di/lhChEw== "@hello-pangea/dnd@^16.5.0": version "16.5.0" - resolved "https://registry.yarnpkg.com/@hello-pangea/dnd/-/dnd-16.5.0.tgz#f323ff9f813204818bc67648a383e8715f47c59c" + resolved "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.5.0.tgz" integrity sha512-n+am6O32jo/CFXciCysz83lPM3I3F58FJw4uS44TceieymcyxQSfzK5OhzPAKrVBZktmuOI6Zim9WABTMtXv4A== dependencies: "@babel/runtime" "^7.23.2" @@ -1475,7 +1833,7 @@ "@humanwhocodes/config-array@^0.11.11": version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" @@ -1484,17 +1842,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1505,12 +1863,12 @@ "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" - resolved "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + resolved "https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" @@ -1522,7 +1880,7 @@ "@jest/core@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + resolved "https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" @@ -1556,7 +1914,7 @@ "@jest/environment@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + resolved "https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" @@ -1566,14 +1924,14 @@ "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + resolved "https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" @@ -1581,7 +1939,7 @@ "@jest/fake-timers@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + resolved "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" @@ -1593,7 +1951,7 @@ "@jest/globals@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + resolved "https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" @@ -1603,7 +1961,7 @@ "@jest/reporters@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + resolved "https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1633,14 +1991,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" - resolved "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + resolved "https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" @@ -1649,7 +2007,7 @@ "@jest/test-result@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + resolved "https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" @@ -1659,7 +2017,7 @@ "@jest/test-sequencer@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + resolved "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" @@ -1669,7 +2027,7 @@ "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -1690,7 +2048,7 @@ "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1702,7 +2060,7 @@ "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" @@ -1710,7 +2068,7 @@ "@jridgewell/gen-mapping@^0.3.0": version "0.3.3" - resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -1719,7 +2077,7 @@ "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -1728,62 +2086,54 @@ "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": version "0.3.3" - resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.3.tgz" integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" - resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12": version "0.3.25" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -1791,174 +2141,511 @@ "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@^0.3.18": + version "0.3.25" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@next/env@14.1.1": version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.1.tgz#80150a8440eb0022a73ba353c6088d419b908bac" + resolved "https://registry.npmjs.org/@next/env/-/env-14.1.1.tgz" integrity sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA== "@next/eslint-plugin-next@13.4.19": version "13.4.19" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz#93d130c37b47fd120f6d111aee36a60611148df1" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz" integrity sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ== dependencies: glob "7.1.7" "@next/swc-darwin-arm64@14.1.1": version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz#b74ba7c14af7d05fa2848bdeb8ee87716c939b64" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz" integrity sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ== -"@next/swc-darwin-x64@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.1.tgz#82c3e67775e40094c66e76845d1a36cc29c9e78b" - integrity sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw== +"@next/third-parties@^14.1.0": + version "14.1.0" + resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-14.1.0.tgz" + integrity sha512-f55SdvQ1WWxi4mb5QqtYQh5wRzbm1XaeP7s39DPn4ks3re+n9VlFccbMxBRHqkE62zAyIKmvkUB2cByT/gugGA== + dependencies: + third-party-capital "1.0.20" -"@next/swc-linux-arm64-gnu@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.1.tgz#4f4134457b90adc5c3d167d07dfb713c632c0caa" - integrity sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -"@next/swc-linux-arm64-musl@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.1.tgz#594bedafaeba4a56db23a48ffed2cef7cd09c31a" - integrity sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ== +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@next/swc-linux-x64-gnu@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.1.tgz#cb4e75f1ff2b9bcadf2a50684605928ddfc58528" - integrity sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ== +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -"@next/swc-linux-x64-musl@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.1.tgz#15f26800df941b94d06327f674819ab64b272e25" - integrity sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og== +"@pkgr/core@^0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz" + integrity sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ== -"@next/swc-win32-arm64-msvc@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.1.tgz#060c134fa7fa843666e3e8574972b2b723773dd9" - integrity sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A== +"@remix-run/router@1.8.0": + version "1.8.0" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz" + integrity sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg== + +"@rushstack/eslint-patch@^1.1.3": + version "1.2.0" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz" + integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.npmmirror.com/@sinonjs/commons/-/commons-3.0.1.tgz" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@smithy/abort-controller@^3.1.6": + version "3.1.6" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/config-resolver@^3.0.10", "@smithy/config-resolver@^3.0.9": + version "3.0.10" + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + tslib "^2.6.2" + +"@smithy/core@^2.4.8", "@smithy/core@^2.5.1": + version "2.5.1" + dependencies: + "@smithy/middleware-serde" "^3.0.8" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-stream" "^3.2.1" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^3.2.4", "@smithy/credential-provider-imds@^3.2.5": + version "3.2.5" + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/property-provider" "^3.1.8" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^3.1.7": + version "3.1.7" + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^3.6.0" + "@smithy/util-hex-encoding" "^3.0.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-browser@^3.0.10": + version "3.0.11" + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.10" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-config-resolver@^3.0.7": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-node@^3.0.9": + version "3.0.10" + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.10" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-universal@^3.0.10": + version "3.0.10" + dependencies: + "@smithy/eventstream-codec" "^3.1.7" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^3.2.9": + version "3.2.9" + dependencies: + "@smithy/protocol-http" "^4.1.4" + "@smithy/querystring-builder" "^3.0.7" + "@smithy/types" "^3.5.0" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^4.0.0": + version "4.0.0" + dependencies: + "@smithy/protocol-http" "^4.1.5" + "@smithy/querystring-builder" "^3.0.8" + "@smithy/types" "^3.6.0" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/hash-node@^3.0.7": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^3.0.7": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^3.0.0": + version "3.0.0" + dependencies: + tslib "^2.6.2" + +"@smithy/middleware-content-length@^3.0.9": + version "3.0.10" + dependencies: + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^3.1.4", "@smithy/middleware-endpoint@^3.2.1": + version "3.2.1" + dependencies: + "@smithy/core" "^2.5.1" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/shared-ini-file-loader" "^3.1.9" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" + "@smithy/util-middleware" "^3.0.8" + tslib "^2.6.2" + +"@smithy/middleware-retry@^3.0.23": + version "3.0.25" + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/protocol-http" "^4.1.5" + "@smithy/service-error-classification" "^3.0.8" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^3.0.7", "@smithy/middleware-serde@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/middleware-stack@^3.0.7", "@smithy/middleware-stack@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/node-config-provider@^3.1.8", "@smithy/node-config-provider@^3.1.9": + version "3.1.9" + dependencies: + "@smithy/property-provider" "^3.1.8" + "@smithy/shared-ini-file-loader" "^3.1.9" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/node-http-handler@^3.2.4", "@smithy/node-http-handler@^3.2.5": + version "3.2.5" + dependencies: + "@smithy/abort-controller" "^3.1.6" + "@smithy/protocol-http" "^4.1.5" + "@smithy/querystring-builder" "^3.0.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/property-provider@^3.1.7", "@smithy/property-provider@^3.1.8": + version "3.1.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/protocol-http@^4.1.4", "@smithy/protocol-http@^4.1.5": + version "4.1.5" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/querystring-builder@^3.0.7", "@smithy/querystring-builder@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + "@smithy/util-uri-escape" "^3.0.0" + tslib "^2.6.2" + +"@smithy/querystring-parser@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/service-error-classification@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + +"@smithy/shared-ini-file-loader@^3.1.8", "@smithy/shared-ini-file-loader@^3.1.9": + version "3.1.9" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/signature-v4@^4.2.0": + version "4.2.1" + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-uri-escape" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^3.4.0", "@smithy/smithy-client@^3.4.2": + version "3.4.2" + dependencies: + "@smithy/core" "^2.5.1" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" + "@smithy/util-stream" "^3.2.1" + tslib "^2.6.2" + +"@smithy/types@^3.5.0", "@smithy/types@^3.6.0": + version "3.6.0" + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^3.0.7", "@smithy/url-parser@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/querystring-parser" "^3.0.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" + +"@smithy/util-base64@^3.0.0": + version "3.0.0" + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^3.0.0": + version "3.0.0" + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^3.0.0": + version "3.0.0" + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" -"@next/swc-win32-ia32-msvc@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.1.tgz#5c06889352b1f77e3807834a0d0afd7e2d2d1da2" - integrity sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw== +"@smithy/util-buffer-from@^3.0.0": + version "3.0.0" + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + tslib "^2.6.2" -"@next/swc-win32-x64-msvc@14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.1.tgz#d38c63a8f9b7f36c1470872797d3735b4a9c5c52" - integrity sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A== +"@smithy/util-config-provider@^3.0.0": + version "3.0.0" + dependencies: + tslib "^2.6.2" -"@next/third-parties@^14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-14.1.0.tgz#d9604fff8880e05d3804d2cf7ab42eb5430aec69" - integrity sha512-f55SdvQ1WWxi4mb5QqtYQh5wRzbm1XaeP7s39DPn4ks3re+n9VlFccbMxBRHqkE62zAyIKmvkUB2cByT/gugGA== +"@smithy/util-defaults-mode-browser@^3.0.23": + version "3.0.25" dependencies: - third-party-capital "1.0.20" + "@smithy/property-provider" "^3.1.8" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + bowser "^2.11.0" + tslib "^2.6.2" -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== +"@smithy/util-defaults-mode-node@^3.0.23": + version "3.0.25" dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" + "@smithy/config-resolver" "^3.0.10" + "@smithy/credential-provider-imds" "^3.2.5" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/property-provider" "^3.1.8" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== +"@smithy/util-endpoints@^2.1.3": + version "2.1.4" + dependencies: + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== +"@smithy/util-hex-encoding@^3.0.0": + version "3.0.0" dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" + tslib "^2.6.2" -"@pkgr/core@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.0.tgz#7d8dacb7fdef0e4387caf7396cbd77f179867d06" - integrity sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ== +"@smithy/util-middleware@^3.0.7", "@smithy/util-middleware@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/types" "^3.6.0" + tslib "^2.6.2" -"@remix-run/router@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.8.0.tgz#e848d2f669f601544df15ce2a313955e4bf0bafc" - integrity sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg== +"@smithy/util-retry@^3.0.7", "@smithy/util-retry@^3.0.8": + version "3.0.8" + dependencies: + "@smithy/service-error-classification" "^3.0.8" + "@smithy/types" "^3.6.0" + tslib "^2.6.2" -"@rushstack/eslint-patch@^1.1.3": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== +"@smithy/util-stream@^3.1.9", "@smithy/util-stream@^3.2.1": + version "3.2.1" + dependencies: + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/types" "^3.6.0" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@smithy/util-uri-escape@^3.0.0": + version "3.0.0" + dependencies: + tslib "^2.6.2" -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.npmmirror.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== +"@smithy/util-utf8@^2.0.0": + version "2.3.0" dependencies: - type-detect "4.0.8" + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== +"@smithy/util-utf8@^3.0.0": + version "3.0.0" dependencies: - "@sinonjs/commons" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + tslib "^2.6.2" "@svgr/babel-plugin-add-jsx-attribute@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== "@svgr/babel-plugin-remove-jsx-attribute@*": version "7.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz#91da77a009dc38e8d30da45d9b62ef8736f2d90a" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz" integrity sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ== "@svgr/babel-plugin-remove-jsx-empty-expression@*": version "7.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz#5154ff1213509e36ab315974c8c2fd48dafb827b" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz" integrity sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw== "@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== "@svgr/babel-plugin-svg-dynamic-title@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== "@svgr/babel-plugin-svg-em-dimensions@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== "@svgr/babel-plugin-transform-react-native-svg@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== "@svgr/babel-plugin-transform-svg-component@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== "@svgr/babel-preset@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== dependencies: "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" @@ -1970,9 +2657,9 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@^6.5.1": +"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== dependencies: "@babel/core" "^7.19.6" @@ -1983,7 +2670,7 @@ "@svgr/hast-util-to-babel-ast@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== dependencies: "@babel/types" "^7.20.0" @@ -1991,7 +2678,7 @@ "@svgr/plugin-jsx@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== dependencies: "@babel/core" "^7.19.6" @@ -2001,7 +2688,7 @@ "@svgr/plugin-svgo@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== dependencies: cosmiconfig "^7.0.1" @@ -2010,7 +2697,7 @@ "@svgr/webpack@^6.5.1": version "6.5.1" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== dependencies: "@babel/core" "^7.19.6" @@ -2024,69 +2711,24 @@ "@swc/helpers@0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz" integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== dependencies: tslib "^2.4.0" "@tauri-apps/api@^1.6.0": version "1.6.0" - resolved "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz#745b7e4e26782c3b2ad9510d558fa5bb2cf29186" + resolved "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz" integrity sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg== "@tauri-apps/cli-darwin-arm64@1.5.11": version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.11.tgz#a831f98f685148e46e8050dbdddbf4bcdda9ddc6" + resolved "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.11.tgz" integrity sha512-2NLSglDb5VfvTbMtmOKWyD+oaL/e8Z/ZZGovHtUFyUSFRabdXc6cZOlcD1BhFvYkHqm+TqGaz5qtPR5UbqDs8A== -"@tauri-apps/cli-darwin-x64@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.11.tgz#0afae17fe1e84b9699a6b9824cd83b60c6ebfa59" - integrity sha512-/RQllHiJRH2fJOCudtZlaUIjofkHzP3zZgxi71ZUm7Fy80smU5TDfwpwOvB0wSVh0g/ciDjMArCSTo0MRvL+ag== - -"@tauri-apps/cli-linux-arm-gnueabihf@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.11.tgz#c46166d7f6c1022105a13d530b1d1336f628981f" - integrity sha512-IlBuBPKmMm+a5LLUEK6a21UGr9ZYd6zKuKLq6IGM4tVweQa8Sf2kP2Nqs74dMGIUrLmMs0vuqdURpykQg+z4NQ== - -"@tauri-apps/cli-linux-arm64-gnu@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.11.tgz#fd5c539a03371e0ab6cd00563dced1610ceb8943" - integrity sha512-w+k1bNHCU/GbmXshtAhyTwqosThUDmCEFLU4Zkin1vl2fuAtQry2RN7thfcJFepblUGL/J7yh3Q/0+BCjtspKQ== - -"@tauri-apps/cli-linux-arm64-musl@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.11.tgz#bf7f940c3aca981d7c240857a86568d5b6e8310f" - integrity sha512-PN6/dl+OfYQ/qrAy4HRAfksJ2AyWQYn2IA/2Wwpaa7SDRz2+hzwTQkvajuvy0sQ5L2WCG7ymFYRYMbpC6Hk9Pg== - -"@tauri-apps/cli-linux-x64-gnu@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.11.tgz#17323105e3863a3f36d51771e642e489037ba59b" - integrity sha512-MTVXLi89Nj7Apcvjezw92m7ZqIDKT5SFKZtVPCg6RoLUBTzko/BQoXYIRWmdoz2pgkHDUHgO2OMJ8oKzzddXbw== - -"@tauri-apps/cli-linux-x64-musl@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.11.tgz#83e22026771ec8ab094922ab114a7385532aa16c" - integrity sha512-kwzAjqFpz7rvTs7WGZLy/a5nS5t15QKr3E9FG95MNF0exTl3d29YoAUAe1Mn0mOSrTJ9Z+vYYAcI/QdcsGBP+w== - -"@tauri-apps/cli-win32-arm64-msvc@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.11.tgz#817874d230fdb09e7211013006a9a22f66ace573" - integrity sha512-L+5NZ/rHrSUrMxjj6YpFYCXp6wHnq8c8SfDTBOX8dO8x+5283/vftb4vvuGIsLS4UwUFXFnLt3XQr44n84E67Q== - -"@tauri-apps/cli-win32-ia32-msvc@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.11.tgz#dee1a00eb9e216415d9d6ab9386c35849613c560" - integrity sha512-oVlD9IVewrY0lZzTdb71kNXkjdgMqFq+ohb67YsJb4Rf7o8A9DTlFds1XLCe3joqLMm4M+gvBKD7YnGIdxQ9vA== - -"@tauri-apps/cli-win32-x64-msvc@1.5.11": - version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.11.tgz#c003ce00b36d056a8b08e0ecf4633c2bba00c497" - integrity sha512-1CexcqUFCis5ypUIMOKllxUBrna09McbftWENgvVXMfA+SP+yPDPAVb8fIvUcdTIwR/yHJwcIucmTB4anww4vg== - "@tauri-apps/cli@1.5.11": version "1.5.11" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.5.11.tgz#02beb559b3b55836c90a1ba9121b3fc50e3760cd" + resolved "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.11.tgz" integrity sha512-B475D7phZrq5sZ3kDABH4g2mEoUIHtnIO+r4ZGAAfsjMbZCwXxR/jlMGTEL+VO3YzjpF7gQe38IzB4vLBbVppw== optionalDependencies: "@tauri-apps/cli-darwin-arm64" "1.5.11" @@ -2100,9 +2742,9 @@ "@tauri-apps/cli-win32-ia32-msvc" "1.5.11" "@tauri-apps/cli-win32-x64-msvc" "1.5.11" -"@testing-library/dom@^10.4.0": +"@testing-library/dom@^10.0.0", "@testing-library/dom@^10.4.0": version "10.4.0" - resolved "https://registry.npmmirror.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz" integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== dependencies: "@babel/code-frame" "^7.10.4" @@ -2116,7 +2758,7 @@ "@testing-library/jest-dom@^6.6.2": version "6.6.2" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.6.2.tgz#8186aa9a07263adef9cc5a59a4772db8c31f4a5b" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.2.tgz" integrity sha512-P6GJD4yqc9jZLbe98j/EkyQDTPgqftohZF5FBkHY5BUERZmcf4HeO2k0XaefEg329ux2p21i1A1DmyQ1kKw2Jw== dependencies: "@adobe/css-tools" "^4.4.0" @@ -2129,49 +2771,49 @@ "@testing-library/react@^16.0.1": version "16.0.1" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.1.tgz#29c0ee878d672703f5e7579f239005e4e0faa875" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz" integrity sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg== dependencies: "@babel/runtime" "^7.12.5" "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@trysound/sax@0.2.0": version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/aria-query@^5.0.1": version "5.0.4" - resolved "https://registry.npmmirror.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@types/babel__core@^7.1.14": version "7.20.5" - resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -2182,14 +2824,14 @@ "@types/babel__generator@*": version "7.6.8" - resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + resolved "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.8.tgz" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -2197,46 +2839,51 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.6" - resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + resolved "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" +"@types/crypto-js@^4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz" + integrity sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ== + "@types/d3-scale-chromatic@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#103124777e8cdec85b20b51fd3397c682ee1e954" + resolved "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz" integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== "@types/d3-scale@^4.0.3": version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz#7a5780e934e52b6f63ad9c24b105e33dd58102b5" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz" integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== dependencies: "@types/d3-time" "*" "@types/d3-time@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz" integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== "@types/debug@^4.0.0": version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz" integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": version "3.7.4" - resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*": +"@types/eslint@*", "@types/eslint@>=8.0.0": version "8.40.2" - resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.2.tgz#2833bc112d809677864a4b0e7d1de4f04d7dac2d" + resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.2.tgz" integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== dependencies: "@types/estree" "*" @@ -2244,26 +2891,26 @@ "@types/estree@*", "@types/estree@^1.0.0": version "1.0.1" - resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/graceful-fs@^4.1.3": version "4.1.9" - resolved "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + resolved "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/hast@^2.0.0": version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== dependencies: "@types/unist" "*" "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" - resolved "https://registry.npmmirror.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + resolved "https://registry.npmmirror.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== dependencies: "@types/react" "*" @@ -2271,26 +2918,26 @@ "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.5.14": version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz" integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: expect "^29.0.0" @@ -2298,12 +2945,12 @@ "@types/js-yaml@4.0.9": version "4.0.9" - resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz" integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== "@types/jsdom@^20.0.0": version "20.0.1" - resolved "https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + resolved "https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz" integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== dependencies: "@types/node" "*" @@ -2312,82 +2959,82 @@ "@types/json-schema@*", "@types/json-schema@^7.0.8": version "7.0.12" - resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/katex@^0.11.0": version "0.11.1" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5" + resolved "https://registry.npmjs.org/@types/katex/-/katex-0.11.1.tgz" integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg== "@types/katex@^0.14.0": version "0.14.0" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.14.0.tgz#b84c0afc3218069a5ad64fe2a95321881021b5fe" + resolved "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz" integrity sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA== "@types/lodash-es@^4.17.12": version "4.17.12" - resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz" integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== dependencies: "@types/lodash" "*" "@types/lodash@*": version "4.17.7" - resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" + resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.7.tgz" integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== "@types/mdast@^3.0.0": version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz" integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== dependencies: "@types/unist" "*" "@types/ms@*": version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*", "@types/node@^20.11.30": version "20.11.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz" integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== dependencies: undici-types "~5.26.4" "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prop-types@*", "@types/prop-types@^15.0.0": version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^18.2.7": +"@types/react-dom@^16.8 || ^17.0 || ^18.0", "@types/react-dom@^18.0.0", "@types/react-dom@^18.2.7": version "18.2.7" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== dependencies: "@types/react" "*" "@types/react-katex@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/react-katex/-/react-katex-3.0.0.tgz#119a902bff10eb52f449fac744aaed8c4909391f" + resolved "https://registry.npmjs.org/@types/react-katex/-/react-katex-3.0.0.tgz" integrity sha512-AiHHXh71a2M7Z6z1wj6iA23SkiRF9r0neHUdu8zjU/cT3MyLxDefYHbcceKhV/gjDEZgF3YaiNHyPNtoGUjPvg== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.70": +"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^18.0.0", "@types/react@^18.2.70", "@types/react@>=16": version "18.2.70" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.70.tgz#89a37f9e0a6a4931f4259c598f40fd44dd6abf71" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.70.tgz" integrity sha512-hjlM2hho2vqklPhopNkXkdkeq6Lv8WSZTpr7956zY+3WS5cfYUewtCzsJLsbW5dEv3lfSeQ4W14ZFeKC437JRQ== dependencies: "@types/prop-types" "*" @@ -2396,49 +3043,49 @@ "@types/scheduler@*": version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/spark-md5@^3.0.4": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/spark-md5/-/spark-md5-3.0.4.tgz#c1221d63c069d95aba0c06a765b80661cacc12bf" + resolved "https://registry.npmjs.org/@types/spark-md5/-/spark-md5-3.0.4.tgz" integrity sha512-qtOaDz+IXiNndPgYb6t1YoutnGvFRtWSNzpVjkAPCfB2UzTyybuD4Tjgs7VgRawum3JnJNRwNQd4N//SvrHg1Q== "@types/stack-utils@^2.0.0": version "2.0.3" - resolved "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + resolved "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/tough-cookie@*": version "4.0.5" - resolved "https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + resolved "https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== "@types/unist@*", "@types/unist@^2.0.0": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@types/use-sync-external-store@^0.0.3": version "0.0.3" - resolved "https://registry.npmmirror.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + resolved "https://registry.npmmirror.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.32" - resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + resolved "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.32.tgz" integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.4.0.tgz#47e7c6e22ff1248e8675d95f488890484de67600" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz" integrity sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg== dependencies: "@typescript-eslint/scope-manager" "6.4.0" @@ -2449,7 +3096,7 @@ "@typescript-eslint/scope-manager@6.4.0": version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz#3048e4262ba3eafa4e2e69b08912d9037ec646ae" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz" integrity sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig== dependencies: "@typescript-eslint/types" "6.4.0" @@ -2457,12 +3104,12 @@ "@typescript-eslint/types@6.4.0": version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.4.0.tgz#5b109a59a805f0d8d375895e42d9e5f0037f66ee" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.0.tgz" integrity sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg== "@typescript-eslint/typescript-estree@6.4.0": version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz#3c58d20632db93fec3d6ab902acbedf593d37276" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz" integrity sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA== dependencies: "@typescript-eslint/types" "6.4.0" @@ -2475,7 +3122,7 @@ "@typescript-eslint/visitor-keys@6.4.0": version "6.4.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz#96a426cdb1add28274abd7a34aefe27f8b7d51ef" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz" integrity sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA== dependencies: "@typescript-eslint/types" "6.4.0" @@ -2483,17 +3130,17 @@ "@vercel/analytics@^0.1.11": version "0.1.11" - resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-0.1.11.tgz#727a0ac655a4a89104cdea3e6925476470299428" + resolved "https://registry.npmjs.org/@vercel/analytics/-/analytics-0.1.11.tgz" integrity sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw== "@vercel/speed-insights@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@vercel/speed-insights/-/speed-insights-1.0.2.tgz#1bebf3e7c7046b6a911721233b263b69214ddb3e" + resolved "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.0.2.tgz" integrity sha512-y5HWeB6RmlyVYxJAMrjiDEz8qAIy2cit0fhBq+MD78WaUwQvuBnQlX4+5MuwVTWi46bV3klaRMq83u9zUy1KOg== -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" @@ -2501,22 +3148,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-buffer@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" @@ -2525,12 +3172,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-section@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2540,26 +3187,26 @@ "@webassemblyjs/ieee754@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2573,7 +3220,7 @@ "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2584,7 +3231,7 @@ "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2592,9 +3239,9 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2606,7 +3253,7 @@ "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" - resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== dependencies: "@webassemblyjs/ast" "1.11.6" @@ -2614,22 +3261,22 @@ "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.6: version "2.0.6" - resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== acorn-globals@^7.0.0: version "7.0.1" - resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz" integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: acorn "^8.1.0" @@ -2637,46 +3284,51 @@ acorn-globals@^7.0.0: acorn-import-assertions@^1.9.0: version "1.9.0" - resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.2, acorn-walk@^8.1.1: version "8.3.3" - resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.3.tgz" integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== dependencies: acorn "^8.11.0" +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +acorn@^8, acorn@^8.7.1: + version "8.9.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.9.0.tgz" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + acorn@^8.1.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.1: version "8.12.1" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.8.2: version "8.9.0" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.9.0.tgz" integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== -acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - agent-base@6: version "6.0.2" - resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2684,12 +3336,12 @@ aggregate-error@^3.0.0: ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2699,48 +3351,48 @@ ajv@^6.12.4, ajv@^6.12.5: ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -2748,31 +3400,31 @@ anymatch@^3.0.3, anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.3.0, aria-query@^5.0.0, aria-query@^5.1.3: +aria-query@^5.0.0, aria-query@^5.1.3, aria-query@5.3.0: version "5.3.0" - resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== dependencies: call-bind "^1.0.2" @@ -2780,7 +3432,7 @@ array-buffer-byte-length@^1.0.0: array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" @@ -2791,12 +3443,12 @@ array-includes@^3.1.5, array-includes@^3.1.6: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" @@ -2806,7 +3458,7 @@ array.prototype.flat@^1.3.1: array.prototype.flatmap@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" @@ -2816,7 +3468,7 @@ array.prototype.flatmap@^1.3.1: array.prototype.tosorted@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== dependencies: call-bind "^1.0.2" @@ -2827,32 +3479,32 @@ array.prototype.tosorted@^1.1.1: ast-types-flow@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@^4.6.2: version "4.6.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== -axios@^1.7.5: +axios@^1.7.5, axios@>=0.25.0: version "1.7.5" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz" integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== dependencies: follow-redirects "^1.15.6" @@ -2861,14 +3513,14 @@ axios@^1.7.5: axobject-query@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz" integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: deep-equal "^2.0.5" babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -2881,7 +3533,7 @@ babel-jest@^29.7.0: babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -2892,7 +3544,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -2902,7 +3554,7 @@ babel-plugin-jest-hoist@^29.6.3: babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" @@ -2911,7 +3563,7 @@ babel-plugin-polyfill-corejs2@^0.3.3: babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" @@ -2919,14 +3571,14 @@ babel-plugin-polyfill-corejs3@^0.6.0: babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -2944,7 +3596,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -2952,32 +3604,35 @@ babel-preset-jest@^29.6.3: bail@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bath-es5@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz#4e2808e8b33b4a5e3328ec1e9032f370f042193d" + resolved "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz" integrity sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bowser@^2.11.0: + version "2.11.0" + brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2985,14 +3640,14 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserslist@^4.14.5: version "4.21.9" - resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.9.tgz" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: caniuse-lite "^1.0.30001503" @@ -3000,9 +3655,9 @@ browserslist@^4.14.5: node-releases "^2.0.12" update-browserslist-db "^1.0.11" -browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -3012,7 +3667,7 @@ browserslist@^4.21.3, browserslist@^4.21.5: browserslist@^4.23.1: version "4.23.3" - resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: caniuse-lite "^1.0.30001646" @@ -3022,26 +3677,26 @@ browserslist@^4.23.1: bser@2.1.1: version "2.1.1" - resolved "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== busboy@1.6.0: version "1.6.0" - resolved "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -3049,42 +3704,46 @@ call-bind@^1.0.0, call-bind@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001503, caniuse-lite@^1.0.30001579: version "1.0.30001617" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz" integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== caniuse-lite@^1.0.30001646: version "1.0.30001649" - resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz#3ec700309ca0da2b0d3d5fb03c411b191761c992" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz" integrity sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -3093,7 +3752,7 @@ chalk@^2.0.0, chalk@^2.4.2: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -3101,25 +3760,30 @@ chalk@^3.0.0: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== "chokidar@>=3.0.0 <4.0.0": version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -3134,34 +3798,34 @@ character-entities@^2.0.0: chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.3.1" - resolved "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + resolved "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -3169,7 +3833,7 @@ cli-truncate@^2.1.0: cli-truncate@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: slice-ansi "^5.0.0" @@ -3177,12 +3841,12 @@ cli-truncate@^3.1.0: client-only@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -3191,83 +3855,88 @@ cliui@^8.0.1: co@^4.6.0: version "4.6.0" - resolved "https://registry.npmmirror.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmmirror.com/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + resolved "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colorette@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@7, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz" integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== commander@^2.20.0: version "2.20.3" - resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^8.0.0, commander@^8.3.0: +commander@^7.2.0, commander@7: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.0.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concurrently@^8.2.2: version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" + resolved "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz" integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== dependencies: chalk "^4.1.2" @@ -3282,38 +3951,38 @@ concurrently@^8.2.2: convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-js-compat@^3.25.1: version "3.29.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.1.tgz#15c0fb812ea27c973c18d425099afa50b934b41b" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz" integrity sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA== dependencies: browserslist "^4.21.5" cose-base@^1.0.0: version "1.0.3" - resolved "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + resolved "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz" integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== dependencies: layout-base "^1.0.0" cose-base@^2.2.0: version "2.2.0" - resolved "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + resolved "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz" integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== dependencies: layout-base "^2.0.0" cosmiconfig@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -3324,7 +3993,7 @@ cosmiconfig@^7.0.1: create-jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + resolved "https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" @@ -3337,35 +4006,40 @@ create-jest@^29.7.0: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-env@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: cross-spawn "^7.0.1" cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + css-box-model@^1.2.1: version "1.2.1" - resolved "https://registry.npmmirror.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + resolved "https://registry.npmmirror.com/css-box-model/-/css-box-model-1.2.1.tgz" integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== dependencies: tiny-invariant "^1.0.6" css-select@^4.1.3: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -3376,7 +4050,7 @@ css-select@^4.1.3: css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" @@ -3384,87 +4058,87 @@ css-tree@^1.1.2, css-tree@^1.1.3: css-what@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== css.escape@^1.5.1: version "1.5.1" - resolved "https://registry.npmmirror.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + resolved "https://registry.npmmirror.com/css.escape/-/css.escape-1.5.1.tgz" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== csso@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: css-tree "^1.1.2" cssom@^0.5.0: version "0.5.0" - resolved "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + resolved "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz" integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" - resolved "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + resolved "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== cssstyle@^2.3.0: version "2.3.0" - resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: cssom "~0.3.6" csstype@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== cytoscape-cose-bilkent@^4.1.0: version "4.1.0" - resolved "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + resolved "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz" integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== dependencies: cose-base "^1.0.0" cytoscape-fcose@^2.1.0: version "2.2.0" - resolved "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + resolved "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz" integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== dependencies: cose-base "^2.2.0" -cytoscape@^3.23.0: +cytoscape@^3.2.0, cytoscape@^3.23.0: version "3.24.0" - resolved "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.24.0.tgz#764e4ca3df37160b1c55244c648afd303a07e109" + resolved "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.24.0.tgz" integrity sha512-W9fJMrAfr/zKFzDCpRR/wn6uoEQ7gfbJmxPK5DadXj69XyAhZYi1QXLOE+UXJfXVXxqGM1o1eeiIrtxrtB43zA== dependencies: heap "^0.2.6" lodash "^4.17.21" +d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: + version "3.2.3" + resolved "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.3.tgz" + integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== + dependencies: + internmap "1 - 2" + "d3-array@1 - 2": version "2.12.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== dependencies: internmap "^1.0.0" -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.3" - resolved "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" - integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== - dependencies: - internmap "1 - 2" - d3-axis@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + resolved "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz" integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== d3-brush@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + resolved "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz" integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== dependencies: d3-dispatch "1 - 3" @@ -3475,38 +4149,38 @@ d3-brush@3: d3-chord@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + resolved "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz" integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== dependencies: d3-path "1 - 3" "d3-color@1 - 3", d3-color@3: version "3.1.0" - resolved "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + resolved "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== d3-contour@4: version "4.0.2" - resolved "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + resolved "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz" integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== dependencies: d3-array "^3.2.0" d3-delaunay@6: version "6.0.4" - resolved "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + resolved "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz" integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== dependencies: delaunator "5" "d3-dispatch@1 - 3", d3-dispatch@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + resolved "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== "d3-drag@2 - 3", d3-drag@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + resolved "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== dependencies: d3-dispatch "1 - 3" @@ -3514,7 +4188,7 @@ d3-delaunay@6: "d3-dsv@1 - 3", d3-dsv@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + resolved "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz" integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== dependencies: commander "7" @@ -3523,19 +4197,19 @@ d3-delaunay@6: "d3-ease@1 - 3", d3-ease@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + resolved "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== d3-fetch@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + resolved "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz" integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== dependencies: d3-dsv "1 - 3" d3-force@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + resolved "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz" integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== dependencies: d3-dispatch "1 - 3" @@ -3544,56 +4218,56 @@ d3-force@3: "d3-format@1 - 3", d3-format@3: version "3.1.0" - resolved "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + resolved "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== d3-geo@3: version "3.1.0" - resolved "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" + resolved "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.0.tgz" integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== dependencies: d3-array "2.5.0 - 3" d3-hierarchy@3: version "3.1.2" - resolved "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + resolved "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz" integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + resolved "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" +d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: + version "3.1.0" + resolved "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + d3-path@1: version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== -"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: - version "3.1.0" - resolved "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - d3-polygon@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + resolved "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz" integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== "d3-quadtree@1 - 3", d3-quadtree@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + resolved "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz" integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== d3-random@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + resolved "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz" integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== d3-sankey@^0.12.3: version "0.12.3" - resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + resolved "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz" integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== dependencies: d3-array "1 - 2" @@ -3601,7 +4275,7 @@ d3-sankey@^0.12.3: d3-scale-chromatic@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" + resolved "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz" integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== dependencies: d3-color "1 - 3" @@ -3609,7 +4283,7 @@ d3-scale-chromatic@3: d3-scale@4: version "4.0.2" - resolved "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + resolved "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== dependencies: d3-array "2.10.0 - 3" @@ -3620,45 +4294,45 @@ d3-scale@4: "d3-selection@2 - 3", d3-selection@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + resolved "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -d3-shape@3: - version "3.2.0" - resolved "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - d3-shape@^1.2.0: version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== dependencies: d3-path "1" +d3-shape@3: + version "3.2.0" + resolved "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" - resolved "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + resolved "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz" integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: d3-time "1 - 3" "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: version "3.1.0" - resolved "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + resolved "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" "d3-timer@1 - 3", d3-timer@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + resolved "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== "d3-transition@2 - 3", d3-transition@3: version "3.0.1" - resolved "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + resolved "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz" integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== dependencies: d3-color "1 - 3" @@ -3669,7 +4343,7 @@ d3-shape@^1.2.0: d3-zoom@3: version "3.0.0" - resolved "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + resolved "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz" integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== dependencies: d3-dispatch "1 - 3" @@ -3680,7 +4354,7 @@ d3-zoom@3: d3@^7.4.0, d3@^7.8.2: version "7.8.4" - resolved "https://registry.npmmirror.com/d3/-/d3-7.8.4.tgz#e35d45800e4068cab07e59e5d883a4bb42ab217f" + resolved "https://registry.npmmirror.com/d3/-/d3-7.8.4.tgz" integrity sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA== dependencies: d3-array "3" @@ -3716,7 +4390,7 @@ d3@^7.4.0, d3@^7.8.2: dagre-d3-es@7.0.10: version "7.0.10" - resolved "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" + resolved "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz" integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== dependencies: d3 "^7.8.2" @@ -3724,17 +4398,17 @@ dagre-d3-es@7.0.10: damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== data-uri-to-buffer@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== data-urls@^3.0.2: version "3.0.2" - resolved "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + resolved "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz" integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: abab "^2.0.6" @@ -3743,57 +4417,64 @@ data-urls@^3.0.2: date-fns@^2.30.0: version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== dependencies: "@babel/runtime" "^7.21.0" dayjs@^1.11.7: version "1.11.7" - resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@4, debug@^4.3.1: - version "4.3.6" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@^4.3.1: + version "4.3.6" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +debug@4: + version "4.3.6" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + decimal.js@^10.4.2: version "10.4.3" - resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-named-character-reference@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: character-entities "^2.0.0" dedent@^1.0.0: version "1.5.3" - resolved "https://registry.npmmirror.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + resolved "https://registry.npmmirror.com/dedent/-/dedent-1.5.3.tgz" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-equal@^2.0.5: version "2.2.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz" integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== dependencies: call-bind "^1.0.2" @@ -3816,17 +4497,17 @@ deep-equal@^2.0.5: deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-properties@^1.1.3, define-properties@^1.1.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" @@ -3834,80 +4515,80 @@ define-properties@^1.1.3, define-properties@^1.1.4: delaunator@5: version "5.0.0" - resolved "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" + resolved "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.0.tgz" integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== dependencies: robust-predicates "^3.0.0" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== dereference-json-schema@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/dereference-json-schema/-/dereference-json-schema-0.2.1.tgz#fcad3c98e0116f7124b0989d39d947fa318cae09" + resolved "https://registry.npmjs.org/dereference-json-schema/-/dereference-json-schema-0.2.1.tgz" integrity sha512-uzJsrg225owJyRQ8FNTPHIuBOdSzIZlHhss9u6W8mp7jJldHqGuLv9cULagP/E26QVJDnjtG8U7Dw139mM1ydA== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^4.0.1: version "4.0.2" - resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-accessibility-api@^0.5.9: version "0.5.16" - resolved "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-accessibility-api@^0.6.3: version "0.6.3" - resolved "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + resolved "https://registry.npmmirror.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -3916,31 +4597,31 @@ dom-serializer@^1.0.1: domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domexception@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + resolved "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz" integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: webidl-conversions "^7.0.0" domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" dompurify@^3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.5.tgz#eb3d9cfa10037b6e73f32c586682c4b2ab01fbed" + resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz" integrity sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A== domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -3949,54 +4630,54 @@ domutils@^2.8.0: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.284: version "1.4.345" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.345.tgz#c90b7183b39245cddf0e990337469063bfced6f0" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.345.tgz" integrity sha512-znGhOQK2TUYLICgS25uaM0a7pHy66rSxbre7l762vg9AUoCcJK+Bu+HCPWpjL/U/kK8/Hf+6E0szAUJSyVYb3Q== electron-to-chromium@^1.4.431: version "1.4.445" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz" integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== electron-to-chromium@^1.5.4: version "1.5.5" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz#03bfdf422bdd2c05ee2657efedde21264a1a566b" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz" integrity sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA== elkjs@^0.8.2: version "0.8.2" - resolved "https://registry.npmmirror.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" + resolved "https://registry.npmmirror.com/elkjs/-/elkjs-0.8.2.tgz" integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== emittery@^0.13.1: version "0.13.1" - resolved "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + resolved "https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-picker-react@^4.9.2: version "4.9.2" - resolved "https://registry.yarnpkg.com/emoji-picker-react/-/emoji-picker-react-4.9.2.tgz#5118c5e1028ce4a96c94eb7c9bef09d30b08742c" + resolved "https://registry.npmjs.org/emoji-picker-react/-/emoji-picker-react-4.9.2.tgz" integrity sha512-pdvLKpto0DMrjE+/8V9QeYjrMcOkJmqBn3GyCSG2zanY32rN2cnWzBUmzArvapAjzBvgf7hNmJP8xmsdu0cmJA== dependencies: flairup "0.0.38" emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enhanced-resolve@^5.12.0: version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" @@ -4004,7 +4685,7 @@ enhanced-resolve@^5.12.0: enhanced-resolve@^5.15.0: version "5.15.0" - resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" @@ -4012,24 +4693,24 @@ enhanced-resolve@^5.15.0: entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== entities@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: array-buffer-byte-length "^1.0.0" @@ -4069,7 +4750,7 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: es-get-iterator@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -4084,12 +4765,12 @@ es-get-iterator@^1.1.2: es-module-lexer@^1.2.1: version "1.3.0" - resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz" integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== es-set-tostringtag@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== dependencies: get-intrinsic "^1.1.3" @@ -4098,14 +4779,14 @@ es-set-tostringtag@^2.0.1: es-shim-unscopables@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== dependencies: has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -4114,7 +4795,7 @@ es-to-primitive@^1.2.1: esbuild@~0.21.5: version "0.21.5" - resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -4143,37 +4824,37 @@ esbuild@~0.21.5: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escalade@^3.1.2: version "3.1.2" - resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== escodegen@^2.0.0: version "2.1.0" - resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -4184,7 +4865,7 @@ escodegen@^2.0.0: eslint-config-next@13.4.19: version "13.4.19" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.19.tgz#f46be9d4bd9e52755f846338456132217081d7f8" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz" integrity sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g== dependencies: "@next/eslint-plugin-next" "13.4.19" @@ -4197,14 +4878,14 @@ eslint-config-next@13.4.19: eslint-plugin-react "^7.31.7" eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" -eslint-config-prettier@^8.8.0: +eslint-config-prettier@*, eslint-config-prettier@^8.8.0: version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" @@ -4213,7 +4894,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: eslint-import-resolver-typescript@^3.5.2: version "3.5.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz#7370c326c3c08f0c1839c592d79d20b704de15d4" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz" integrity sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A== dependencies: debug "^4.3.4" @@ -4226,14 +4907,14 @@ eslint-import-resolver-typescript@^3.5.2: eslint-module-utils@^2.7.4: version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.26.0: +eslint-plugin-import@*, eslint-plugin-import@^2.26.0: version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: array-includes "^3.1.6" @@ -4254,7 +4935,7 @@ eslint-plugin-import@^2.26.0: eslint-plugin-jsx-a11y@^6.5.1: version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== dependencies: "@babel/runtime" "^7.20.7" @@ -4276,7 +4957,7 @@ eslint-plugin-jsx-a11y@^6.5.1: eslint-plugin-prettier@^5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz" integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== dependencies: prettier-linter-helpers "^1.0.0" @@ -4284,12 +4965,12 @@ eslint-plugin-prettier@^5.1.3: "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.31.7: version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" @@ -4310,40 +4991,40 @@ eslint-plugin-react@^7.31.7: eslint-plugin-unused-imports@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz#63a98c9ad5f622cd9f830f70bc77739f25ccfe0d" + resolved "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz" integrity sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ== dependencies: eslint-rule-composer "^0.3.0" eslint-rule-composer@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.49.0: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8.49.0, eslint@>=7.0.0, eslint@>=8.0.0, eslint@8: version "8.49.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz" integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -4386,7 +5067,7 @@ eslint@^8.49.0: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -4395,53 +5076,53 @@ espree@^9.6.0, espree@^9.6.1: esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.2.0: version "3.3.0" - resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== exec-sh@^0.2.0: version "0.2.2" - resolved "https://registry.npmmirror.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + resolved "https://registry.npmmirror.com/exec-sh/-/exec-sh-0.2.2.tgz" integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== dependencies: merge "^1.2.0" execa@^5.0.0: version "5.1.1" - resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -4456,7 +5137,7 @@ execa@^5.0.0: execa@^7.0.0: version "7.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + resolved "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz" integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== dependencies: cross-spawn "^7.0.3" @@ -4471,12 +5152,12 @@ execa@^7.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -4487,22 +5168,22 @@ expect@^29.0.0, expect@^29.7.0: extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -4513,38 +5194,43 @@ fast-glob@^3.2.11, fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@4.4.1: + version "4.4.1" + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fault@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + resolved "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz" integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== dependencies: format "^0.2.0" fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== dependencies: node-domexception "^1.0.0" @@ -4552,21 +5238,21 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -4574,7 +5260,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -4582,12 +5268,12 @@ find-up@^5.0.0: flairup@0.0.38: version "0.0.38" - resolved "https://registry.yarnpkg.com/flairup/-/flairup-0.0.38.tgz#62216990a8317a1b07d1d816033624c5b2130f31" + resolved "https://registry.npmjs.org/flairup/-/flairup-0.0.38.tgz" integrity sha512-W9QA5TM7eYNlGoBYwfVn/o6v4yWBCxfq4+EJ5w774oFeyWvVWnYq6Dgt4CJltjG9y/lPwbOqz3jSSr8K66ToGg== flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -4595,24 +5281,24 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.15.6: version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" form-data@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -4621,44 +5307,44 @@ form-data@^4.0.0: format@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== formdata-polyfill@^4.0.10: version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== dependencies: fetch-blob "^3.1.2" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -4668,27 +5354,27 @@ function.prototype.name@^1.1.5: functions-have-names@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== fuse.js@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" + resolved "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz" integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" @@ -4697,17 +5383,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -4715,81 +5401,81 @@ get-symbol-description@^1.0.0: get-tsconfig@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz" integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== get-tsconfig@^4.7.5: version "4.7.5" - resolved "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + resolved "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz" integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== dependencies: resolve-pkg-maps "^1.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4801,7 +5487,7 @@ globby@^11.1.0: globby@^13.1.3: version "13.1.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz" integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== dependencies: dir-glob "^3.0.1" @@ -4812,77 +5498,77 @@ globby@^13.1.3: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-from-dom@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz#25836ddecc3cc0849d32749c2a7aec03e94b59a7" + resolved "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz" integrity sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ== dependencies: hastscript "^7.0.0" @@ -4890,7 +5576,7 @@ hast-util-from-dom@^4.0.0: hast-util-from-html-isomorphic@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz#592b2bea880d476665b76ca1cf7d1a94925c80ec" + resolved "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz" integrity sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw== dependencies: "@types/hast" "^2.0.0" @@ -4900,7 +5586,7 @@ hast-util-from-html-isomorphic@^1.0.0: hast-util-from-html@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz#2482fd701b2d8270b912b3909d6fb645d4a346cf" + resolved "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz" integrity sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A== dependencies: "@types/hast" "^2.0.0" @@ -4911,7 +5597,7 @@ hast-util-from-html@^1.0.0: hast-util-from-parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz" integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== dependencies: "@types/hast" "^2.0.0" @@ -4924,7 +5610,7 @@ hast-util-from-parse5@^7.0.0: hast-util-is-element@^2.0.0: version "2.1.3" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz" integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== dependencies: "@types/hast" "^2.0.0" @@ -4932,14 +5618,14 @@ hast-util-is-element@^2.0.0: hast-util-parse-selector@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" hast-util-to-text@^3.0.0, hast-util-to-text@^3.1.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" + resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz" integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== dependencies: "@types/hast" "^2.0.0" @@ -4949,12 +5635,12 @@ hast-util-to-text@^3.0.0, hast-util-to-text@^3.1.0: hast-util-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== hastscript@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: "@types/hast" "^2.0.0" @@ -4965,46 +5651,46 @@ hastscript@^7.0.0: heap@^0.2.6: version "0.2.7" - resolved "https://registry.npmmirror.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + resolved "https://registry.npmmirror.com/heap/-/heap-0.2.7.tgz" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== heic2any@^0.0.4: version "0.0.4" - resolved "https://registry.npmmirror.com/heic2any/-/heic2any-0.0.4.tgz#eddb8e6fec53c8583a6e18b65069bb5e8d19028a" + resolved "https://registry.npmmirror.com/heic2any/-/heic2any-0.0.4.tgz" integrity sha512-3lLnZiDELfabVH87htnRolZ2iehX9zwpRyGNz22GKXIu0fznlblf0/ftppXKNqS26dqFSeqfIBhAmAj/uSp0cA== highlight.js@~11.7.0: version "11.7.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz" integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" html-encoding-sniffer@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: whatwg-encoding "^2.0.0" html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-to-image@^1.11.11: version "1.11.11" - resolved "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz#c0f8a34dc9e4b97b93ff7ea286eb8562642ebbea" + resolved "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz" integrity sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA== http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -5013,7 +5699,7 @@ http-proxy-agent@^5.0.0: https-proxy-agent@^5.0.1: version "5.0.1" - resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -5021,44 +5707,44 @@ https-proxy-agent@^5.0.1: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== human-signals@^4.3.0: version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== husky@^8.0.0: version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== iconv-lite@0.6, iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" idb-keyval@^6.2.1: version "6.2.1" - resolved "https://registry.npmmirror.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + resolved "https://registry.npmmirror.com/idb-keyval/-/idb-keyval-6.2.1.tgz" integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== ignore@^5.2.0: version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immutable@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -5066,7 +5752,7 @@ import-fresh@^3.2.1: import-local@^3.0.2: version "3.2.0" - resolved "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + resolved "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" @@ -5074,17 +5760,17 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -5092,36 +5778,36 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inline-style-parser@0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - internmap@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + is-arguments@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -5129,7 +5815,7 @@ is-arguments@^1.1.1: is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" @@ -5138,26 +5824,26 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -5165,102 +5851,102 @@ is-boolean-object@^1.1.0: is-buffer@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-core-module@^2.13.0: version "2.15.0" - resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.15.0.tgz" integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== dependencies: hasown "^2.0.2" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -5268,43 +5954,43 @@ is-regex@^1.1.4: is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -5315,19 +6001,19 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: is-weakmap@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== dependencies: call-bind "^1.0.2" @@ -5335,22 +6021,22 @@ is-weakset@^2.0.1: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" - resolved "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -5361,7 +6047,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-instrument@^6.0.0: version "6.0.3" - resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + resolved "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" @@ -5372,7 +6058,7 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -5381,7 +6067,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -5390,7 +6076,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.7" - resolved "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + resolved "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" @@ -5398,7 +6084,7 @@ istanbul-reports@^3.1.3: jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + resolved "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" @@ -5407,7 +6093,7 @@ jest-changed-files@^29.7.0: jest-circus@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + resolved "https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" @@ -5433,7 +6119,7 @@ jest-circus@^29.7.0: jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + resolved "https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" @@ -5450,7 +6136,7 @@ jest-cli@^29.7.0: jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + resolved "https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" @@ -5478,7 +6164,7 @@ jest-config@^29.7.0: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -5488,14 +6174,14 @@ jest-diff@^29.7.0: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + resolved "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + resolved "https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" @@ -5506,7 +6192,7 @@ jest-each@^29.7.0: jest-environment-jsdom@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + resolved "https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz" integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== dependencies: "@jest/environment" "^29.7.0" @@ -5520,7 +6206,7 @@ jest-environment-jsdom@^29.7.0: jest-environment-node@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + resolved "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" @@ -5532,12 +6218,12 @@ jest-environment-node@^29.7.0: jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -5556,7 +6242,7 @@ jest-haste-map@^29.7.0: jest-leak-detector@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + resolved "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" @@ -5564,7 +6250,7 @@ jest-leak-detector@^29.7.0: jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -5574,7 +6260,7 @@ jest-matcher-utils@^29.7.0: jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -5589,7 +6275,7 @@ jest-message-util@^29.7.0: jest-mock@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + resolved "https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" @@ -5598,25 +6284,25 @@ jest-mock@^29.7.0: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + resolved "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" jest-snapshot "^29.7.0" -jest-resolve@^29.7.0: +jest-resolve@*, jest-resolve@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" @@ -5631,7 +6317,7 @@ jest-resolve@^29.7.0: jest-runner@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + resolved "https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" @@ -5658,7 +6344,7 @@ jest-runner@^29.7.0: jest-runtime@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + resolved "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" @@ -5686,7 +6372,7 @@ jest-runtime@^29.7.0: jest-snapshot@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + resolved "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" @@ -5712,7 +6398,7 @@ jest-snapshot@^29.7.0: jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -5724,7 +6410,7 @@ jest-util@^29.7.0: jest-validate@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + resolved "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" @@ -5736,7 +6422,7 @@ jest-validate@^29.7.0: jest-watcher@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + resolved "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" @@ -5750,7 +6436,7 @@ jest-watcher@^29.7.0: jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -5759,7 +6445,7 @@ jest-worker@^27.4.5: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -5769,7 +6455,7 @@ jest-worker@^29.7.0: jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + resolved "https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -5779,12 +6465,12 @@ jest@^29.7.0: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -5792,14 +6478,14 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsdom@^20.0.0: version "20.0.3" - resolved "https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + resolved "https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz" integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: abab "^2.0.6" @@ -5831,44 +6517,44 @@ jsdom@^20.0.0: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.2.2, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: array-includes "^3.1.5" @@ -5876,63 +6562,63 @@ json5@^2.2.2, json5@^2.2.3: katex@^0.13.0: version "0.13.24" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905" + resolved "https://registry.npmjs.org/katex/-/katex-0.13.24.tgz" integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w== dependencies: commander "^8.0.0" katex@^0.16.0: version "0.16.8" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.8.tgz#89b453f40e8557f423f31a1009e9298dd99d5ceb" + resolved "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz" integrity sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg== dependencies: commander "^8.3.0" khroma@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" + resolved "https://registry.npmmirror.com/khroma/-/khroma-2.0.0.tgz" integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kleur@^4.0.3: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== language-subtag-registry@~0.3.2: version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@=1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" layout-base@^1.0.0: version "1.0.2" - resolved "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + resolved "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== layout-base@^2.0.0: version "2.0.1" - resolved "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + resolved "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz" integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== leven@^3.1.0: version "3.1.0" - resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -5940,17 +6626,17 @@ levn@^0.4.1: lilconfig@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^13.2.2: version "13.2.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.2.tgz#5e711d3139c234f73402177be2f8dd312e6508ca" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz" integrity sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA== dependencies: chalk "5.2.0" @@ -5969,7 +6655,7 @@ lint-staged@^13.2.2: listr2@^5.0.7: version "5.0.8" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + resolved "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz" integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== dependencies: cli-truncate "^2.1.0" @@ -5983,56 +6669,56 @@ listr2@^5.0.7: loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.escape@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.unescape@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + resolved "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz" integrity sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-update@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -6042,19 +6728,19 @@ log-update@^4.0.0: longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lowlight@^2.0.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-2.8.1.tgz#5f54016ebd1b2f66b3d0b94d10ef6dd5df4f2e42" + resolved "https://registry.npmjs.org/lowlight/-/lowlight-2.8.1.tgz" integrity sha512-HCaGL61RKc1MYzEYn3rFoGkK0yslzCVDFJEanR19rc2L0mb8i58XM55jSRbzp9jcQrFzschPlwooC0vuNitk8Q== dependencies: "@types/hast" "^2.0.0" @@ -6063,50 +6749,50 @@ lowlight@^2.0.0: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.npmmirror.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@^1.1.1: version "1.3.6" - resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" markdown-table@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== markdown-to-txt@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/markdown-to-txt/-/markdown-to-txt-2.0.1.tgz#bfd6233a2635443cc24900a158b60c6af36ce9c5" + resolved "https://registry.npmjs.org/markdown-to-txt/-/markdown-to-txt-2.0.1.tgz" integrity sha512-Hsj7KTN8k1gutlLum3vosHwVZGnv8/cbYKWVkUyo/D1rzOYddbDesILebRfOsaVfjIBJank/AVOySBlHAYqfZw== dependencies: lodash.escape "^4.0.1" @@ -6115,12 +6801,12 @@ markdown-to-txt@^2.0.1: marked@^4.0.14: version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== mdast-util-definitions@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" @@ -6129,7 +6815,7 @@ mdast-util-definitions@^5.0.0: mdast-util-find-and-replace@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz" integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== dependencies: "@types/mdast" "^3.0.0" @@ -6139,7 +6825,7 @@ mdast-util-find-and-replace@^2.0.0: mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.3.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" @@ -6157,7 +6843,7 @@ mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.3.0: mdast-util-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz" integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== dependencies: "@types/mdast" "^3.0.0" @@ -6167,7 +6853,7 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-gfm-footnote@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz" integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== dependencies: "@types/mdast" "^3.0.0" @@ -6176,7 +6862,7 @@ mdast-util-gfm-footnote@^1.0.0: mdast-util-gfm-strikethrough@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz" integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== dependencies: "@types/mdast" "^3.0.0" @@ -6184,7 +6870,7 @@ mdast-util-gfm-strikethrough@^1.0.0: mdast-util-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz" integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== dependencies: "@types/mdast" "^3.0.0" @@ -6194,7 +6880,7 @@ mdast-util-gfm-table@^1.0.0: mdast-util-gfm-task-list-item@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz" integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== dependencies: "@types/mdast" "^3.0.0" @@ -6202,7 +6888,7 @@ mdast-util-gfm-task-list-item@^1.0.0: mdast-util-gfm@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz" integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== dependencies: mdast-util-from-markdown "^1.0.0" @@ -6215,7 +6901,7 @@ mdast-util-gfm@^2.0.0: mdast-util-math@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-2.0.2.tgz#19a06a81f31643f48cc805e7c31edb7ce739242c" + resolved "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz" integrity sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ== dependencies: "@types/mdast" "^3.0.0" @@ -6224,7 +6910,7 @@ mdast-util-math@^2.0.0: mdast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz" integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== dependencies: "@types/mdast" "^3.0.0" @@ -6232,7 +6918,7 @@ mdast-util-phrasing@^3.0.0: mdast-util-to-hast@^12.1.0: version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" @@ -6246,7 +6932,7 @@ mdast-util-to-hast@^12.1.0: mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz" integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" @@ -6260,39 +6946,39 @@ mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz#db859050d79d48cf9896d294de06f3ede7474d16" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz" integrity sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA== dependencies: "@types/mdast" "^3.0.0" mdn-data@2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== memoize-one@^6.0.0: version "6.0.0" - resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - merge@^1.2.0: version "1.2.1" - resolved "https://registry.npmmirror.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + resolved "https://registry.npmmirror.com/merge/-/merge-1.2.1.tgz" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + mermaid@^10.6.1: version "10.6.1" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.6.1.tgz#701f4160484137a417770ce757ce1887a98c00fc" + resolved "https://registry.npmjs.org/mermaid/-/mermaid-10.6.1.tgz" integrity sha512-Hky0/RpOw/1il9X8AvzOEChfJtVvmXm+y7JML5C//ePYMy0/9jCEmW1E1g86x9oDfW9+iVEdTV/i+M6KWRNs4A== dependencies: "@braintree/sanitize-url" "^6.0.1" @@ -6318,7 +7004,7 @@ mermaid@^10.6.1: micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz" integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== dependencies: decode-named-character-reference "^1.0.0" @@ -6340,7 +7026,7 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: micromark-extension-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz" integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== dependencies: micromark-util-character "^1.0.0" @@ -6351,7 +7037,7 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-extension-gfm-footnote@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz" integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== dependencies: micromark-core-commonmark "^1.0.0" @@ -6365,7 +7051,7 @@ micromark-extension-gfm-footnote@^1.0.0: micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz" integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== dependencies: micromark-util-chunked "^1.0.0" @@ -6377,7 +7063,7 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-extension-gfm-table@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz" integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== dependencies: micromark-factory-space "^1.0.0" @@ -6388,14 +7074,14 @@ micromark-extension-gfm-table@^1.0.0: micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz" integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== dependencies: micromark-util-types "^1.0.0" micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz" integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== dependencies: micromark-factory-space "^1.0.0" @@ -6406,7 +7092,7 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-extension-gfm@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz" integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== dependencies: micromark-extension-gfm-autolink-literal "^1.0.0" @@ -6420,7 +7106,7 @@ micromark-extension-gfm@^2.0.0: micromark-extension-math@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz#bb7d28b907b17f1813dd3d0df2a6df6bb1a4d0e1" + resolved "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz" integrity sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA== dependencies: "@types/katex" "^0.11.0" @@ -6433,7 +7119,7 @@ micromark-extension-math@^2.0.0: micromark-factory-destination@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz" integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== dependencies: micromark-util-character "^1.0.0" @@ -6442,7 +7128,7 @@ micromark-factory-destination@^1.0.0: micromark-factory-label@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz" integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== dependencies: micromark-util-character "^1.0.0" @@ -6452,7 +7138,7 @@ micromark-factory-label@^1.0.0: micromark-factory-space@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz" integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== dependencies: micromark-util-character "^1.0.0" @@ -6460,7 +7146,7 @@ micromark-factory-space@^1.0.0: micromark-factory-title@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz" integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== dependencies: micromark-factory-space "^1.0.0" @@ -6471,7 +7157,7 @@ micromark-factory-title@^1.0.0: micromark-factory-whitespace@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz" integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== dependencies: micromark-factory-space "^1.0.0" @@ -6481,7 +7167,7 @@ micromark-factory-whitespace@^1.0.0: micromark-util-character@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz" integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== dependencies: micromark-util-symbol "^1.0.0" @@ -6489,14 +7175,14 @@ micromark-util-character@^1.0.0: micromark-util-chunked@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz" integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz" integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== dependencies: micromark-util-character "^1.0.0" @@ -6505,7 +7191,7 @@ micromark-util-classify-character@^1.0.0: micromark-util-combine-extensions@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz" integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== dependencies: micromark-util-chunked "^1.0.0" @@ -6513,14 +7199,14 @@ micromark-util-combine-extensions@^1.0.0: micromark-util-decode-numeric-character-reference@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz" integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz" integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== dependencies: decode-named-character-reference "^1.0.0" @@ -6530,31 +7216,31 @@ micromark-util-decode-string@^1.0.0: micromark-util-encode@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz" integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== micromark-util-html-tag-name@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz" integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== micromark-util-normalize-identifier@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz" integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz" integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== dependencies: micromark-util-types "^1.0.0" micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz" integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== dependencies: micromark-util-character "^1.0.0" @@ -6563,7 +7249,7 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-subtokenize@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz" integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== dependencies: micromark-util-chunked "^1.0.0" @@ -6573,17 +7259,17 @@ micromark-util-subtokenize@^1.0.0: micromark-util-symbol@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz" integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz" integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== micromark@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz" integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== dependencies: "@types/debug" "^4.0.0" @@ -6606,7 +7292,7 @@ micromark@^3.0.0: micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -6614,81 +7300,81 @@ micromatch@^4.0.4, micromatch@^4.0.5: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@^2.1.27: version "2.1.35" - resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + nanoid@^3.3.6: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanoid@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.3.tgz#6c97f53d793a7a1de6a38ebb46f50f95bf9793c7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.0.3.tgz" integrity sha512-I7X2b22cxA4LIHXPSqbBCEQSL+1wv8TuoefejsX4HFWyC6jc5JG7CEaxOltiKjc1M+YCS2YkrZZcj4+dytw9GA== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next@^14.1.1: +"next@^13.0.0 || ^14.0.0", next@^14.1.1: version "14.1.1" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.1.tgz#92bd603996c050422a738e90362dff758459a171" + resolved "https://registry.npmjs.org/next/-/next-14.1.1.tgz" integrity sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww== dependencies: "@next/env" "14.1.1" @@ -6711,12 +7397,12 @@ next@^14.1.1: node-domexception@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@^3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.1.tgz#b3eea7b54b3a48020e46f4f88b9c5a7430d20b2e" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz" integrity sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow== dependencies: data-uri-to-buffer "^4.0.0" @@ -6725,73 +7411,73 @@ node-fetch@^3.3.1: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.12: version "2.0.12" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz" integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== node-releases@^2.0.18: version "2.0.18" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== node-releases@^2.0.8: version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== non-layered-tidy-tree-layout@^2.0.2: version "2.0.2" - resolved "https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + resolved "https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz" integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npm-run-path@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== dependencies: path-key "^4.0.0" nth-check@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" nwsapi@^2.2.2: version "2.2.12" - resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.12.tgz" integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -6799,12 +7485,12 @@ object-is@^1.1.5: object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -6814,7 +7500,7 @@ object.assign@^4.1.3, object.assign@^4.1.4: object.entries@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" @@ -6823,7 +7509,7 @@ object.entries@^1.1.6: object.fromentries@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" @@ -6832,7 +7518,7 @@ object.fromentries@^2.0.6: object.hasown@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" @@ -6840,7 +7526,7 @@ object.hasown@^1.1.2: object.values@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" @@ -6849,28 +7535,28 @@ object.values@^1.1.6: once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" openapi-client-axios@^7.5.5: version "7.5.5" - resolved "https://registry.npmjs.org/openapi-client-axios/-/openapi-client-axios-7.5.5.tgz#4cb2bb7484ff9d1c92d9ff509db235cc35d64f38" + resolved "https://registry.npmjs.org/openapi-client-axios/-/openapi-client-axios-7.5.5.tgz" integrity sha512-pgCo1z+rxtYmGQXzB+N5DiXvRurTP6JqV+Ao/wtaGUMIIIM+znh3nTztps+FZS8mZgWnDHpdEzL9bWtZuWuvoA== dependencies: bath-es5 "^3.0.3" @@ -6879,12 +7565,12 @@ openapi-client-axios@^7.5.5: openapi-types@^12.1.3: version "12.1.3" - resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== optionator@^0.9.3: version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: "@aashutoshrathi/word-wrap" "^1.2.3" @@ -6896,54 +7582,54 @@ optionator@^0.9.3: p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -6953,76 +7639,76 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picocolors@^1.0.1: version "1.0.1" - resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pirates@^4.0.4: version "4.0.6" - resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" @@ -7031,24 +7717,24 @@ postcss@8.4.31: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" -prettier@^3.0.2: +prettier@^3.0.2, prettier@>=3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.2.tgz#78fcecd6d870551aa5547437cdae39d4701dca5b" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz" integrity sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ== pretty-format@^27.0.2: version "27.5.1" - resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: ansi-regex "^5.0.1" @@ -7057,7 +7743,7 @@ pretty-format@^27.0.2: pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -7066,7 +7752,7 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: prompts@^2.0.1: version "2.4.2" - resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -7074,7 +7760,7 @@ prompts@^2.0.1: prop-types@^15.0.0, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -7083,82 +7769,87 @@ prop-types@^15.0.0, prop-types@^15.8.1: property-information@^6.0.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz" integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.33: version "1.9.0" - resolved "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== punycode@^2.1.1: version "2.3.1" - resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: version "6.1.0" - resolved "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + resolved "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.1.0.tgz" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== raf-schd@^4.0.3: version "4.0.3" - resolved "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" + resolved "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -react-dom@^18.2.0: +"react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, react-dom@^18.2.0, react-dom@>=16.8: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" scheduler "^0.23.0" -react-is@^16.13.1, react-is@^16.7.0: +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: version "17.0.2" - resolved "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-markdown@^8.0.7: version "8.0.7" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" + resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz" integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== dependencies: "@types/hast" "^2.0.0" @@ -7179,7 +7870,7 @@ react-markdown@^8.0.7: react-redux@^8.1.3: version "8.1.3" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.3.tgz#4fdc0462d0acb59af29a13c27ffef6f49ab4df46" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz" integrity sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw== dependencies: "@babel/runtime" "^7.12.1" @@ -7191,7 +7882,7 @@ react-redux@^8.1.3: react-router-dom@^6.15.0: version "6.15.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.15.0.tgz#6da7db61e56797266fbbef0d5e324d6ac443ee40" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz" integrity sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ== dependencies: "@remix-run/router" "1.8.0" @@ -7199,67 +7890,67 @@ react-router-dom@^6.15.0: react-router@6.15.0: version "6.15.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.15.0.tgz#bf2cb5a4a7ed57f074d4ea88db0d95033f39cac8" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz" integrity sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg== dependencies: "@remix-run/router" "1.8.0" -react@^18.2.0: +"react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.5 || ^17.0.0 || ^18.0.0", react@^16.8||^17||^18, react@^18.0.0, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16, react@>=16.8, react@>=16.8.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redent@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + resolved "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" strip-indent "^3.0.0" -redux@^4.2.1: +"redux@^4 || ^5.0.0-beta.0", redux@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" regenerate-unicode-properties@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" regexp.prototype.flags@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: call-bind "^1.0.2" @@ -7268,7 +7959,7 @@ regexp.prototype.flags@^1.4.3: regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -7280,14 +7971,14 @@ regexpu-core@^5.3.1: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" rehype-highlight@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/rehype-highlight/-/rehype-highlight-6.0.0.tgz#8097219d8813b51f4c2b6d92db27dac6cbc9a641" + resolved "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-6.0.0.tgz" integrity sha512-q7UtlFicLhetp7K48ZgZiJgchYscMma7XjzX7t23bqEJF8m6/s+viXQEe4oHjrATTIZpX7RG8CKD7BlNZoh9gw== dependencies: "@types/hast" "^2.0.0" @@ -7298,7 +7989,7 @@ rehype-highlight@^6.0.0: rehype-katex@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.3.tgz#83e5b929b0967978e9491c02117f55be3594d7e1" + resolved "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz" integrity sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA== dependencies: "@types/hast" "^2.0.0" @@ -7310,7 +8001,7 @@ rehype-katex@^6.0.3: remark-breaks@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.2.tgz#f466b9d3474d7323146c0149fc1496dabadd908e" + resolved "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.2.tgz" integrity sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw== dependencies: "@types/mdast" "^3.0.0" @@ -7319,7 +8010,7 @@ remark-breaks@^3.0.2: remark-gfm@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== dependencies: "@types/mdast" "^3.0.0" @@ -7329,7 +8020,7 @@ remark-gfm@^3.0.1: remark-math@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-5.1.1.tgz#459e798d978d4ca032e745af0bac81ddcdf94964" + resolved "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz" integrity sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw== dependencies: "@types/mdast" "^3.0.0" @@ -7339,7 +8030,7 @@ remark-math@^5.1.1: remark-parse@^10.0.0: version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz" integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== dependencies: "@types/mdast" "^3.0.0" @@ -7348,7 +8039,7 @@ remark-parse@^10.0.0: remark-rehype@^10.0.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: "@types/hast" "^2.0.0" @@ -7358,44 +8049,44 @@ remark-rehype@^10.0.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve.exports@^2.0.0: version "2.0.2" - resolved "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + resolved "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.14.2, resolve@^1.22.1: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -7404,7 +8095,7 @@ resolve@^1.14.2, resolve@^1.22.1: resolve@^1.20.0: version "1.22.8" - resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -7413,7 +8104,7 @@ resolve@^1.20.0: resolve@^2.0.0-next.4: version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: is-core-module "^2.9.0" @@ -7422,7 +8113,7 @@ resolve@^2.0.0-next.4: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -7430,67 +8121,67 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" robust-predicates@^3.0.0: version "3.0.1" - resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" + resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.1.tgz" integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rw@1: version "1.3.3" - resolved "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + resolved "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== rxjs@^7.8.0: version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" rxjs@^7.8.1: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" sade@^1.7.3: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" safe-buffer@^5.1.0: version "5.2.1" - resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" @@ -7499,12 +8190,12 @@ safe-regex-test@^1.0.0: "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.59.2: +sass@^1.3.0, sass@^1.59.2: version "1.60.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81" + resolved "https://registry.npmjs.org/sass/-/sass-1.60.0.tgz" integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -7513,21 +8204,21 @@ sass@^1.59.2: saxes@^6.0.0: version "6.0.0" - resolved "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + resolved "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz" integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" - resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" @@ -7536,48 +8227,48 @@ schema-utils@^3.1.1, schema-utils@^3.2.0: semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.3: version "7.6.3" - resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^7.5.4: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -7586,27 +8277,27 @@ side-channel@^1.0.4: signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -7615,7 +8306,7 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -7624,90 +8315,90 @@ slice-ansi@^4.0.0: slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== spark-md5@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" + resolved "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz" integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== spawn-command@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz" integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stable@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== string-argv@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-length@^4.0.1: version "4.0.2" - resolved "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -7715,7 +8406,7 @@ string-length@^4.0.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -7724,7 +8415,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -7733,7 +8424,7 @@ string-width@^5.0.0: string.prototype.matchall@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" @@ -7747,7 +8438,7 @@ string.prototype.matchall@^4.0.8: string.prototype.trim@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" @@ -7756,7 +8447,7 @@ string.prototype.trim@^1.2.7: string.prototype.trimend@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" @@ -7765,7 +8456,7 @@ string.prototype.trimend@^1.0.6: string.prototype.trimstart@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" @@ -7774,103 +8465,113 @@ string.prototype.trimstart@^1.0.6: strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + style-to-object@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" + resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz" integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== dependencies: inline-style-parser "0.1.1" styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" stylis@^4.1.3: version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== dependencies: "@trysound/sax" "0.2.0" @@ -7883,12 +8584,12 @@ svgo@^2.8.0: symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== synckit@^0.8.5, synckit@^0.8.6: version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz" integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== dependencies: "@pkgr/core" "^0.1.0" @@ -7896,12 +8597,12 @@ synckit@^0.8.5, synckit@^0.8.6: tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== terser-webpack-plugin@^5.3.7: version "5.3.9" - resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -7912,7 +8613,7 @@ terser-webpack-plugin@^5.3.7: terser@^5.16.8: version "5.18.2" - resolved "https://registry.npmmirror.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948" + resolved "https://registry.npmmirror.com/terser/-/terser-5.18.2.tgz" integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== dependencies: "@jridgewell/source-map" "^0.3.3" @@ -7922,7 +8623,7 @@ terser@^5.16.8: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -7931,44 +8632,44 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== third-party-capital@1.0.20: version "1.0.20" - resolved "https://registry.yarnpkg.com/third-party-capital/-/third-party-capital-1.0.20.tgz#e218a929a35bf4d2245da9addb8ab978d2f41685" + resolved "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz" integrity sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA== through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tiny-invariant@^1.0.6: version "1.3.1" - resolved "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + resolved "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== tmpl@1.0.5: version "1.0.5" - resolved "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tough-cookie@^4.1.2: version "4.1.4" - resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.4.tgz" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" @@ -7978,39 +8679,39 @@ tough-cookie@^4.1.2: tr46@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + resolved "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz" integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: punycode "^2.1.1" tree-kill@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trough@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + resolved "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== ts-api-utils@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz" integrity sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== ts-dedent@^2.2.0: version "2.2.0" - resolved "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + resolved "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== -ts-node@^10.9.2: +ts-node@^10.9.2, ts-node@>=9.0.0: version "10.9.2" - resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -8029,7 +8730,7 @@ ts-node@^10.9.2: tsconfig-paths@^3.14.1: version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" @@ -8037,19 +8738,24 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.1.0, tslib@^2.4.0: +tslib@^2.1.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tslib@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsx@^4.16.0: version "4.16.0" - resolved "https://registry.npmmirror.com/tsx/-/tsx-4.16.0.tgz#913dd96f191b76f07a8744201d8c15d510aa1352" + resolved "https://registry.npmmirror.com/tsx/-/tsx-4.16.0.tgz" integrity sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ== dependencies: esbuild "~0.21.5" @@ -8059,43 +8765,43 @@ tsx@^4.16.0: type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@5.2.2: +typescript@>=2.7, typescript@>=3.3.1, typescript@>=4.2.0, typescript@5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -8105,17 +8811,17 @@ unbox-primitive@^1.0.2: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -8123,17 +8829,17 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unified@^10.0.0: version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: "@types/unist" "^2.0.0" @@ -8146,7 +8852,7 @@ unified@^10.0.0: unist-util-find-after@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz#80c69c92b0504033638ce11973f4135f2c822e2d" + resolved "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz" integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== dependencies: "@types/unist" "^2.0.0" @@ -8154,26 +8860,26 @@ unist-util-find-after@^4.0.0: unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^5.0.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" unist-util-position@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" unist-util-remove-position@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz" integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== dependencies: "@types/unist" "^2.0.0" @@ -8181,14 +8887,14 @@ unist-util-remove-position@^4.0.0: unist-util-stringify-position@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" @@ -8196,7 +8902,7 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: unist-util-visit@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" @@ -8205,12 +8911,12 @@ unist-util-visit@^4.0.0: universalify@^0.2.0: version "0.2.0" - resolved "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== update-browserslist-db@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" @@ -8218,7 +8924,7 @@ update-browserslist-db@^1.0.10: update-browserslist-db@^1.0.11: version "1.0.11" - resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" @@ -8226,7 +8932,7 @@ update-browserslist-db@^1.0.11: update-browserslist-db@^1.1.0: version "1.1.0" - resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz" integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: escalade "^3.1.2" @@ -8234,14 +8940,14 @@ update-browserslist-db@^1.1.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -8249,27 +8955,30 @@ url-parse@^1.5.3: use-debounce@^9.0.4: version "9.0.4" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.4.tgz#51d25d856fbdfeb537553972ce3943b897f1ac85" + resolved "https://registry.npmjs.org/use-debounce/-/use-debounce-9.0.4.tgz" integrity sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ== use-memo-one@^1.1.3: version "1.1.3" - resolved "https://registry.npmmirror.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + resolved "https://registry.npmmirror.com/use-memo-one/-/use-memo-one-1.1.3.tgz" integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== -use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0: +use-sync-external-store@^1.0.0, use-sync-external-store@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== uuid@^9.0.0: version "9.0.0" - resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +uuid@^9.0.1: + version "9.0.1" + uvu@^0.5.0: version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" @@ -8279,12 +8988,12 @@ uvu@^0.5.0: v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-to-istanbul@^9.0.1: version "9.3.0" - resolved "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + resolved "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -8293,7 +9002,7 @@ v8-to-istanbul@^9.0.1: vfile-location@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: "@types/unist" "^2.0.0" @@ -8301,7 +9010,7 @@ vfile-location@^4.0.0: vfile-message@^3.0.0: version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" @@ -8309,7 +9018,7 @@ vfile-message@^3.0.0: vfile@^5.0.0: version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" @@ -8319,21 +9028,21 @@ vfile@^5.0.0: w3c-xmlserializer@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: xml-name-validator "^4.0.0" walker@^1.0.8: version "1.0.8" - resolved "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" watch@^1.0.2: version "1.0.2" - resolved "https://registry.npmmirror.com/watch/-/watch-1.0.2.tgz#340a717bde765726fa0aa07d721e0147a551df0c" + resolved "https://registry.npmmirror.com/watch/-/watch-1.0.2.tgz" integrity sha512-1u+Z5n9Jc1E2c7qDO8SinPoZuHj7FgbgU1olSFoyaklduDvvtX7GMMtlE6OC9FTXq4KvNAOfj6Zu4vI1e9bAKA== dependencies: exec-sh "^0.2.0" @@ -8341,7 +9050,7 @@ watch@^1.0.2: watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -8349,32 +9058,32 @@ watchpack@^2.4.0: web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== web-streams-polyfill@^3.0.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== web-worker@^1.2.0: version "1.2.0" - resolved "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + resolved "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.88.1: +webpack@^5.1.0, webpack@^5.88.1: version "5.88.1" - resolved "https://registry.npmmirror.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" + resolved "https://registry.npmmirror.com/webpack/-/webpack-5.88.1.tgz" integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== dependencies: "@types/eslint-scope" "^3.7.3" @@ -8404,19 +9113,19 @@ webpack@^5.88.1: whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: iconv-lite "0.6.3" whatwg-mimetype@^3.0.0: version "3.0.0" - resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== whatwg-url@^11.0.0: version "11.0.0" - resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz" integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== dependencies: tr46 "^3.0.0" @@ -8424,7 +9133,7 @@ whatwg-url@^11.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -8435,7 +9144,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== dependencies: is-map "^2.0.1" @@ -8445,7 +9154,7 @@ which-collection@^1.0.1: which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -8457,14 +9166,14 @@ which-typed-array@^1.1.9: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -8473,7 +9182,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -8482,12 +9191,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -8495,52 +9204,52 @@ write-file-atomic@^4.0.2: ws@^8.11.0: version "8.18.0" - resolved "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + resolved "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.2.2: version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -8553,22 +9262,22 @@ yargs@^17.3.1, yargs@^17.7.2: yn@3.1.1: version "3.1.1" - resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zustand@^4.3.8: version "4.3.8" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz" integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg== dependencies: use-sync-external-store "1.2.0" zwitch@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From ca17e90c52d3e3ba67dbca3ddcf7415b9fb3de90 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 6 Nov 2024 00:43:03 +0800 Subject: [PATCH 14/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/utils/encryption.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/encryption.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/utils/encryption.ts b/app/utils/encryption.ts index 0fb8439fea0..76ceed68b0f 100644 --- a/app/utils/encryption.ts +++ b/app/utils/encryption.ts @@ -1,7 +1,13 @@ import { AES, enc } from "crypto-js"; -const SECRET_KEY = "your-secret-key"; // Replace this with a secure, randomly generated key - +const SECRET_KEY = + process.env.ENCRYPTION_KEY || + "your-secret-key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Replace this with a secure, randomly generated key +if (!SECRET_KEY || SECRET_KEY.length < 32) { + throw new Error( + "ENCRYPTION_KEY environment variable must be set with at least 32 characters", + ); +} export function encrypt(data: string): string { try { return AES.encrypt(data, SECRET_KEY).toString(); From c55cea58532c7ecf98838ca59efcb9a0d109ee7f Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 6 Nov 2024 09:09:49 +0800 Subject: [PATCH 15/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/store/access.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/store/access.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/store/access.ts b/app/store/access.ts index 3703978fbc5..9251b016baf 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -288,7 +288,11 @@ export const useAccessStore = createPersistStore( return res; }) - + .then((res: DangerConfig) => { + console.log("[Config] got config from server", res); + set(() => ({ ...res })); + return res; + }) .then((res: Partial) => { console.log("[Config] got config from server", res); // Encrypt Bedrock-related sensitive data before storing From 952d8835a3b21c27bd991f568903557b94246f52 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 6 Nov 2024 09:44:36 +0800 Subject: [PATCH 16/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/components/settings.tsx=20=09=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=9A=20=20=20=20=20app/components/ui-lib.tsx=20=09?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/constant.ts=20=09?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20=20=20app/utils/encryption.?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/settings.tsx | 3 +++ app/components/ui-lib.tsx | 25 ++++++++++++++++++++++++- app/constant.ts | 4 ++-- app/utils/encryption.ts | 7 +++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 0bd570826a1..f4d8c537320 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -997,6 +997,7 @@ export function Settings() { (access) => (access.awsAccessKey = e.currentTarget.value), ); }} + maskWhenShow={true} /> (access.awsSecretKey = e.currentTarget.value), ); }} + maskWhenShow={true} /> (access.awsSessionToken = e.currentTarget.value), ); }} + maskWhenShow={true} /> diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 4af37dbba1c..e0228d97fee 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -11,6 +11,7 @@ import MaxIcon from "../icons/max.svg"; import MinIcon from "../icons/min.svg"; import Locale from "../locales"; +import { maskSensitiveValue } from "../utils/encryption"; import { createRoot } from "react-dom/client"; import React, { @@ -266,13 +267,32 @@ export function Input(props: InputProps) { } export function PasswordInput( - props: HTMLProps & { aria?: string }, + props: HTMLProps & { + aria?: string; + maskWhenShow?: boolean; // New prop to control masking behavior + }, ) { const [visible, setVisible] = useState(false); + const [displayValue, setDisplayValue] = useState(props.value as string); + + useEffect(() => { + if (props.maskWhenShow && visible && props.value) { + setDisplayValue(maskSensitiveValue(props.value as string)); + } else { + setDisplayValue(props.value as string); + } + }, [visible, props.value, props.maskWhenShow]); + function changeVisibility() { setVisible(!visible); } + const handleChange = (e: React.ChangeEvent) => { + if (props.onChange) { + props.onChange(e); + } + }; + return (
@@ -543,6 +565,7 @@ export function Selector(props: {
); } + export function FullScreen(props: any) { const { children, right = 10, top = 10, ...rest } = props; const ref = useRef(); diff --git a/app/constant.ts b/app/constant.ts index d15a2fe796d..4c2730d4dfc 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -121,8 +121,8 @@ export enum ServiceProvider { Stability = "Stability", Iflytek = "Iflytek", XAI = "XAI", - Bedrock = "Bedrock", ChatGLM = "ChatGLM", + Bedrock = "Bedrock", } // Google API safety settings, see https://ai.google.dev/gemini-api/docs/safety-settings @@ -136,7 +136,6 @@ export enum GoogleSafetySettingsThreshold { export enum ModelProvider { Stability = "Stability", - Bedrock = "Bedrock", GPT = "GPT", GeminiPro = "GeminiPro", Claude = "Claude", @@ -148,6 +147,7 @@ export enum ModelProvider { Iflytek = "Iflytek", XAI = "XAI", ChatGLM = "ChatGLM", + Bedrock = "Bedrock", } export const Stability = { diff --git a/app/utils/encryption.ts b/app/utils/encryption.ts index 76ceed68b0f..ef750d9abd1 100644 --- a/app/utils/encryption.ts +++ b/app/utils/encryption.ts @@ -8,6 +8,7 @@ if (!SECRET_KEY || SECRET_KEY.length < 32) { "ENCRYPTION_KEY environment variable must be set with at least 32 characters", ); } + export function encrypt(data: string): string { try { return AES.encrypt(data, SECRET_KEY).toString(); @@ -26,3 +27,9 @@ export function decrypt(encryptedData: string): string { return encryptedData; // Fallback to the original data if decryption fails } } + +export function maskSensitiveValue(value: string): string { + if (!value) return ""; + if (value.length <= 4) return value; + return "*".repeat(value.length - 4) + value.slice(-4); +} From f0c23cc6aa9473ed8a25ab2a38449862d5ac7d73 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 6 Nov 2024 13:10:20 +0800 Subject: [PATCH 17/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/store/access.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/store/access.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/store/access.ts b/app/store/access.ts index 292bc7ee88b..b628d09e39a 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -25,7 +25,6 @@ import { DEFAULT_CONFIG } from "./config"; import { getModelProvider } from "../utils/model"; import { encrypt, decrypt } from "../utils/encryption"; - let fetchState = 0; // 0 not fetch, 1 fetching, 2 done const isApp = getClientConfig()?.buildMode === "export"; @@ -291,12 +290,12 @@ export const useAccessStore = createPersistStore( return res; }) .then((res: DangerConfig) => { - console.log("[Config] got config from server", res); + console.log("[Config] received DangerConfig server configuration"); set(() => ({ ...res })); return res; }) .then((res: Partial) => { - console.log("[Config] got config from server", res); + console.log("[Config] received AccessState server configuration"); // Encrypt Bedrock-related sensitive data before storing const encryptedRes = { ...res }; const keysToEncrypt: BedrockCredentialKey[] = [ From 5d5456c1c5f71df23af2f7b147ccb667dd92c181 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 6 Nov 2024 17:23:53 +0800 Subject: [PATCH 18/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/client/platforms/bedrock.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 25 +++++++++++++++++++++++++ app/client/platforms/bedrock.ts | 9 ++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 4a2a1fc5d13..b2b04cc327c 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -46,6 +46,7 @@ export interface ConverseRequest { description?: string; input_schema: any; }[]; + stream?: boolean; } function supportsToolUse(modelId: string): boolean { @@ -188,6 +189,30 @@ export async function handle( throw new Error("No stream in response"); } + // If stream is false, accumulate the response and return as JSON + console.log("Body.stream==========" + body.stream); + if (body.stream === false) { + let fullResponse = { + content: "", + }; + + const responseStream = + response.stream as AsyncIterable; + for await (const event of responseStream) { + if ( + "contentBlockDelta" in event && + event.contentBlockDelta?.delta && + "text" in event.contentBlockDelta.delta && + event.contentBlockDelta.delta.text + ) { + fullResponse.content += event.contentBlockDelta.delta.text; + } + } + + return NextResponse.json(fullResponse); + } + + // Otherwise, return streaming response const stream = new ReadableStream({ async start(controller) { try { diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 6d236344e5c..8dca4eff5e3 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -38,9 +38,11 @@ export class BedrockApi implements LLMApi { } extractMessage(res: any) { - console.log("[Response] claude response: ", res); - - return res?.content?.[0]?.text; + console.log("[Response] Bedrock not stream response: ", res); + if (res.error) { + return "```\n" + JSON.stringify(res, null, 4) + "\n```"; + } + return res?.content ?? res; } async chat(options: ChatOptions): Promise { @@ -144,6 +146,7 @@ export class BedrockApi implements LLMApi { topP: modelConfig.top_p, stopSequences: [], }, + stream: shouldStream, }; const conversePath = `${ApiPath.Bedrock}/converse`; From 82a368a3aa5a0649549f3dc05f79f879d2677e64 Mon Sep 17 00:00:00 2001 From: glay Date: Thu, 7 Nov 2024 08:13:24 +0800 Subject: [PATCH 19/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20.env.template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.template | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.env.template b/.env.template index 8c0c4c1cc5e..524fc3da202 100644 --- a/.env.template +++ b/.env.template @@ -71,4 +71,7 @@ WHITE_WEBDAV_ENDPOINTS= ### bedrock (optional) AWS_REGION= AWS_ACCESS_KEY= -AWS_SECRET_KEY= \ No newline at end of file +AWS_SECRET_KEY= + +### Assign this with a secure, randomly generated key +ENCRYPTION_KEY= \ No newline at end of file From bfa433919fc9d97d90ad337b5f0223e0e58b9cae Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 13 Nov 2024 07:57:51 +0800 Subject: [PATCH 20/72] Add AWS access key validation. --- app/components/settings.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/components/settings.tsx b/app/components/settings.tsx index c2724885cdb..8a942baf779 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -994,9 +994,14 @@ export function Settings() { type="text" placeholder={Locale.Settings.Access.Bedrock.AccessKey.Placeholder} onChange={(e) => { - accessStore.update( - (access) => (access.awsAccessKey = e.currentTarget.value), - ); + accessStore.update((access) => { + const accessKey = e.currentTarget.value; + if (accessKey && accessKey.length !== 20) { + showToast(Locale.Settings.Access.Bedrock.AccessKey.Invalid); + return; + } + access.awsAccessKey = accessKey; + }); }} maskWhenShow={true} /> From 70f066c15f4e3d2baa9af15f34aa1557df7af356 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 13 Nov 2024 08:08:01 +0800 Subject: [PATCH 21/72] Add AWS region validation and improve code style. --- app/components/settings.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 8a942baf779..75672a14068 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -978,9 +978,14 @@ export function Settings() { value={accessStore.awsRegion} placeholder="us-west-2" onChange={(e) => - accessStore.update( - (access) => (access.awsRegion = e.currentTarget.value), - ) + accessStore.update((access) => { + const region = e.currentTarget.value; + if (!/^[a-z]{2}-[a-z]+-\d+$/.test(region)) { + showToast(Locale.Settings.Access.Bedrock.Region.Invalid); + return; + } + access.awsRegion = region; + }) } /> From 1b5a81c7ad28e0599dbe5f4dabe0c67d85b69afc Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 13 Nov 2024 08:10:10 +0800 Subject: [PATCH 22/72] Add AWS secret key validation. --- app/components/settings.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 75672a14068..7d48a0ec207 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -1021,9 +1021,14 @@ export function Settings() { type="text" placeholder={Locale.Settings.Access.Bedrock.SecretKey.Placeholder} onChange={(e) => { - accessStore.update( - (access) => (access.awsSecretKey = e.currentTarget.value), - ); + accessStore.update((access) => { + const secretKey = e.currentTarget.value; + if (secretKey && secretKey.length !== 40) { + showToast(Locale.Settings.Access.Bedrock.SecretKey.Invalid); + return; + } + access.awsSecretKey = secretKey; + }); }} maskWhenShow={true} /> From 24261d20b3dc03c6544c769118272b0f53e9cf70 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 13 Nov 2024 08:18:20 +0800 Subject: [PATCH 23/72] Consider adding more Bedrock-specific configurations --- app/constant.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/constant.ts b/app/constant.ts index edb9a92e912..822b4158e60 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -242,6 +242,8 @@ export const ChatGLM = { export const Bedrock = { ChatPath: "converse", + ApiVersion: "2023-11-01", + getEndpoint: (region: string = "us-west-2") =>`https://bedrock-runtime.${region}.amazonaws.com`, }; export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang From 6bc16127201eba0390773230a69f92890e5bbb59 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 13 Nov 2024 12:33:59 +0800 Subject: [PATCH 24/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/locales/cn.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/locales/en.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20?= =?UTF-8?q?=20=20=20=20yarn.lock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/locales/cn.ts | 3 + app/locales/en.ts | 3 + yarn.lock | 1385 ++++++++++++++++++++++++++------------------- 3 files changed, 806 insertions(+), 585 deletions(-) diff --git a/app/locales/cn.ts b/app/locales/cn.ts index b493b8ea8bb..7dd1ff99eff 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -348,16 +348,19 @@ const cn = { Title: "AWS Region", SubTitle: "The AWS region where Bedrock service is located", Placeholder: "us-west-2", + Invalid: "无效的 AWS 区域格式。示例:us-west-2", }, AccessKey: { Title: "AWS Access Key ID", SubTitle: "Your AWS access key ID for Bedrock service", Placeholder: "AKIA...", + Invalid: "无效的 AWS Access Key 格式。必须为20个字符。", }, SecretKey: { Title: "AWS Secret Access Key", SubTitle: "Your AWS secret access key for Bedrock service", Placeholder: "****", + Invalid: "无效的 AWS Secret Key 格式。必须为40个字符。", }, SessionToken: { Title: "AWS Session Token (Optional)", diff --git a/app/locales/en.ts b/app/locales/en.ts index 5fb43faf60f..8e3fc7a7b3c 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -352,16 +352,19 @@ const en: LocaleType = { Title: "AWS Region", SubTitle: "The AWS region where Bedrock service is located", Placeholder: "us-west-2", + Invalid: "Invalid AWS region format. Example: us-west-2", }, AccessKey: { Title: "AWS Access Key ID", SubTitle: "Your AWS access key ID for Bedrock service", Placeholder: "AKIA...", + Invalid: "Invalid AWS access key format. Must be 20 characters long.", }, SecretKey: { Title: "AWS Secret Access Key", SubTitle: "Your AWS secret access key for Bedrock service", Placeholder: "****", + Invalid: "Invalid AWS secret key format. Must be 40 characters long.", }, SessionToken: { Title: "AWS Session Token (Optional)", diff --git a/yarn.lock b/yarn.lock index efc7c18a51a..3b2d34197d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,8 @@ "@aws-crypto/crc32@5.2.0": version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== dependencies: "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" @@ -29,6 +31,8 @@ "@aws-crypto/sha256-browser@5.2.0": version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: "@aws-crypto/sha256-js" "^5.2.0" "@aws-crypto/supports-web-crypto" "^5.2.0" @@ -38,8 +42,10 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-crypto/sha256-js@^5.2.0", "@aws-crypto/sha256-js@5.2.0": +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" @@ -47,385 +53,435 @@ "@aws-crypto/supports-web-crypto@^5.2.0": version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: tslib "^2.6.2" "@aws-crypto/util@^5.2.0": version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: "@aws-sdk/types" "^3.222.0" "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" "@aws-sdk/client-bedrock-runtime@^3.679.0": - version "3.679.0" + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.687.0.tgz#9c08850b2cebe62da0682f76c7a5559e53829325" + integrity sha512-ayFDpIOXVOeY84CPo9KCY2emEPjLBNFT8TFeZeUjz8KiV+K0LwAKnkbLQkTweHFN2sq2pa7XqAPZ70xMjt5w3w== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.679.0" - "@aws-sdk/client-sts" "3.679.0" - "@aws-sdk/core" "3.679.0" - "@aws-sdk/credential-provider-node" "3.679.0" - "@aws-sdk/middleware-host-header" "3.679.0" - "@aws-sdk/middleware-logger" "3.679.0" - "@aws-sdk/middleware-recursion-detection" "3.679.0" - "@aws-sdk/middleware-user-agent" "3.679.0" - "@aws-sdk/region-config-resolver" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@aws-sdk/util-endpoints" "3.679.0" - "@aws-sdk/util-user-agent-browser" "3.679.0" - "@aws-sdk/util-user-agent-node" "3.679.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/eventstream-serde-browser" "^3.0.10" - "@smithy/eventstream-serde-config-resolver" "^3.0.7" - "@smithy/eventstream-serde-node" "^3.0.9" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" + "@aws-sdk/client-sso-oidc" "3.687.0" + "@aws-sdk/client-sts" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/eventstream-serde-browser" "^3.0.11" + "@smithy/eventstream-serde-config-resolver" "^3.0.8" + "@smithy/eventstream-serde-node" "^3.0.10" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-stream" "^3.1.9" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" + "@smithy/util-stream" "^3.2.1" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@^3.679.0", "@aws-sdk/client-sso-oidc@3.679.0": - version "3.679.0" +"@aws-sdk/client-sso-oidc@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.687.0.tgz#a327cc65b7bb2cbda305c4467bfae452b5d27927" + integrity sha512-Rdd8kLeTeh+L5ZuG4WQnWgYgdv7NorytKdZsGjiag1D8Wv3PcJvPqqWdgnI0Og717BSXVoaTYaN34FyqFYSx6Q== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.679.0" - "@aws-sdk/credential-provider-node" "3.679.0" - "@aws-sdk/middleware-host-header" "3.679.0" - "@aws-sdk/middleware-logger" "3.679.0" - "@aws-sdk/middleware-recursion-detection" "3.679.0" - "@aws-sdk/middleware-user-agent" "3.679.0" - "@aws-sdk/region-config-resolver" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@aws-sdk/util-endpoints" "3.679.0" - "@aws-sdk/util-user-agent-browser" "3.679.0" - "@aws-sdk/util-user-agent-node" "3.679.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.679.0": - version "3.679.0" +"@aws-sdk/client-sso@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.687.0.tgz#4c71b818e718f632aa3dd4047961bededa23e4a7" + integrity sha512-dfj0y9fQyX4kFill/ZG0BqBTLQILKlL7+O5M4F9xlsh2WNuV2St6WtcOg14Y1j5UODPJiJs//pO+mD1lihT5Kw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.679.0" - "@aws-sdk/middleware-host-header" "3.679.0" - "@aws-sdk/middleware-logger" "3.679.0" - "@aws-sdk/middleware-recursion-detection" "3.679.0" - "@aws-sdk/middleware-user-agent" "3.679.0" - "@aws-sdk/region-config-resolver" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@aws-sdk/util-endpoints" "3.679.0" - "@aws-sdk/util-user-agent-browser" "3.679.0" - "@aws-sdk/util-user-agent-node" "3.679.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@^3.679.0", "@aws-sdk/client-sts@3.679.0": - version "3.679.0" +"@aws-sdk/client-sts@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.687.0.tgz#fcb837080b225c5820f08326e98db54e48606fb1" + integrity sha512-SQjDH8O4XCTtouuCVYggB0cCCrIaTzUZIkgJUpOsIEJBLlTbNOb/BZqUShAQw2o9vxr2rCeOGjAQOYPysW/Pmg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.679.0" - "@aws-sdk/core" "3.679.0" - "@aws-sdk/credential-provider-node" "3.679.0" - "@aws-sdk/middleware-host-header" "3.679.0" - "@aws-sdk/middleware-logger" "3.679.0" - "@aws-sdk/middleware-recursion-detection" "3.679.0" - "@aws-sdk/middleware-user-agent" "3.679.0" - "@aws-sdk/region-config-resolver" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@aws-sdk/util-endpoints" "3.679.0" - "@aws-sdk/util-user-agent-browser" "3.679.0" - "@aws-sdk/util-user-agent-node" "3.679.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.8" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" + "@aws-sdk/client-sso-oidc" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-node" "3.687.0" + "@aws-sdk/middleware-host-header" "3.686.0" + "@aws-sdk/middleware-logger" "3.686.0" + "@aws-sdk/middleware-recursion-detection" "3.686.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/region-config-resolver" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@aws-sdk/util-user-agent-browser" "3.686.0" + "@aws-sdk/util-user-agent-node" "3.687.0" + "@smithy/config-resolver" "^3.0.10" + "@smithy/core" "^2.5.1" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/hash-node" "^3.0.8" + "@smithy/invalid-dependency" "^3.0.8" + "@smithy/middleware-content-length" "^3.0.10" + "@smithy/middleware-endpoint" "^3.2.1" + "@smithy/middleware-retry" "^3.0.25" + "@smithy/middleware-serde" "^3.0.8" + "@smithy/middleware-stack" "^3.0.8" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/node-http-handler" "^3.2.5" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/url-parser" "^3.0.8" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.23" - "@smithy/util-defaults-mode-node" "^3.0.23" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" + "@smithy/util-defaults-mode-browser" "^3.0.25" + "@smithy/util-defaults-mode-node" "^3.0.25" + "@smithy/util-endpoints" "^2.1.4" + "@smithy/util-middleware" "^3.0.8" + "@smithy/util-retry" "^3.0.8" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/core@3.679.0": - version "3.679.0" +"@aws-sdk/core@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.686.0.tgz#106a3733c250094db15ba765386db4643f5613b6" + integrity sha512-Xt3DV4DnAT3v2WURwzTxWQK34Ew+iiLzoUoguvLaZrVMFOqMMrwVjP+sizqIaHp1j7rGmFcN5I8saXnsDLuQLA== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/core" "^2.4.8" - "@smithy/node-config-provider" "^3.1.8" + "@aws-sdk/types" "3.686.0" + "@smithy/core" "^2.5.1" + "@smithy/node-config-provider" "^3.1.9" "@smithy/property-provider" "^3.1.7" - "@smithy/protocol-http" "^4.1.4" + "@smithy/protocol-http" "^4.1.5" "@smithy/signature-v4" "^4.2.0" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-middleware" "^3.0.7" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/util-middleware" "^3.0.8" fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.679.0": - version "3.679.0" +"@aws-sdk/credential-provider-env@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.686.0.tgz#71ce2df0be065dacddd873d1be7426bc8c6038ec" + integrity sha512-osD7lPO8OREkgxPiTWmA1i6XEmOth1uW9HWWj/+A2YGCj1G/t2sHu931w4Qj9NWHYZtbTTXQYVRg+TErALV7nQ== dependencies: - "@aws-sdk/core" "3.679.0" - "@aws-sdk/types" "3.679.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.679.0": - version "3.679.0" +"@aws-sdk/credential-provider-http@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.686.0.tgz#fe84ea67fea6bb61effc0f10b99a0c3e9378d6c3" + integrity sha512-xyGAD/f3vR/wssUiZrNFWQWXZvI4zRm2wpHhoHA1cC2fbRMNFYtFn365yw6dU7l00ZLcdFB1H119AYIUZS7xbw== dependencies: - "@aws-sdk/core" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/node-http-handler" "^3.2.4" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@smithy/fetch-http-handler" "^4.0.0" + "@smithy/node-http-handler" "^3.2.5" "@smithy/property-provider" "^3.1.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-stream" "^3.1.9" + "@smithy/protocol-http" "^4.1.5" + "@smithy/smithy-client" "^3.4.2" + "@smithy/types" "^3.6.0" + "@smithy/util-stream" "^3.2.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.679.0": - version "3.679.0" - dependencies: - "@aws-sdk/core" "3.679.0" - "@aws-sdk/credential-provider-env" "3.679.0" - "@aws-sdk/credential-provider-http" "3.679.0" - "@aws-sdk/credential-provider-process" "3.679.0" - "@aws-sdk/credential-provider-sso" "3.679.0" - "@aws-sdk/credential-provider-web-identity" "3.679.0" - "@aws-sdk/types" "3.679.0" +"@aws-sdk/credential-provider-ini@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.687.0.tgz#adb7f3fe381767ad1a4aee352162630f7b5f54de" + integrity sha512-6d5ZJeZch+ZosJccksN0PuXv7OSnYEmanGCnbhUqmUSz9uaVX6knZZfHCZJRgNcfSqg9QC0zsFA/51W5HCUqSQ== + dependencies: + "@aws-sdk/core" "3.686.0" + "@aws-sdk/credential-provider-env" "3.686.0" + "@aws-sdk/credential-provider-http" "3.686.0" + "@aws-sdk/credential-provider-process" "3.686.0" + "@aws-sdk/credential-provider-sso" "3.687.0" + "@aws-sdk/credential-provider-web-identity" "3.686.0" + "@aws-sdk/types" "3.686.0" "@smithy/credential-provider-imds" "^3.2.4" "@smithy/property-provider" "^3.1.7" "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.679.0": - version "3.679.0" - dependencies: - "@aws-sdk/credential-provider-env" "3.679.0" - "@aws-sdk/credential-provider-http" "3.679.0" - "@aws-sdk/credential-provider-ini" "3.679.0" - "@aws-sdk/credential-provider-process" "3.679.0" - "@aws-sdk/credential-provider-sso" "3.679.0" - "@aws-sdk/credential-provider-web-identity" "3.679.0" - "@aws-sdk/types" "3.679.0" +"@aws-sdk/credential-provider-node@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.687.0.tgz#46bd8014bb68913ad285aed01e6920083a42d056" + integrity sha512-Pqld8Nx11NYaBUrVk3bYiGGpLCxkz8iTONlpQWoVWFhSOzlO7zloNOaYbD2XgFjjqhjlKzE91drs/f41uGeCTA== + dependencies: + "@aws-sdk/credential-provider-env" "3.686.0" + "@aws-sdk/credential-provider-http" "3.686.0" + "@aws-sdk/credential-provider-ini" "3.687.0" + "@aws-sdk/credential-provider-process" "3.686.0" + "@aws-sdk/credential-provider-sso" "3.687.0" + "@aws-sdk/credential-provider-web-identity" "3.686.0" + "@aws-sdk/types" "3.686.0" "@smithy/credential-provider-imds" "^3.2.4" "@smithy/property-provider" "^3.1.7" "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.679.0": - version "3.679.0" +"@aws-sdk/credential-provider-process@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.686.0.tgz#7b02591d9b81fb16288618ce23d3244496c1b538" + integrity sha512-sXqaAgyzMOc+dm4CnzAR5Q6S9OWVHyZjLfW6IQkmGjqeQXmZl24c4E82+w64C+CTkJrFLzH1VNOYp1Hy5gE6Qw== dependencies: - "@aws-sdk/core" "3.679.0" - "@aws-sdk/types" "3.679.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" "@smithy/property-provider" "^3.1.7" "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.679.0": - version "3.679.0" +"@aws-sdk/credential-provider-sso@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.687.0.tgz#2e5704bdaa3c420c2a00a1316cdbdf57d78ae649" + integrity sha512-N1YCoE7DovIRF2ReyRrA4PZzF0WNi4ObPwdQQkVxhvSm7PwjbWxrfq7rpYB+6YB1Uq3QPzgVwUFONE36rdpxUQ== dependencies: - "@aws-sdk/client-sso" "3.679.0" - "@aws-sdk/core" "3.679.0" - "@aws-sdk/token-providers" "3.679.0" - "@aws-sdk/types" "3.679.0" + "@aws-sdk/client-sso" "3.687.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/token-providers" "3.686.0" + "@aws-sdk/types" "3.686.0" "@smithy/property-provider" "^3.1.7" "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.679.0": - version "3.679.0" +"@aws-sdk/credential-provider-web-identity@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.686.0.tgz#228be45b2f840ebf227d96ee5e326c1efa3c25a9" + integrity sha512-40UqCpPxyHCXDP7CGd9JIOZDgDZf+u1OyLaGBpjQJlz1HYuEsIWnnbTe29Yg3Ah/Zc3g4NBWcUdlGVotlnpnDg== dependencies: - "@aws-sdk/core" "3.679.0" - "@aws-sdk/types" "3.679.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.679.0": - version "3.679.0" +"@aws-sdk/middleware-host-header@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.686.0.tgz#16f0be33fc738968a4e10ff77cb8a04e2b2c2359" + integrity sha512-+Yc6rO02z+yhFbHmRZGvEw1vmzf/ifS9a4aBjJGeVVU+ZxaUvnk+IUZWrj4YQopUQ+bSujmMUzJLXSkbDq7yuw== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.686.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.679.0": - version "3.679.0" +"@aws-sdk/middleware-logger@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.686.0.tgz#4e094e42e10bf17d43b9c9afc3fc594f4aa72e02" + integrity sha512-cX43ODfA2+SPdX7VRxu6gXk4t4bdVJ9pkktbfnkE5t27OlwNfvSGGhnHrQL8xTOFeyQ+3T+oowf26gf1OI+vIg== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.686.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.679.0": - version "3.679.0" +"@aws-sdk/middleware-recursion-detection@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.686.0.tgz#aba097d2dcc9d3b9d4523d7ae03ac3b387617db1" + integrity sha512-jF9hQ162xLgp9zZ/3w5RUNhmwVnXDBlABEUX8jCgzaFpaa742qR/KKtjjZQ6jMbQnP+8fOCSXFAVNMU+s6v81w== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.686.0" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.679.0": - version "3.679.0" +"@aws-sdk/middleware-user-agent@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.687.0.tgz#a5feb5466d2926cd1ef5dd6f4778b33ce160ca7f" + integrity sha512-nUgsKiEinyA50CaDXojAkOasAU3Apdg7Qox6IjNUC4ZjgOu7QWsCDB5N28AYMUt06cNYeYQdfMX1aEzG85a1Mg== dependencies: - "@aws-sdk/core" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@aws-sdk/util-endpoints" "3.679.0" - "@smithy/core" "^2.4.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.686.0" + "@aws-sdk/types" "3.686.0" + "@aws-sdk/util-endpoints" "3.686.0" + "@smithy/core" "^2.5.1" + "@smithy/protocol-http" "^4.1.5" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.679.0": - version "3.679.0" +"@aws-sdk/region-config-resolver@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.686.0.tgz#3ef61e2cd95eb0ae80ecd5eef284744eb0a76d7c" + integrity sha512-6zXD3bSD8tcsMAVVwO1gO7rI1uy2fCD3czgawuPGPopeLiPpo6/3FoUWCQzk2nvEhj7p9Z4BbjwZGSlRkVrXTw== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.686.0" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" + "@smithy/util-middleware" "^3.0.8" tslib "^2.6.2" -"@aws-sdk/token-providers@3.679.0": - version "3.679.0" +"@aws-sdk/token-providers@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.686.0.tgz#c7733a0a079adc9404bd9d8fc4ff52edef0a123a" + integrity sha512-9oL4kTCSePFmyKPskibeiOXV6qavPZ63/kXM9Wh9V6dTSvBtLeNnMxqGvENGKJcTdIgtoqyqA6ET9u0PJ5IRIg== dependencies: - "@aws-sdk/types" "3.679.0" + "@aws-sdk/types" "3.686.0" "@smithy/property-provider" "^3.1.7" "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/types@^3.222.0", "@aws-sdk/types@3.679.0": - version "3.679.0" +"@aws-sdk/types@3.686.0", "@aws-sdk/types@^3.222.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.686.0.tgz#01aa5307c727de9e69969c538f99ae8b53f1074f" + integrity sha512-xFnrb3wxOoJcW2Xrh63ZgFo5buIu9DF7bOHnwoUxHdNpUXicUh0AHw85TjXxyxIAd0d1psY/DU7QHoNI3OswgQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.679.0": - version "3.679.0" +"@aws-sdk/util-endpoints@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.686.0.tgz#c9a621961b8efda6d82ab3523d673acb0629d6d0" + integrity sha512-7msZE2oYl+6QYeeRBjlDgxQUhq/XRky3cXE0FqLFs2muLS7XSuQEXkpOXB3R782ygAP6JX0kmBxPTLurRTikZg== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/types" "^3.5.0" - "@smithy/util-endpoints" "^2.1.3" + "@aws-sdk/types" "3.686.0" + "@smithy/types" "^3.6.0" + "@smithy/util-endpoints" "^2.1.4" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": version "3.679.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.679.0.tgz#8d5898624691e12ccbad839e103562002bbec85e" + integrity sha512-zKTd48/ZWrCplkXpYDABI74rQlbR0DNHs8nH95htfSLj9/mWRSwaGptoxwcihaq/77vi/fl2X3y0a1Bo8bt7RA== dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.679.0": - version "3.679.0" +"@aws-sdk/util-user-agent-browser@3.686.0": + version "3.686.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.686.0.tgz#953ef68c1b54e02f9de742310f47c33452f088bc" + integrity sha512-YiQXeGYZegF1b7B2GOR61orhgv79qmI0z7+Agm3NXLO6hGfVV3kFUJbXnjtH1BgWo5hbZYW7HQ2omGb3dnb6Lg== dependencies: - "@aws-sdk/types" "3.679.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.686.0" + "@smithy/types" "^3.6.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.679.0": - version "3.679.0" +"@aws-sdk/util-user-agent-node@3.687.0": + version "3.687.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.687.0.tgz#6bdc45c2ef776a86614b002867aef37fc6f45b41" + integrity sha512-idkP6ojSTZ4ek1pJ8wIN7r9U3KR5dn0IkJn3KQBXQ58LWjkRqLtft2vxzdsktWwhPKjjmIKl1S0kbvqLawf8XQ== dependencies: - "@aws-sdk/middleware-user-agent" "3.679.0" - "@aws-sdk/types" "3.679.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/middleware-user-agent" "3.687.0" + "@aws-sdk/types" "3.686.0" + "@smithy/node-config-provider" "^3.1.9" + "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -440,13 +496,6 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" @@ -465,28 +514,7 @@ resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.25.2.tgz" integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.19.6", "@babel/core@^7.4.0-0": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/core@^7.11.6", "@babel/core@^7.8.0": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": version "7.25.2" resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -507,47 +535,26 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.12.3": - version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.23.9": - version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz" - integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== +"@babel/core@^7.19.6": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz" + integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/helper-compilation-targets" "^7.25.2" - "@babel/helper-module-transforms" "^7.25.2" - "@babel/helpers" "^7.25.0" - "@babel/parser" "^7.25.0" - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.2" - "@babel/types" "^7.25.2" - convert-source-map "^2.0.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.3" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.3" + "@babel/types" "^7.21.3" + convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" + json5 "^2.2.2" + semver "^6.3.0" "@babel/generator@^7.21.3": version "7.21.3" @@ -920,12 +927,7 @@ dependencies: "@babel/types" "^7.25.2" -"@babel/parser@^7.20.7": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== - -"@babel/parser@^7.21.3": +"@babel/parser@^7.20.7", "@babel/parser@^7.21.3": version "7.21.3" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz" integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== @@ -1647,7 +1649,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.20.7", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.23.6" + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" @@ -1676,16 +1680,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/template@^7.25.0": - version "7.25.0" - resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.0.tgz" - integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/template@^7.3.3": +"@babel/template@^7.25.0", "@babel/template@^7.3.3": version "7.25.0" resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.0.tgz" integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== @@ -1723,7 +1718,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0": +"@babel/types@^7.0.0", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3": version "7.25.2" resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz" integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== @@ -1750,15 +1745,6 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3": - version "7.25.2" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz" - integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== - dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" @@ -1776,11 +1762,121 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -2093,16 +2189,16 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" @@ -2121,7 +2217,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -2131,31 +2227,15 @@ resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.12": - version "0.3.25" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.18": - version "0.3.25" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -2163,13 +2243,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" "@next/env@14.1.1": version "14.1.1" @@ -2188,6 +2268,46 @@ resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz" integrity sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ== +"@next/swc-darwin-x64@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.1.tgz#82c3e67775e40094c66e76845d1a36cc29c9e78b" + integrity sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw== + +"@next/swc-linux-arm64-gnu@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.1.tgz#4f4134457b90adc5c3d167d07dfb713c632c0caa" + integrity sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg== + +"@next/swc-linux-arm64-musl@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.1.tgz#594bedafaeba4a56db23a48ffed2cef7cd09c31a" + integrity sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ== + +"@next/swc-linux-x64-gnu@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.1.tgz#cb4e75f1ff2b9bcadf2a50684605928ddfc58528" + integrity sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ== + +"@next/swc-linux-x64-musl@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.1.tgz#15f26800df941b94d06327f674819ab64b272e25" + integrity sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og== + +"@next/swc-win32-arm64-msvc@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.1.tgz#060c134fa7fa843666e3e8574972b2b723773dd9" + integrity sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A== + +"@next/swc-win32-ia32-msvc@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.1.tgz#5c06889352b1f77e3807834a0d0afd7e2d2d1da2" + integrity sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw== + +"@next/swc-win32-x64-msvc@14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.1.tgz#d38c63a8f9b7f36c1470872797d3735b4a9c5c52" + integrity sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A== + "@next/third-parties@^14.1.0": version "14.1.0" resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-14.1.0.tgz" @@ -2203,7 +2323,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2252,12 +2372,16 @@ "@smithy/abort-controller@^3.1.6": version "3.1.6" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.6.tgz#d9de97b85ca277df6ffb9ee7cd83d5da793ee6de" + integrity sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/config-resolver@^3.0.10", "@smithy/config-resolver@^3.0.9": +"@smithy/config-resolver@^3.0.10": version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.10.tgz#d9529d9893e5fae1f14cb1ffd55517feb6d7e50f" + integrity sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw== dependencies: "@smithy/node-config-provider" "^3.1.9" "@smithy/types" "^3.6.0" @@ -2265,8 +2389,10 @@ "@smithy/util-middleware" "^3.0.8" tslib "^2.6.2" -"@smithy/core@^2.4.8", "@smithy/core@^2.5.1": +"@smithy/core@^2.5.1": version "2.5.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.5.1.tgz#7f635b76778afca845bcb401d36f22fa37712f15" + integrity sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg== dependencies: "@smithy/middleware-serde" "^3.0.8" "@smithy/protocol-http" "^4.1.5" @@ -2279,6 +2405,8 @@ "@smithy/credential-provider-imds@^3.2.4", "@smithy/credential-provider-imds@^3.2.5": version "3.2.5" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz#dbfd849a4a7ebd68519cd9fc35f78d091e126d0a" + integrity sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg== dependencies: "@smithy/node-config-provider" "^3.1.9" "@smithy/property-provider" "^3.1.8" @@ -2288,27 +2416,35 @@ "@smithy/eventstream-codec@^3.1.7": version "3.1.7" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz#5bfaffbc83ae374ffd85a755a8200ba3c7aed016" + integrity sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA== dependencies: "@aws-crypto/crc32" "5.2.0" "@smithy/types" "^3.6.0" "@smithy/util-hex-encoding" "^3.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^3.0.10": +"@smithy/eventstream-serde-browser@^3.0.11": version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz#019f3d1016d893b65ef6efec8c5e2fa925d0ac3d" + integrity sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A== dependencies: "@smithy/eventstream-serde-universal" "^3.0.10" "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^3.0.7": +"@smithy/eventstream-serde-config-resolver@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz#bba17a358818e61993aaa73e36ea4023c5805556" + integrity sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^3.0.9": +"@smithy/eventstream-serde-node@^3.0.10": version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz#da40b872001390bb47807186855faba8172b3b5b" + integrity sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw== dependencies: "@smithy/eventstream-serde-universal" "^3.0.10" "@smithy/types" "^3.6.0" @@ -2316,22 +2452,17 @@ "@smithy/eventstream-serde-universal@^3.0.10": version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz#b24e66fec9ec003eb0a1d6733fa22ded43129281" + integrity sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww== dependencies: "@smithy/eventstream-codec" "^3.1.7" "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.2.9": - version "3.2.9" - dependencies: - "@smithy/protocol-http" "^4.1.4" - "@smithy/querystring-builder" "^3.0.7" - "@smithy/types" "^3.5.0" - "@smithy/util-base64" "^3.0.0" - tslib "^2.6.2" - "@smithy/fetch-http-handler@^4.0.0": version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz#3763cb5178745ed630ed5bc3beb6328abdc31f36" + integrity sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g== dependencies: "@smithy/protocol-http" "^4.1.5" "@smithy/querystring-builder" "^3.0.8" @@ -2339,39 +2470,51 @@ "@smithy/util-base64" "^3.0.0" tslib "^2.6.2" -"@smithy/hash-node@^3.0.7": +"@smithy/hash-node@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.8.tgz#f451cc342f74830466b0b39bf985dc3022634065" + integrity sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng== dependencies: "@smithy/types" "^3.6.0" "@smithy/util-buffer-from" "^3.0.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^3.0.7": +"@smithy/invalid-dependency@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz#4d381a4c24832371ade79e904a72c173c9851e5f" + integrity sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== dependencies: tslib "^2.6.2" "@smithy/is-array-buffer@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz#9a95c2d46b8768946a9eec7f935feaddcffa5e7a" + integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== dependencies: tslib "^2.6.2" -"@smithy/middleware-content-length@^3.0.9": +"@smithy/middleware-content-length@^3.0.10": version "3.0.10" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz#738266f6d81436d7e3a86bea931bc64e04ae7dbf" + integrity sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg== dependencies: "@smithy/protocol-http" "^4.1.5" "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.1.4", "@smithy/middleware-endpoint@^3.2.1": +"@smithy/middleware-endpoint@^3.2.1": version "3.2.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz#b9ee42d29d8f3a266883d293c4d6a586f7b60979" + integrity sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA== dependencies: "@smithy/core" "^2.5.1" "@smithy/middleware-serde" "^3.0.8" @@ -2382,8 +2525,10 @@ "@smithy/util-middleware" "^3.0.8" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.23": +"@smithy/middleware-retry@^3.0.25": version "3.0.25" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz#a6b1081fc1a0991ffe1d15e567e76198af01f37c" + integrity sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg== dependencies: "@smithy/node-config-provider" "^3.1.9" "@smithy/protocol-http" "^4.1.5" @@ -2395,28 +2540,36 @@ tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.7", "@smithy/middleware-serde@^3.0.8": +"@smithy/middleware-serde@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz#a46d10dba3c395be0d28610d55c89ff8c07c0cd3" + integrity sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.7", "@smithy/middleware-stack@^3.0.8": +"@smithy/middleware-stack@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz#f1c7d9c7fe8280c6081141c88f4a76875da1fc43" + integrity sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/node-config-provider@^3.1.8", "@smithy/node-config-provider@^3.1.9": +"@smithy/node-config-provider@^3.1.9": version "3.1.9" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz#d27ba8e4753f1941c24ed0af824dbc6c492f510a" + integrity sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew== dependencies: "@smithy/property-provider" "^3.1.8" "@smithy/shared-ini-file-loader" "^3.1.9" "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/node-http-handler@^3.2.4", "@smithy/node-http-handler@^3.2.5": +"@smithy/node-http-handler@^3.2.5": version "3.2.5" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz#ad9d9ba1528bf0d4a655135e978ecc14b3df26a2" + integrity sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w== dependencies: "@smithy/abort-controller" "^3.1.6" "@smithy/protocol-http" "^4.1.5" @@ -2426,18 +2579,24 @@ "@smithy/property-provider@^3.1.7", "@smithy/property-provider@^3.1.8": version "3.1.8" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.8.tgz#b1c5a3949effbb9772785ad7ddc5b4b235b10fbe" + integrity sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/protocol-http@^4.1.4", "@smithy/protocol-http@^4.1.5": +"@smithy/protocol-http@^4.1.5": version "4.1.5" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.5.tgz#a1f397440f299b6a5abeed6866957fecb1bf5013" + integrity sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/querystring-builder@^3.0.7", "@smithy/querystring-builder@^3.0.8": +"@smithy/querystring-builder@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz#0d845be53aa624771c518d1412881236ce12ed4f" + integrity sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA== dependencies: "@smithy/types" "^3.6.0" "@smithy/util-uri-escape" "^3.0.0" @@ -2445,23 +2604,31 @@ "@smithy/querystring-parser@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz#057a8e2d301eea8eac7071923100ba38a824d7df" + integrity sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" "@smithy/service-error-classification@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz#265ad2573b972f6c7bdd1ad6c5155a88aeeea1c4" + integrity sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g== dependencies: "@smithy/types" "^3.6.0" "@smithy/shared-ini-file-loader@^3.1.8", "@smithy/shared-ini-file-loader@^3.1.9": version "3.1.9" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz#1b77852b5bb176445e1d80333fa3f739313a4928" + integrity sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" "@smithy/signature-v4@^4.2.0": version "4.2.1" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.2.1.tgz#a918fd7d99af9f60aa07617506fa54be408126ee" + integrity sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg== dependencies: "@smithy/is-array-buffer" "^3.0.0" "@smithy/protocol-http" "^4.1.5" @@ -2472,8 +2639,10 @@ "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.4.0", "@smithy/smithy-client@^3.4.2": +"@smithy/smithy-client@^3.4.2": version "3.4.2" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.4.2.tgz#a6e3ed98330ce170cf482e765bd0c21e0fde8ae4" + integrity sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA== dependencies: "@smithy/core" "^2.5.1" "@smithy/middleware-endpoint" "^3.2.1" @@ -2483,13 +2652,17 @@ "@smithy/util-stream" "^3.2.1" tslib "^2.6.2" -"@smithy/types@^3.5.0", "@smithy/types@^3.6.0": +"@smithy/types@^3.6.0": version "3.6.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.6.0.tgz#03a52bfd62ee4b7b2a1842c8ae3ada7a0a5ff3a4" + integrity sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.7", "@smithy/url-parser@^3.0.8": +"@smithy/url-parser@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.8.tgz#8057d91d55ba8df97d74576e000f927b42da9e18" + integrity sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg== dependencies: "@smithy/querystring-parser" "^3.0.8" "@smithy/types" "^3.6.0" @@ -2497,6 +2670,8 @@ "@smithy/util-base64@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" + integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== dependencies: "@smithy/util-buffer-from" "^3.0.0" "@smithy/util-utf8" "^3.0.0" @@ -2504,33 +2679,45 @@ "@smithy/util-body-length-browser@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz#86ec2f6256310b4845a2f064e2f571c1ca164ded" + integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== dependencies: tslib "^2.6.2" "@smithy/util-body-length-node@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz#99a291bae40d8932166907fe981d6a1f54298a6d" + integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== dependencies: tslib "^2.6.2" "@smithy/util-buffer-from@^2.2.0": version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" "@smithy/util-buffer-from@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz#559fc1c86138a89b2edaefc1e6677780c24594e3" + integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== dependencies: "@smithy/is-array-buffer" "^3.0.0" tslib "^2.6.2" "@smithy/util-config-provider@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz#62c6b73b22a430e84888a8f8da4b6029dd5b8efe" + integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.23": +"@smithy/util-defaults-mode-browser@^3.0.25": version "3.0.25" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz#ef9b84272d1db23503ff155f9075a4543ab6dab7" + integrity sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA== dependencies: "@smithy/property-provider" "^3.1.8" "@smithy/smithy-client" "^3.4.2" @@ -2538,8 +2725,10 @@ bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.23": +"@smithy/util-defaults-mode-node@^3.0.25": version "3.0.25" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz#c16fe3995c8e90ae318e336178392173aebe1e37" + integrity sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g== dependencies: "@smithy/config-resolver" "^3.0.10" "@smithy/credential-provider-imds" "^3.2.5" @@ -2549,8 +2738,10 @@ "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/util-endpoints@^2.1.3": +"@smithy/util-endpoints@^2.1.4": version "2.1.4" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz#a29134c2b1982442c5fc3be18d9b22796e8eb964" + integrity sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ== dependencies: "@smithy/node-config-provider" "^3.1.9" "@smithy/types" "^3.6.0" @@ -2558,24 +2749,32 @@ "@smithy/util-hex-encoding@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz#32938b33d5bf2a15796cd3f178a55b4155c535e6" + integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.7", "@smithy/util-middleware@^3.0.8": +"@smithy/util-middleware@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.8.tgz#372bc7a2845408ad69da039d277fc23c2734d0c6" + integrity sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA== dependencies: "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.7", "@smithy/util-retry@^3.0.8": +"@smithy/util-retry@^3.0.8": version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.8.tgz#9c607c175a4d8a87b5d8ebaf308f6b849e4dc4d0" + integrity sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow== dependencies: "@smithy/service-error-classification" "^3.0.8" "@smithy/types" "^3.6.0" tslib "^2.6.2" -"@smithy/util-stream@^3.1.9", "@smithy/util-stream@^3.2.1": +"@smithy/util-stream@^3.2.1": version "3.2.1" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.2.1.tgz#f3055dc4c8caba8af4e47191ea7e773d0e5a429d" + integrity sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A== dependencies: "@smithy/fetch-http-handler" "^4.0.0" "@smithy/node-http-handler" "^3.2.5" @@ -2588,17 +2787,23 @@ "@smithy/util-uri-escape@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz#e43358a78bf45d50bb736770077f0f09195b6f54" + integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== dependencies: tslib "^2.6.2" "@smithy/util-utf8@^2.0.0": version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" "@smithy/util-utf8@^3.0.0": version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-3.0.0.tgz#1a6a823d47cbec1fd6933e5fc87df975286d9d6a" + integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== dependencies: "@smithy/util-buffer-from" "^3.0.0" tslib "^2.6.2" @@ -2657,7 +2862,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" "@svgr/babel-plugin-transform-svg-component" "^6.5.1" -"@svgr/core@*", "@svgr/core@^6.0.0", "@svgr/core@^6.5.1": +"@svgr/core@^6.5.1": version "6.5.1" resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== @@ -2726,6 +2931,51 @@ resolved "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.11.tgz" integrity sha512-2NLSglDb5VfvTbMtmOKWyD+oaL/e8Z/ZZGovHtUFyUSFRabdXc6cZOlcD1BhFvYkHqm+TqGaz5qtPR5UbqDs8A== +"@tauri-apps/cli-darwin-x64@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.11.tgz#0afae17fe1e84b9699a6b9824cd83b60c6ebfa59" + integrity sha512-/RQllHiJRH2fJOCudtZlaUIjofkHzP3zZgxi71ZUm7Fy80smU5TDfwpwOvB0wSVh0g/ciDjMArCSTo0MRvL+ag== + +"@tauri-apps/cli-linux-arm-gnueabihf@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.11.tgz#c46166d7f6c1022105a13d530b1d1336f628981f" + integrity sha512-IlBuBPKmMm+a5LLUEK6a21UGr9ZYd6zKuKLq6IGM4tVweQa8Sf2kP2Nqs74dMGIUrLmMs0vuqdURpykQg+z4NQ== + +"@tauri-apps/cli-linux-arm64-gnu@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.11.tgz#fd5c539a03371e0ab6cd00563dced1610ceb8943" + integrity sha512-w+k1bNHCU/GbmXshtAhyTwqosThUDmCEFLU4Zkin1vl2fuAtQry2RN7thfcJFepblUGL/J7yh3Q/0+BCjtspKQ== + +"@tauri-apps/cli-linux-arm64-musl@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.11.tgz#bf7f940c3aca981d7c240857a86568d5b6e8310f" + integrity sha512-PN6/dl+OfYQ/qrAy4HRAfksJ2AyWQYn2IA/2Wwpaa7SDRz2+hzwTQkvajuvy0sQ5L2WCG7ymFYRYMbpC6Hk9Pg== + +"@tauri-apps/cli-linux-x64-gnu@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.11.tgz#17323105e3863a3f36d51771e642e489037ba59b" + integrity sha512-MTVXLi89Nj7Apcvjezw92m7ZqIDKT5SFKZtVPCg6RoLUBTzko/BQoXYIRWmdoz2pgkHDUHgO2OMJ8oKzzddXbw== + +"@tauri-apps/cli-linux-x64-musl@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.11.tgz#83e22026771ec8ab094922ab114a7385532aa16c" + integrity sha512-kwzAjqFpz7rvTs7WGZLy/a5nS5t15QKr3E9FG95MNF0exTl3d29YoAUAe1Mn0mOSrTJ9Z+vYYAcI/QdcsGBP+w== + +"@tauri-apps/cli-win32-arm64-msvc@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.11.tgz#817874d230fdb09e7211013006a9a22f66ace573" + integrity sha512-L+5NZ/rHrSUrMxjj6YpFYCXp6wHnq8c8SfDTBOX8dO8x+5283/vftb4vvuGIsLS4UwUFXFnLt3XQr44n84E67Q== + +"@tauri-apps/cli-win32-ia32-msvc@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.11.tgz#dee1a00eb9e216415d9d6ab9386c35849613c560" + integrity sha512-oVlD9IVewrY0lZzTdb71kNXkjdgMqFq+ohb67YsJb4Rf7o8A9DTlFds1XLCe3joqLMm4M+gvBKD7YnGIdxQ9vA== + +"@tauri-apps/cli-win32-x64-msvc@1.5.11": + version "1.5.11" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.11.tgz#c003ce00b36d056a8b08e0ecf4633c2bba00c497" + integrity sha512-1CexcqUFCis5ypUIMOKllxUBrna09McbftWENgvVXMfA+SP+yPDPAVb8fIvUcdTIwR/yHJwcIucmTB4anww4vg== + "@tauri-apps/cli@1.5.11": version "1.5.11" resolved "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.11.tgz" @@ -2742,7 +2992,7 @@ "@tauri-apps/cli-win32-ia32-msvc" "1.5.11" "@tauri-apps/cli-win32-x64-msvc" "1.5.11" -"@testing-library/dom@^10.0.0", "@testing-library/dom@^10.4.0": +"@testing-library/dom@^10.4.0": version "10.4.0" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz" integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== @@ -2756,10 +3006,10 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.6.2": - version "6.6.2" - resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.2.tgz" - integrity sha512-P6GJD4yqc9jZLbe98j/EkyQDTPgqftohZF5FBkHY5BUERZmcf4HeO2k0XaefEg329ux2p21i1A1DmyQ1kKw2Jw== +"@testing-library/jest-dom@^6.6.3": + version "6.6.3" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz#26ba906cf928c0f8172e182c6fe214eb4f9f2bd2" + integrity sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA== dependencies: "@adobe/css-tools" "^4.4.0" aria-query "^5.0.0" @@ -2881,7 +3131,7 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@>=8.0.0": +"@types/eslint@*": version "8.40.2" resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.2.tgz" integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== @@ -3018,7 +3268,7 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^16.8 || ^17.0 || ^18.0", "@types/react-dom@^18.0.0", "@types/react-dom@^18.2.7": +"@types/react-dom@^18.2.7": version "18.2.7" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== @@ -3032,7 +3282,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^18.0.0", "@types/react@^18.2.70", "@types/react@>=16": +"@types/react@*", "@types/react@^18.2.70": version "18.2.70" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.70.tgz" integrity sha512-hjlM2hho2vqklPhopNkXkdkeq6Lv8WSZTpr7956zY+3WS5cfYUewtCzsJLsbW5dEv3lfSeQ4W14ZFeKC437JRQ== @@ -3138,7 +3388,7 @@ resolved "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.0.2.tgz" integrity sha512-y5HWeB6RmlyVYxJAMrjiDEz8qAIy2cit0fhBq+MD78WaUwQvuBnQlX4+5MuwVTWi46bV3klaRMq83u9zUy1KOg== -"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz" integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== @@ -3239,7 +3489,7 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" -"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== @@ -3299,26 +3549,21 @@ acorn-walk@^8.0.2, acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -acorn@^8, acorn@^8.7.1: - version "8.9.0" - resolved "https://registry.npmmirror.com/acorn/-/acorn-8.9.0.tgz" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - acorn@^8.1.0, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.1: version "8.12.1" resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -acorn@^8.8.2: +acorn@^8.7.1, acorn@^8.8.2: version "8.9.0" resolved "https://registry.npmmirror.com/acorn/-/acorn-8.9.0.tgz" integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + agent-base@6: version "6.0.2" resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz" @@ -3339,7 +3584,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3415,7 +3660,7 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.0.0, aria-query@^5.1.3, aria-query@5.3.0: +aria-query@5.3.0, aria-query@^5.0.0, aria-query@^5.1.3: version "5.3.0" resolved "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -3502,7 +3747,7 @@ axe-core@^4.6.2: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== -axios@^1.7.5, axios@>=0.25.0: +axios@^1.7.5: version "1.7.5" resolved "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz" integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== @@ -3629,6 +3874,8 @@ boolbase@^1.0.0: bowser@^2.11.0: version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== brace-expansion@^1.1.7: version "1.1.11" @@ -3655,7 +3902,7 @@ browserslist@^4.14.5: node-releases "^2.0.12" update-browserslist-db "^1.0.11" -browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.21.3, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3732,16 +3979,12 @@ ccount@^2.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== -chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3766,11 +4009,6 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz" @@ -3882,16 +4120,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colorette@^2.0.19: version "2.0.19" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" @@ -3909,6 +4147,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz" @@ -3919,17 +4162,7 @@ commander@^2.20.0: resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^7.2.0, commander@7: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.0.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commander@^8.3.0: +commander@^8.0.0, commander@^8.3.0: version "8.3.0" resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -4114,7 +4347,7 @@ cytoscape-fcose@^2.1.0: dependencies: cose-base "^2.2.0" -cytoscape@^3.2.0, cytoscape@^3.23.0: +cytoscape@^3.23.0: version "3.24.0" resolved "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.24.0.tgz" integrity sha512-W9fJMrAfr/zKFzDCpRR/wn6uoEQ7gfbJmxPK5DadXj69XyAhZYi1QXLOE+UXJfXVXxqGM1o1eeiIrtxrtB43zA== @@ -4122,13 +4355,6 @@ cytoscape@^3.2.0, cytoscape@^3.23.0: heap "^0.2.6" lodash "^4.17.21" -d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3: - version "3.2.3" - resolved "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.3.tgz" - integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== - dependencies: - internmap "1 - 2" - "d3-array@1 - 2": version "2.12.1" resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" @@ -4136,6 +4362,13 @@ d3-array@^3.2.0, "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", dependencies: internmap "^1.0.0" +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.3" + resolved "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.3.tgz" + integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== + dependencies: + internmap "1 - 2" + d3-axis@3: version "3.0.0" resolved "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz" @@ -4245,16 +4478,16 @@ d3-hierarchy@3: dependencies: d3-color "1 - 3" -d3-path@^3.1.0, "d3-path@1 - 3", d3-path@3: - version "3.1.0" - resolved "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - d3-path@1: version "1.0.9" resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + d3-polygon@3: version "3.0.1" resolved "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz" @@ -4302,13 +4535,6 @@ d3-scale@4: resolved "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== -d3-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - d3-shape@3: version "3.2.0" resolved "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz" @@ -4316,6 +4542,13 @@ d3-shape@3: dependencies: d3-path "^3.1.0" +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" resolved "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz" @@ -4432,6 +4665,13 @@ dayjs@^1.11.7: resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== +debug@4, debug@^4.3.1: + version "4.3.6" + resolved "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -4446,20 +4686,6 @@ debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" -debug@^4.3.1: - version "4.3.6" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -debug@4: - version "4.3.6" - resolved "https://registry.npmmirror.com/debug/-/debug-4.3.6.tgz" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz" @@ -4883,7 +5109,7 @@ eslint-config-next@13.4.19: eslint-plugin-react "^7.31.7" eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" -eslint-config-prettier@*, eslint-config-prettier@^8.8.0: +eslint-config-prettier@^8.8.0: version "8.8.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== @@ -4917,7 +5143,7 @@ eslint-module-utils@^2.7.4: dependencies: debug "^3.2.7" -eslint-plugin-import@*, eslint-plugin-import@^2.26.0: +eslint-plugin-import@^2.26.0: version "2.27.5" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== @@ -5006,14 +5232,6 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz" @@ -5022,12 +5240,20 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8.49.0, eslint@>=7.0.0, eslint@>=8.0.0, eslint@8: +eslint@^8.49.0: version "8.49.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz" integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== @@ -5209,6 +5435,8 @@ fast-levenshtein@^2.0.6: fast-xml-parser@4.4.1: version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: strnum "^1.0.5" @@ -5435,27 +5663,27 @@ glob-to-regexp@^0.4.1: resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" @@ -5800,16 +6028,16 @@ internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -internmap@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" - integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== - "internmap@1 - 2": version "2.0.3" resolved "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -6305,7 +6533,7 @@ jest-resolve-dependencies@^29.7.0: jest-regex-util "^29.6.3" jest-snapshot "^29.7.0" -jest-resolve@*, jest-resolve@^29.7.0: +jest-resolve@^29.7.0: version "29.7.0" resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== @@ -6971,16 +7199,16 @@ merge-stream@^2.0.0: resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.npmmirror.com/merge/-/merge-1.2.1.tgz" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/merge/-/merge-1.2.1.tgz" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + mermaid@^10.6.1: version "10.6.1" resolved "https://registry.npmjs.org/mermaid/-/mermaid-10.6.1.tgz" @@ -7347,16 +7575,16 @@ mri@^1.1.0: resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nanoid@^3.3.6: version "3.3.7" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" @@ -7377,7 +7605,7 @@ neo-async@^2.6.2: resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -"next@^13.0.0 || ^14.0.0", next@^14.1.1: +next@^14.1.1: version "14.1.1" resolved "https://registry.npmjs.org/next/-/next-14.1.1.tgz" integrity sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww== @@ -7732,7 +7960,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.0.2, prettier@>=3.0.0: +prettier@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz" integrity sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ== @@ -7824,7 +8052,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -"react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, react-dom@^18.2.0, react-dom@>=16.8: +react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -7832,12 +8060,7 @@ randombytes@^2.1.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -7900,7 +8123,7 @@ react-router@6.15.0: dependencies: "@remix-run/router" "1.8.0" -"react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.5 || ^17.0.0 || ^18.0.0", react@^16.8||^17||^18, react@^18.0.0, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16, react@>=16.8, react@>=16.8.0: +react@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -7922,7 +8145,7 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -"redux@^4 || ^5.0.0-beta.0", redux@^4.2.1: +redux@^4.2.1: version "4.2.1" resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -8204,7 +8427,7 @@ safe-regex-test@^1.0.0: resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.3.0, sass@^1.59.2: +sass@^1.59.2: version "1.60.0" resolved "https://registry.npmjs.org/sass/-/sass-1.60.0.tgz" integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== @@ -8332,19 +8555,11 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz" @@ -8353,6 +8568,14 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" @@ -8522,6 +8745,8 @@ strip-json-comments@^3.1.1: strnum@^1.0.5: version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== style-to-object@^0.4.0: version "0.4.1" @@ -8556,14 +8781,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -8720,7 +8938,7 @@ ts-dedent@^2.2.0: resolved "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== -ts-node@^10.9.2, ts-node@>=9.0.0: +ts-node@^10.9.2: version "10.9.2" resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -8749,12 +8967,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.1.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tslib@^2.4.0: +tslib@^2.1.0, tslib@^2.4.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -8805,7 +9018,7 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@>=2.7, typescript@>=3.3.1, typescript@>=4.2.0, typescript@5.2.2: +typescript@5.2.2: version "5.2.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== @@ -8974,7 +9187,7 @@ use-memo-one@^1.1.3: resolved "https://registry.npmmirror.com/use-memo-one/-/use-memo-one-1.1.3.tgz" integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== -use-sync-external-store@^1.0.0, use-sync-external-store@1.2.0: +use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== @@ -8986,6 +9199,8 @@ uuid@^9.0.0: uuid@^9.0.1: version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== uvu@^0.5.0: version "0.5.6" @@ -9092,7 +9307,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.1.0, webpack@^5.88.1: +webpack@^5.88.1: version "5.88.1" resolved "https://registry.npmmirror.com/webpack/-/webpack-5.88.1.tgz" integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== From 225ad308987d713afa31fc7f6f380f3eeb4581d8 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 13 Nov 2024 18:37:47 +0800 Subject: [PATCH 25/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/components/ui-lib.tsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 1 - app/components/ui-lib.tsx | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index b2b04cc327c..c8709722e02 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -190,7 +190,6 @@ export async function handle( } // If stream is false, accumulate the response and return as JSON - console.log("Body.stream==========" + body.stream); if (body.stream === false) { let fullResponse = { content: "", diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 1df0462c05a..5f183c8c4dc 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -272,19 +272,20 @@ export function Input(props: InputProps) { export function PasswordInput( props: HTMLProps & { aria?: string; - maskWhenShow?: boolean; // New prop to control masking behavior + maskWhenShow?: boolean; }, ) { const [visible, setVisible] = useState(false); const [displayValue, setDisplayValue] = useState(props.value as string); + const { maskWhenShow, ...inputProps } = props; useEffect(() => { - if (props.maskWhenShow && visible && props.value) { + if (maskWhenShow && visible && props.value) { setDisplayValue(maskSensitiveValue(props.value as string)); } else { setDisplayValue(props.value as string); } - }, [visible, props.value, props.maskWhenShow]); + }, [visible, props.value, maskWhenShow]); function changeVisibility() { setVisible(!visible); @@ -305,7 +306,7 @@ export function PasswordInput( className={"password-eye"} /> Date: Mon, 18 Nov 2024 16:12:03 +0800 Subject: [PATCH 26/72] remove document function,only keep the bedrock service provider --- app/client/api.ts | 12 ++---------- app/locales/cn.ts | 1 - app/locales/en.ts | 1 - 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/app/client/api.ts b/app/client/api.ts index 260252df810..003cd88749d 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -12,7 +12,6 @@ import { useChatStore, } from "../store"; import { ChatGPTApi, DalleRequestPayload } from "./platforms/openai"; -import { BedrockApi } from "./platforms/bedrock"; import { GeminiProApi } from "./platforms/google"; import { ClaudeApi } from "./platforms/anthropic"; import { ErnieApi } from "./platforms/baidu"; @@ -23,6 +22,7 @@ import { MoonshotApi } from "./platforms/moonshot"; import { SparkApi } from "./platforms/iflytek"; import { XAIApi } from "./platforms/xai"; import { ChatGLMApi } from "./platforms/glm"; +import { BedrockApi } from "./platforms/bedrock"; import { encrypt } from "../utils/encryption"; export const ROLES = ["system", "user", "assistant"] as const; @@ -33,19 +33,11 @@ export const TTSModels = ["tts-1", "tts-1-hd"] as const; export type ChatModel = ModelType; export interface MultimodalContent { - type: "text" | "image_url" | "document"; + type: "text" | "image_url"; text?: string; image_url?: { url: string; }; - document?: { - format: string; - name: string; - source: { - bytes: string; - media_type?: string; - }; - }; } export interface RequestMessage { diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 7dd1ff99eff..d98a7eaded2 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -81,7 +81,6 @@ const cn = { Clear: "清除聊天", Settings: "对话设置", UploadImage: "上传图片", - UploadDocument: "上传文档", }, Rename: "重命名对话", Typing: "正在输入…", diff --git a/app/locales/en.ts b/app/locales/en.ts index 8e3fc7a7b3c..e4bd0cedb40 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -82,7 +82,6 @@ const en: LocaleType = { Clear: "Clear Context", Settings: "Settings", UploadImage: "Upload Images", - UploadDocument: "Upload Documents", }, Rename: "Rename Chat", Typing: "Typing…", From f60c237b16c035f9ce84b76b8fd0a89d8ba0a6b9 Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 20 Nov 2024 15:25:36 +0800 Subject: [PATCH 27/72] =?UTF-8?q?=E5=8E=BB=E6=8E=89sdk=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E5=85=A5=EF=BC=8C=E5=AE=A2=E6=88=B7=E7=AB=AF=E4=B9=9F=E8=83=BD?= =?UTF-8?q?=E7=9B=B4=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 421 +++++++++++++------------------- app/client/api.ts | 2 +- app/client/platforms/bedrock.ts | 402 ++++++++++++++---------------- app/components/ui-lib.tsx | 2 +- app/constant.ts | 35 ++- app/store/access.ts | 88 +------ app/utils/aws.ts | 236 ++++++++++++++++++ app/utils/encryption.ts | 35 --- package.json | 1 - 9 files changed, 632 insertions(+), 590 deletions(-) create mode 100644 app/utils/aws.ts delete mode 100644 app/utils/encryption.ts diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index c8709722e02..1417e9475b8 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,285 +1,169 @@ -import { getServerSideConfig } from "../config/server"; -import { prettyObject } from "../utils/format"; import { NextRequest, NextResponse } from "next/server"; -import { decrypt } from "../utils/encryption"; -import { - BedrockRuntimeClient, - ConverseStreamCommand, - ConverseStreamCommandInput, - Message, - ContentBlock, - ConverseStreamOutput, -} from "@aws-sdk/client-bedrock-runtime"; +import { sign, decrypt } from "../utils/aws"; -const ALLOWED_PATH = new Set(["converse"]); +const ALLOWED_PATH = new Set(["chat", "models"]); -// AWS Credential Validation Function -function validateAwsCredentials( - region: string, - accessKeyId: string, - secretAccessKey: string, -): boolean { - const regionRegex = /^[a-z]{2}-[a-z]+-\d+$/; - const accessKeyRegex = /^(AKIA|A3T|ASIA)[A-Z0-9]{16}$/; - - return ( - regionRegex.test(region) && - accessKeyRegex.test(accessKeyId) && - secretAccessKey.length === 40 - ); -} - -export interface ConverseRequest { - modelId: string; - messages: { - role: "user" | "assistant" | "system"; - content: string | any[]; - }[]; - inferenceConfig?: { - maxTokens?: number; - temperature?: number; - topP?: number; - stopSequences?: string[]; - }; - tools?: { - name: string; - description?: string; - input_schema: any; - }[]; - stream?: boolean; -} - -function supportsToolUse(modelId: string): boolean { - return modelId.toLowerCase().includes("claude-3"); +function parseEventData(chunk: Uint8Array): any { + const decoder = new TextDecoder(); + const text = decoder.decode(chunk); + try { + return JSON.parse(text); + } catch (e) { + try { + const base64Match = text.match(/:"([A-Za-z0-9+/=]+)"/); + if (base64Match) { + const decoded = Buffer.from(base64Match[1], "base64").toString("utf-8"); + return JSON.parse(decoded); + } + const eventMatch = text.match(/:event-type[^\{]+({.*})/); + if (eventMatch) { + return JSON.parse(eventMatch[1]); + } + } catch (innerError) {} + } + return null; } -function formatRequestBody( - request: ConverseRequest, -): ConverseStreamCommandInput { - const messages: Message[] = request.messages.map((msg) => ({ - role: msg.role === "system" ? "user" : msg.role, - content: Array.isArray(msg.content) - ? msg.content.map((item) => { - if (item.type === "tool_use") { - return { - toolUse: { - toolUseId: item.id, - name: item.name, - input: item.input || "{}", - }, - } as ContentBlock; - } - if (item.type === "tool_result") { - return { - toolResult: { - toolUseId: item.tool_use_id, - content: [{ text: item.content || ";" }], - status: "success", - }, - } as ContentBlock; - } - if (item.type === "text") { - return { text: item.text || ";" } as ContentBlock; - } - if (item.type === "image") { - return { - image: { - format: item.source.media_type.split("/")[1] as - | "png" - | "jpeg" - | "gif" - | "webp", - source: { - bytes: Uint8Array.from( - Buffer.from(item.source.data, "base64"), - ), - }, - }, - } as ContentBlock; +async function* transformBedrockStream(stream: ReadableStream) { + const reader = stream.getReader(); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + const parsed = parseEventData(value); + if (parsed) { + if (parsed.type === "content_block_delta") { + if (parsed.delta?.type === "text_delta") { + yield `data: ${JSON.stringify({ + delta: { text: parsed.delta.text }, + })}\n\n`; + } else if (parsed.delta?.type === "input_json_delta") { + yield `data: ${JSON.stringify(parsed)}\n\n`; } - return { text: ";" } as ContentBlock; - }) - : [{ text: msg.content || ";" } as ContentBlock], - })); + } else if ( + parsed.type === "message_delta" && + parsed.delta?.stop_reason + ) { + yield `data: ${JSON.stringify({ + delta: { stop_reason: parsed.delta.stop_reason }, + })}\n\n`; + } else if ( + parsed.type === "content_block_start" && + parsed.content_block?.type === "tool_use" + ) { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } else if (parsed.type === "content_block_stop") { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } + } + } + } finally { + reader.releaseLock(); + } +} - const input: ConverseStreamCommandInput = { - modelId: request.modelId, - messages, - ...(request.inferenceConfig && { - inferenceConfig: request.inferenceConfig, - }), - }; +function validateRequest(body: any, modelId: string): void { + if (!modelId) throw new Error("Model ID is required"); - if (request.tools?.length && supportsToolUse(request.modelId)) { - input.toolConfig = { - tools: request.tools.map((tool) => ({ - toolSpec: { - name: tool.name, - description: tool.description, - inputSchema: { - json: tool.input_schema, - }, - }, - })), - toolChoice: { auto: {} }, - }; + if (modelId.startsWith("anthropic.claude")) { + if ( + !body.anthropic_version || + body.anthropic_version !== "bedrock-2023-05-31" + ) { + throw new Error("anthropic_version must be 'bedrock-2023-05-31'"); + } + if (typeof body.max_tokens !== "number" || body.max_tokens < 0) { + throw new Error("max_tokens must be a positive number"); + } + if (modelId.startsWith("anthropic.claude-3")) { + if (!Array.isArray(body.messages)) + throw new Error("messages array is required for Claude 3"); + } else if (typeof body.prompt !== "string") { + throw new Error("prompt is required for Claude 2 and earlier"); + } + } else if (modelId.startsWith("meta.llama")) { + if (!body.prompt) throw new Error("Llama requires a prompt"); + } else if (modelId.startsWith("mistral.mistral")) { + if (!Array.isArray(body.messages)) + throw new Error("Mistral requires a messages array"); + } else if (modelId.startsWith("amazon.titan")) { + if (!body.inputText) throw new Error("Titan requires inputText"); } - - return input; } -export async function handle( - req: NextRequest, - { params }: { params: { path: string[] } }, -) { - if (req.method === "OPTIONS") { - return NextResponse.json({ body: "OK" }, { status: 200 }); - } +async function requestBedrock(req: NextRequest) { + const controller = new AbortController(); + const awsRegion = req.headers.get("X-Region") ?? ""; + const awsAccessKey = req.headers.get("X-Access-Key") ?? ""; + const awsSecretKey = req.headers.get("X-Secret-Key") ?? ""; + const awsSessionToken = req.headers.get("X-Session-Token"); + const modelId = req.headers.get("X-Model-Id") ?? ""; - const subpath = params.path.join("/"); - if (!ALLOWED_PATH.has(subpath)) { - return NextResponse.json( - { error: true, msg: "Path not allowed: " + subpath }, - { status: 403 }, - ); + if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { + throw new Error("Missing required AWS credentials or model ID"); } - const serverConfig = getServerSideConfig(); - let region = serverConfig.awsRegion; - let accessKeyId = serverConfig.awsAccessKey; - let secretAccessKey = serverConfig.awsSecretKey; - let sessionToken = undefined; + const decryptedAccessKey = decrypt(awsAccessKey); + const decryptedSecretKey = decrypt(awsSecretKey); + const decryptedSessionToken = awsSessionToken + ? decrypt(awsSessionToken) + : undefined; - // Attempt to get credentials from headers if not in server config - if (!region || !accessKeyId || !secretAccessKey) { - region = decrypt(req.headers.get("X-Region") ?? ""); - accessKeyId = decrypt(req.headers.get("X-Access-Key") ?? ""); - secretAccessKey = decrypt(req.headers.get("X-Secret-Key") ?? ""); - sessionToken = req.headers.get("X-Session-Token") - ? decrypt(req.headers.get("X-Session-Token") ?? "") - : undefined; + if (!decryptedAccessKey || !decryptedSecretKey) { + throw new Error("Failed to decrypt AWS credentials"); } - // Validate AWS credentials - if (!validateAwsCredentials(region, accessKeyId, secretAccessKey)) { - return NextResponse.json( - { - error: true, - msg: "Invalid AWS credentials. Please check your region, access key, and secret key.", - }, - { status: 401 }, - ); - } + const endpoint = `https://bedrock-runtime.${awsRegion}.amazonaws.com/model/${modelId}/invoke-with-response-stream`; + const timeoutId = setTimeout(() => controller.abort(), 10 * 60 * 1000); try { - const client = new BedrockRuntimeClient({ - region, - credentials: { - accessKeyId, - secretAccessKey, - sessionToken, - }, + const bodyText = await req.clone().text(); + const bodyJson = JSON.parse(bodyText); + validateRequest(bodyJson, modelId); + const canonicalBody = JSON.stringify(bodyJson); + + const headers = await sign({ + method: "POST", + url: endpoint, + region: awsRegion, + accessKeyId: decryptedAccessKey, + secretAccessKey: decryptedSecretKey, + sessionToken: decryptedSessionToken, + body: canonicalBody, + service: "bedrock", }); - const body = (await req.json()) as ConverseRequest; - const command = new ConverseStreamCommand(formatRequestBody(body)); - const response = await client.send(command); - - if (!response.stream) { - throw new Error("No stream in response"); - } - - // If stream is false, accumulate the response and return as JSON - if (body.stream === false) { - let fullResponse = { - content: "", - }; + const res = await fetch(endpoint, { + method: "POST", + headers, + body: canonicalBody, + redirect: "manual", + // @ts-ignore + duplex: "half", + signal: controller.signal, + }); - const responseStream = - response.stream as AsyncIterable; - for await (const event of responseStream) { - if ( - "contentBlockDelta" in event && - event.contentBlockDelta?.delta && - "text" in event.contentBlockDelta.delta && - event.contentBlockDelta.delta.text - ) { - fullResponse.content += event.contentBlockDelta.delta.text; - } + if (!res.ok) { + const error = await res.text(); + try { + const errorJson = JSON.parse(error); + throw new Error(errorJson.message || error); + } catch { + throw new Error(error); } - - return NextResponse.json(fullResponse); } - // Otherwise, return streaming response + const transformedStream = transformBedrockStream(res.body!); const stream = new ReadableStream({ async start(controller) { try { - const responseStream = - response.stream as AsyncIterable; - for await (const event of responseStream) { - if ( - "contentBlockStart" in event && - event.contentBlockStart?.start?.toolUse && - event.contentBlockStart.contentBlockIndex !== undefined - ) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "content_block", - content_block: { - type: "tool_use", - id: event.contentBlockStart.start.toolUse.toolUseId, - name: event.contentBlockStart.start.toolUse.name, - }, - index: event.contentBlockStart.contentBlockIndex, - })}\n\n`, - ); - } else if ( - "contentBlockDelta" in event && - event.contentBlockDelta?.delta && - event.contentBlockDelta.contentBlockIndex !== undefined - ) { - const delta = event.contentBlockDelta.delta; - - if ("text" in delta && delta.text) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "content_block_delta", - delta: { - type: "text_delta", - text: delta.text, - }, - index: event.contentBlockDelta.contentBlockIndex, - })}\n\n`, - ); - } else if ("toolUse" in delta && delta.toolUse?.input) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "content_block_delta", - delta: { - type: "input_json_delta", - partial_json: delta.toolUse.input, - }, - index: event.contentBlockDelta.contentBlockIndex, - })}\n\n`, - ); - } - } else if ( - "contentBlockStop" in event && - event.contentBlockStop?.contentBlockIndex !== undefined - ) { - controller.enqueue( - `data: ${JSON.stringify({ - type: "content_block_stop", - index: event.contentBlockStop.contentBlockIndex, - })}\n\n`, - ); - } + for await (const chunk of transformedStream) { + controller.enqueue(new TextEncoder().encode(chunk)); } controller.close(); - } catch (error) { - console.error("[Bedrock] Stream error:", error); - controller.error(error); + } catch (err) { + controller.error(err); } }, }); @@ -289,16 +173,37 @@ export async function handle( "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", + "X-Accel-Buffering": "no", }, }); } catch (e) { - console.error("[Bedrock] Error:", e); + throw e; + } finally { + clearTimeout(timeoutId); + } +} + +export async function handle( + req: NextRequest, + { params }: { params: { path: string[] } }, +) { + if (req.method === "OPTIONS") { + return NextResponse.json({ body: "OK" }, { status: 200 }); + } + + const subpath = params.path.join("/"); + if (!ALLOWED_PATH.has(subpath)) { return NextResponse.json( - { - error: true, - message: e instanceof Error ? e.message : "Unknown error", - details: prettyObject(e), - }, + { error: true, msg: "you are not allowed to request " + subpath }, + { status: 403 }, + ); + } + + try { + return await requestBedrock(req); + } catch (e) { + return NextResponse.json( + { error: true, msg: e instanceof Error ? e.message : "Unknown error" }, { status: 500 }, ); } diff --git a/app/client/api.ts b/app/client/api.ts index 003cd88749d..feb1c93a212 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -23,7 +23,7 @@ import { SparkApi } from "./platforms/iflytek"; import { XAIApi } from "./platforms/xai"; import { ChatGLMApi } from "./platforms/glm"; import { BedrockApi } from "./platforms/bedrock"; -import { encrypt } from "../utils/encryption"; +import { encrypt } from "../utils/aws"; export const ROLES = ["system", "user", "assistant"] as const; export type MessageRole = (typeof ROLES)[number]; diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 8dca4eff5e3..4c6371b1714 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,30 +1,13 @@ -import { ApiPath } from "../../constant"; -import { ChatOptions, getHeaders, LLMApi, SpeechOptions } from "../api"; +import { ChatOptions, LLMApi, SpeechOptions } from "../api"; import { useAppConfig, usePluginStore, useChatStore, + useAccessStore, ChatMessageTool, } from "../../store"; -import { getMessageTextContent, isVisionModel } from "../../utils"; -import { fetch } from "../../utils/stream"; import { preProcessImageContent, stream } from "../../utils/chat"; -import { RequestPayload } from "./openai"; - -export type MultiBlockContent = { - type: "image" | "text"; - source?: { - type: string; - media_type: string; - data: string; - }; - text?: string; -}; - -export type AnthropicMessage = { - role: (typeof ClaudeMapper)[keyof typeof ClaudeMapper]; - content: string | MultiBlockContent[]; -}; +import { getMessageTextContent, isVisionModel } from "../../utils"; const ClaudeMapper = { assistant: "assistant", @@ -32,62 +15,52 @@ const ClaudeMapper = { system: "user", } as const; +interface ToolDefinition { + function?: { + name: string; + description?: string; + parameters?: any; + }; +} + export class BedrockApi implements LLMApi { speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); } extractMessage(res: any) { - console.log("[Response] Bedrock not stream response: ", res); - if (res.error) { - return "```\n" + JSON.stringify(res, null, 4) + "\n```"; - } - return res?.content ?? res; + if (res?.content?.[0]?.text) return res.content[0].text; + if (res?.messages?.[0]?.content?.[0]?.text) + return res.messages[0].content[0].text; + if (res?.delta?.text) return res.delta.text; + return ""; } - async chat(options: ChatOptions): Promise { + async chat(options: ChatOptions) { const visionModel = isVisionModel(options.config.model); - const shouldStream = !!options.config.stream; + const isClaude3 = options.config.model.startsWith("anthropic.claude-3"); + const modelConfig = { ...useAppConfig.getState().modelConfig, ...useChatStore.getState().currentSession().mask.modelConfig, - ...{ - model: options.config.model, - }, + model: options.config.model, }; - // try get base64image from local cache image_url - const messages: ChatOptions["messages"] = []; - for (const v of options.messages) { - const content = await preProcessImageContent(v.content); - messages.push({ role: v.role, content }); - } - - const keys = ["system", "user"]; - - // roles must alternate between "user" and "assistant" in claude, so add a fake assistant message between two user messages - for (let i = 0; i < messages.length - 1; i++) { - const message = messages[i]; - const nextMessage = messages[i + 1]; - - if (keys.includes(message.role) && keys.includes(nextMessage.role)) { - messages[i] = [ - message, - { - role: "assistant", - content: ";", - }, - ] as any; + let systemMessage = ""; + const messages = []; + for (const msg of options.messages) { + const content = await preProcessImageContent(msg.content); + if (msg.role === "system") { + systemMessage = getMessageTextContent(msg); + } else { + messages.push({ role: msg.role, content }); } } - const prompt = messages - .flat() - .filter((v) => { - if (!v.content) return false; - if (typeof v.content === "string" && !v.content.trim()) return false; - return true; - }) + const formattedMessages = messages + .filter( + (v) => v.content && (typeof v.content !== "string" || v.content.trim()), + ) .map((v) => { const { role, content } = v; const insideRole = ClaudeMapper[role] ?? "user"; @@ -95,200 +68,201 @@ export class BedrockApi implements LLMApi { if (!visionModel || typeof content === "string") { return { role: insideRole, - content: getMessageTextContent(v), + content: [{ type: "text", text: getMessageTextContent(v) }], }; } + return { role: insideRole, content: content .filter((v) => v.image_url || v.text) .map(({ type, text, image_url }) => { - if (type === "text") { - return { - type, - text: text!, - }; - } + if (type === "text") return { type, text: text! }; + const { url = "" } = image_url || {}; const colonIndex = url.indexOf(":"); const semicolonIndex = url.indexOf(";"); const comma = url.indexOf(","); - const mimeType = url.slice(colonIndex + 1, semicolonIndex); - const encodeType = url.slice(semicolonIndex + 1, comma); - const data = url.slice(comma + 1); - return { - type: "image" as const, + type: "image", source: { - type: encodeType, - media_type: mimeType, - data, + type: url.slice(semicolonIndex + 1, comma), + media_type: url.slice(colonIndex + 1, semicolonIndex), + data: url.slice(comma + 1), }, }; }), }; }); - if (prompt[0]?.role === "assistant") { - prompt.unshift({ - role: "user", - content: ";", - }); - } - const requestBody = { - modelId: options.config.model, - messages: prompt, - inferenceConfig: { - maxTokens: modelConfig.max_tokens, + anthropic_version: "bedrock-2023-05-31", + max_tokens: modelConfig.max_tokens, + messages: formattedMessages, + ...(systemMessage && { system: systemMessage }), + ...(modelConfig.temperature !== undefined && { temperature: modelConfig.temperature, - topP: modelConfig.top_p, - stopSequences: [], - }, - stream: shouldStream, + }), + ...(modelConfig.top_p !== undefined && { top_p: modelConfig.top_p }), + ...(isClaude3 && { top_k: 5 }), }; - const conversePath = `${ApiPath.Bedrock}/converse`; const controller = new AbortController(); options.onController?.(controller); - if (shouldStream) { - let currentToolUse: ChatMessageTool | null = null; - let index = -1; - const [tools, funcs] = usePluginStore - .getState() - .getAsTools( - useChatStore.getState().currentSession().mask?.plugin || [], - ); - return stream( - conversePath, - requestBody, - getHeaders(), - // @ts-ignore - tools.map((tool) => ({ - name: tool?.function?.name, - description: tool?.function?.description, - input_schema: tool?.function?.parameters, - })), - funcs, - controller, - // parseSSE - (text: string, runTools: ChatMessageTool[]) => { - // console.log("parseSSE", text, runTools); - let chunkJson: - | undefined - | { - type: "content_block_delta" | "content_block_stop"; - content_block?: { - type: "tool_use"; - id: string; - name: string; - }; - delta?: { - type: "text_delta" | "input_json_delta"; - text?: string; - partial_json?: string; - }; - index: number; - }; - chunkJson = JSON.parse(text); - - if (chunkJson?.content_block?.type == "tool_use") { - index += 1; - const id = chunkJson?.content_block.id; - const name = chunkJson?.content_block.name; - runTools.push({ - id, - type: "function", - function: { - name, - arguments: "", - }, - }); - } - if ( - chunkJson?.delta?.type == "input_json_delta" && - chunkJson?.delta?.partial_json - ) { - // @ts-ignore - runTools[index]["function"]["arguments"] += - chunkJson?.delta?.partial_json; - } - return chunkJson?.delta?.text; - }, - // processToolMessage, include tool_calls message and tool call results - ( - requestPayload: RequestPayload, - toolCallMessage: any, - toolCallResult: any[], - ) => { - // reset index value - index = -1; - // @ts-ignore - requestPayload?.messages?.splice( - // @ts-ignore - requestPayload?.messages?.length, - 0, - { - role: "assistant", - content: toolCallMessage.tool_calls.map( - (tool: ChatMessageTool) => ({ - type: "tool_use", - id: tool.id, - name: tool?.function?.name, - input: tool?.function?.arguments - ? JSON.parse(tool?.function?.arguments) - : {}, - }), - ), - }, - // @ts-ignore - ...toolCallResult.map((result) => ({ - role: "user", - content: [ - { - type: "tool_result", - tool_use_id: result.tool_call_id, - content: result.content, - }, - ], - })), - ); - }, - options, + const accessStore = useAccessStore.getState(); + if (!accessStore.isValidBedrock()) { + throw new Error( + "Invalid AWS credentials. Please check your configuration.", ); - } else { - const payload = { - method: "POST", - body: JSON.stringify(requestBody), - signal: controller.signal, - headers: { - ...getHeaders(), // get common headers - }, + } + + try { + const apiEndpoint = "/api/bedrock/chat"; + const headers = { + "Content-Type": "application/json", + "X-Region": accessStore.awsRegion, + "X-Access-Key": accessStore.awsAccessKey, + "X-Secret-Key": accessStore.awsSecretKey, + "X-Model-Id": modelConfig.model, + ...(accessStore.awsSessionToken && { + "X-Session-Token": accessStore.awsSessionToken, + }), }; - try { - controller.signal.onabort = () => - options.onFinish("", new Response(null, { status: 400 })); + if (options.config.stream) { + let index = -1; + let currentToolArgs = ""; + const [tools, funcs] = usePluginStore + .getState() + .getAsTools( + useChatStore.getState().currentSession().mask?.plugin || [], + ); - const res = await fetch(conversePath, payload); - const resJson = await res.json(); + return stream( + apiEndpoint, + requestBody, + headers, + (tools as ToolDefinition[]).map((tool) => ({ + name: tool?.function?.name, + description: tool?.function?.description, + input_schema: tool?.function?.parameters, + })), + funcs, + controller, + (text: string, runTools: ChatMessageTool[]) => { + try { + const chunkJson = JSON.parse(text); + if (chunkJson?.content_block?.type === "tool_use") { + index += 1; + currentToolArgs = ""; + const id = chunkJson.content_block?.id; + const name = chunkJson.content_block?.name; + if (id && name) { + runTools.push({ + id, + type: "function", + function: { name, arguments: "" }, + }); + } + } else if ( + chunkJson?.delta?.type === "input_json_delta" && + chunkJson.delta?.partial_json + ) { + currentToolArgs += chunkJson.delta.partial_json; + try { + JSON.parse(currentToolArgs); + if (index >= 0 && index < runTools.length) { + runTools[index].function!.arguments = currentToolArgs; + } + } catch (e) {} + } else if ( + chunkJson?.type === "content_block_stop" && + currentToolArgs && + index >= 0 && + index < runTools.length + ) { + try { + if (currentToolArgs.trim().endsWith(",")) { + currentToolArgs = currentToolArgs.slice(0, -1) + "}"; + } else if (!currentToolArgs.endsWith("}")) { + currentToolArgs += "}"; + } + JSON.parse(currentToolArgs); + runTools[index].function!.arguments = currentToolArgs; + } catch (e) {} + } + return this.extractMessage(chunkJson); + } catch (e) { + return ""; + } + }, + ( + requestPayload: any, + toolCallMessage: any, + toolCallResult: any[], + ) => { + index = -1; + currentToolArgs = ""; + if (requestPayload?.messages) { + requestPayload.messages.splice( + requestPayload.messages.length, + 0, + { + role: "assistant", + content: [ + { + type: "text", + text: JSON.stringify( + toolCallMessage.tool_calls.map( + (tool: ChatMessageTool) => ({ + type: "tool_use", + id: tool.id, + name: tool?.function?.name, + input: tool?.function?.arguments + ? JSON.parse(tool?.function?.arguments) + : {}, + }), + ), + ), + }, + ], + }, + ...toolCallResult.map((result) => ({ + role: "user", + content: [ + { + type: "text", + text: `Tool '${result.tool_call_id}' returned: ${result.content}`, + }, + ], + })), + ); + } + }, + options, + ); + } else { + const res = await fetch(apiEndpoint, { + method: "POST", + headers, + body: JSON.stringify(requestBody), + }); + const resJson = await res.json(); const message = this.extractMessage(resJson); options.onFinish(message, res); - } catch (e) { - console.error("failed to chat", e); - options.onError?.(e as Error); } + } catch (e) { + options.onError?.(e as Error); } } + async usage() { - return { - used: 0, - total: 0, - }; + return { used: 0, total: 0 }; } + async models() { return []; } diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 5f183c8c4dc..4b7a4798adf 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -11,7 +11,7 @@ import MaxIcon from "../icons/max.svg"; import MinIcon from "../icons/min.svg"; import Locale from "../locales"; -import { maskSensitiveValue } from "../utils/encryption"; +import { maskSensitiveValue } from "../utils/aws"; import { createRoot } from "react-dom/client"; import React, { diff --git a/app/constant.ts b/app/constant.ts index 822b4158e60..32b051c764e 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -241,9 +241,10 @@ export const ChatGLM = { }; export const Bedrock = { - ChatPath: "converse", + ChatPath: "model", // Simplified path since we'll append the full path in bedrock.ts ApiVersion: "2023-11-01", - getEndpoint: (region: string = "us-west-2") =>`https://bedrock-runtime.${region}.amazonaws.com`, + getEndpoint: (region: string = "us-west-2") => + `https://bedrock-runtime.${region}.amazonaws.com`, }; export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang @@ -326,19 +327,43 @@ const openaiModels = [ ]; const bedrockModels = [ + // Amazon Titan Models + "amazon.titan-text-express-v1", + "amazon.titan-text-lite-v1", + "amazon.titan-text-agile-v1", + + // Cohere Models + "cohere.command-light-text-v14", + "cohere.command-r-plus-v1:0", + "cohere.command-r-v1:0", + "cohere.command-text-v14", + // Claude Models "anthropic.claude-3-haiku-20240307-v1:0", "anthropic.claude-3-5-haiku-20241022-v1:0", "anthropic.claude-3-sonnet-20240229-v1:0", "anthropic.claude-3-5-sonnet-20241022-v2:0", "anthropic.claude-3-opus-20240229-v1:0", + "anthropic.claude-2.1", + "anthropic.claude-v2", + "anthropic.claude-v1", + "anthropic.claude-instant-v1", // Meta Llama Models - "us.meta.llama3-2-11b-instruct-v1:0", - "us.meta.llama3-2-90b-instruct-v1:0", - //Mistral + "meta.llama2-13b-chat-v1", + "meta.llama2-70b-chat-v1", + "meta.llama3-8b-instruct-v1:0", + "meta.llama3-2-11b-instruct-v1:0", + "meta.llama3-2-90b-instruct-v1:0", + + // Mistral Models + "mistral.mistral-7b-instruct-v0:2", "mistral.mistral-large-2402-v1:0", "mistral.mistral-large-2407-v1:0", + + // AI21 Models + "ai21.j2-mid-v1", + "ai21.j2-ultra-v1", ]; const googleModels = [ diff --git a/app/store/access.ts b/app/store/access.ts index b628d09e39a..75a8123a2ed 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -4,7 +4,6 @@ import { StoreKey, ApiPath, OPENAI_BASE_URL, - BEDROCK_BASE_URL, ANTHROPIC_BASE_URL, GEMINI_BASE_URL, BAIDU_BASE_URL, @@ -23,14 +22,12 @@ import { createPersistStore } from "../utils/store"; import { ensure } from "../utils/clone"; import { DEFAULT_CONFIG } from "./config"; import { getModelProvider } from "../utils/model"; -import { encrypt, decrypt } from "../utils/encryption"; let fetchState = 0; // 0 not fetch, 1 fetching, 2 done const isApp = getClientConfig()?.buildMode === "export"; const DEFAULT_OPENAI_URL = isApp ? OPENAI_BASE_URL : ApiPath.OpenAI; -const DEFAULT_BEDROCK_URL = isApp ? BEDROCK_BASE_URL : ApiPath.Bedrock; const DEFAULT_GOOGLE_URL = isApp ? GEMINI_BASE_URL : ApiPath.Google; @@ -64,13 +61,6 @@ const DEFAULT_ACCESS_STATE = { openaiUrl: DEFAULT_OPENAI_URL, openaiApiKey: "", - // bedrock - awsRegion: "", - awsAccessKey: "", - awsSecretKey: "", - awsSessionToken: "", - awsCognitoUser: false, - // azure azureUrl: "", azureApiKey: "", @@ -126,6 +116,12 @@ const DEFAULT_ACCESS_STATE = { chatglmUrl: DEFAULT_CHATGLM_URL, chatglmApiKey: "", + // aws bedrock + awsRegion: "", + awsAccessKey: "", + awsSecretKey: "", + awsSessionToken: "", + // server config needCode: true, hideUserApiKey: false, @@ -139,9 +135,6 @@ const DEFAULT_ACCESS_STATE = { edgeTTSVoiceName: "zh-CN-YunxiNeural", }; -type AccessState = typeof DEFAULT_ACCESS_STATE; -type BedrockCredentialKey = "awsAccessKey" | "awsSecretKey" | "awsSessionToken"; - export const useAccessStore = createPersistStore( { ...DEFAULT_ACCESS_STATE }, @@ -162,46 +155,6 @@ export const useAccessStore = createPersistStore( return ensure(get(), ["openaiApiKey"]); }, - isValidBedrock() { - const state = get(); - return ( - ensure(state, ["awsAccessKey", "awsSecretKey", "awsRegion"]) && - this.validateAwsCredentials( - this.getDecryptedAwsCredential("awsAccessKey"), - this.getDecryptedAwsCredential("awsSecretKey"), - state.awsRegion, - ) - ); - }, - - validateAwsCredentials( - accessKey: string, - secretKey: string, - region: string, - ) { - // Comprehensive AWS credential validation - const accessKeyRegex = /^(AKIA|A3T|ASIA)[A-Z0-9]{16}$/; - const regionRegex = /^[a-z]{2}-[a-z]+-\d+$/; - - return ( - accessKeyRegex.test(accessKey) && // Validate access key format - secretKey.length === 40 && // Validate secret key length - regionRegex.test(region) && // Validate region format - accessKey !== "" && - secretKey !== "" && - region !== "" - ); - }, - - setEncryptedAwsCredential(key: BedrockCredentialKey, value: string) { - set({ [key]: encrypt(value) }); - }, - - getDecryptedAwsCredential(key: BedrockCredentialKey): string { - const encryptedValue = get()[key]; - return encryptedValue ? decrypt(encryptedValue) : ""; - }, - isValidAzure() { return ensure(get(), ["azureUrl", "azureApiKey", "azureApiVersion"]); }, @@ -233,6 +186,7 @@ export const useAccessStore = createPersistStore( isValidMoonshot() { return ensure(get(), ["moonshotApiKey"]); }, + isValidIflytek() { return ensure(get(), ["iflytekApiKey"]); }, @@ -245,13 +199,16 @@ export const useAccessStore = createPersistStore( return ensure(get(), ["chatglmApiKey"]); }, + isValidBedrock() { + return ensure(get(), ["awsRegion", "awsAccessKey", "awsSecretKey"]); + }, + isAuthorized() { this.fetch(); // has token or has code or disabled access control return ( this.isValidOpenAI() || - this.isValidBedrock() || this.isValidAzure() || this.isValidGoogle() || this.isValidAnthropic() || @@ -263,6 +220,7 @@ export const useAccessStore = createPersistStore( this.isValidIflytek() || this.isValidXAI() || this.isValidChatGLM() || + this.isValidBedrock() || !this.enabledAccessControl() || (this.enabledAccessControl() && ensure(get(), ["accessCode"])) ); @@ -290,28 +248,8 @@ export const useAccessStore = createPersistStore( return res; }) .then((res: DangerConfig) => { - console.log("[Config] received DangerConfig server configuration"); + console.log("[Config] got config from server", res); set(() => ({ ...res })); - return res; - }) - .then((res: Partial) => { - console.log("[Config] received AccessState server configuration"); - // Encrypt Bedrock-related sensitive data before storing - const encryptedRes = { ...res }; - const keysToEncrypt: BedrockCredentialKey[] = [ - "awsAccessKey", - "awsSecretKey", - "awsSessionToken", - ]; - - keysToEncrypt.forEach((key) => { - const value = encryptedRes[key]; - if (value) { - (encryptedRes[key] as string) = encrypt(value as string); - } - }); - - set(() => ({ ...encryptedRes })); }) .catch(() => { console.error("[Config] failed to fetch config"); diff --git a/app/utils/aws.ts b/app/utils/aws.ts new file mode 100644 index 00000000000..dfa0a92fe64 --- /dev/null +++ b/app/utils/aws.ts @@ -0,0 +1,236 @@ +import SHA256 from "crypto-js/sha256"; +import HmacSHA256 from "crypto-js/hmac-sha256"; +import Hex from "crypto-js/enc-hex"; +import Utf8 from "crypto-js/enc-utf8"; +import { AES, enc } from "crypto-js"; + +const SECRET_KEY = + process.env.ENCRYPTION_KEY || + "your-secret-key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +if (!SECRET_KEY || SECRET_KEY.length < 32) { + throw new Error( + "ENCRYPTION_KEY environment variable must be set with at least 32 characters", + ); +} + +export function encrypt(data: string): string { + if (!data) return ""; + try { + return AES.encrypt(data, SECRET_KEY).toString(); + } catch (error) { + console.error("Encryption failed:", error); + return data; + } +} + +export function decrypt(encryptedData: string): string { + if (!encryptedData) return ""; + try { + // Try to decrypt + const bytes = AES.decrypt(encryptedData, SECRET_KEY); + const decrypted = bytes.toString(enc.Utf8); + + // If decryption results in empty string but input wasn't empty, + // the input might already be decrypted + if (!decrypted && encryptedData) { + return encryptedData; + } + return decrypted; + } catch (error) { + // If decryption fails, the input might already be decrypted + return encryptedData; + } +} + +export function maskSensitiveValue(value: string): string { + if (!value) return ""; + if (value.length <= 4) return value; + return "*".repeat(value.length - 4) + value.slice(-4); +} + +export interface SignParams { + method: string; + url: string; + region: string; + accessKeyId: string; + secretAccessKey: string; + sessionToken?: string; + body: string; + service: string; +} + +function hmac( + key: string | CryptoJS.lib.WordArray, + data: string, +): CryptoJS.lib.WordArray { + if (typeof key === "string") { + key = Utf8.parse(key); + } + return HmacSHA256(data, key); +} + +function getSigningKey( + secretKey: string, + dateStamp: string, + region: string, + service: string, +): CryptoJS.lib.WordArray { + const kDate = hmac("AWS4" + secretKey, dateStamp); + const kRegion = hmac(kDate, region); + const kService = hmac(kRegion, service); + const kSigning = hmac(kService, "aws4_request"); + return kSigning; +} + +function normalizeHeaderValue(value: string): string { + return value.replace(/\s+/g, " ").trim(); +} + +function encodeURIComponent_RFC3986(str: string): string { + return encodeURIComponent(str) + .replace( + /[!'()*]/g, + (c) => "%" + c.charCodeAt(0).toString(16).toUpperCase(), + ) + .replace(/[-_.~]/g, (c) => c); // RFC 3986 unreserved characters +} + +function encodeURI_RFC3986(uri: string): string { + // Handle empty or root path + if (!uri || uri === "/") return ""; + + // Split the path into segments, preserving empty segments for double slashes + const segments = uri.split("/"); + + return segments + .map((segment) => { + if (!segment) return ""; + + // Special handling for Bedrock model paths + if (segment.includes("model/")) { + const parts = segment.split(/(model\/)/); + return parts + .map((part) => { + if (part === "model/") return part; + // Handle the model identifier part + if (part.includes(".") || part.includes(":")) { + return part + .split(/([.:])/g) + .map((subpart, i) => { + if (i % 2 === 1) return subpart; // Don't encode separators + return encodeURIComponent_RFC3986(subpart); + }) + .join(""); + } + return encodeURIComponent_RFC3986(part); + }) + .join(""); + } + + // Handle invoke-with-response-stream without encoding + if (segment === "invoke-with-response-stream") { + return segment; + } + + return encodeURIComponent_RFC3986(segment); + }) + .join("/"); +} + +export async function sign({ + method, + url, + region, + accessKeyId, + secretAccessKey, + sessionToken, + body, + service, +}: SignParams): Promise> { + const endpoint = new URL(url); + const canonicalUri = "/" + encodeURI_RFC3986(endpoint.pathname.slice(1)); + const canonicalQueryString = endpoint.search.slice(1); // Remove leading '?' + + // Create a date stamp and time stamp in ISO8601 format + const now = new Date(); + const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, ""); + const dateStamp = amzDate.slice(0, 8); + + // Calculate the hash of the payload + const payloadHash = SHA256(body).toString(Hex); + + // Define headers with normalized values + const headers: Record = { + accept: "application/vnd.amazon.eventstream", + "content-type": "application/json", + host: endpoint.host, + "x-amz-content-sha256": payloadHash, + "x-amz-date": amzDate, + "x-amzn-bedrock-accept": "*/*", + }; + + // Add session token if present + if (sessionToken) { + headers["x-amz-security-token"] = sessionToken; + } + + // Get sorted header keys (case-insensitive) + const sortedHeaderKeys = Object.keys(headers).sort((a, b) => + a.toLowerCase().localeCompare(b.toLowerCase()), + ); + + // Create canonical headers string with normalized values + const canonicalHeaders = sortedHeaderKeys + .map( + (key) => `${key.toLowerCase()}:${normalizeHeaderValue(headers[key])}\n`, + ) + .join(""); + + // Create signed headers string + const signedHeaders = sortedHeaderKeys + .map((key) => key.toLowerCase()) + .join(";"); + + // Create canonical request + const canonicalRequest = [ + method.toUpperCase(), + canonicalUri, + canonicalQueryString, + canonicalHeaders, + signedHeaders, + payloadHash, + ].join("\n"); + + // Create the string to sign + const algorithm = "AWS4-HMAC-SHA256"; + const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`; + const stringToSign = [ + algorithm, + amzDate, + credentialScope, + SHA256(canonicalRequest).toString(Hex), + ].join("\n"); + + // Calculate the signature + const signingKey = getSigningKey(secretAccessKey, dateStamp, region, service); + const signature = hmac(signingKey, stringToSign).toString(Hex); + + // Create the authorization header + const authorization = [ + `${algorithm} Credential=${accessKeyId}/${credentialScope}`, + `SignedHeaders=${signedHeaders}`, + `Signature=${signature}`, + ].join(", "); + + // Return headers with proper casing for the request + return { + Accept: headers.accept, + "Content-Type": headers["content-type"], + Host: headers.host, + "X-Amz-Content-Sha256": headers["x-amz-content-sha256"], + "X-Amz-Date": headers["x-amz-date"], + "X-Amzn-Bedrock-Accept": headers["x-amzn-bedrock-accept"], + ...(sessionToken && { "X-Amz-Security-Token": sessionToken }), + Authorization: authorization, + }; +} diff --git a/app/utils/encryption.ts b/app/utils/encryption.ts deleted file mode 100644 index ef750d9abd1..00000000000 --- a/app/utils/encryption.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { AES, enc } from "crypto-js"; - -const SECRET_KEY = - process.env.ENCRYPTION_KEY || - "your-secret-key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Replace this with a secure, randomly generated key -if (!SECRET_KEY || SECRET_KEY.length < 32) { - throw new Error( - "ENCRYPTION_KEY environment variable must be set with at least 32 characters", - ); -} - -export function encrypt(data: string): string { - try { - return AES.encrypt(data, SECRET_KEY).toString(); - } catch (error) { - console.error("Encryption failed:", error); - return data; // Fallback to unencrypted data if encryption fails - } -} - -export function decrypt(encryptedData: string): string { - try { - const bytes = AES.decrypt(encryptedData, SECRET_KEY); - return bytes.toString(enc.Utf8); - } catch (error) { - console.error("Decryption failed:", error); - return encryptedData; // Fallback to the original data if decryption fails - } -} - -export function maskSensitiveValue(value: string): string { - if (!value) return ""; - if (value.length <= 4) return value; - return "*".repeat(value.length - 4) + value.slice(-4); -} diff --git a/package.json b/package.json index 304aa40b43d..57a63bcac43 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "test:ci": "jest --ci" }, "dependencies": { - "@aws-sdk/client-bedrock-runtime": "^3.679.0", "@fortaine/fetch-event-source": "^3.0.6", "@hello-pangea/dnd": "^16.5.0", "@next/third-parties": "^14.1.0", From bd68df1d9b046ba17a87b2dfc99d58a56e17dad1 Mon Sep 17 00:00:00 2001 From: glay Date: Fri, 22 Nov 2024 06:33:39 +0800 Subject: [PATCH 28/72] =?UTF-8?q?=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20=20?= =?UTF-8?q?=20=20app/api/bedrock.ts=20=09=E4=BF=AE=E6=94=B9=EF=BC=9A=20=20?= =?UTF-8?q?=20=20=20app/client/platforms/bedrock.ts=20=09=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=20=20=20app/constant.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 158 ++++++++++++++++++++++--- app/client/platforms/bedrock.ts | 197 ++++++++++++++++++++++++++------ app/constant.ts | 30 ++--- 3 files changed, 308 insertions(+), 77 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 1417e9475b8..d0da02ed025 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -7,32 +7,117 @@ function parseEventData(chunk: Uint8Array): any { const decoder = new TextDecoder(); const text = decoder.decode(chunk); try { - return JSON.parse(text); + const parsed = JSON.parse(text); + // AWS Bedrock wraps the response in a 'body' field + if (typeof parsed.body === "string") { + try { + return JSON.parse(parsed.body); + } catch (e) { + return { output: parsed.body }; + } + } + return parsed.body || parsed; } catch (e) { + console.error("Error parsing event data:", e); try { + // Handle base64 encoded responses const base64Match = text.match(/:"([A-Za-z0-9+/=]+)"/); if (base64Match) { const decoded = Buffer.from(base64Match[1], "base64").toString("utf-8"); - return JSON.parse(decoded); + try { + return JSON.parse(decoded); + } catch (e) { + return { output: decoded }; + } } + + // Handle event-type responses const eventMatch = text.match(/:event-type[^\{]+({.*})/); if (eventMatch) { - return JSON.parse(eventMatch[1]); + try { + return JSON.parse(eventMatch[1]); + } catch (e) { + return { output: eventMatch[1] }; + } + } + + // Handle plain text responses + if (text.trim()) { + // Clean up any malformed JSON characters + const cleanText = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); + return { output: cleanText }; } - } catch (innerError) {} + } catch (innerError) { + console.error("Error in fallback parsing:", innerError); + } } return null; } -async function* transformBedrockStream(stream: ReadableStream) { +async function* transformBedrockStream( + stream: ReadableStream, + modelId: string, +) { const reader = stream.getReader(); + let buffer = ""; + try { while (true) { const { done, value } = await reader.read(); - if (done) break; + if (done) { + if (buffer) { + yield `data: ${JSON.stringify({ + delta: { text: buffer }, + })}\n\n`; + } + break; + } const parsed = parseEventData(value); - if (parsed) { + if (!parsed) continue; + + console.log("Parsed response:", JSON.stringify(parsed, null, 2)); + + // Handle Titan models + if (modelId.startsWith("amazon.titan")) { + const text = parsed.outputText || ""; + if (text) { + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + // Handle LLaMA3 models + else if (modelId.startsWith("us.meta.llama3")) { + let text = ""; + if (parsed.generation) { + text = parsed.generation; + } else if (parsed.output) { + text = parsed.output; + } else if (typeof parsed === "string") { + text = parsed; + } + + if (text) { + // Clean up any control characters or invalid JSON characters + text = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + // Handle Mistral models + else if (modelId.startsWith("mistral.mistral")) { + const text = + parsed.output || parsed.outputs?.[0]?.text || parsed.completion || ""; + if (text) { + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + // Handle Claude models + else if (modelId.startsWith("anthropic.claude")) { if (parsed.type === "content_block_delta") { if (parsed.delta?.type === "text_delta") { yield `data: ${JSON.stringify({ @@ -66,6 +151,8 @@ async function* transformBedrockStream(stream: ReadableStream) { function validateRequest(body: any, modelId: string): void { if (!modelId) throw new Error("Model ID is required"); + const bodyContent = body.body || body; + if (modelId.startsWith("anthropic.claude")) { if ( !body.anthropic_version || @@ -82,13 +169,14 @@ function validateRequest(body: any, modelId: string): void { } else if (typeof body.prompt !== "string") { throw new Error("prompt is required for Claude 2 and earlier"); } - } else if (modelId.startsWith("meta.llama")) { - if (!body.prompt) throw new Error("Llama requires a prompt"); + } else if (modelId.startsWith("us.meta.llama3")) { + if (!bodyContent.prompt) { + throw new Error("prompt is required for LLaMA3 models"); + } } else if (modelId.startsWith("mistral.mistral")) { - if (!Array.isArray(body.messages)) - throw new Error("Mistral requires a messages array"); + if (!bodyContent.prompt) throw new Error("Mistral requires a prompt"); } else if (modelId.startsWith("amazon.titan")) { - if (!body.inputText) throw new Error("Titan requires inputText"); + if (!bodyContent.inputText) throw new Error("Titan requires inputText"); } } @@ -114,14 +202,35 @@ async function requestBedrock(req: NextRequest) { throw new Error("Failed to decrypt AWS credentials"); } - const endpoint = `https://bedrock-runtime.${awsRegion}.amazonaws.com/model/${modelId}/invoke-with-response-stream`; + // Construct the base endpoint + const baseEndpoint = `https://bedrock-runtime.${awsRegion}.amazonaws.com`; + + // Set up timeout const timeoutId = setTimeout(() => controller.abort(), 10 * 60 * 1000); try { + // Determine the endpoint and request body based on model type + let endpoint; + let requestBody; + let additionalHeaders = {}; + const bodyText = await req.clone().text(); + if (!bodyText) { + throw new Error("Request body is empty"); + } + const bodyJson = JSON.parse(bodyText); validateRequest(bodyJson, modelId); - const canonicalBody = JSON.stringify(bodyJson); + + // For all other models, use standard endpoint + endpoint = `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; + requestBody = JSON.stringify(bodyJson.body || bodyJson); + + console.log("Request to AWS Bedrock:", { + endpoint, + modelId, + body: requestBody, + }); const headers = await sign({ method: "POST", @@ -130,14 +239,17 @@ async function requestBedrock(req: NextRequest) { accessKeyId: decryptedAccessKey, secretAccessKey: decryptedSecretKey, sessionToken: decryptedSessionToken, - body: canonicalBody, + body: requestBody, service: "bedrock", }); const res = await fetch(endpoint, { method: "POST", - headers, - body: canonicalBody, + headers: { + ...headers, + ...additionalHeaders, + }, + body: requestBody, redirect: "manual", // @ts-ignore duplex: "half", @@ -146,15 +258,20 @@ async function requestBedrock(req: NextRequest) { if (!res.ok) { const error = await res.text(); + console.error("AWS Bedrock error response:", error); try { const errorJson = JSON.parse(error); throw new Error(errorJson.message || error); } catch { - throw new Error(error); + throw new Error(error || "Failed to get response from Bedrock"); } } - const transformedStream = transformBedrockStream(res.body!); + if (!res.body) { + throw new Error("Empty response from Bedrock"); + } + + const transformedStream = transformBedrockStream(res.body, modelId); const stream = new ReadableStream({ async start(controller) { try { @@ -163,6 +280,7 @@ async function requestBedrock(req: NextRequest) { } controller.close(); } catch (err) { + console.error("Stream error:", err); controller.error(err); } }, @@ -177,6 +295,7 @@ async function requestBedrock(req: NextRequest) { }, }); } catch (e) { + console.error("Request error:", e); throw e; } finally { clearTimeout(timeoutId); @@ -202,6 +321,7 @@ export async function handle( try { return await requestBedrock(req); } catch (e) { + console.error("Handler error:", e); return NextResponse.json( { error: true, msg: e instanceof Error ? e.message : "Unknown error" }, { status: 500 }, diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 4c6371b1714..c13aa44102c 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,4 +1,11 @@ -import { ChatOptions, LLMApi, SpeechOptions } from "../api"; +import { + ChatOptions, + LLMApi, + SpeechOptions, + RequestMessage, + MultimodalContent, + MessageRole, +} from "../api"; import { useAppConfig, usePluginStore, @@ -15,6 +22,8 @@ const ClaudeMapper = { system: "user", } as const; +type ClaudeRole = keyof typeof ClaudeMapper; + interface ToolDefinition { function?: { name: string; @@ -28,44 +37,131 @@ export class BedrockApi implements LLMApi { throw new Error("Speech not implemented for Bedrock."); } - extractMessage(res: any) { - if (res?.content?.[0]?.text) return res.content[0].text; - if (res?.messages?.[0]?.content?.[0]?.text) - return res.messages[0].content[0].text; - if (res?.delta?.text) return res.delta.text; - return ""; + extractMessage(res: any, modelId: string = "") { + try { + // Handle Titan models + if (modelId.startsWith("amazon.titan")) { + if (res?.delta?.text) return res.delta.text; + return res?.outputText || ""; + } + + // Handle LLaMA models + if (modelId.startsWith("us.meta.llama3")) { + if (res?.delta?.text) return res.delta.text; + if (res?.generation) return res.generation; + if (typeof res?.output === "string") return res.output; + if (typeof res === "string") return res; + return ""; + } + + // Handle Mistral models + if (modelId.startsWith("mistral.mistral")) { + if (res?.delta?.text) return res.delta.text; + return res?.outputs?.[0]?.text || res?.output || res?.completion || ""; + } + + // Handle Claude models and fallback cases + if (res?.content?.[0]?.text) return res.content[0].text; + if (res?.messages?.[0]?.content?.[0]?.text) + return res.messages[0].content[0].text; + if (res?.delta?.text) return res.delta.text; + if (res?.completion) return res.completion; + if (res?.generation) return res.generation; + if (res?.outputText) return res.outputText; + if (res?.output) return res.output; + + if (typeof res === "string") return res; + + return ""; + } catch (e) { + console.error("Error extracting message:", e); + return ""; + } } - async chat(options: ChatOptions) { - const visionModel = isVisionModel(options.config.model); - const isClaude3 = options.config.model.startsWith("anthropic.claude-3"); + formatRequestBody( + messages: RequestMessage[], + systemMessage: string, + modelConfig: any, + ) { + const model = modelConfig.model; - const modelConfig = { - ...useAppConfig.getState().modelConfig, - ...useChatStore.getState().currentSession().mask.modelConfig, - model: options.config.model, - }; + // Handle Titan models + if (model.startsWith("amazon.titan")) { + const allMessages = systemMessage + ? [ + { role: "system" as MessageRole, content: systemMessage }, + ...messages, + ] + : messages; + const inputText = allMessages + .map((m) => `${m.role}: ${getMessageTextContent(m)}`) + .join("\n"); + return { + body: { + inputText, + textGenerationConfig: { + maxTokenCount: modelConfig.max_tokens, + temperature: modelConfig.temperature, + stopSequences: [], + }, + }, + }; + } - let systemMessage = ""; - const messages = []; - for (const msg of options.messages) { - const content = await preProcessImageContent(msg.content); - if (msg.role === "system") { - systemMessage = getMessageTextContent(msg); - } else { - messages.push({ role: msg.role, content }); - } + // Handle LLaMA3 models - simplified format + if (model.startsWith("us.meta.llama3")) { + const allMessages = systemMessage + ? [ + { role: "system" as MessageRole, content: systemMessage }, + ...messages, + ] + : messages; + + const prompt = allMessages + .map((m) => `${m.role}: ${getMessageTextContent(m)}`) + .join("\n"); + + return { + contentType: "application/json", + accept: "application/json", + body: { + prompt, + }, + }; + } + + // Handle Mistral models + if (model.startsWith("mistral.mistral")) { + const allMessages = systemMessage + ? [ + { role: "system" as MessageRole, content: systemMessage }, + ...messages, + ] + : messages; + const prompt = allMessages + .map((m) => `${m.role}: ${getMessageTextContent(m)}`) + .join("\n"); + return { + body: { + prompt, + temperature: modelConfig.temperature || 0.7, + max_tokens: modelConfig.max_tokens || 4096, + }, + }; } + // Handle Claude models (existing implementation) + const isClaude3 = model.startsWith("anthropic.claude-3"); const formattedMessages = messages .filter( (v) => v.content && (typeof v.content !== "string" || v.content.trim()), ) .map((v) => { const { role, content } = v; - const insideRole = ClaudeMapper[role] ?? "user"; + const insideRole = ClaudeMapper[role as ClaudeRole] ?? "user"; - if (!visionModel || typeof content === "string") { + if (!isVisionModel(model) || typeof content === "string") { return { role: insideRole, content: [{ type: "text", text: getMessageTextContent(v) }], @@ -74,7 +170,7 @@ export class BedrockApi implements LLMApi { return { role: insideRole, - content: content + content: (content as MultimodalContent[]) .filter((v) => v.image_url || v.text) .map(({ type, text, image_url }) => { if (type === "text") return { type, text: text! }; @@ -96,17 +192,40 @@ export class BedrockApi implements LLMApi { }; }); - const requestBody = { + return { anthropic_version: "bedrock-2023-05-31", max_tokens: modelConfig.max_tokens, messages: formattedMessages, ...(systemMessage && { system: systemMessage }), - ...(modelConfig.temperature !== undefined && { - temperature: modelConfig.temperature, - }), - ...(modelConfig.top_p !== undefined && { top_p: modelConfig.top_p }), + temperature: modelConfig.temperature, ...(isClaude3 && { top_k: 5 }), }; + } + + async chat(options: ChatOptions) { + const modelConfig = { + ...useAppConfig.getState().modelConfig, + ...useChatStore.getState().currentSession().mask.modelConfig, + model: options.config.model, + }; + + let systemMessage = ""; + const messages = []; + for (const msg of options.messages) { + const content = await preProcessImageContent(msg.content); + if (msg.role === "system") { + systemMessage = getMessageTextContent(msg); + } else { + messages.push({ role: msg.role, content }); + } + } + + const requestBody = this.formatRequestBody( + messages, + systemMessage, + modelConfig, + ); + // console.log("Request body:", JSON.stringify(requestBody, null, 2)); const controller = new AbortController(); options.onController?.(controller); @@ -121,7 +240,8 @@ export class BedrockApi implements LLMApi { try { const apiEndpoint = "/api/bedrock/chat"; const headers = { - "Content-Type": "application/json", + "Content-Type": requestBody.contentType || "application/json", + Accept: requestBody.accept || "application/json", "X-Region": accessStore.awsRegion, "X-Access-Key": accessStore.awsAccessKey, "X-Secret-Key": accessStore.awsSecretKey, @@ -154,6 +274,7 @@ export class BedrockApi implements LLMApi { (text: string, runTools: ChatMessageTool[]) => { try { const chunkJson = JSON.parse(text); + // console.log("Received chunk:", JSON.stringify(chunkJson, null, 2)); if (chunkJson?.content_block?.type === "tool_use") { index += 1; currentToolArgs = ""; @@ -193,8 +314,11 @@ export class BedrockApi implements LLMApi { runTools[index].function!.arguments = currentToolArgs; } catch (e) {} } - return this.extractMessage(chunkJson); + const message = this.extractMessage(chunkJson, modelConfig.model); + // console.log("Extracted message:", message); + return message; } catch (e) { + console.error("Error parsing chunk:", e); return ""; } }, @@ -251,10 +375,13 @@ export class BedrockApi implements LLMApi { }); const resJson = await res.json(); - const message = this.extractMessage(resJson); + // console.log("Response:", JSON.stringify(resJson, null, 2)); + const message = this.extractMessage(resJson, modelConfig.model); + // console.log("Extracted message:", message); options.onFinish(message, res); } } catch (e) { + console.error("Chat error:", e); options.onError?.(e as Error); } } diff --git a/app/constant.ts b/app/constant.ts index 32b051c764e..5ac58916796 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -330,40 +330,24 @@ const bedrockModels = [ // Amazon Titan Models "amazon.titan-text-express-v1", "amazon.titan-text-lite-v1", - "amazon.titan-text-agile-v1", - - // Cohere Models - "cohere.command-light-text-v14", - "cohere.command-r-plus-v1:0", - "cohere.command-r-v1:0", - "cohere.command-text-v14", - + "amazon.titan-tg1-large", // Claude Models "anthropic.claude-3-haiku-20240307-v1:0", "anthropic.claude-3-5-haiku-20241022-v1:0", "anthropic.claude-3-sonnet-20240229-v1:0", "anthropic.claude-3-5-sonnet-20241022-v2:0", "anthropic.claude-3-opus-20240229-v1:0", - "anthropic.claude-2.1", - "anthropic.claude-v2", - "anthropic.claude-v1", - "anthropic.claude-instant-v1", - // Meta Llama Models - "meta.llama2-13b-chat-v1", - "meta.llama2-70b-chat-v1", - "meta.llama3-8b-instruct-v1:0", - "meta.llama3-2-11b-instruct-v1:0", - "meta.llama3-2-90b-instruct-v1:0", - + "us.meta.llama3-1-8b-instruct-v1:0", + "us.meta.llama3-1-70b-instruct-v1:0", + "us.meta.llama3-2-1b-instruct-v1:0", + "us.meta.llama3-2-3b-instruct-v1:0", + "us.meta.llama3-2-11b-instruct-v1:0", + "us.meta.llama3-2-90b-instruct-v1:0", // Mistral Models "mistral.mistral-7b-instruct-v0:2", "mistral.mistral-large-2402-v1:0", "mistral.mistral-large-2407-v1:0", - - // AI21 Models - "ai21.j2-mid-v1", - "ai21.j2-ultra-v1", ]; const googleModels = [ From b0c1ccd0a0a02bf4ba2f34a1148f7480ab756482 Mon Sep 17 00:00:00 2001 From: glay Date: Fri, 22 Nov 2024 22:03:42 +0800 Subject: [PATCH 29/72] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=92=8C=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=8F=AF=E4=BB=A5=E8=AE=BE=E7=BD=AE=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=95=B0=E6=8D=AE=E7=9A=84=E5=AF=86=E9=92=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.template | 7 +++-- app/api/auth.ts | 31 +++++-------------- app/api/bedrock.ts | 54 +++++++++++++++++++------------- app/client/api.ts | 55 +++++++++++++++++---------------- app/client/platforms/bedrock.ts | 26 +++++++--------- app/components/chat.module.scss | 15 ++------- app/components/settings.tsx | 34 ++++++++++---------- app/config/server.ts | 13 +++++--- app/locales/cn.ts | 12 +++---- app/locales/en.ts | 12 +++---- app/store/access.ts | 13 ++++++-- app/utils/aws.ts | 24 +++++--------- 12 files changed, 140 insertions(+), 156 deletions(-) diff --git a/.env.template b/.env.template index 524fc3da202..1f477319594 100644 --- a/.env.template +++ b/.env.template @@ -70,8 +70,9 @@ WHITE_WEBDAV_ENDPOINTS= ### bedrock (optional) AWS_REGION= -AWS_ACCESS_KEY= +AWS_ACCESS_KEY=AKIA AWS_SECRET_KEY= - -### Assign this with a secure, randomly generated key +### Assign this with a secure, randomly generated key; +### Generate a secure, random key that is at least 32 characters long. You can use a password generator or a command like this: +### openssl rand -base64 32 ENCRYPTION_KEY= \ No newline at end of file diff --git a/app/api/auth.ts b/app/api/auth.ts index e56f85820c0..044cd62f2b7 100644 --- a/app/api/auth.ts +++ b/app/api/auth.ts @@ -52,29 +52,6 @@ export function auth(req: NextRequest, modelProvider: ModelProvider) { msg: "you are not allowed to access with your own api key", }; } - // Special handling for Bedrock - if (modelProvider === ModelProvider.Bedrock) { - const region = serverConfig.awsRegion; - const accessKeyId = serverConfig.awsAccessKey; - const secretAccessKey = serverConfig.awsSecretKey; - - console.log("[Auth] Bedrock credentials:", { - region, - accessKeyId: accessKeyId ? "***" : undefined, - secretKey: secretAccessKey ? "***" : undefined, - }); - - // Check if AWS credentials are provided - if (!region || !accessKeyId || !secretAccessKey) { - return { - error: true, - msg: "Missing AWS credentials. Please configure Region, Access Key ID, and Secret Access Key in settings.", - }; - } - - return { error: false }; - } - // if user does not provide an api key, inject system api key if (!apiKey) { const serverConfig = getServerSideConfig(); @@ -120,6 +97,14 @@ export function auth(req: NextRequest, modelProvider: ModelProvider) { case ModelProvider.ChatGLM: systemApiKey = serverConfig.chatglmApiKey; break; + case ModelProvider.Bedrock: + systemApiKey = + serverConfig.awsRegion + + ":" + + serverConfig.awsAccessKey + + ":" + + serverConfig.awsSecretKey; + break; case ModelProvider.GPT: default: if (req.nextUrl.pathname.includes("azure/deployments")) { diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index d0da02ed025..e6b039ae84b 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,5 +1,6 @@ import { NextRequest, NextResponse } from "next/server"; -import { sign, decrypt } from "../utils/aws"; +import { sign } from "../utils/aws"; +import { getServerSideConfig } from "../config/server"; const ALLOWED_PATH = new Set(["chat", "models"]); @@ -18,7 +19,7 @@ function parseEventData(chunk: Uint8Array): any { } return parsed.body || parsed; } catch (e) { - console.error("Error parsing event data:", e); + // console.error("Error parsing event data:", e); try { // Handle base64 encoded responses const base64Match = text.match(/:"([A-Za-z0-9+/=]+)"/); @@ -76,7 +77,7 @@ async function* transformBedrockStream( const parsed = parseEventData(value); if (!parsed) continue; - console.log("Parsed response:", JSON.stringify(parsed, null, 2)); + // console.log("Parsed response:", JSON.stringify(parsed, null, 2)); // Handle Titan models if (modelId.startsWith("amazon.titan")) { @@ -182,24 +183,36 @@ function validateRequest(body: any, modelId: string): void { async function requestBedrock(req: NextRequest) { const controller = new AbortController(); - const awsRegion = req.headers.get("X-Region") ?? ""; - const awsAccessKey = req.headers.get("X-Access-Key") ?? ""; - const awsSecretKey = req.headers.get("X-Secret-Key") ?? ""; - const awsSessionToken = req.headers.get("X-Session-Token"); - const modelId = req.headers.get("X-Model-Id") ?? ""; - if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { - throw new Error("Missing required AWS credentials or model ID"); - } + // Get AWS credentials from server config first + const config = getServerSideConfig(); + let awsRegion = config.awsRegion; + let awsAccessKey = config.awsAccessKey; + let awsSecretKey = config.awsSecretKey; + let modelId = ""; + + // If server-side credentials are not available, parse from Authorization header + if (!awsRegion || !awsAccessKey || !awsSecretKey) { + const authHeader = req.headers.get("Authorization"); + if (!authHeader || !authHeader.startsWith("Bearer ")) { + throw new Error("Missing or invalid Authorization header"); + } + + const [_, credentials] = authHeader.split("Bearer "); + const [region, accessKey, secretKey, model] = credentials.split(","); - const decryptedAccessKey = decrypt(awsAccessKey); - const decryptedSecretKey = decrypt(awsSecretKey); - const decryptedSessionToken = awsSessionToken - ? decrypt(awsSessionToken) - : undefined; + if (!region || !accessKey || !secretKey || !model) { + throw new Error("Invalid Authorization header format"); + } + + awsRegion = region; + awsAccessKey = accessKey; + awsSecretKey = secretKey; + modelId = model; + } - if (!decryptedAccessKey || !decryptedSecretKey) { - throw new Error("Failed to decrypt AWS credentials"); + if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { + throw new Error("Missing required AWS credentials or model ID"); } // Construct the base endpoint @@ -236,9 +249,8 @@ async function requestBedrock(req: NextRequest) { method: "POST", url: endpoint, region: awsRegion, - accessKeyId: decryptedAccessKey, - secretAccessKey: decryptedSecretKey, - sessionToken: decryptedSessionToken, + accessKeyId: awsAccessKey, + secretAccessKey: awsSecretKey, body: requestBody, service: "bedrock", }); diff --git a/app/client/api.ts b/app/client/api.ts index feb1c93a212..eb0e4270d73 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -23,7 +23,6 @@ import { SparkApi } from "./platforms/iflytek"; import { XAIApi } from "./platforms/xai"; import { ChatGLMApi } from "./platforms/glm"; import { BedrockApi } from "./platforms/bedrock"; -import { encrypt } from "../utils/aws"; export const ROLES = ["system", "user", "assistant"] as const; export type MessageRole = (typeof ROLES)[number]; @@ -258,8 +257,6 @@ export function getHeaders(ignoreHeaders: boolean = false) { const isEnabledAccessControl = accessStore.enabledAccessControl(); const apiKey = isGoogle ? accessStore.googleApiKey - : isBedrock - ? accessStore.awsAccessKey // Use AWS access key for Bedrock : isAzure ? accessStore.azureApiKey : isAnthropic @@ -278,6 +275,18 @@ export function getHeaders(ignoreHeaders: boolean = false) { ? accessStore.iflytekApiKey && accessStore.iflytekApiSecret ? accessStore.iflytekApiKey + ":" + accessStore.iflytekApiSecret : "" + : isBedrock + ? accessStore.awsRegion && + accessStore.awsAccessKey && + accessStore.awsSecretKey + ? accessStore.awsRegion + + "," + + accessStore.awsAccessKey + + "," + + accessStore.awsSecretKey + + "," + + modelConfig.model + : "" : accessStore.openaiApiKey; return { isBedrock, @@ -303,13 +312,10 @@ export function getHeaders(ignoreHeaders: boolean = false) { ? "x-api-key" : isGoogle ? "x-goog-api-key" - : isBedrock - ? "x-api-key" : "Authorization"; } const { - isBedrock, isGoogle, isAzure, isAnthropic, @@ -322,28 +328,23 @@ export function getHeaders(ignoreHeaders: boolean = false) { const authHeader = getAuthHeader(); - if (isBedrock) { - // Secure encryption of AWS credentials using the new encryption utility - headers["X-Region"] = encrypt(accessStore.awsRegion); - headers["X-Access-Key"] = encrypt(accessStore.awsAccessKey); - headers["X-Secret-Key"] = encrypt(accessStore.awsSecretKey); - - if (accessStore.awsSessionToken) { - headers["X-Session-Token"] = encrypt(accessStore.awsSessionToken); - } - } else { - const bearerToken = getBearerToken( - apiKey, - isAzure || isAnthropic || isGoogle, + // if (isBedrock) { + // // Secure encryption of AWS credentials using the new encryption utility + // headers["X-Region"] = encrypt(accessStore.awsRegion); + // headers["X-Access-Key"] = encrypt(accessStore.awsAccessKey); + // headers["X-Secret-Key"] = encrypt(accessStore.awsSecretKey); + // } else { + const bearerToken = getBearerToken( + apiKey, + isAzure || isAnthropic || isGoogle, + ); + + if (bearerToken) { + headers[authHeader] = bearerToken; + } else if (isEnabledAccessControl && validString(accessStore.accessCode)) { + headers["Authorization"] = getBearerToken( + ACCESS_CODE_PREFIX + accessStore.accessCode, ); - - if (bearerToken) { - headers[authHeader] = bearerToken; - } else if (isEnabledAccessControl && validString(accessStore.accessCode)) { - headers["Authorization"] = getBearerToken( - ACCESS_CODE_PREFIX + accessStore.accessCode, - ); - } } return headers; diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index c13aa44102c..a4a11c30bd6 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,5 +1,6 @@ import { ChatOptions, + getHeaders, LLMApi, SpeechOptions, RequestMessage, @@ -233,23 +234,22 @@ export class BedrockApi implements LLMApi { const accessStore = useAccessStore.getState(); if (!accessStore.isValidBedrock()) { throw new Error( - "Invalid AWS credentials. Please check your configuration.", + "Invalid AWS credentials. Please check your configuration and ensure ENCRYPTION_KEY is set.", ); } try { const apiEndpoint = "/api/bedrock/chat"; - const headers = { - "Content-Type": requestBody.contentType || "application/json", - Accept: requestBody.accept || "application/json", - "X-Region": accessStore.awsRegion, - "X-Access-Key": accessStore.awsAccessKey, - "X-Secret-Key": accessStore.awsSecretKey, - "X-Model-Id": modelConfig.model, - ...(accessStore.awsSessionToken && { - "X-Session-Token": accessStore.awsSessionToken, - }), - }; + // const headers = { + // "Content-Type": requestBody.contentType || "application/json", + // Accept: requestBody.accept || "application/json", + // "X-Region": accessStore.awsRegion, + // "X-Access-Key": accessStore.awsAccessKey, + // "X-Secret-Key": accessStore.awsSecretKey, + // "X-Model-Id": modelConfig.model, + // "X-Encryption-Key": accessStore.bedrockEncryptionKey, + // }; + const headers = getHeaders(); if (options.config.stream) { let index = -1; @@ -274,7 +274,6 @@ export class BedrockApi implements LLMApi { (text: string, runTools: ChatMessageTool[]) => { try { const chunkJson = JSON.parse(text); - // console.log("Received chunk:", JSON.stringify(chunkJson, null, 2)); if (chunkJson?.content_block?.type === "tool_use") { index += 1; currentToolArgs = ""; @@ -375,7 +374,6 @@ export class BedrockApi implements LLMApi { }); const resJson = await res.json(); - // console.log("Response:", JSON.stringify(resJson, null, 2)); const message = this.extractMessage(resJson, modelConfig.model); // console.log("Extracted message:", message); options.onFinish(message, res); diff --git a/app/components/chat.module.scss b/app/components/chat.module.scss index 387d2f90ec4..55575c29740 100644 --- a/app/components/chat.module.scss +++ b/app/components/chat.module.scss @@ -79,17 +79,6 @@ pointer-events: none; } - .icon { - display: flex; - align-items: center; - justify-content: center; - - svg { - width: 16px; - height: 16px; - } - } - &:hover { --delay: 0.5s; width: var(--full-width); @@ -410,8 +399,8 @@ button { padding: 7px; + } } -} /* Specific styles for iOS devices */ @media screen and (max-device-width: 812px) and (-webkit-min-device-pixel-ratio: 2) { @@ -761,4 +750,4 @@ transform: translateX(0); } } -} +} \ No newline at end of file diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 7d48a0ec207..e06cc5442a1 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -980,12 +980,12 @@ export function Settings() { onChange={(e) => accessStore.update((access) => { const region = e.currentTarget.value; - if (!/^[a-z]{2}-[a-z]+-\d+$/.test(region)) { - showToast(Locale.Settings.Access.Bedrock.Region.Invalid); - return; - } + if (!/^[a-z]{2}-[a-z]+-\d+$/.test(region)) { + showToast(Locale.Settings.Access.Bedrock.Region.Invalid); + return; + } access.awsRegion = region; - }) + }) } /> @@ -999,7 +999,7 @@ export function Settings() { type="text" placeholder={Locale.Settings.Access.Bedrock.AccessKey.Placeholder} onChange={(e) => { - accessStore.update((access) => { + accessStore.update((access) => { const accessKey = e.currentTarget.value; if (accessKey && accessKey.length !== 20) { showToast(Locale.Settings.Access.Bedrock.AccessKey.Invalid); @@ -1022,11 +1022,11 @@ export function Settings() { placeholder={Locale.Settings.Access.Bedrock.SecretKey.Placeholder} onChange={(e) => { accessStore.update((access) => { - const secretKey = e.currentTarget.value; - if (secretKey && secretKey.length !== 40) { - showToast(Locale.Settings.Access.Bedrock.SecretKey.Invalid); - return; - } + const secretKey = e.currentTarget.value; + if (secretKey && secretKey.length !== 40) { + showToast(Locale.Settings.Access.Bedrock.SecretKey.Invalid); + return; + } access.awsSecretKey = secretKey; }); }} @@ -1034,17 +1034,17 @@ export function Settings() { /> { accessStore.update( - (access) => (access.awsSessionToken = e.currentTarget.value), + (access) => (access.bedrockEncryptionKey = e.currentTarget.value), ); }} maskWhenShow={true} diff --git a/app/config/server.ts b/app/config/server.ts index 0437ed534f1..e8fbf131a17 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -13,9 +13,10 @@ declare global { OPENAI_ORG_ID?: string; // openai only // bedrock only - BEDROCK_REGION?: string; - BEDROCK_API_KEY?: string; - BEDROCK_API_SECRET?: string; + AWS_REGION?: string; + AWS_ACCESS_KEY?: string; + AWS_SECRET_KEY?: string; + ENCRYPTION_KEY?: string; VERCEL?: string; BUILD_MODE?: "standalone" | "export"; @@ -148,7 +149,10 @@ export const getServerSideConfig = () => { } const isStability = !!process.env.STABILITY_API_KEY; - const isBedrock = !!process.env.BEDROCK_API_KEY; + const isBedrock = + !!process.env.AWS_REGION && + !!process.env.AWS_ACCESS_KEY && + !!process.env.AWS_SECRET_KEY; const isAzure = !!process.env.AZURE_URL; const isGoogle = !!process.env.GOOGLE_API_KEY; const isAnthropic = !!process.env.ANTHROPIC_API_KEY; @@ -182,6 +186,7 @@ export const getServerSideConfig = () => { awsRegion: process.env.AWS_REGION, awsAccessKey: process.env.AWS_ACCESS_KEY, awsSecretKey: process.env.AWS_SECRET_KEY, + bedrockEncryptionKey: process.env.ENCRYPTION_KEY, isStability, stabilityUrl: process.env.STABILITY_URL, diff --git a/app/locales/cn.ts b/app/locales/cn.ts index d98a7eaded2..9a8f5cc193d 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -361,14 +361,10 @@ const cn = { Placeholder: "****", Invalid: "无效的 AWS Secret Key 格式。必须为40个字符。", }, - SessionToken: { - Title: "AWS Session Token (Optional)", - SubTitle: "Your AWS session token if using temporary credentials", - Placeholder: "Optional session token", - }, - Endpoint: { - Title: "AWS Bedrock Endpoint", - SubTitle: "Custom endpoint for AWS Bedrock API. Default: ", + EncryptionKey: { + Title: "加密密钥", + SubTitle: "用于配置数据的加密密钥", + Placeholder: "输入加密密钥", }, }, Azure: { diff --git a/app/locales/en.ts b/app/locales/en.ts index e4bd0cedb40..670f822c8b8 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -365,14 +365,10 @@ const en: LocaleType = { Placeholder: "****", Invalid: "Invalid AWS secret key format. Must be 40 characters long.", }, - SessionToken: { - Title: "AWS Session Token (Optional)", - SubTitle: "Your AWS session token if using temporary credentials", - Placeholder: "Optional session token", - }, - Endpoint: { - Title: "AWS Bedrock Endpoint", - SubTitle: "Custom endpoint for AWS Bedrock API. Default: ", + EncryptionKey: { + Title: "Encryption Key", + SubTitle: "Your encryption key for configuration data", + Placeholder: "Enter encryption key", }, }, Azure: { diff --git a/app/store/access.ts b/app/store/access.ts index 75a8123a2ed..5ec99b17519 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -15,6 +15,7 @@ import { IFLYTEK_BASE_URL, XAI_BASE_URL, CHATGLM_BASE_URL, + BEDROCK_BASE_URL, } from "../constant"; import { getHeaders } from "../client/api"; import { getClientConfig } from "../config/client"; @@ -51,6 +52,8 @@ const DEFAULT_XAI_URL = isApp ? XAI_BASE_URL : ApiPath.XAI; const DEFAULT_CHATGLM_URL = isApp ? CHATGLM_BASE_URL : ApiPath.ChatGLM; +const DEFAULT_BEDROCK_URL = isApp ? BEDROCK_BASE_URL : ApiPath.Bedrock; + const DEFAULT_ACCESS_STATE = { accessCode: "", useCustomConfig: false, @@ -117,10 +120,11 @@ const DEFAULT_ACCESS_STATE = { chatglmApiKey: "", // aws bedrock + bedrokUrl: DEFAULT_BEDROCK_URL, awsRegion: "", awsAccessKey: "", awsSecretKey: "", - awsSessionToken: "", + bedrockEncryptionKey: "", // server config needCode: true, @@ -200,7 +204,12 @@ export const useAccessStore = createPersistStore( }, isValidBedrock() { - return ensure(get(), ["awsRegion", "awsAccessKey", "awsSecretKey"]); + return ensure(get(), [ + "awsRegion", + "awsAccessKey", + "awsSecretKey", + "bedrockEncryptionKey", + ]); }, isAuthorized() { diff --git a/app/utils/aws.ts b/app/utils/aws.ts index dfa0a92fe64..d8870732898 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -3,14 +3,14 @@ import HmacSHA256 from "crypto-js/hmac-sha256"; import Hex from "crypto-js/enc-hex"; import Utf8 from "crypto-js/enc-utf8"; import { AES, enc } from "crypto-js"; - -const SECRET_KEY = - process.env.ENCRYPTION_KEY || - "your-secret-key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -if (!SECRET_KEY || SECRET_KEY.length < 32) { - throw new Error( - "ENCRYPTION_KEY environment variable must be set with at least 32 characters", - ); +import { getServerSideConfig } from "../config/server"; + +const serverConfig = getServerSideConfig(); +// console.info(serverConfig); +const SECRET_KEY = serverConfig.bedrockEncryptionKey || ""; +// console.info("======SECRET_KEY:"+SECRET_KEY); +if (serverConfig.isBedrock && !SECRET_KEY) { + console.error("When use Bedrock modle,ENCRYPTION_KEY should been set!"); } export function encrypt(data: string): string { @@ -54,7 +54,6 @@ export interface SignParams { region: string; accessKeyId: string; secretAccessKey: string; - sessionToken?: string; body: string; service: string; } @@ -143,7 +142,6 @@ export async function sign({ region, accessKeyId, secretAccessKey, - sessionToken, body, service, }: SignParams): Promise> { @@ -169,11 +167,6 @@ export async function sign({ "x-amzn-bedrock-accept": "*/*", }; - // Add session token if present - if (sessionToken) { - headers["x-amz-security-token"] = sessionToken; - } - // Get sorted header keys (case-insensitive) const sortedHeaderKeys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()), @@ -230,7 +223,6 @@ export async function sign({ "X-Amz-Content-Sha256": headers["x-amz-content-sha256"], "X-Amz-Date": headers["x-amz-date"], "X-Amzn-Bedrock-Accept": headers["x-amzn-bedrock-accept"], - ...(sessionToken && { "X-Amz-Security-Token": sessionToken }), Authorization: authorization, }; } From a85db21e1f72ba784d63904c778487081a839336 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 23 Nov 2024 12:09:45 +0800 Subject: [PATCH 30/72] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 23 +++++++++------- app/client/api.ts | 41 ++++++++++++++------------- app/client/platforms/bedrock.ts | 49 ++++++++++++++++++++++++--------- app/store/access.ts | 2 +- app/utils/aws.ts | 29 ++----------------- 5 files changed, 73 insertions(+), 71 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index e6b039ae84b..2154ee5ff1b 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,7 +1,9 @@ import { NextRequest, NextResponse } from "next/server"; +import { auth } from "./auth"; import { sign } from "../utils/aws"; import { getServerSideConfig } from "../config/server"; - +import { ModelProvider } from "@/app/constant"; +import { prettyObject } from "@/app/utils/format"; const ALLOWED_PATH = new Set(["chat", "models"]); function parseEventData(chunk: Uint8Array): any { @@ -189,7 +191,7 @@ async function requestBedrock(req: NextRequest) { let awsRegion = config.awsRegion; let awsAccessKey = config.awsAccessKey; let awsSecretKey = config.awsSecretKey; - let modelId = ""; + let modelId = req.headers.get("ModelID"); // If server-side credentials are not available, parse from Authorization header if (!awsRegion || !awsAccessKey || !awsSecretKey) { @@ -199,16 +201,15 @@ async function requestBedrock(req: NextRequest) { } const [_, credentials] = authHeader.split("Bearer "); - const [region, accessKey, secretKey, model] = credentials.split(","); + const [region, accessKey, secretKey] = credentials.split(":"); - if (!region || !accessKey || !secretKey || !model) { + if (!region || !accessKey || !secretKey) { throw new Error("Invalid Authorization header format"); } awsRegion = region; awsAccessKey = accessKey; awsSecretKey = secretKey; - modelId = model; } if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { @@ -329,14 +330,16 @@ export async function handle( { status: 403 }, ); } - + const authResult = auth(req, ModelProvider.Bedrock); + if (authResult.error) { + return NextResponse.json(authResult, { + status: 401, + }); + } try { return await requestBedrock(req); } catch (e) { console.error("Handler error:", e); - return NextResponse.json( - { error: true, msg: e instanceof Error ? e.message : "Unknown error" }, - { status: 500 }, - ); + return NextResponse.json(prettyObject(e)); } } diff --git a/app/client/api.ts b/app/client/api.ts index eb0e4270d73..47e3b674e92 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -280,12 +280,10 @@ export function getHeaders(ignoreHeaders: boolean = false) { accessStore.awsAccessKey && accessStore.awsSecretKey ? accessStore.awsRegion + - "," + + ":" + accessStore.awsAccessKey + - "," + - accessStore.awsSecretKey + - "," + - modelConfig.model + ":" + + accessStore.awsSecretKey : "" : accessStore.openaiApiKey; return { @@ -316,6 +314,7 @@ export function getHeaders(ignoreHeaders: boolean = false) { } const { + isBedrock, isGoogle, isAzure, isAnthropic, @@ -328,23 +327,23 @@ export function getHeaders(ignoreHeaders: boolean = false) { const authHeader = getAuthHeader(); - // if (isBedrock) { - // // Secure encryption of AWS credentials using the new encryption utility - // headers["X-Region"] = encrypt(accessStore.awsRegion); - // headers["X-Access-Key"] = encrypt(accessStore.awsAccessKey); - // headers["X-Secret-Key"] = encrypt(accessStore.awsSecretKey); - // } else { - const bearerToken = getBearerToken( - apiKey, - isAzure || isAnthropic || isGoogle, - ); - - if (bearerToken) { - headers[authHeader] = bearerToken; - } else if (isEnabledAccessControl && validString(accessStore.accessCode)) { - headers["Authorization"] = getBearerToken( - ACCESS_CODE_PREFIX + accessStore.accessCode, + if (isBedrock) { + if (apiKey) { + headers[authHeader] = getBearerToken(apiKey); + } + } else { + const bearerToken = getBearerToken( + apiKey, + isAzure || isAnthropic || isGoogle, ); + + if (bearerToken) { + headers[authHeader] = bearerToken; + } else if (isEnabledAccessControl && validString(accessStore.accessCode)) { + headers["Authorization"] = getBearerToken( + ACCESS_CODE_PREFIX + accessStore.accessCode, + ); + } } return headers; diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index a4a11c30bd6..d5517374647 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,3 +1,4 @@ +"use client"; import { ChatOptions, getHeaders, @@ -16,6 +17,8 @@ import { } from "../../store"; import { preProcessImageContent, stream } from "../../utils/chat"; import { getMessageTextContent, isVisionModel } from "../../utils"; +import { ApiPath, BEDROCK_BASE_URL } from "../../constant"; +import { getClientConfig } from "../../config/client"; const ClaudeMapper = { assistant: "assistant", @@ -34,6 +37,35 @@ interface ToolDefinition { } export class BedrockApi implements LLMApi { + private disableListModels = true; + + path(path: string): string { + const accessStore = useAccessStore.getState(); + + let baseUrl = ""; + + if (accessStore.useCustomConfig) { + baseUrl = accessStore.bedrockUrl; + } + + if (baseUrl.length === 0) { + const isApp = !!getClientConfig()?.isApp; + const apiPath = ApiPath.Bedrock; + baseUrl = isApp ? BEDROCK_BASE_URL : apiPath; + } + + if (baseUrl.endsWith("/")) { + baseUrl = baseUrl.slice(0, baseUrl.length - 1); + } + if (!baseUrl.startsWith("http") && !baseUrl.startsWith(ApiPath.Bedrock)) { + baseUrl = "https://" + baseUrl; + } + + console.log("[Proxy Endpoint] ", baseUrl, path); + + return [baseUrl, path].join("/"); + } + speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); } @@ -239,17 +271,9 @@ export class BedrockApi implements LLMApi { } try { - const apiEndpoint = "/api/bedrock/chat"; - // const headers = { - // "Content-Type": requestBody.contentType || "application/json", - // Accept: requestBody.accept || "application/json", - // "X-Region": accessStore.awsRegion, - // "X-Access-Key": accessStore.awsAccessKey, - // "X-Secret-Key": accessStore.awsSecretKey, - // "X-Model-Id": modelConfig.model, - // "X-Encryption-Key": accessStore.bedrockEncryptionKey, - // }; + const chatPath = this.path("chat"); const headers = getHeaders(); + headers.ModelID = modelConfig.model; if (options.config.stream) { let index = -1; @@ -261,7 +285,7 @@ export class BedrockApi implements LLMApi { ); return stream( - apiEndpoint, + chatPath, requestBody, headers, (tools as ToolDefinition[]).map((tool) => ({ @@ -367,7 +391,7 @@ export class BedrockApi implements LLMApi { options, ); } else { - const res = await fetch(apiEndpoint, { + const res = await fetch(chatPath, { method: "POST", headers, body: JSON.stringify(requestBody), @@ -375,7 +399,6 @@ export class BedrockApi implements LLMApi { const resJson = await res.json(); const message = this.extractMessage(resJson, modelConfig.model); - // console.log("Extracted message:", message); options.onFinish(message, res); } } catch (e) { diff --git a/app/store/access.ts b/app/store/access.ts index 5ec99b17519..be35f8925d6 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -120,7 +120,7 @@ const DEFAULT_ACCESS_STATE = { chatglmApiKey: "", // aws bedrock - bedrokUrl: DEFAULT_BEDROCK_URL, + bedrockUrl: DEFAULT_BEDROCK_URL, awsRegion: "", awsAccessKey: "", awsSecretKey: "", diff --git a/app/utils/aws.ts b/app/utils/aws.ts index d8870732898..bca9d699a70 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -6,9 +6,7 @@ import { AES, enc } from "crypto-js"; import { getServerSideConfig } from "../config/server"; const serverConfig = getServerSideConfig(); -// console.info(serverConfig); const SECRET_KEY = serverConfig.bedrockEncryptionKey || ""; -// console.info("======SECRET_KEY:"+SECRET_KEY); if (serverConfig.isBedrock && !SECRET_KEY) { console.error("When use Bedrock modle,ENCRYPTION_KEY should been set!"); } @@ -26,18 +24,13 @@ export function encrypt(data: string): string { export function decrypt(encryptedData: string): string { if (!encryptedData) return ""; try { - // Try to decrypt const bytes = AES.decrypt(encryptedData, SECRET_KEY); const decrypted = bytes.toString(enc.Utf8); - - // If decryption results in empty string but input wasn't empty, - // the input might already be decrypted if (!decrypted && encryptedData) { return encryptedData; } return decrypted; } catch (error) { - // If decryption fails, the input might already be decrypted return encryptedData; } } @@ -91,32 +84,28 @@ function encodeURIComponent_RFC3986(str: string): string { /[!'()*]/g, (c) => "%" + c.charCodeAt(0).toString(16).toUpperCase(), ) - .replace(/[-_.~]/g, (c) => c); // RFC 3986 unreserved characters + .replace(/[-_.~]/g, (c) => c); } function encodeURI_RFC3986(uri: string): string { - // Handle empty or root path if (!uri || uri === "/") return ""; - // Split the path into segments, preserving empty segments for double slashes const segments = uri.split("/"); return segments .map((segment) => { if (!segment) return ""; - // Special handling for Bedrock model paths if (segment.includes("model/")) { const parts = segment.split(/(model\/)/); return parts .map((part) => { if (part === "model/") return part; - // Handle the model identifier part if (part.includes(".") || part.includes(":")) { return part .split(/([.:])/g) .map((subpart, i) => { - if (i % 2 === 1) return subpart; // Don't encode separators + if (i % 2 === 1) return subpart; return encodeURIComponent_RFC3986(subpart); }) .join(""); @@ -126,7 +115,6 @@ function encodeURI_RFC3986(uri: string): string { .join(""); } - // Handle invoke-with-response-stream without encoding if (segment === "invoke-with-response-stream") { return segment; } @@ -147,17 +135,14 @@ export async function sign({ }: SignParams): Promise> { const endpoint = new URL(url); const canonicalUri = "/" + encodeURI_RFC3986(endpoint.pathname.slice(1)); - const canonicalQueryString = endpoint.search.slice(1); // Remove leading '?' + const canonicalQueryString = endpoint.search.slice(1); - // Create a date stamp and time stamp in ISO8601 format const now = new Date(); const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, ""); const dateStamp = amzDate.slice(0, 8); - // Calculate the hash of the payload const payloadHash = SHA256(body).toString(Hex); - // Define headers with normalized values const headers: Record = { accept: "application/vnd.amazon.eventstream", "content-type": "application/json", @@ -167,24 +152,20 @@ export async function sign({ "x-amzn-bedrock-accept": "*/*", }; - // Get sorted header keys (case-insensitive) const sortedHeaderKeys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()), ); - // Create canonical headers string with normalized values const canonicalHeaders = sortedHeaderKeys .map( (key) => `${key.toLowerCase()}:${normalizeHeaderValue(headers[key])}\n`, ) .join(""); - // Create signed headers string const signedHeaders = sortedHeaderKeys .map((key) => key.toLowerCase()) .join(";"); - // Create canonical request const canonicalRequest = [ method.toUpperCase(), canonicalUri, @@ -194,7 +175,6 @@ export async function sign({ payloadHash, ].join("\n"); - // Create the string to sign const algorithm = "AWS4-HMAC-SHA256"; const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`; const stringToSign = [ @@ -204,18 +184,15 @@ export async function sign({ SHA256(canonicalRequest).toString(Hex), ].join("\n"); - // Calculate the signature const signingKey = getSigningKey(secretAccessKey, dateStamp, region, service); const signature = hmac(signingKey, stringToSign).toString(Hex); - // Create the authorization header const authorization = [ `${algorithm} Credential=${accessKeyId}/${credentialScope}`, `SignedHeaders=${signedHeaders}`, `Signature=${signature}`, ].join(", "); - // Return headers with proper casing for the request return { Accept: headers.accept, "Content-Type": headers["content-type"], From ff88421904d8136470f04e6d1adfd26e9c671ef8 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 23 Nov 2024 13:52:14 +0800 Subject: [PATCH 31/72] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E9=92=A5?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 28 +++++++++++++++---------- app/client/api.ts | 7 ++++--- app/components/settings.tsx | 12 ----------- app/store/access.ts | 42 +++++++++++++++++++++++-------------- app/utils/aws.ts | 5 +++-- 5 files changed, 50 insertions(+), 44 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 2154ee5ff1b..9677bf5ca49 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,9 +1,10 @@ import { NextRequest, NextResponse } from "next/server"; import { auth } from "./auth"; -import { sign } from "../utils/aws"; +import { sign, decrypt } from "../utils/aws"; import { getServerSideConfig } from "../config/server"; -import { ModelProvider } from "@/app/constant"; -import { prettyObject } from "@/app/utils/format"; +import { ModelProvider } from "../constant"; +import { prettyObject } from "../utils/format"; + const ALLOWED_PATH = new Set(["chat", "models"]); function parseEventData(chunk: Uint8Array): any { @@ -79,8 +80,6 @@ async function* transformBedrockStream( const parsed = parseEventData(value); if (!parsed) continue; - // console.log("Parsed response:", JSON.stringify(parsed, null, 2)); - // Handle Titan models if (modelId.startsWith("amazon.titan")) { const text = parsed.outputText || ""; @@ -191,7 +190,6 @@ async function requestBedrock(req: NextRequest) { let awsRegion = config.awsRegion; let awsAccessKey = config.awsAccessKey; let awsSecretKey = config.awsSecretKey; - let modelId = req.headers.get("ModelID"); // If server-side credentials are not available, parse from Authorization header if (!awsRegion || !awsAccessKey || !awsSecretKey) { @@ -201,17 +199,25 @@ async function requestBedrock(req: NextRequest) { } const [_, credentials] = authHeader.split("Bearer "); - const [region, accessKey, secretKey] = credentials.split(":"); + console.log("credentials===============" + credentials); + const [encryptedRegion, encryptedAccessKey, encryptedSecretKey] = + credentials.split(":"); - if (!region || !accessKey || !secretKey) { + if (!encryptedRegion || !encryptedAccessKey || !encryptedSecretKey) { throw new Error("Invalid Authorization header format"); } - awsRegion = region; - awsAccessKey = accessKey; - awsSecretKey = secretKey; + // Decrypt the credentials + awsRegion = decrypt(encryptedRegion); + awsAccessKey = decrypt(encryptedAccessKey); + awsSecretKey = decrypt(encryptedSecretKey); + + if (!awsRegion || !awsAccessKey || !awsSecretKey) { + throw new Error("Failed to decrypt AWS credentials"); + } } + let modelId = req.headers.get("ModelID"); if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { throw new Error("Missing required AWS credentials or model ID"); } diff --git a/app/client/api.ts b/app/client/api.ts index 47e3b674e92..04da39ac18a 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -23,6 +23,7 @@ import { SparkApi } from "./platforms/iflytek"; import { XAIApi } from "./platforms/xai"; import { ChatGLMApi } from "./platforms/glm"; import { BedrockApi } from "./platforms/bedrock"; +import { encrypt } from "../utils/aws"; export const ROLES = ["system", "user", "assistant"] as const; export type MessageRole = (typeof ROLES)[number]; @@ -279,11 +280,11 @@ export function getHeaders(ignoreHeaders: boolean = false) { ? accessStore.awsRegion && accessStore.awsAccessKey && accessStore.awsSecretKey - ? accessStore.awsRegion + + ? encrypt(accessStore.awsRegion) + ":" + - accessStore.awsAccessKey + + encrypt(accessStore.awsAccessKey) + ":" + - accessStore.awsSecretKey + encrypt(accessStore.awsSecretKey) : "" : accessStore.openaiApiKey; return { diff --git a/app/components/settings.tsx b/app/components/settings.tsx index e06cc5442a1..bc251d47e5f 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -980,10 +980,6 @@ export function Settings() { onChange={(e) => accessStore.update((access) => { const region = e.currentTarget.value; - if (!/^[a-z]{2}-[a-z]+-\d+$/.test(region)) { - showToast(Locale.Settings.Access.Bedrock.Region.Invalid); - return; - } access.awsRegion = region; }) } @@ -1001,10 +997,6 @@ export function Settings() { onChange={(e) => { accessStore.update((access) => { const accessKey = e.currentTarget.value; - if (accessKey && accessKey.length !== 20) { - showToast(Locale.Settings.Access.Bedrock.AccessKey.Invalid); - return; - } access.awsAccessKey = accessKey; }); }} @@ -1023,10 +1015,6 @@ export function Settings() { onChange={(e) => { accessStore.update((access) => { const secretKey = e.currentTarget.value; - if (secretKey && secretKey.length !== 40) { - showToast(Locale.Settings.Access.Bedrock.SecretKey.Invalid); - return; - } access.awsSecretKey = secretKey; }); }} diff --git a/app/store/access.ts b/app/store/access.ts index be35f8925d6..c0b3268cf99 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -23,35 +23,24 @@ import { createPersistStore } from "../utils/store"; import { ensure } from "../utils/clone"; import { DEFAULT_CONFIG } from "./config"; import { getModelProvider } from "../utils/model"; +import { encrypt, decrypt } from "../utils/aws"; let fetchState = 0; // 0 not fetch, 1 fetching, 2 done const isApp = getClientConfig()?.buildMode === "export"; const DEFAULT_OPENAI_URL = isApp ? OPENAI_BASE_URL : ApiPath.OpenAI; - const DEFAULT_GOOGLE_URL = isApp ? GEMINI_BASE_URL : ApiPath.Google; - const DEFAULT_ANTHROPIC_URL = isApp ? ANTHROPIC_BASE_URL : ApiPath.Anthropic; - const DEFAULT_BAIDU_URL = isApp ? BAIDU_BASE_URL : ApiPath.Baidu; - const DEFAULT_BYTEDANCE_URL = isApp ? BYTEDANCE_BASE_URL : ApiPath.ByteDance; - const DEFAULT_ALIBABA_URL = isApp ? ALIBABA_BASE_URL : ApiPath.Alibaba; - const DEFAULT_TENCENT_URL = isApp ? TENCENT_BASE_URL : ApiPath.Tencent; - const DEFAULT_MOONSHOT_URL = isApp ? MOONSHOT_BASE_URL : ApiPath.Moonshot; - const DEFAULT_STABILITY_URL = isApp ? STABILITY_BASE_URL : ApiPath.Stability; - const DEFAULT_IFLYTEK_URL = isApp ? IFLYTEK_BASE_URL : ApiPath.Iflytek; - const DEFAULT_XAI_URL = isApp ? XAI_BASE_URL : ApiPath.XAI; - const DEFAULT_CHATGLM_URL = isApp ? CHATGLM_BASE_URL : ApiPath.ChatGLM; - const DEFAULT_BEDROCK_URL = isApp ? BEDROCK_BASE_URL : ApiPath.Bedrock; const DEFAULT_ACCESS_STATE = { @@ -141,17 +130,14 @@ const DEFAULT_ACCESS_STATE = { export const useAccessStore = createPersistStore( { ...DEFAULT_ACCESS_STATE }, - (set, get) => ({ enabledAccessControl() { this.fetch(); - return get().needCode; }, edgeVoiceName() { this.fetch(); - return get().edgeTTSVoiceName; }, @@ -253,7 +239,6 @@ export const useAccessStore = createPersistStore( DEFAULT_CONFIG.modelConfig.model = model; DEFAULT_CONFIG.modelConfig.providerName = providerName as any; } - return res; }) .then((res: DangerConfig) => { @@ -267,6 +252,31 @@ export const useAccessStore = createPersistStore( fetchState = 2; }); }, + + // Override the set method to encrypt AWS credentials before storage + set: (partial: { [key: string]: any }) => { + if (partial.awsAccessKey) { + partial.awsAccessKey = encrypt(partial.awsAccessKey); + } + if (partial.awsSecretKey) { + partial.awsSecretKey = encrypt(partial.awsSecretKey); + } + if (partial.awsRegion) { + partial.awsRegion = encrypt(partial.awsRegion); + } + set(partial); + }, + + // Add getter to decrypt AWS credentials when needed + get: () => { + const state = get(); + return { + ...state, + awsRegion: state.awsRegion ? decrypt(state.awsRegion) : "", + awsAccessKey: state.awsAccessKey ? decrypt(state.awsAccessKey) : "", + awsSecretKey: state.awsSecretKey ? decrypt(state.awsSecretKey) : "", + }; + }, }), { name: StoreKey.Access, diff --git a/app/utils/aws.ts b/app/utils/aws.ts index bca9d699a70..92c5cc6b52c 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -17,7 +17,7 @@ export function encrypt(data: string): string { return AES.encrypt(data, SECRET_KEY).toString(); } catch (error) { console.error("Encryption failed:", error); - return data; + return ""; } } @@ -31,7 +31,8 @@ export function decrypt(encryptedData: string): string { } return decrypted; } catch (error) { - return encryptedData; + console.error("Decryption failed:", error); + return ""; } } From a6337e9f235596685c1b7062447e1bb5d917eb80 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 23 Nov 2024 15:13:52 +0800 Subject: [PATCH 32/72] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=80=BB=E7=BB=93?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E7=9A=84=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 36 +++++++++++++++++++++------------ app/client/platforms/bedrock.ts | 1 + app/utils/aws.ts | 21 +++++++++++-------- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 9677bf5ca49..e342a886739 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -199,7 +199,6 @@ async function requestBedrock(req: NextRequest) { } const [_, credentials] = authHeader.split("Bearer "); - console.log("credentials===============" + credentials); const [encryptedRegion, encryptedAccessKey, encryptedSecretKey] = credentials.split(":"); @@ -218,6 +217,7 @@ async function requestBedrock(req: NextRequest) { } let modelId = req.headers.get("ModelID"); + let shouldStream = req.headers.get("ShouldStream"); if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { throw new Error("Missing required AWS credentials or model ID"); } @@ -232,7 +232,6 @@ async function requestBedrock(req: NextRequest) { // Determine the endpoint and request body based on model type let endpoint; let requestBody; - let additionalHeaders = {}; const bodyText = await req.clone().text(); if (!bodyText) { @@ -242,15 +241,19 @@ async function requestBedrock(req: NextRequest) { const bodyJson = JSON.parse(bodyText); validateRequest(bodyJson, modelId); - // For all other models, use standard endpoint - endpoint = `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; + // For all models, use standard endpoints + if (shouldStream === "false") { + endpoint = `${baseEndpoint}/model/${modelId}/invoke`; + } else { + endpoint = `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; + } requestBody = JSON.stringify(bodyJson.body || bodyJson); - console.log("Request to AWS Bedrock:", { - endpoint, - modelId, - body: requestBody, - }); + // console.log("Request to AWS Bedrock:", { + // endpoint, + // modelId, + // body: requestBody, + // }); const headers = await sign({ method: "POST", @@ -260,14 +263,12 @@ async function requestBedrock(req: NextRequest) { secretAccessKey: awsSecretKey, body: requestBody, service: "bedrock", + isStreaming: shouldStream !== "false", }); const res = await fetch(endpoint, { method: "POST", - headers: { - ...headers, - ...additionalHeaders, - }, + headers, body: requestBody, redirect: "manual", // @ts-ignore @@ -290,6 +291,15 @@ async function requestBedrock(req: NextRequest) { throw new Error("Empty response from Bedrock"); } + // Handle non-streaming response + if (shouldStream === "false") { + const responseText = await res.text(); + console.error("AWS Bedrock shouldStream === false:", responseText); + const parsed = parseEventData(new TextEncoder().encode(responseText)); + return NextResponse.json(parsed); + } + + // Handle streaming response const transformedStream = transformBedrockStream(res.body, modelId); const stream = new ReadableStream({ async start(controller) { diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index d5517374647..0f7d7302211 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -391,6 +391,7 @@ export class BedrockApi implements LLMApi { options, ); } else { + headers.ShouldStream = "false"; const res = await fetch(chatPath, { method: "POST", headers, diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 92c5cc6b52c..d2997412f63 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -50,6 +50,8 @@ export interface SignParams { secretAccessKey: string; body: string; service: string; + isStreaming?: boolean; + additionalHeaders?: Record; } function hmac( @@ -133,6 +135,8 @@ export async function sign({ secretAccessKey, body, service, + isStreaming = true, + additionalHeaders = {}, }: SignParams): Promise> { const endpoint = new URL(url); const canonicalUri = "/" + encodeURI_RFC3986(endpoint.pathname.slice(1)); @@ -145,14 +149,20 @@ export async function sign({ const payloadHash = SHA256(body).toString(Hex); const headers: Record = { - accept: "application/vnd.amazon.eventstream", + accept: isStreaming + ? "application/vnd.amazon.eventstream" + : "application/json", "content-type": "application/json", host: endpoint.host, "x-amz-content-sha256": payloadHash, "x-amz-date": amzDate, - "x-amzn-bedrock-accept": "*/*", + ...additionalHeaders, }; + if (isStreaming) { + headers["x-amzn-bedrock-accept"] = "*/*"; + } + const sortedHeaderKeys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()), ); @@ -195,12 +205,7 @@ export async function sign({ ].join(", "); return { - Accept: headers.accept, - "Content-Type": headers["content-type"], - Host: headers.host, - "X-Amz-Content-Sha256": headers["x-amz-content-sha256"], - "X-Amz-Date": headers["x-amz-date"], - "X-Amzn-Bedrock-Accept": headers["x-amzn-bedrock-accept"], + ...headers, Authorization: authorization, }; } From 238eb70986ad744a31bd5388a9cdfac355856c8e Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 23 Nov 2024 16:27:19 +0800 Subject: [PATCH 33/72] =?UTF-8?q?=E5=AE=8C=E5=96=84mistral=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E6=8E=A8=E7=90=86=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 41 ++++++++++++----- app/client/platforms/bedrock.ts | 79 ++++++++++++++++++++++----------- 2 files changed, 81 insertions(+), 39 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index e342a886739..5739415ba24 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -110,8 +110,17 @@ async function* transformBedrockStream( } // Handle Mistral models else if (modelId.startsWith("mistral.mistral")) { - const text = - parsed.output || parsed.outputs?.[0]?.text || parsed.completion || ""; + let text = ""; + if (parsed.outputs?.[0]?.text) { + text = parsed.outputs[0].text; + } else if (parsed.output) { + text = parsed.output; + } else if (parsed.completion) { + text = parsed.completion; + } else if (typeof parsed === "string") { + text = parsed; + } + if (text) { yield `data: ${JSON.stringify({ delta: { text }, @@ -176,7 +185,17 @@ function validateRequest(body: any, modelId: string): void { throw new Error("prompt is required for LLaMA3 models"); } } else if (modelId.startsWith("mistral.mistral")) { - if (!bodyContent.prompt) throw new Error("Mistral requires a prompt"); + if (!bodyContent.prompt) { + throw new Error("prompt is required for Mistral models"); + } + if ( + !bodyContent.prompt.startsWith("[INST]") || + !bodyContent.prompt.includes("[/INST]") + ) { + throw new Error( + "Mistral prompt must be wrapped in [INST] and [/INST] tags", + ); + } } else if (modelId.startsWith("amazon.titan")) { if (!bodyContent.inputText) throw new Error("Titan requires inputText"); } @@ -247,29 +266,27 @@ async function requestBedrock(req: NextRequest) { } else { endpoint = `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; } - requestBody = JSON.stringify(bodyJson.body || bodyJson); - - // console.log("Request to AWS Bedrock:", { - // endpoint, - // modelId, - // body: requestBody, - // }); + // Set content type and accept headers for Mistral models const headers = await sign({ method: "POST", url: endpoint, region: awsRegion, accessKeyId: awsAccessKey, secretAccessKey: awsSecretKey, - body: requestBody, + body: JSON.stringify(bodyJson.body || bodyJson), service: "bedrock", isStreaming: shouldStream !== "false", + ...(modelId.startsWith("mistral.mistral") && { + contentType: "application/json", + accept: "application/json", + }), }); const res = await fetch(endpoint, { method: "POST", headers, - body: requestBody, + body: JSON.stringify(bodyJson.body || bodyJson), redirect: "manual", // @ts-ignore duplex: "half", diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 0f7d7302211..aff4c5582ed 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -74,16 +74,30 @@ export class BedrockApi implements LLMApi { try { // Handle Titan models if (modelId.startsWith("amazon.titan")) { - if (res?.delta?.text) return res.delta.text; - return res?.outputText || ""; + let text = ""; + if (res?.delta?.text) { + text = res.delta.text; + } else { + text = res?.outputText || ""; + } + // Clean up Titan response by removing leading question mark and whitespace + return text.replace(/^[\s?]+/, ""); } // Handle LLaMA models if (modelId.startsWith("us.meta.llama3")) { - if (res?.delta?.text) return res.delta.text; - if (res?.generation) return res.generation; - if (typeof res?.output === "string") return res.output; - if (typeof res === "string") return res; + if (res?.delta?.text) { + return res.delta.text; + } + if (res?.generation) { + return res.generation; + } + if (typeof res?.output === "string") { + return res.output; + } + if (typeof res === "string") { + return res; + } return ""; } @@ -127,9 +141,19 @@ export class BedrockApi implements LLMApi { ...messages, ] : messages; + + // Format messages without role prefixes for Titan const inputText = allMessages - .map((m) => `${m.role}: ${getMessageTextContent(m)}`) - .join("\n"); + .map((m) => { + // Include system message as a prefix instruction + if (m.role === "system") { + return getMessageTextContent(m); + } + // For user/assistant messages, just include the content + return getMessageTextContent(m); + }) + .join("\n\n"); + return { body: { inputText, @@ -142,29 +166,25 @@ export class BedrockApi implements LLMApi { }; } - // Handle LLaMA3 models - simplified format + // Handle LLaMA3 models if (model.startsWith("us.meta.llama3")) { - const allMessages = systemMessage - ? [ - { role: "system" as MessageRole, content: systemMessage }, - ...messages, - ] - : messages; - - const prompt = allMessages - .map((m) => `${m.role}: ${getMessageTextContent(m)}`) - .join("\n"); + // Only include the last user message for LLaMA + const lastMessage = messages[messages.length - 1]; + const prompt = getMessageTextContent(lastMessage); return { contentType: "application/json", accept: "application/json", body: { - prompt, + prompt: prompt, + max_gen_len: modelConfig.max_tokens || 256, + temperature: modelConfig.temperature || 0.5, + top_p: 0.9, }, }; } - // Handle Mistral models + // Handle Mistral models with correct instruction format if (model.startsWith("mistral.mistral")) { const allMessages = systemMessage ? [ @@ -172,14 +192,21 @@ export class BedrockApi implements LLMApi { ...messages, ] : messages; - const prompt = allMessages - .map((m) => `${m.role}: ${getMessageTextContent(m)}`) - .join("\n"); + + // Format messages as a conversation with instruction tags + const prompt = `[INST] ${allMessages + .map((m) => getMessageTextContent(m)) + .join("\n")} [/INST]`; + return { + contentType: "application/json", + accept: "application/json", body: { prompt, - temperature: modelConfig.temperature || 0.7, max_tokens: modelConfig.max_tokens || 4096, + temperature: modelConfig.temperature || 0.5, + top_p: 0.9, + top_k: 50, }, }; } @@ -258,7 +285,6 @@ export class BedrockApi implements LLMApi { systemMessage, modelConfig, ); - // console.log("Request body:", JSON.stringify(requestBody, null, 2)); const controller = new AbortController(); options.onController?.(controller); @@ -338,7 +364,6 @@ export class BedrockApi implements LLMApi { } catch (e) {} } const message = this.extractMessage(chunkJson, modelConfig.model); - // console.log("Extracted message:", message); return message; } catch (e) { console.error("Error parsing chunk:", e); From 513cf1b20647ff80e3f5018d26a4408ed53ca0ea Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 23 Nov 2024 18:23:20 +0800 Subject: [PATCH 34/72] =?UTF-8?q?=E5=AE=8C=E5=96=84llama=E5=92=8Cmistral?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=9A=84=E6=8E=A8=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 71 +++++++++++------ app/client/platforms/bedrock.ts | 132 +++++++++++++++++++++----------- 2 files changed, 134 insertions(+), 69 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 5739415ba24..fa52363ae5f 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -15,7 +15,8 @@ function parseEventData(chunk: Uint8Array): any { // AWS Bedrock wraps the response in a 'body' field if (typeof parsed.body === "string") { try { - return JSON.parse(parsed.body); + const bodyJson = JSON.parse(parsed.body); + return bodyJson; } catch (e) { return { output: parsed.body }; } @@ -89,10 +90,12 @@ async function* transformBedrockStream( })}\n\n`; } } - // Handle LLaMA3 models - else if (modelId.startsWith("us.meta.llama3")) { + // Handle LLaMA models + else if (modelId.startsWith("us.meta.llama")) { let text = ""; - if (parsed.generation) { + if (parsed.outputs?.[0]?.text) { + text = parsed.outputs[0].text; + } else if (parsed.generation) { text = parsed.generation; } else if (parsed.output) { text = parsed.output; @@ -101,8 +104,6 @@ async function* transformBedrockStream( } if (text) { - // Clean up any control characters or invalid JSON characters - text = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); yield `data: ${JSON.stringify({ delta: { text }, })}\n\n`; @@ -162,6 +163,7 @@ async function* transformBedrockStream( function validateRequest(body: any, modelId: string): void { if (!modelId) throw new Error("Model ID is required"); + // Handle nested body structure const bodyContent = body.body || body; if (modelId.startsWith("anthropic.claude")) { @@ -180,22 +182,20 @@ function validateRequest(body: any, modelId: string): void { } else if (typeof body.prompt !== "string") { throw new Error("prompt is required for Claude 2 and earlier"); } - } else if (modelId.startsWith("us.meta.llama3")) { - if (!bodyContent.prompt) { - throw new Error("prompt is required for LLaMA3 models"); + } else if (modelId.startsWith("us.meta.llama")) { + if (!bodyContent.prompt || typeof bodyContent.prompt !== "string") { + throw new Error("prompt string is required for LLaMA models"); + } + if ( + !bodyContent.max_gen_len || + typeof bodyContent.max_gen_len !== "number" + ) { + throw new Error("max_gen_len must be a positive number for LLaMA models"); } } else if (modelId.startsWith("mistral.mistral")) { if (!bodyContent.prompt) { throw new Error("prompt is required for Mistral models"); } - if ( - !bodyContent.prompt.startsWith("[INST]") || - !bodyContent.prompt.includes("[/INST]") - ) { - throw new Error( - "Mistral prompt must be wrapped in [INST] and [/INST] tags", - ); - } } else if (modelId.startsWith("amazon.titan")) { if (!bodyContent.inputText) throw new Error("Titan requires inputText"); } @@ -250,7 +250,6 @@ async function requestBedrock(req: NextRequest) { try { // Determine the endpoint and request body based on model type let endpoint; - let requestBody; const bodyText = await req.clone().text(); if (!bodyText) { @@ -258,6 +257,10 @@ async function requestBedrock(req: NextRequest) { } const bodyJson = JSON.parse(bodyText); + + // Debug log the request body + console.log("Original request body:", JSON.stringify(bodyJson, null, 2)); + validateRequest(bodyJson, modelId); // For all models, use standard endpoints @@ -267,26 +270,44 @@ async function requestBedrock(req: NextRequest) { endpoint = `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; } - // Set content type and accept headers for Mistral models + // Set additional headers based on model type + const additionalHeaders: Record = {}; + if ( + modelId.startsWith("us.meta.llama") || + modelId.startsWith("mistral.mistral") + ) { + additionalHeaders["content-type"] = "application/json"; + additionalHeaders["accept"] = "application/json"; + } + + // For Mistral models, unwrap the body object + const finalRequestBody = + modelId.startsWith("mistral.mistral") && bodyJson.body + ? bodyJson.body + : bodyJson; + + // Set content type and accept headers for specific models const headers = await sign({ method: "POST", url: endpoint, region: awsRegion, accessKeyId: awsAccessKey, secretAccessKey: awsSecretKey, - body: JSON.stringify(bodyJson.body || bodyJson), + body: JSON.stringify(finalRequestBody), service: "bedrock", isStreaming: shouldStream !== "false", - ...(modelId.startsWith("mistral.mistral") && { - contentType: "application/json", - accept: "application/json", - }), + additionalHeaders, }); + // Debug log the final request body + // console.log("Final request endpoint:", endpoint); + // console.log(headers); + // console.log("Final request body:", JSON.stringify(finalRequestBody, null, 2)); + const res = await fetch(endpoint, { method: "POST", headers, - body: JSON.stringify(bodyJson.body || bodyJson), + body: JSON.stringify(finalRequestBody), redirect: "manual", // @ts-ignore duplex: "half", diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index aff4c5582ed..5c661c86f8b 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -85,14 +85,17 @@ export class BedrockApi implements LLMApi { } // Handle LLaMA models - if (modelId.startsWith("us.meta.llama3")) { + if (modelId.startsWith("us.meta.llama")) { if (res?.delta?.text) { return res.delta.text; } if (res?.generation) { return res.generation; } - if (typeof res?.output === "string") { + if (res?.outputs?.[0]?.text) { + return res.outputs[0].text; + } + if (res?.output) { return res.output; } if (typeof res === "string") { @@ -103,11 +106,28 @@ export class BedrockApi implements LLMApi { // Handle Mistral models if (modelId.startsWith("mistral.mistral")) { - if (res?.delta?.text) return res.delta.text; - return res?.outputs?.[0]?.text || res?.output || res?.completion || ""; + if (res?.delta?.text) { + return res.delta.text; + } + if (res?.outputs?.[0]?.text) { + return res.outputs[0].text; + } + if (res?.content?.[0]?.text) { + return res.content[0].text; + } + if (res?.output) { + return res.output; + } + if (res?.completion) { + return res.completion; + } + if (typeof res === "string") { + return res; + } + return ""; } - // Handle Claude models and fallback cases + // Handle Claude models if (res?.content?.[0]?.text) return res.content[0].text; if (res?.messages?.[0]?.content?.[0]?.text) return res.messages[0].content[0].text; @@ -142,14 +162,11 @@ export class BedrockApi implements LLMApi { ] : messages; - // Format messages without role prefixes for Titan const inputText = allMessages .map((m) => { - // Include system message as a prefix instruction if (m.role === "system") { return getMessageTextContent(m); } - // For user/assistant messages, just include the content return getMessageTextContent(m); }) .join("\n\n"); @@ -166,25 +183,39 @@ export class BedrockApi implements LLMApi { }; } - // Handle LLaMA3 models - if (model.startsWith("us.meta.llama3")) { - // Only include the last user message for LLaMA - const lastMessage = messages[messages.length - 1]; - const prompt = getMessageTextContent(lastMessage); + // Handle LLaMA models + if (model.startsWith("us.meta.llama")) { + const allMessages = systemMessage + ? [ + { role: "system" as MessageRole, content: systemMessage }, + ...messages, + ] + : messages; + + const prompt = allMessages + .map((m) => { + const content = getMessageTextContent(m); + if (m.role === "system") { + return `System: ${content}`; + } else if (m.role === "user") { + return `User: ${content}`; + } else if (m.role === "assistant") { + return `Assistant: ${content}`; + } + return content; + }) + .join("\n\n"); return { - contentType: "application/json", - accept: "application/json", - body: { - prompt: prompt, - max_gen_len: modelConfig.max_tokens || 256, - temperature: modelConfig.temperature || 0.5, - top_p: 0.9, - }, + prompt, + max_gen_len: modelConfig.max_tokens || 512, + temperature: modelConfig.temperature || 0.6, + top_p: modelConfig.top_p || 0.9, + stop: ["User:", "System:", "Assistant:", "\n\n"], }; } - // Handle Mistral models with correct instruction format + // Handle Mistral models if (model.startsWith("mistral.mistral")) { const allMessages = systemMessage ? [ @@ -193,25 +224,29 @@ export class BedrockApi implements LLMApi { ] : messages; - // Format messages as a conversation with instruction tags - const prompt = `[INST] ${allMessages - .map((m) => getMessageTextContent(m)) - .join("\n")} [/INST]`; + const formattedConversation = allMessages + .map((m) => { + const content = getMessageTextContent(m); + if (m.role === "system") { + return content; + } else if (m.role === "user") { + return content; + } else if (m.role === "assistant") { + return content; + } + return content; + }) + .join("\n"); + // Format according to Mistral's requirements return { - contentType: "application/json", - accept: "application/json", - body: { - prompt, - max_tokens: modelConfig.max_tokens || 4096, - temperature: modelConfig.temperature || 0.5, - top_p: 0.9, - top_k: 50, - }, + prompt: formattedConversation, + max_tokens: modelConfig.max_tokens || 4096, + temperature: modelConfig.temperature || 0.7, }; } - // Handle Claude models (existing implementation) + // Handle Claude models const isClaude3 = model.startsWith("anthropic.claude-3"); const formattedMessages = messages .filter( @@ -253,12 +288,14 @@ export class BedrockApi implements LLMApi { }); return { - anthropic_version: "bedrock-2023-05-31", - max_tokens: modelConfig.max_tokens, - messages: formattedMessages, - ...(systemMessage && { system: systemMessage }), - temperature: modelConfig.temperature, - ...(isClaude3 && { top_k: 5 }), + body: { + anthropic_version: "bedrock-2023-05-31", + max_tokens: modelConfig.max_tokens, + messages: formattedMessages, + ...(systemMessage && { system: systemMessage }), + temperature: modelConfig.temperature, + ...(isClaude3 && { top_k: modelConfig.top_k || 50 }), + }, }; } @@ -301,6 +338,13 @@ export class BedrockApi implements LLMApi { const headers = getHeaders(); headers.ModelID = modelConfig.model; + // For LLaMA and Mistral models, send the request body directly without the 'body' wrapper + const finalRequestBody = + modelConfig.model.startsWith("us.meta.llama") || + modelConfig.model.startsWith("mistral.mistral") + ? requestBody + : requestBody.body; + if (options.config.stream) { let index = -1; let currentToolArgs = ""; @@ -312,7 +356,7 @@ export class BedrockApi implements LLMApi { return stream( chatPath, - requestBody, + finalRequestBody, headers, (tools as ToolDefinition[]).map((tool) => ({ name: tool?.function?.name, @@ -420,7 +464,7 @@ export class BedrockApi implements LLMApi { const res = await fetch(chatPath, { method: "POST", headers, - body: JSON.stringify(requestBody), + body: JSON.stringify(finalRequestBody), }); const resJson = await res.json(); From 2ccdd1706a2168ef4e6e900872a8528d2c9cd558 Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 24 Nov 2024 15:37:49 +0800 Subject: [PATCH 35/72] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=B0=86=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=8A=BD=E5=8F=96=E5=88=B0util=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.template | 6 +- app/api/bedrock.ts | 354 ++++++--------------- app/client/api.ts | 6 +- app/client/platforms/bedrock.ts | 548 +++++++++++++------------------- app/components/settings.tsx | 13 +- app/config/server.ts | 2 +- app/locales/cn.ts | 1 + app/locales/en.ts | 2 + app/store/access.ts | 29 +- app/utils/aws.ts | 383 +++++++++++++++++----- 10 files changed, 652 insertions(+), 692 deletions(-) diff --git a/.env.template b/.env.template index 1f477319594..1661f77e1eb 100644 --- a/.env.template +++ b/.env.template @@ -71,8 +71,4 @@ WHITE_WEBDAV_ENDPOINTS= ### bedrock (optional) AWS_REGION= AWS_ACCESS_KEY=AKIA -AWS_SECRET_KEY= -### Assign this with a secure, randomly generated key; -### Generate a secure, random key that is at least 32 characters long. You can use a password generator or a command like this: -### openssl rand -base64 32 -ENCRYPTION_KEY= \ No newline at end of file +AWS_SECRET_KEY= \ No newline at end of file diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index fa52363ae5f..d65fc3f508a 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -1,209 +1,23 @@ import { NextRequest, NextResponse } from "next/server"; import { auth } from "./auth"; -import { sign, decrypt } from "../utils/aws"; +import { + sign, + decrypt, + getBedrockEndpoint, + getModelHeaders, + transformBedrockStream, + parseEventData, + BedrockCredentials, +} from "../utils/aws"; import { getServerSideConfig } from "../config/server"; import { ModelProvider } from "../constant"; import { prettyObject } from "../utils/format"; const ALLOWED_PATH = new Set(["chat", "models"]); -function parseEventData(chunk: Uint8Array): any { - const decoder = new TextDecoder(); - const text = decoder.decode(chunk); - try { - const parsed = JSON.parse(text); - // AWS Bedrock wraps the response in a 'body' field - if (typeof parsed.body === "string") { - try { - const bodyJson = JSON.parse(parsed.body); - return bodyJson; - } catch (e) { - return { output: parsed.body }; - } - } - return parsed.body || parsed; - } catch (e) { - // console.error("Error parsing event data:", e); - try { - // Handle base64 encoded responses - const base64Match = text.match(/:"([A-Za-z0-9+/=]+)"/); - if (base64Match) { - const decoded = Buffer.from(base64Match[1], "base64").toString("utf-8"); - try { - return JSON.parse(decoded); - } catch (e) { - return { output: decoded }; - } - } - - // Handle event-type responses - const eventMatch = text.match(/:event-type[^\{]+({.*})/); - if (eventMatch) { - try { - return JSON.parse(eventMatch[1]); - } catch (e) { - return { output: eventMatch[1] }; - } - } - - // Handle plain text responses - if (text.trim()) { - // Clean up any malformed JSON characters - const cleanText = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); - return { output: cleanText }; - } - } catch (innerError) { - console.error("Error in fallback parsing:", innerError); - } - } - return null; -} - -async function* transformBedrockStream( - stream: ReadableStream, - modelId: string, -) { - const reader = stream.getReader(); - let buffer = ""; - - try { - while (true) { - const { done, value } = await reader.read(); - if (done) { - if (buffer) { - yield `data: ${JSON.stringify({ - delta: { text: buffer }, - })}\n\n`; - } - break; - } - - const parsed = parseEventData(value); - if (!parsed) continue; - - // Handle Titan models - if (modelId.startsWith("amazon.titan")) { - const text = parsed.outputText || ""; - if (text) { - yield `data: ${JSON.stringify({ - delta: { text }, - })}\n\n`; - } - } - // Handle LLaMA models - else if (modelId.startsWith("us.meta.llama")) { - let text = ""; - if (parsed.outputs?.[0]?.text) { - text = parsed.outputs[0].text; - } else if (parsed.generation) { - text = parsed.generation; - } else if (parsed.output) { - text = parsed.output; - } else if (typeof parsed === "string") { - text = parsed; - } - - if (text) { - yield `data: ${JSON.stringify({ - delta: { text }, - })}\n\n`; - } - } - // Handle Mistral models - else if (modelId.startsWith("mistral.mistral")) { - let text = ""; - if (parsed.outputs?.[0]?.text) { - text = parsed.outputs[0].text; - } else if (parsed.output) { - text = parsed.output; - } else if (parsed.completion) { - text = parsed.completion; - } else if (typeof parsed === "string") { - text = parsed; - } - - if (text) { - yield `data: ${JSON.stringify({ - delta: { text }, - })}\n\n`; - } - } - // Handle Claude models - else if (modelId.startsWith("anthropic.claude")) { - if (parsed.type === "content_block_delta") { - if (parsed.delta?.type === "text_delta") { - yield `data: ${JSON.stringify({ - delta: { text: parsed.delta.text }, - })}\n\n`; - } else if (parsed.delta?.type === "input_json_delta") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } - } else if ( - parsed.type === "message_delta" && - parsed.delta?.stop_reason - ) { - yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.delta.stop_reason }, - })}\n\n`; - } else if ( - parsed.type === "content_block_start" && - parsed.content_block?.type === "tool_use" - ) { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } else if (parsed.type === "content_block_stop") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } - } - } - } finally { - reader.releaseLock(); - } -} - -function validateRequest(body: any, modelId: string): void { - if (!modelId) throw new Error("Model ID is required"); - - // Handle nested body structure - const bodyContent = body.body || body; - - if (modelId.startsWith("anthropic.claude")) { - if ( - !body.anthropic_version || - body.anthropic_version !== "bedrock-2023-05-31" - ) { - throw new Error("anthropic_version must be 'bedrock-2023-05-31'"); - } - if (typeof body.max_tokens !== "number" || body.max_tokens < 0) { - throw new Error("max_tokens must be a positive number"); - } - if (modelId.startsWith("anthropic.claude-3")) { - if (!Array.isArray(body.messages)) - throw new Error("messages array is required for Claude 3"); - } else if (typeof body.prompt !== "string") { - throw new Error("prompt is required for Claude 2 and earlier"); - } - } else if (modelId.startsWith("us.meta.llama")) { - if (!bodyContent.prompt || typeof bodyContent.prompt !== "string") { - throw new Error("prompt string is required for LLaMA models"); - } - if ( - !bodyContent.max_gen_len || - typeof bodyContent.max_gen_len !== "number" - ) { - throw new Error("max_gen_len must be a positive number for LLaMA models"); - } - } else if (modelId.startsWith("mistral.mistral")) { - if (!bodyContent.prompt) { - throw new Error("prompt is required for Mistral models"); - } - } else if (modelId.startsWith("amazon.titan")) { - if (!bodyContent.inputText) throw new Error("Titan requires inputText"); - } -} - -async function requestBedrock(req: NextRequest) { - const controller = new AbortController(); - +async function getBedrockCredentials( + req: NextRequest, +): Promise { // Get AWS credentials from server config first const config = getServerSideConfig(); let awsRegion = config.awsRegion; @@ -224,90 +38,99 @@ async function requestBedrock(req: NextRequest) { if (!encryptedRegion || !encryptedAccessKey || !encryptedSecretKey) { throw new Error("Invalid Authorization header format"); } - + const encryptionKey = req.headers.get("XEncryptionKey") || ""; // Decrypt the credentials - awsRegion = decrypt(encryptedRegion); - awsAccessKey = decrypt(encryptedAccessKey); - awsSecretKey = decrypt(encryptedSecretKey); + awsRegion = decrypt(encryptedRegion, encryptionKey); + awsAccessKey = decrypt(encryptedAccessKey, encryptionKey); + awsSecretKey = decrypt(encryptedSecretKey, encryptionKey); if (!awsRegion || !awsAccessKey || !awsSecretKey) { - throw new Error("Failed to decrypt AWS credentials"); + throw new Error( + "Failed to decrypt AWS credentials. Please ensure ENCRYPTION_KEY is set correctly.", + ); } } - let modelId = req.headers.get("ModelID"); - let shouldStream = req.headers.get("ShouldStream"); - if (!awsRegion || !awsAccessKey || !awsSecretKey || !modelId) { - throw new Error("Missing required AWS credentials or model ID"); - } - - // Construct the base endpoint - const baseEndpoint = `https://bedrock-runtime.${awsRegion}.amazonaws.com`; + return { + region: awsRegion, + accessKeyId: awsAccessKey, + secretAccessKey: awsSecretKey, + }; +} - // Set up timeout +async function requestBedrock(req: NextRequest) { + const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 10 * 60 * 1000); try { - // Determine the endpoint and request body based on model type - let endpoint; + // Get credentials and model info + const credentials = await getBedrockCredentials(req); + const modelId = req.headers.get("XModelID"); + const shouldStream = req.headers.get("ShouldStream") !== "false"; + if (!modelId) { + throw new Error("Missing model ID"); + } + + // Parse and validate request body const bodyText = await req.clone().text(); if (!bodyText) { throw new Error("Request body is empty"); } - - const bodyJson = JSON.parse(bodyText); - - // Debug log the request body - console.log("Original request body:", JSON.stringify(bodyJson, null, 2)); - - validateRequest(bodyJson, modelId); - - // For all models, use standard endpoints - if (shouldStream === "false") { - endpoint = `${baseEndpoint}/model/${modelId}/invoke`; - } else { - endpoint = `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; + let bodyJson; + try { + bodyJson = JSON.parse(bodyText); + } catch (e) { + throw new Error(`Invalid JSON in request body: ${e}`); } - // Set additional headers based on model type - const additionalHeaders: Record = {}; - if ( - modelId.startsWith("us.meta.llama") || - modelId.startsWith("mistral.mistral") - ) { - additionalHeaders["content-type"] = "application/json"; - additionalHeaders["accept"] = "application/json"; + // Extract tool configuration if present + let tools: any[] | undefined; + if (bodyJson.tools) { + tools = bodyJson.tools; + delete bodyJson.tools; // Remove from main request body } - // For Mistral models, unwrap the body object - const finalRequestBody = - modelId.startsWith("mistral.mistral") && bodyJson.body - ? bodyJson.body - : bodyJson; + // Get endpoint and prepare request + const endpoint = getBedrockEndpoint( + credentials.region, + modelId, + shouldStream, + ); + const additionalHeaders = getModelHeaders(modelId); + + console.log("[Bedrock Request] Endpoint:", endpoint); + console.log("[Bedrock Request] Model ID:", modelId); + + // Only include tools for Claude models + const isClaudeModel = modelId.toLowerCase().includes("claude3"); + const requestBody = { + ...bodyJson, + ...(isClaudeModel && tools && { tools }), + }; - // Set content type and accept headers for specific models + // Sign request const headers = await sign({ method: "POST", url: endpoint, - region: awsRegion, - accessKeyId: awsAccessKey, - secretAccessKey: awsSecretKey, - body: JSON.stringify(finalRequestBody), + region: credentials.region, + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + body: JSON.stringify(requestBody), service: "bedrock", - isStreaming: shouldStream !== "false", + isStreaming: shouldStream, additionalHeaders, }); - // Debug log the final request body - // console.log("Final request endpoint:", endpoint); - // console.log(headers); - // console.log("Final request body:", JSON.stringify(finalRequestBody, null, 2)); - + // Make request to AWS Bedrock + console.log( + "[Bedrock Request] Body:", + JSON.stringify(requestBody, null, 2), + ); const res = await fetch(endpoint, { method: "POST", headers, - body: JSON.stringify(finalRequestBody), + body: JSON.stringify(requestBody), redirect: "manual", // @ts-ignore duplex: "half", @@ -316,24 +139,35 @@ async function requestBedrock(req: NextRequest) { if (!res.ok) { const error = await res.text(); - console.error("AWS Bedrock error response:", error); + console.error("[Bedrock Error] Status:", res.status); + console.error("[Bedrock Error] Response:", error); try { const errorJson = JSON.parse(error); throw new Error(errorJson.message || error); } catch { - throw new Error(error || "Failed to get response from Bedrock"); + throw new Error( + `Bedrock request failed with status ${res.status}: ${ + error || "No error message" + }`, + ); } } if (!res.body) { - throw new Error("Empty response from Bedrock"); + console.error("[Bedrock Error] Empty response body"); + throw new Error( + "Empty response from Bedrock. Please check AWS credentials and permissions.", + ); } // Handle non-streaming response - if (shouldStream === "false") { + if (!shouldStream) { const responseText = await res.text(); - console.error("AWS Bedrock shouldStream === false:", responseText); + console.log("[Bedrock Response] Non-streaming:", responseText); const parsed = parseEventData(new TextEncoder().encode(responseText)); + if (!parsed) { + throw new Error("Failed to parse Bedrock response"); + } return NextResponse.json(parsed); } @@ -347,7 +181,7 @@ async function requestBedrock(req: NextRequest) { } controller.close(); } catch (err) { - console.error("Stream error:", err); + console.error("[Bedrock Stream Error]:", err); controller.error(err); } }, @@ -362,7 +196,7 @@ async function requestBedrock(req: NextRequest) { }, }); } catch (e) { - console.error("Request error:", e); + console.error("[Bedrock Request Error]:", e); throw e; } finally { clearTimeout(timeoutId); @@ -384,12 +218,14 @@ export async function handle( { status: 403 }, ); } + const authResult = auth(req, ModelProvider.Bedrock); if (authResult.error) { return NextResponse.json(authResult, { status: 401, }); } + try { return await requestBedrock(req); } catch (e) { diff --git a/app/client/api.ts b/app/client/api.ts index 04da39ac18a..06537d1de52 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -280,11 +280,11 @@ export function getHeaders(ignoreHeaders: boolean = false) { ? accessStore.awsRegion && accessStore.awsAccessKey && accessStore.awsSecretKey - ? encrypt(accessStore.awsRegion) + + ? encrypt(accessStore.awsRegion, accessStore.encryptionKey) + ":" + - encrypt(accessStore.awsAccessKey) + + encrypt(accessStore.awsAccessKey, accessStore.encryptionKey) + ":" + - encrypt(accessStore.awsSecretKey) + encrypt(accessStore.awsSecretKey, accessStore.encryptionKey) : "" : accessStore.openaiApiKey; return { diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 5c661c86f8b..7d1bda3dd25 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -1,24 +1,19 @@ "use client"; -import { - ChatOptions, - getHeaders, - LLMApi, - SpeechOptions, - RequestMessage, - MultimodalContent, - MessageRole, -} from "../api"; +import { ChatOptions, getHeaders, LLMApi, SpeechOptions } from "../api"; import { useAppConfig, usePluginStore, useChatStore, useAccessStore, ChatMessageTool, -} from "../../store"; -import { preProcessImageContent, stream } from "../../utils/chat"; -import { getMessageTextContent, isVisionModel } from "../../utils"; -import { ApiPath, BEDROCK_BASE_URL } from "../../constant"; -import { getClientConfig } from "../../config/client"; +} from "@/app/store"; +import { preProcessImageContent, stream } from "@/app/utils/chat"; +import { getMessageTextContent, isVisionModel } from "@/app/utils"; +import { ApiPath, BEDROCK_BASE_URL } from "@/app/constant"; +import { getClientConfig } from "@/app/config/client"; +import { extractMessage } from "@/app/utils/aws"; +import { RequestPayload } from "./openai"; +import { fetch } from "@/app/utils/stream"; const ClaudeMapper = { assistant: "assistant", @@ -28,184 +23,41 @@ const ClaudeMapper = { type ClaudeRole = keyof typeof ClaudeMapper; -interface ToolDefinition { - function?: { - name: string; - description?: string; - parameters?: any; - }; -} - export class BedrockApi implements LLMApi { - private disableListModels = true; - - path(path: string): string { - const accessStore = useAccessStore.getState(); - - let baseUrl = ""; - - if (accessStore.useCustomConfig) { - baseUrl = accessStore.bedrockUrl; - } - - if (baseUrl.length === 0) { - const isApp = !!getClientConfig()?.isApp; - const apiPath = ApiPath.Bedrock; - baseUrl = isApp ? BEDROCK_BASE_URL : apiPath; - } - - if (baseUrl.endsWith("/")) { - baseUrl = baseUrl.slice(0, baseUrl.length - 1); - } - if (!baseUrl.startsWith("http") && !baseUrl.startsWith(ApiPath.Bedrock)) { - baseUrl = "https://" + baseUrl; - } - - console.log("[Proxy Endpoint] ", baseUrl, path); - - return [baseUrl, path].join("/"); - } - speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); } - extractMessage(res: any, modelId: string = "") { - try { - // Handle Titan models - if (modelId.startsWith("amazon.titan")) { - let text = ""; - if (res?.delta?.text) { - text = res.delta.text; - } else { - text = res?.outputText || ""; - } - // Clean up Titan response by removing leading question mark and whitespace - return text.replace(/^[\s?]+/, ""); - } - - // Handle LLaMA models - if (modelId.startsWith("us.meta.llama")) { - if (res?.delta?.text) { - return res.delta.text; - } - if (res?.generation) { - return res.generation; - } - if (res?.outputs?.[0]?.text) { - return res.outputs[0].text; - } - if (res?.output) { - return res.output; - } - if (typeof res === "string") { - return res; - } - return ""; - } - - // Handle Mistral models - if (modelId.startsWith("mistral.mistral")) { - if (res?.delta?.text) { - return res.delta.text; - } - if (res?.outputs?.[0]?.text) { - return res.outputs[0].text; - } - if (res?.content?.[0]?.text) { - return res.content[0].text; - } - if (res?.output) { - return res.output; - } - if (res?.completion) { - return res.completion; - } - if (typeof res === "string") { - return res; - } - return ""; - } - - // Handle Claude models - if (res?.content?.[0]?.text) return res.content[0].text; - if (res?.messages?.[0]?.content?.[0]?.text) - return res.messages[0].content[0].text; - if (res?.delta?.text) return res.delta.text; - if (res?.completion) return res.completion; - if (res?.generation) return res.generation; - if (res?.outputText) return res.outputText; - if (res?.output) return res.output; - - if (typeof res === "string") return res; - - return ""; - } catch (e) { - console.error("Error extracting message:", e); - return ""; - } - } - - formatRequestBody( - messages: RequestMessage[], - systemMessage: string, - modelConfig: any, - ) { + formatRequestBody(messages: ChatOptions["messages"], modelConfig: any) { const model = modelConfig.model; + const visionModel = isVisionModel(modelConfig.model); + // Handle Titan models if (model.startsWith("amazon.titan")) { - const allMessages = systemMessage - ? [ - { role: "system" as MessageRole, content: systemMessage }, - ...messages, - ] - : messages; - - const inputText = allMessages - .map((m) => { - if (m.role === "system") { - return getMessageTextContent(m); - } - return getMessageTextContent(m); + const inputText = messages + .map((message) => { + return `${message.role}: ${message.content}`; }) .join("\n\n"); return { - body: { - inputText, - textGenerationConfig: { - maxTokenCount: modelConfig.max_tokens, - temperature: modelConfig.temperature, - stopSequences: [], - }, + inputText, + textGenerationConfig: { + maxTokenCount: modelConfig.max_tokens, + temperature: modelConfig.temperature, + stopSequences: [], }, }; } // Handle LLaMA models if (model.startsWith("us.meta.llama")) { - const allMessages = systemMessage - ? [ - { role: "system" as MessageRole, content: systemMessage }, - ...messages, - ] - : messages; - - const prompt = allMessages - .map((m) => { - const content = getMessageTextContent(m); - if (m.role === "system") { - return `System: ${content}`; - } else if (m.role === "user") { - return `User: ${content}`; - } else if (m.role === "assistant") { - return `Assistant: ${content}`; - } - return content; + const prompt = messages + .map((message) => { + return `${message.role}: ${message.content}`; }) .join("\n\n"); - return { prompt, max_gen_len: modelConfig.max_tokens || 512, @@ -217,116 +69,124 @@ export class BedrockApi implements LLMApi { // Handle Mistral models if (model.startsWith("mistral.mistral")) { - const allMessages = systemMessage - ? [ - { role: "system" as MessageRole, content: systemMessage }, - ...messages, - ] - : messages; - - const formattedConversation = allMessages - .map((m) => { - const content = getMessageTextContent(m); - if (m.role === "system") { - return content; - } else if (m.role === "user") { - return content; - } else if (m.role === "assistant") { - return content; - } - return content; + const prompt = messages + .map((message) => { + return `${message.role}: ${message.content}`; }) - .join("\n"); - - // Format according to Mistral's requirements + .join("\n\n"); return { - prompt: formattedConversation, + prompt, max_tokens: modelConfig.max_tokens || 4096, temperature: modelConfig.temperature || 0.7, }; } // Handle Claude models - const isClaude3 = model.startsWith("anthropic.claude-3"); - const formattedMessages = messages - .filter( - (v) => v.content && (typeof v.content !== "string" || v.content.trim()), - ) + const keys = ["system", "user"]; + // roles must alternate between "user" and "assistant" in claude, so add a fake assistant message between two user messages + for (let i = 0; i < messages.length - 1; i++) { + const message = messages[i]; + const nextMessage = messages[i + 1]; + + if (keys.includes(message.role) && keys.includes(nextMessage.role)) { + messages[i] = [ + message, + { + role: "assistant", + content: ";", + }, + ] as any; + } + } + const prompt = messages + .flat() + .filter((v) => { + if (!v.content) return false; + if (typeof v.content === "string" && !v.content.trim()) return false; + return true; + }) .map((v) => { const { role, content } = v; - const insideRole = ClaudeMapper[role as ClaudeRole] ?? "user"; + const insideRole = ClaudeMapper[role] ?? "user"; - if (!isVisionModel(model) || typeof content === "string") { + if (!visionModel || typeof content === "string") { return { role: insideRole, - content: [{ type: "text", text: getMessageTextContent(v) }], + content: getMessageTextContent(v), }; } - return { role: insideRole, - content: (content as MultimodalContent[]) + content: content .filter((v) => v.image_url || v.text) .map(({ type, text, image_url }) => { - if (type === "text") return { type, text: text! }; - + if (type === "text") { + return { + type, + text: text!, + }; + } const { url = "" } = image_url || {}; const colonIndex = url.indexOf(":"); const semicolonIndex = url.indexOf(";"); const comma = url.indexOf(","); + const mimeType = url.slice(colonIndex + 1, semicolonIndex); + const encodeType = url.slice(semicolonIndex + 1, comma); + const data = url.slice(comma + 1); + return { - type: "image", + type: "image" as const, source: { - type: url.slice(semicolonIndex + 1, comma), - media_type: url.slice(colonIndex + 1, semicolonIndex), - data: url.slice(comma + 1), + type: encodeType, + media_type: mimeType, + data, }, }; }), }; }); - return { - body: { - anthropic_version: "bedrock-2023-05-31", - max_tokens: modelConfig.max_tokens, - messages: formattedMessages, - ...(systemMessage && { system: systemMessage }), - temperature: modelConfig.temperature, - ...(isClaude3 && { top_k: modelConfig.top_k || 50 }), - }, + if (prompt[0]?.role === "assistant") { + prompt.unshift({ + role: "user", + content: ";", + }); + } + const requestBody: any = { + anthropic_version: useAccessStore.getState().bedrockAnthropicVersion, + max_tokens: modelConfig.max_tokens, + messages: prompt, + temperature: modelConfig.temperature, + top_p: modelConfig.top_p || 0.9, + top_k: modelConfig.top_k || 5, }; + return requestBody; } async chat(options: ChatOptions) { + const accessStore = useAccessStore.getState(); + + const shouldStream = !!options.config.stream; + const modelConfig = { ...useAppConfig.getState().modelConfig, ...useChatStore.getState().currentSession().mask.modelConfig, - model: options.config.model, + ...{ + model: options.config.model, + }, }; - let systemMessage = ""; - const messages = []; - for (const msg of options.messages) { - const content = await preProcessImageContent(msg.content); - if (msg.role === "system") { - systemMessage = getMessageTextContent(msg); - } else { - messages.push({ role: msg.role, content }); - } + // try get base64image from local cache image_url + const messages: ChatOptions["messages"] = []; + for (const v of options.messages) { + const content = await preProcessImageContent(v.content); + messages.push({ role: v.role, content }); } - const requestBody = this.formatRequestBody( - messages, - systemMessage, - modelConfig, - ); - const controller = new AbortController(); options.onController?.(controller); - const accessStore = useAccessStore.getState(); if (!accessStore.isValidBedrock()) { throw new Error( "Invalid AWS credentials. Please check your configuration and ensure ENCRYPTION_KEY is set.", @@ -336,29 +196,30 @@ export class BedrockApi implements LLMApi { try { const chatPath = this.path("chat"); const headers = getHeaders(); - headers.ModelID = modelConfig.model; - - // For LLaMA and Mistral models, send the request body directly without the 'body' wrapper - const finalRequestBody = - modelConfig.model.startsWith("us.meta.llama") || - modelConfig.model.startsWith("mistral.mistral") - ? requestBody - : requestBody.body; + headers.XModelID = modelConfig.model; + headers.XEncryptionKey = accessStore.encryptionKey; + + console.log("[Bedrock Client] Request:", { + path: chatPath, + model: modelConfig.model, + messages: messages.length, + stream: shouldStream, + }); - if (options.config.stream) { + const finalRequestBody = this.formatRequestBody(messages, modelConfig); + if (shouldStream) { let index = -1; - let currentToolArgs = ""; const [tools, funcs] = usePluginStore .getState() .getAsTools( useChatStore.getState().currentSession().mask?.plugin || [], ); - return stream( chatPath, finalRequestBody, headers, - (tools as ToolDefinition[]).map((tool) => ({ + // @ts-ignore + tools.map((tool) => ({ name: tool?.function?.name, description: tool?.function?.description, input_schema: tool?.function?.parameters, @@ -366,96 +227,86 @@ export class BedrockApi implements LLMApi { funcs, controller, (text: string, runTools: ChatMessageTool[]) => { - try { - const chunkJson = JSON.parse(text); - if (chunkJson?.content_block?.type === "tool_use") { - index += 1; - currentToolArgs = ""; - const id = chunkJson.content_block?.id; - const name = chunkJson.content_block?.name; - if (id && name) { - runTools.push({ - id, - type: "function", - function: { name, arguments: "" }, - }); - } - } else if ( - chunkJson?.delta?.type === "input_json_delta" && - chunkJson.delta?.partial_json - ) { - currentToolArgs += chunkJson.delta.partial_json; - try { - JSON.parse(currentToolArgs); - if (index >= 0 && index < runTools.length) { - runTools[index].function!.arguments = currentToolArgs; - } - } catch (e) {} - } else if ( - chunkJson?.type === "content_block_stop" && - currentToolArgs && - index >= 0 && - index < runTools.length - ) { - try { - if (currentToolArgs.trim().endsWith(",")) { - currentToolArgs = currentToolArgs.slice(0, -1) + "}"; - } else if (!currentToolArgs.endsWith("}")) { - currentToolArgs += "}"; - } - JSON.parse(currentToolArgs); - runTools[index].function!.arguments = currentToolArgs; - } catch (e) {} - } - const message = this.extractMessage(chunkJson, modelConfig.model); - return message; - } catch (e) { - console.error("Error parsing chunk:", e); - return ""; + // console.log("parseSSE", text, runTools); + let chunkJson: + | undefined + | { + type: "content_block_delta" | "content_block_stop"; + content_block?: { + type: "tool_use"; + id: string; + name: string; + }; + delta?: { + type: "text_delta" | "input_json_delta"; + text?: string; + partial_json?: string; + }; + index: number; + }; + chunkJson = JSON.parse(text); + + if (chunkJson?.content_block?.type == "tool_use") { + index += 1; + const id = chunkJson?.content_block.id; + const name = chunkJson?.content_block.name; + runTools.push({ + id, + type: "function", + function: { + name, + arguments: "", + }, + }); + } + if ( + chunkJson?.delta?.type == "input_json_delta" && + chunkJson?.delta?.partial_json + ) { + // @ts-ignore + runTools[index]["function"]["arguments"] += + chunkJson?.delta?.partial_json; } + return chunkJson?.delta?.text; }, + // processToolMessage, include tool_calls message and tool call results ( - requestPayload: any, + requestPayload: RequestPayload, toolCallMessage: any, toolCallResult: any[], ) => { + // reset index value index = -1; - currentToolArgs = ""; - if (requestPayload?.messages) { - requestPayload.messages.splice( - requestPayload.messages.length, - 0, - { - role: "assistant", - content: [ - { - type: "text", - text: JSON.stringify( - toolCallMessage.tool_calls.map( - (tool: ChatMessageTool) => ({ - type: "tool_use", - id: tool.id, - name: tool?.function?.name, - input: tool?.function?.arguments - ? JSON.parse(tool?.function?.arguments) - : {}, - }), - ), - ), - }, - ], - }, - ...toolCallResult.map((result) => ({ - role: "user", - content: [ - { - type: "text", - text: `Tool '${result.tool_call_id}' returned: ${result.content}`, - }, - ], - })), - ); - } + // @ts-ignore + requestPayload?.messages?.splice( + // @ts-ignore + requestPayload?.messages?.length, + 0, + { + role: "assistant", + content: toolCallMessage.tool_calls.map( + (tool: ChatMessageTool) => ({ + type: "tool_use", + id: tool.id, + name: tool?.function?.name, + input: tool?.function?.arguments + ? JSON.parse(tool?.function?.arguments) + : {}, + }), + ), + }, + // @ts-ignore + ...toolCallResult.map((result) => ({ + role: "user", + content: [ + { + type: "tool_result", + tool_use_id: result.tool_call_id, + content: result.content, + }, + ], + })), + ); }, options, ); @@ -467,15 +318,48 @@ export class BedrockApi implements LLMApi { body: JSON.stringify(finalRequestBody), }); + if (!res.ok) { + const errorText = await res.text(); + console.error("[Bedrock Client] Error response:", errorText); + throw new Error(`Request failed: ${errorText}`); + } + const resJson = await res.json(); - const message = this.extractMessage(resJson, modelConfig.model); + if (!resJson) { + throw new Error("Empty response from server"); + } + + const message = extractMessage(resJson, modelConfig.model); + if (!message) { + throw new Error("Failed to extract message from response"); + } + options.onFinish(message, res); } } catch (e) { - console.error("Chat error:", e); + console.error("[Bedrock Client] Chat error:", e); options.onError?.(e as Error); } } + path(path: string): string { + const accessStore = useAccessStore.getState(); + let baseUrl = accessStore.useCustomConfig ? accessStore.bedrockUrl : ""; + + if (baseUrl.length === 0) { + const isApp = !!getClientConfig()?.isApp; + const apiPath = ApiPath.Bedrock; + baseUrl = isApp ? BEDROCK_BASE_URL : apiPath; + } + + baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + if (!baseUrl.startsWith("http") && !baseUrl.startsWith(ApiPath.Bedrock)) { + baseUrl = "https://" + baseUrl; + } + + console.log("[Bedrock Client] API Endpoint:", baseUrl, path); + + return [baseUrl, path].join("/"); + } async usage() { return { used: 0, total: 0 }; diff --git a/app/components/settings.tsx b/app/components/settings.tsx index bc251d47e5f..c71569b27f4 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -1,5 +1,4 @@ import { useState, useEffect, useMemo } from "react"; - import styles from "./settings.module.scss"; import ResetIcon from "../icons/reload.svg"; @@ -1027,14 +1026,22 @@ export function Settings() { > { accessStore.update( - (access) => (access.bedrockEncryptionKey = e.currentTarget.value), + (access) => (access.encryptionKey = e.currentTarget.value), ); }} + onBlur={(e) => { + const value = e.currentTarget.value; + if (!value || value.length < 8) { + showToast(Locale.Settings.Access.Bedrock.EncryptionKey.Invalid); + accessStore.update((access) => (access.encryptionKey = "")); + return; + } + }} maskWhenShow={true} /> diff --git a/app/config/server.ts b/app/config/server.ts index e8fbf131a17..1f59c805fa0 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -186,7 +186,7 @@ export const getServerSideConfig = () => { awsRegion: process.env.AWS_REGION, awsAccessKey: process.env.AWS_ACCESS_KEY, awsSecretKey: process.env.AWS_SECRET_KEY, - bedrockEncryptionKey: process.env.ENCRYPTION_KEY, + encryptionKey: process.env.ENCRYPTION_KEY, isStability, stabilityUrl: process.env.STABILITY_URL, diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 9a8f5cc193d..90970ba5e96 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -365,6 +365,7 @@ const cn = { Title: "加密密钥", SubTitle: "用于配置数据的加密密钥", Placeholder: "输入加密密钥", + Invalid: "无效的加密密钥。必须至少包含8个字符!", }, }, Azure: { diff --git a/app/locales/en.ts b/app/locales/en.ts index 670f822c8b8..5e800049e16 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -369,6 +369,8 @@ const en: LocaleType = { Title: "Encryption Key", SubTitle: "Your encryption key for configuration data", Placeholder: "Enter encryption key", + Invalid: + "Invalid encryption key format. Must no less than 8 characters long!", }, }, Azure: { diff --git a/app/store/access.ts b/app/store/access.ts index c0b3268cf99..156bd6ff1cc 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -113,7 +113,8 @@ const DEFAULT_ACCESS_STATE = { awsRegion: "", awsAccessKey: "", awsSecretKey: "", - bedrockEncryptionKey: "", + encryptionKey: "", + bedrockAnthropicVersion: "bedrock-2023-05-31", // server config needCode: true, @@ -194,7 +195,7 @@ export const useAccessStore = createPersistStore( "awsRegion", "awsAccessKey", "awsSecretKey", - "bedrockEncryptionKey", + "encryptionKey", ]); }, @@ -256,13 +257,19 @@ export const useAccessStore = createPersistStore( // Override the set method to encrypt AWS credentials before storage set: (partial: { [key: string]: any }) => { if (partial.awsAccessKey) { - partial.awsAccessKey = encrypt(partial.awsAccessKey); + partial.awsAccessKey = encrypt( + partial.awsAccessKey, + partial.encryptionKey, + ); } if (partial.awsSecretKey) { - partial.awsSecretKey = encrypt(partial.awsSecretKey); + partial.awsSecretKey = encrypt( + partial.awsSecretKey, + partial.encryptionKey, + ); } if (partial.awsRegion) { - partial.awsRegion = encrypt(partial.awsRegion); + partial.awsRegion = encrypt(partial.awsRegion, partial.encryptionKey); } set(partial); }, @@ -272,9 +279,15 @@ export const useAccessStore = createPersistStore( const state = get(); return { ...state, - awsRegion: state.awsRegion ? decrypt(state.awsRegion) : "", - awsAccessKey: state.awsAccessKey ? decrypt(state.awsAccessKey) : "", - awsSecretKey: state.awsSecretKey ? decrypt(state.awsSecretKey) : "", + awsRegion: state.awsRegion + ? decrypt(state.awsRegion, state.encryptionKey) + : "", + awsAccessKey: state.awsAccessKey + ? decrypt(state.awsAccessKey, state.encryptionKey) + : "", + awsSecretKey: state.awsSecretKey + ? decrypt(state.awsSecretKey, state.encryptionKey) + : "", }; }, }), diff --git a/app/utils/aws.ts b/app/utils/aws.ts index d2997412f63..75b359195a6 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -3,36 +3,59 @@ import HmacSHA256 from "crypto-js/hmac-sha256"; import Hex from "crypto-js/enc-hex"; import Utf8 from "crypto-js/enc-utf8"; import { AES, enc } from "crypto-js"; -import { getServerSideConfig } from "../config/server"; -const serverConfig = getServerSideConfig(); -const SECRET_KEY = serverConfig.bedrockEncryptionKey || ""; -if (serverConfig.isBedrock && !SECRET_KEY) { - console.error("When use Bedrock modle,ENCRYPTION_KEY should been set!"); +// Types and Interfaces +export interface BedrockCredentials { + region: string; + accessKeyId: string; + secretAccessKey: string; +} + +export interface BedrockRequestConfig { + modelId: string; + shouldStream: boolean; + body: any; + credentials: BedrockCredentials; } -export function encrypt(data: string): string { +export interface ModelValidationConfig { + requiredFields: string[]; + optionalFields?: string[]; + customValidation?: (body: any) => string | null; +} + +// Encryption utilities +export function encrypt(data: string, encryptionKey: string): string { if (!data) return ""; + if (!encryptionKey) { + console.error("[AWS Encryption Error] Encryption key is required"); + throw new Error("Encryption key is required for AWS credential encryption"); + } try { - return AES.encrypt(data, SECRET_KEY).toString(); + return AES.encrypt(data, encryptionKey).toString(); } catch (error) { - console.error("Encryption failed:", error); - return ""; + console.error("[AWS Encryption Error]:", error); + throw new Error("Failed to encrypt AWS credentials"); } } -export function decrypt(encryptedData: string): string { +export function decrypt(encryptedData: string, encryptionKey: string): string { if (!encryptedData) return ""; + if (!encryptionKey) { + console.error("[AWS Decryption Error] Encryption key is required"); + throw new Error("Encryption key is required for AWS credential decryption"); + } try { - const bytes = AES.decrypt(encryptedData, SECRET_KEY); + const bytes = AES.decrypt(encryptedData, encryptionKey); const decrypted = bytes.toString(enc.Utf8); if (!decrypted && encryptedData) { - return encryptedData; + console.error("[AWS Decryption Error] Failed to decrypt data"); + throw new Error("Failed to decrypt AWS credentials"); } return decrypted; } catch (error) { - console.error("Decryption failed:", error); - return ""; + console.error("[AWS Decryption Error]:", error); + throw new Error("Failed to decrypt AWS credentials"); } } @@ -42,6 +65,7 @@ export function maskSensitiveValue(value: string): string { return "*".repeat(value.length - 4) + value.slice(-4); } +// AWS Signing export interface SignParams { method: string; url: string; @@ -138,74 +162,271 @@ export async function sign({ isStreaming = true, additionalHeaders = {}, }: SignParams): Promise> { - const endpoint = new URL(url); - const canonicalUri = "/" + encodeURI_RFC3986(endpoint.pathname.slice(1)); - const canonicalQueryString = endpoint.search.slice(1); - - const now = new Date(); - const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, ""); - const dateStamp = amzDate.slice(0, 8); - - const payloadHash = SHA256(body).toString(Hex); - - const headers: Record = { - accept: isStreaming - ? "application/vnd.amazon.eventstream" - : "application/json", - "content-type": "application/json", - host: endpoint.host, - "x-amz-content-sha256": payloadHash, - "x-amz-date": amzDate, - ...additionalHeaders, - }; - - if (isStreaming) { - headers["x-amzn-bedrock-accept"] = "*/*"; + try { + const endpoint = new URL(url); + const canonicalUri = "/" + encodeURI_RFC3986(endpoint.pathname.slice(1)); + const canonicalQueryString = endpoint.search.slice(1); + + const now = new Date(); + const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, ""); + const dateStamp = amzDate.slice(0, 8); + + const payloadHash = SHA256(body).toString(Hex); + + const headers: Record = { + accept: isStreaming + ? "application/vnd.amazon.eventstream" + : "application/json", + "content-type": "application/json", + host: endpoint.host, + "x-amz-content-sha256": payloadHash, + "x-amz-date": amzDate, + ...additionalHeaders, + }; + + if (isStreaming) { + headers["x-amzn-bedrock-accept"] = "*/*"; + } + + const sortedHeaderKeys = Object.keys(headers).sort((a, b) => + a.toLowerCase().localeCompare(b.toLowerCase()), + ); + + const canonicalHeaders = sortedHeaderKeys + .map( + (key) => `${key.toLowerCase()}:${normalizeHeaderValue(headers[key])}\n`, + ) + .join(""); + + const signedHeaders = sortedHeaderKeys + .map((key) => key.toLowerCase()) + .join(";"); + + const canonicalRequest = [ + method.toUpperCase(), + canonicalUri, + canonicalQueryString, + canonicalHeaders, + signedHeaders, + payloadHash, + ].join("\n"); + + const algorithm = "AWS4-HMAC-SHA256"; + const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`; + const stringToSign = [ + algorithm, + amzDate, + credentialScope, + SHA256(canonicalRequest).toString(Hex), + ].join("\n"); + + const signingKey = getSigningKey( + secretAccessKey, + dateStamp, + region, + service, + ); + const signature = hmac(signingKey, stringToSign).toString(Hex); + + const authorization = [ + `${algorithm} Credential=${accessKeyId}/${credentialScope}`, + `SignedHeaders=${signedHeaders}`, + `Signature=${signature}`, + ].join(", "); + + return { + ...headers, + Authorization: authorization, + }; + } catch (error) { + console.error("[AWS Signing Error]:", error); + throw new Error("Failed to sign AWS request"); } +} - const sortedHeaderKeys = Object.keys(headers).sort((a, b) => - a.toLowerCase().localeCompare(b.toLowerCase()), - ); +// Bedrock utilities +export function parseEventData(chunk: Uint8Array): any { + const decoder = new TextDecoder(); + const text = decoder.decode(chunk); + try { + const parsed = JSON.parse(text); + // AWS Bedrock wraps the response in a 'body' field + if (typeof parsed.body === "string") { + try { + return JSON.parse(parsed.body); + } catch (e) { + return { output: parsed.body }; + } + } + return parsed.body || parsed; + } catch (e) { + try { + // Handle base64 encoded responses + const base64Match = text.match(/:"([A-Za-z0-9+/=]+)"/); + if (base64Match) { + const decoded = Buffer.from(base64Match[1], "base64").toString("utf-8"); + try { + return JSON.parse(decoded); + } catch (e) { + return { output: decoded }; + } + } - const canonicalHeaders = sortedHeaderKeys - .map( - (key) => `${key.toLowerCase()}:${normalizeHeaderValue(headers[key])}\n`, - ) - .join(""); - - const signedHeaders = sortedHeaderKeys - .map((key) => key.toLowerCase()) - .join(";"); - - const canonicalRequest = [ - method.toUpperCase(), - canonicalUri, - canonicalQueryString, - canonicalHeaders, - signedHeaders, - payloadHash, - ].join("\n"); - - const algorithm = "AWS4-HMAC-SHA256"; - const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`; - const stringToSign = [ - algorithm, - amzDate, - credentialScope, - SHA256(canonicalRequest).toString(Hex), - ].join("\n"); - - const signingKey = getSigningKey(secretAccessKey, dateStamp, region, service); - const signature = hmac(signingKey, stringToSign).toString(Hex); - - const authorization = [ - `${algorithm} Credential=${accessKeyId}/${credentialScope}`, - `SignedHeaders=${signedHeaders}`, - `Signature=${signature}`, - ].join(", "); - - return { - ...headers, - Authorization: authorization, - }; + // Handle event-type responses + const eventMatch = text.match(/:event-type[^\{]+({.*})/); + if (eventMatch) { + try { + return JSON.parse(eventMatch[1]); + } catch (e) { + return { output: eventMatch[1] }; + } + } + + // Handle plain text responses + if (text.trim()) { + // Clean up any malformed JSON characters + const cleanText = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); + return { output: cleanText }; + } + } catch (innerError) { + console.error("[AWS Parse Error] Inner parsing failed:", innerError); + } + } + return null; +} + +export function getBedrockEndpoint( + region: string, + modelId: string, + shouldStream: boolean, +): string { + if (!region || !modelId) { + throw new Error("Region and model ID are required for Bedrock endpoint"); + } + const baseEndpoint = `https://bedrock-runtime.${region}.amazonaws.com`; + const endpoint = + shouldStream === false + ? `${baseEndpoint}/model/${modelId}/invoke` + : `${baseEndpoint}/model/${modelId}/invoke-with-response-stream`; + return endpoint; +} + +export function getModelHeaders(modelId: string): Record { + if (!modelId) { + throw new Error("Model ID is required for headers"); + } + + const headers: Record = {}; + + if ( + modelId.startsWith("us.meta.llama") || + modelId.startsWith("mistral.mistral") + ) { + headers["content-type"] = "application/json"; + headers["accept"] = "application/json"; + } + + return headers; +} + +export function extractMessage(res: any, modelId: string = ""): string { + if (!res) { + console.error("[AWS Extract Error] extractMessage Empty response"); + return ""; + } + console.log("[Response] extractMessage response: ", res); + return res?.content?.[0]?.text; + return ""; +} + +export async function* transformBedrockStream( + stream: ReadableStream, + modelId: string, +) { + const reader = stream.getReader(); + let buffer = ""; + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) { + if (buffer) { + yield `data: ${JSON.stringify({ + delta: { text: buffer }, + })}\n\n`; + } + break; + } + + const parsed = parseEventData(value); + if (!parsed) continue; + + // Handle Titan models + if (modelId.startsWith("amazon.titan")) { + const text = parsed.outputText || ""; + if (text) { + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + // Handle LLaMA3 models + else if (modelId.startsWith("us.meta.llama3")) { + let text = ""; + if (parsed.generation) { + text = parsed.generation; + } else if (parsed.output) { + text = parsed.output; + } else if (typeof parsed === "string") { + text = parsed; + } + + if (text) { + // Clean up any control characters or invalid JSON characters + text = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + // Handle Mistral models + else if (modelId.startsWith("mistral.mistral")) { + const text = + parsed.output || parsed.outputs?.[0]?.text || parsed.completion || ""; + if (text) { + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + // Handle Claude models + else if (modelId.startsWith("anthropic.claude")) { + if (parsed.type === "content_block_delta") { + if (parsed.delta?.type === "text_delta") { + yield `data: ${JSON.stringify({ + delta: { text: parsed.delta.text }, + })}\n\n`; + } else if (parsed.delta?.type === "input_json_delta") { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } + } else if ( + parsed.type === "message_delta" && + parsed.delta?.stop_reason + ) { + yield `data: ${JSON.stringify({ + delta: { stop_reason: parsed.delta.stop_reason }, + })}\n\n`; + } else if ( + parsed.type === "content_block_start" && + parsed.content_block?.type === "tool_use" + ) { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } else if (parsed.type === "content_block_stop") { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } + } + } + } finally { + reader.releaseLock(); + } } From 6f7a6350305c751f8ed5972c2206fee750347042 Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 24 Nov 2024 23:54:04 +0800 Subject: [PATCH 36/72] =?UTF-8?q?=E5=AE=8C=E5=96=84llama=E5=92=8Cmistral?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=9A=84=E6=8E=A8=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 48 +++++++-- app/client/platforms/bedrock.ts | 57 ++++++++--- app/utils.ts | 5 +- app/utils/aws.ts | 173 +++++++++++++++++++++----------- 4 files changed, 199 insertions(+), 84 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index d65fc3f508a..45aa84b2fa0 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -4,7 +4,6 @@ import { sign, decrypt, getBedrockEndpoint, - getModelHeaders, transformBedrockStream, parseEventData, BedrockCredentials, @@ -83,6 +82,10 @@ async function requestBedrock(req: NextRequest) { } catch (e) { throw new Error(`Invalid JSON in request body: ${e}`); } + console.log( + "[Bedrock Request] original Body:", + JSON.stringify(bodyJson, null, 2), + ); // Extract tool configuration if present let tools: any[] | undefined; @@ -97,18 +100,44 @@ async function requestBedrock(req: NextRequest) { modelId, shouldStream, ); - const additionalHeaders = getModelHeaders(modelId); console.log("[Bedrock Request] Endpoint:", endpoint); console.log("[Bedrock Request] Model ID:", modelId); - // Only include tools for Claude models - const isClaudeModel = modelId.toLowerCase().includes("claude3"); + // Handle tools for different models + const isMistralModel = modelId.toLowerCase().includes("mistral"); + const isClaudeModel = modelId.toLowerCase().includes("claude"); + const requestBody = { ...bodyJson, - ...(isClaudeModel && tools && { tools }), }; + if (tools && tools.length > 0) { + if (isClaudeModel) { + // Claude models already have correct tool format + requestBody.tools = tools; + } else if (isMistralModel) { + // Format messages for Mistral + if (typeof requestBody.prompt === "string") { + requestBody.messages = [ + { role: "user", content: requestBody.prompt }, + ]; + delete requestBody.prompt; + } + + // Add tools in Mistral's format + requestBody.tool_choice = "auto"; + requestBody.tools = tools.map((tool) => ({ + type: "function", + function: { + name: tool.name, + description: tool.description, + parameters: tool.input_schema, + }, + })); + } + } + // Sign request const headers = await sign({ method: "POST", @@ -119,12 +148,11 @@ async function requestBedrock(req: NextRequest) { body: JSON.stringify(requestBody), service: "bedrock", isStreaming: shouldStream, - additionalHeaders, }); // Make request to AWS Bedrock console.log( - "[Bedrock Request] Body:", + "[Bedrock Request] Final Body:", JSON.stringify(requestBody, null, 2), ); const res = await fetch(endpoint, { @@ -173,11 +201,15 @@ async function requestBedrock(req: NextRequest) { // Handle streaming response const transformedStream = transformBedrockStream(res.body, modelId); + const encoder = new TextEncoder(); const stream = new ReadableStream({ async start(controller) { try { for await (const chunk of transformedStream) { - controller.enqueue(new TextEncoder().encode(chunk)); + // Ensure we're sending non-empty chunks + if (chunk && chunk.trim()) { + controller.enqueue(encoder.encode(chunk)); + } } controller.close(); } catch (err) { diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 7d1bda3dd25..1799e4dbc63 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -37,7 +37,7 @@ export class BedrockApi implements LLMApi { if (model.startsWith("amazon.titan")) { const inputText = messages .map((message) => { - return `${message.role}: ${message.content}`; + return `${message.role}: ${getMessageTextContent(message)}`; }) .join("\n\n"); @@ -52,32 +52,59 @@ export class BedrockApi implements LLMApi { } // Handle LLaMA models - if (model.startsWith("us.meta.llama")) { - const prompt = messages - .map((message) => { - return `${message.role}: ${message.content}`; - }) - .join("\n\n"); + if (model.includes("meta.llama")) { + // Format conversation for Llama models + let prompt = ""; + let systemPrompt = ""; + + // Extract system message if present + const systemMessage = messages.find((m) => m.role === "system"); + if (systemMessage) { + systemPrompt = getMessageTextContent(systemMessage); + } + + // Format the conversation + const conversationMessages = messages.filter((m) => m.role !== "system"); + prompt = `[INST] <>\n${ + systemPrompt || "You are a helpful, respectful and honest assistant." + }\n<>\n\n`; + + for (let i = 0; i < conversationMessages.length; i++) { + const message = conversationMessages[i]; + const content = getMessageTextContent(message); + if (i === 0 && message.role === "user") { + // First user message goes in the same [INST] block as system prompt + prompt += `${content} [/INST]`; + } else { + if (message.role === "user") { + prompt += `\n\n[INST] ${content} [/INST]`; + } else { + prompt += ` ${content} `; + } + } + } + return { prompt, max_gen_len: modelConfig.max_tokens || 512, - temperature: modelConfig.temperature || 0.6, + temperature: modelConfig.temperature || 0.7, top_p: modelConfig.top_p || 0.9, - stop: ["User:", "System:", "Assistant:", "\n\n"], }; } // Handle Mistral models if (model.startsWith("mistral.mistral")) { - const prompt = messages - .map((message) => { - return `${message.role}: ${message.content}`; - }) - .join("\n\n"); + // Format messages for Mistral's chat format + const formattedMessages = messages.map((message) => ({ + role: message.role, + content: getMessageTextContent(message), + })); + return { - prompt, + messages: formattedMessages, max_tokens: modelConfig.max_tokens || 4096, temperature: modelConfig.temperature || 0.7, + top_p: modelConfig.top_p || 0.9, }; } diff --git a/app/utils.ts b/app/utils.ts index f478567296e..30c2dde5dbc 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -292,7 +292,10 @@ export function showPlugins(provider: ServiceProvider, model: string) { if (provider == ServiceProvider.Anthropic && !model.includes("claude-2")) { return true; } - if (provider == ServiceProvider.Bedrock && model.includes("claude-3")) { + if ( + (provider == ServiceProvider.Bedrock && model.includes("claude-3")) || + model.includes("mistral-large") + ) { return true; } if (provider == ServiceProvider.Google && !model.includes("vision")) { diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 75b359195a6..127e82cf972 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -75,7 +75,6 @@ export interface SignParams { body: string; service: string; isStreaming?: boolean; - additionalHeaders?: Record; } function hmac( @@ -160,7 +159,6 @@ export async function sign({ body, service, isStreaming = true, - additionalHeaders = {}, }: SignParams): Promise> { try { const endpoint = new URL(url); @@ -181,7 +179,6 @@ export async function sign({ host: endpoint.host, "x-amz-content-sha256": payloadHash, "x-amz-date": amzDate, - ...additionalHeaders, }; if (isStreaming) { @@ -311,32 +308,25 @@ export function getBedrockEndpoint( return endpoint; } -export function getModelHeaders(modelId: string): Record { - if (!modelId) { - throw new Error("Model ID is required for headers"); - } - - const headers: Record = {}; - - if ( - modelId.startsWith("us.meta.llama") || - modelId.startsWith("mistral.mistral") - ) { - headers["content-type"] = "application/json"; - headers["accept"] = "application/json"; - } - - return headers; -} - export function extractMessage(res: any, modelId: string = ""): string { if (!res) { console.error("[AWS Extract Error] extractMessage Empty response"); return ""; } console.log("[Response] extractMessage response: ", res); - return res?.content?.[0]?.text; - return ""; + + // Handle Mistral model response format + if (modelId.toLowerCase().includes("mistral")) { + return res?.outputs?.[0]?.text || ""; + } + + // Handle Llama model response format + if (modelId.toLowerCase().includes("llama")) { + return res?.generation || ""; + } + + // Handle Claude and other models + return res?.content?.[0]?.text || ""; } export async function* transformBedrockStream( @@ -344,58 +334,105 @@ export async function* transformBedrockStream( modelId: string, ) { const reader = stream.getReader(); - let buffer = ""; + let accumulatedText = ""; + let toolCallStarted = false; + let currentToolCall = null; try { while (true) { const { done, value } = await reader.read(); - if (done) { - if (buffer) { - yield `data: ${JSON.stringify({ - delta: { text: buffer }, - })}\n\n`; - } - break; - } + + if (done) break; const parsed = parseEventData(value); if (!parsed) continue; - // Handle Titan models - if (modelId.startsWith("amazon.titan")) { - const text = parsed.outputText || ""; - if (text) { - yield `data: ${JSON.stringify({ - delta: { text }, - })}\n\n`; + console.log("parseEventData========================="); + console.log(parsed); + // Handle Mistral models + if (modelId.toLowerCase().includes("mistral")) { + // If we have content, accumulate it + if ( + parsed.choices?.[0]?.message?.role === "assistant" && + parsed.choices?.[0]?.message?.content + ) { + accumulatedText += parsed.choices?.[0]?.message?.content; + console.log("accumulatedText========================="); + console.log(accumulatedText); + // Check for tool call in the accumulated text + if (!toolCallStarted && accumulatedText.includes("```json")) { + const jsonMatch = accumulatedText.match( + /```json\s*({[\s\S]*?})\s*```/, + ); + if (jsonMatch) { + try { + const toolData = JSON.parse(jsonMatch[1]); + currentToolCall = { + id: `tool-${Date.now()}`, + name: toolData.name, + arguments: toolData.arguments, + }; + + // Emit tool call start + yield `data: ${JSON.stringify({ + type: "content_block_start", + content_block: { + type: "tool_use", + id: currentToolCall.id, + name: currentToolCall.name, + }, + })}\n\n`; + + // Emit tool arguments + yield `data: ${JSON.stringify({ + type: "content_block_delta", + delta: { + type: "input_json_delta", + partial_json: JSON.stringify(currentToolCall.arguments), + }, + })}\n\n`; + + // Emit tool call stop + yield `data: ${JSON.stringify({ + type: "content_block_stop", + })}\n\n`; + + // Clear the accumulated text after processing the tool call + accumulatedText = accumulatedText.replace( + /```json\s*{[\s\S]*?}\s*```/, + "", + ); + toolCallStarted = false; + currentToolCall = null; + } catch (e) { + console.error("Failed to parse tool JSON:", e); + } + } + } + // emit the text content if it's not empty + if (parsed.choices?.[0]?.message?.content.trim()) { + yield `data: ${JSON.stringify({ + delta: { text: parsed.choices?.[0]?.message?.content }, + })}\n\n`; + } + // Handle stop reason if present + if (parsed.choices?.[0]?.stop_reason) { + yield `data: ${JSON.stringify({ + delta: { stop_reason: parsed.choices[0].stop_reason }, + })}\n\n`; + } } } - // Handle LLaMA3 models - else if (modelId.startsWith("us.meta.llama3")) { - let text = ""; + // Handle Llama models + else if (modelId.toLowerCase().includes("llama")) { if (parsed.generation) { - text = parsed.generation; - } else if (parsed.output) { - text = parsed.output; - } else if (typeof parsed === "string") { - text = parsed; - } - - if (text) { - // Clean up any control characters or invalid JSON characters - text = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); yield `data: ${JSON.stringify({ - delta: { text }, + delta: { text: parsed.generation }, })}\n\n`; } - } - // Handle Mistral models - else if (modelId.startsWith("mistral.mistral")) { - const text = - parsed.output || parsed.outputs?.[0]?.text || parsed.completion || ""; - if (text) { + if (parsed.stop_reason) { yield `data: ${JSON.stringify({ - delta: { text }, + delta: { stop_reason: parsed.stop_reason }, })}\n\n`; } } @@ -423,6 +460,22 @@ export async function* transformBedrockStream( yield `data: ${JSON.stringify(parsed)}\n\n`; } else if (parsed.type === "content_block_stop") { yield `data: ${JSON.stringify(parsed)}\n\n`; + } else { + // Handle regular text responses + const text = parsed.response || parsed.output || ""; + if (text) { + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; + } + } + } else { + // Handle other model text responses + const text = parsed.outputText || parsed.generation || ""; + if (text) { + yield `data: ${JSON.stringify({ + delta: { text }, + })}\n\n`; } } } From 5bd7e28f82f6f61cbdf00ecca2ace50e3dccb495 Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 25 Nov 2024 09:12:30 +0800 Subject: [PATCH 37/72] =?UTF-8?q?=E5=8E=BB=E6=8E=89Debug=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/aws.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 127e82cf972..1dd23d06774 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -313,7 +313,7 @@ export function extractMessage(res: any, modelId: string = ""): string { console.error("[AWS Extract Error] extractMessage Empty response"); return ""; } - console.log("[Response] extractMessage response: ", res); + // console.log("[Response] extractMessage response: ", res); // Handle Mistral model response format if (modelId.toLowerCase().includes("mistral")) { @@ -347,8 +347,8 @@ export async function* transformBedrockStream( const parsed = parseEventData(value); if (!parsed) continue; - console.log("parseEventData========================="); - console.log(parsed); + // console.log("parseEventData========================="); + // console.log(parsed); // Handle Mistral models if (modelId.toLowerCase().includes("mistral")) { // If we have content, accumulate it @@ -357,8 +357,8 @@ export async function* transformBedrockStream( parsed.choices?.[0]?.message?.content ) { accumulatedText += parsed.choices?.[0]?.message?.content; - console.log("accumulatedText========================="); - console.log(accumulatedText); + // console.log("accumulatedText========================="); + // console.log(accumulatedText); // Check for tool call in the accumulated text if (!toolCallStarted && accumulatedText.includes("```json")) { const jsonMatch = accumulatedText.match( From 0abfd279e4095038499001c0376c6d03c9cc0797 Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 25 Nov 2024 09:20:22 +0800 Subject: [PATCH 38/72] =?UTF-8?q?=E5=AE=8C=E5=96=84bedrock=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/locales/cn.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 90970ba5e96..b9ed56b9c32 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -344,20 +344,20 @@ const cn = { }, Bedrock: { Region: { - Title: "AWS Region", - SubTitle: "The AWS region where Bedrock service is located", + Title: "AWS 区域", + SubTitle: "Bedrock 服务所在的 AWS 区域", Placeholder: "us-west-2", Invalid: "无效的 AWS 区域格式。示例:us-west-2", }, AccessKey: { - Title: "AWS Access Key ID", - SubTitle: "Your AWS access key ID for Bedrock service", + Title: "AWS 访问密钥 ID", + SubTitle: "用于 Bedrock 服务的 AWS 访问密钥 ID", Placeholder: "AKIA...", Invalid: "无效的 AWS Access Key 格式。必须为20个字符。", }, SecretKey: { - Title: "AWS Secret Access Key", - SubTitle: "Your AWS secret access key for Bedrock service", + Title: "AWS 私有访问密钥", + SubTitle: "用于 Bedrock 服务的 AWS 私有访问密钥", Placeholder: "****", Invalid: "无效的 AWS Secret Key 格式。必须为40个字符。", }, From 2fe848ecf3b3d6c87428cd6ed66a7c89bcf633ae Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 25 Nov 2024 09:51:02 +0800 Subject: [PATCH 39/72] =?UTF-8?q?=E5=8E=BB=E6=8E=89Debug=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 45aa84b2fa0..87d67287c2b 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -82,10 +82,10 @@ async function requestBedrock(req: NextRequest) { } catch (e) { throw new Error(`Invalid JSON in request body: ${e}`); } - console.log( - "[Bedrock Request] original Body:", - JSON.stringify(bodyJson, null, 2), - ); + // console.log( + // "[Bedrock Request] original Body:", + // JSON.stringify(bodyJson, null, 2), + // ); // Extract tool configuration if present let tools: any[] | undefined; From 9a473048b120696fbc2c945493a85f118b63750c Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 25 Nov 2024 09:51:46 +0800 Subject: [PATCH 40/72] =?UTF-8?q?=E5=8E=BB=E6=8E=89Debug=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 87d67287c2b..f2e008bf53e 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -151,10 +151,10 @@ async function requestBedrock(req: NextRequest) { }); // Make request to AWS Bedrock - console.log( - "[Bedrock Request] Final Body:", - JSON.stringify(requestBody, null, 2), - ); + // console.log( + // "[Bedrock Request] Final Body:", + // JSON.stringify(requestBody, null, 2), + // ); const res = await fetch(endpoint, { method: "POST", headers, From e6633753a4e155e52a03fb7fbfdd86991d54f22e Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 25 Nov 2024 20:08:21 +0800 Subject: [PATCH 41/72] =?UTF-8?q?=E5=AE=8C=E5=96=84mistral=20tool=20use?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=E5=92=8Cllama3=E6=B6=88=E6=81=AF=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 21 ++--- app/client/platforms/bedrock.ts | 151 +++++++++++++++++++++----------- app/constant.ts | 3 - app/utils/aws.ts | 123 ++++++++++---------------- 4 files changed, 151 insertions(+), 147 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index f2e008bf53e..79063e03cc8 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -105,26 +105,17 @@ async function requestBedrock(req: NextRequest) { console.log("[Bedrock Request] Model ID:", modelId); // Handle tools for different models - const isMistralModel = modelId.toLowerCase().includes("mistral"); + const isMistralLargeModel = modelId + .toLowerCase() + .includes("mistral.mistral-large"); const isClaudeModel = modelId.toLowerCase().includes("claude"); - const requestBody = { + const requestBody: any = { ...bodyJson, }; if (tools && tools.length > 0) { - if (isClaudeModel) { - // Claude models already have correct tool format - requestBody.tools = tools; - } else if (isMistralModel) { - // Format messages for Mistral - if (typeof requestBody.prompt === "string") { - requestBody.messages = [ - { role: "user", content: requestBody.prompt }, - ]; - delete requestBody.prompt; - } - + if (isMistralLargeModel) { // Add tools in Mistral's format requestBody.tool_choice = "auto"; requestBody.tools = tools.map((tool) => ({ @@ -135,6 +126,8 @@ async function requestBedrock(req: NextRequest) { parameters: tool.input_schema, }, })); + } else if (isClaudeModel) { + requestBody.tools = tools; } } diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 1799e4dbc63..856c67b47bb 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -21,7 +21,22 @@ const ClaudeMapper = { system: "user", } as const; +const MistralMapper = { + system: "system", + user: "user", + assistant: "assistant", +} as const; + type ClaudeRole = keyof typeof ClaudeMapper; +type MistralRole = keyof typeof MistralMapper; + +interface Tool { + function?: { + name?: string; + description?: string; + parameters?: any; + }; +} export class BedrockApi implements LLMApi { speech(options: SpeechOptions): Promise { @@ -30,7 +45,6 @@ export class BedrockApi implements LLMApi { formatRequestBody(messages: ChatOptions["messages"], modelConfig: any) { const model = modelConfig.model; - const visionModel = isVisionModel(modelConfig.model); // Handle Titan models @@ -53,37 +67,27 @@ export class BedrockApi implements LLMApi { // Handle LLaMA models if (model.includes("meta.llama")) { - // Format conversation for Llama models - let prompt = ""; - let systemPrompt = ""; + let prompt = "<|begin_of_text|>"; // Extract system message if present const systemMessage = messages.find((m) => m.role === "system"); if (systemMessage) { - systemPrompt = getMessageTextContent(systemMessage); + prompt += `<|start_header_id|>system<|end_header_id|>\n${getMessageTextContent( + systemMessage, + )}<|eot_id|>`; } // Format the conversation const conversationMessages = messages.filter((m) => m.role !== "system"); - prompt = `[INST] <>\n${ - systemPrompt || "You are a helpful, respectful and honest assistant." - }\n<>\n\n`; - - for (let i = 0; i < conversationMessages.length; i++) { - const message = conversationMessages[i]; + for (const message of conversationMessages) { + const role = message.role === "assistant" ? "assistant" : "user"; const content = getMessageTextContent(message); - if (i === 0 && message.role === "user") { - // First user message goes in the same [INST] block as system prompt - prompt += `${content} [/INST]`; - } else { - if (message.role === "user") { - prompt += `\n\n[INST] ${content} [/INST]`; - } else { - prompt += ` ${content} `; - } - } + prompt += `<|start_header_id|>${role}<|end_header_id|>\n${content}<|eot_id|>`; } + // Add the final assistant header to prompt completion + prompt += "<|start_header_id|>assistant<|end_header_id|>"; + return { prompt, max_gen_len: modelConfig.max_tokens || 512, @@ -94,9 +98,8 @@ export class BedrockApi implements LLMApi { // Handle Mistral models if (model.startsWith("mistral.mistral")) { - // Format messages for Mistral's chat format const formattedMessages = messages.map((message) => ({ - role: message.role, + role: MistralMapper[message.role as MistralRole] || "user", content: getMessageTextContent(message), })); @@ -234,6 +237,11 @@ export class BedrockApi implements LLMApi { }); const finalRequestBody = this.formatRequestBody(messages, modelConfig); + console.log( + "[Bedrock Client] Request Body:", + JSON.stringify(finalRequestBody, null, 2), + ); + if (shouldStream) { let index = -1; const [tools, funcs] = usePluginStore @@ -253,6 +261,7 @@ export class BedrockApi implements LLMApi { })), funcs, controller, + // parseSSE (text: string, runTools: ChatMessageTool[]) => { // console.log("parseSSE", text, runTools); let chunkJson: @@ -304,36 +313,73 @@ export class BedrockApi implements LLMApi { ) => { // reset index value index = -1; - // @ts-ignore - requestPayload?.messages?.splice( - // @ts-ignore - requestPayload?.messages?.length, - 0, - { - role: "assistant", - content: toolCallMessage.tool_calls.map( - (tool: ChatMessageTool) => ({ - type: "tool_use", - id: tool.id, - name: tool?.function?.name, - input: tool?.function?.arguments - ? JSON.parse(tool?.function?.arguments) - : {}, - }), - ), - }, + + const modelId = modelConfig.model; + const isMistral = modelId.startsWith("mistral.mistral"); + const isClaude = modelId.includes("anthropic.claude"); + + if (isClaude) { + // Format for Claude // @ts-ignore - ...toolCallResult.map((result) => ({ - role: "user", - content: [ - { - type: "tool_result", - tool_use_id: result.tool_call_id, - content: result.content, - }, - ], - })), - ); + requestPayload?.messages?.splice( + // @ts-ignore + requestPayload?.messages?.length, + 0, + { + role: "assistant", + content: toolCallMessage.tool_calls.map( + (tool: ChatMessageTool) => ({ + type: "tool_use", + id: tool.id, + name: tool?.function?.name, + input: tool?.function?.arguments + ? JSON.parse(tool?.function?.arguments) + : {}, + }), + ), + }, + // @ts-ignore + ...toolCallResult.map((result) => ({ + role: "user", + content: [ + { + type: "tool_result", + tool_use_id: result.tool_call_id, + content: result.content, + }, + ], + })), + ); + } else if (isMistral) { + // Format for Mistral + requestPayload?.messages?.splice( + requestPayload?.messages?.length, + 0, + { + role: "assistant", + content: "", + // @ts-ignore + tool_calls: toolCallMessage.tool_calls.map( + (tool: ChatMessageTool) => ({ + id: tool.id, + function: { + name: tool?.function?.name, + arguments: tool?.function?.arguments || "{}", + }, + }), + ), + }, + ...toolCallResult.map((result) => ({ + role: "tool", + tool_call_id: result.tool_call_id, + content: result.content, + })), + ); + } else { + console.warn( + `[Bedrock Client] Unhandled model type for tool calls: ${modelId}`, + ); + } }, options, ); @@ -368,6 +414,7 @@ export class BedrockApi implements LLMApi { options.onError?.(e as Error); } } + path(path: string): string { const accessStore = useAccessStore.getState(); let baseUrl = accessStore.useCustomConfig ? accessStore.bedrockUrl : ""; diff --git a/app/constant.ts b/app/constant.ts index 75ed0a4030d..8efee805f8d 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -342,12 +342,9 @@ const bedrockModels = [ // Meta Llama Models "us.meta.llama3-1-8b-instruct-v1:0", "us.meta.llama3-1-70b-instruct-v1:0", - "us.meta.llama3-2-1b-instruct-v1:0", - "us.meta.llama3-2-3b-instruct-v1:0", "us.meta.llama3-2-11b-instruct-v1:0", "us.meta.llama3-2-90b-instruct-v1:0", // Mistral Models - "mistral.mistral-7b-instruct-v0:2", "mistral.mistral-large-2402-v1:0", "mistral.mistral-large-2407-v1:0", ]; diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 1dd23d06774..cb23f60e22f 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -245,6 +245,7 @@ export async function sign({ export function parseEventData(chunk: Uint8Array): any { const decoder = new TextDecoder(); const text = decoder.decode(chunk); + // console.info("[AWS Parse ] parsing:", text); try { const parsed = JSON.parse(text); // AWS Bedrock wraps the response in a 'body' field @@ -317,7 +318,10 @@ export function extractMessage(res: any, modelId: string = ""): string { // Handle Mistral model response format if (modelId.toLowerCase().includes("mistral")) { - return res?.outputs?.[0]?.text || ""; + if (res.choices?.[0]?.message?.content) { + return res.choices[0].message.content; + } + return res.output || ""; } // Handle Llama model response format @@ -334,9 +338,7 @@ export async function* transformBedrockStream( modelId: string, ) { const reader = stream.getReader(); - let accumulatedText = ""; - let toolCallStarted = false; - let currentToolCall = null; + let toolInput = ""; try { while (true) { @@ -349,90 +351,54 @@ export async function* transformBedrockStream( // console.log("parseEventData========================="); // console.log(parsed); + // Handle Mistral models if (modelId.toLowerCase().includes("mistral")) { - // If we have content, accumulate it - if ( - parsed.choices?.[0]?.message?.role === "assistant" && - parsed.choices?.[0]?.message?.content - ) { - accumulatedText += parsed.choices?.[0]?.message?.content; - // console.log("accumulatedText========================="); - // console.log(accumulatedText); - // Check for tool call in the accumulated text - if (!toolCallStarted && accumulatedText.includes("```json")) { - const jsonMatch = accumulatedText.match( - /```json\s*({[\s\S]*?})\s*```/, - ); - if (jsonMatch) { - try { - const toolData = JSON.parse(jsonMatch[1]); - currentToolCall = { - id: `tool-${Date.now()}`, - name: toolData.name, - arguments: toolData.arguments, - }; - - // Emit tool call start - yield `data: ${JSON.stringify({ - type: "content_block_start", - content_block: { - type: "tool_use", - id: currentToolCall.id, - name: currentToolCall.name, - }, - })}\n\n`; - - // Emit tool arguments - yield `data: ${JSON.stringify({ - type: "content_block_delta", - delta: { - type: "input_json_delta", - partial_json: JSON.stringify(currentToolCall.arguments), - }, - })}\n\n`; - - // Emit tool call stop - yield `data: ${JSON.stringify({ - type: "content_block_stop", - })}\n\n`; - - // Clear the accumulated text after processing the tool call - accumulatedText = accumulatedText.replace( - /```json\s*{[\s\S]*?}\s*```/, - "", - ); - toolCallStarted = false; - currentToolCall = null; - } catch (e) { - console.error("Failed to parse tool JSON:", e); - } - } - } - // emit the text content if it's not empty - if (parsed.choices?.[0]?.message?.content.trim()) { + // Handle tool calls + if (parsed.choices?.[0]?.message?.tool_calls) { + const toolCalls = parsed.choices[0].message.tool_calls; + for (const toolCall of toolCalls) { + // Emit tool call start yield `data: ${JSON.stringify({ - delta: { text: parsed.choices?.[0]?.message?.content }, + type: "content_block_start", + content_block: { + type: "tool_use", + id: toolCall.id || `tool-${Date.now()}`, + name: toolCall.function?.name, + }, })}\n\n`; - } - // Handle stop reason if present - if (parsed.choices?.[0]?.stop_reason) { + + // Emit tool arguments + if (toolCall.function?.arguments) { + yield `data: ${JSON.stringify({ + type: "content_block_delta", + delta: { + type: "input_json_delta", + partial_json: toolCall.function.arguments, + }, + })}\n\n`; + } + + // Emit tool call stop yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.choices[0].stop_reason }, + type: "content_block_stop", })}\n\n`; } + continue; } - } - // Handle Llama models - else if (modelId.toLowerCase().includes("llama")) { - if (parsed.generation) { + + // Handle regular content + const content = parsed.choices?.[0]?.message?.content; + if (content?.trim()) { yield `data: ${JSON.stringify({ - delta: { text: parsed.generation }, + delta: { text: content }, })}\n\n`; } - if (parsed.stop_reason) { + + // Handle stop reason + if (parsed.choices?.[0]?.finish_reason) { yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.stop_reason }, + delta: { stop_reason: parsed.choices[0].finish_reason }, })}\n\n`; } } @@ -469,8 +435,9 @@ export async function* transformBedrockStream( })}\n\n`; } } - } else { - // Handle other model text responses + } + // Handle other models + else { const text = parsed.outputText || parsed.generation || ""; if (text) { yield `data: ${JSON.stringify({ From 448babd27f80601aaa43c7e71214435664981b72 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 26 Nov 2024 10:10:34 +0800 Subject: [PATCH 42/72] =?UTF-8?q?=E5=AE=8C=E5=96=84mistral=20tool=20use?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 22 +-- app/utils/aws.ts | 113 +++++++------- docs/bedrock-response-format.md | 258 ++++++++++++++++++++++++++++++++ 3 files changed, 331 insertions(+), 62 deletions(-) create mode 100644 docs/bedrock-response-format.md diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 79063e03cc8..78fc4b4dc50 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -184,7 +184,6 @@ async function requestBedrock(req: NextRequest) { // Handle non-streaming response if (!shouldStream) { const responseText = await res.text(); - console.log("[Bedrock Response] Non-streaming:", responseText); const parsed = parseEventData(new TextEncoder().encode(responseText)); if (!parsed) { throw new Error("Failed to parse Bedrock response"); @@ -212,13 +211,18 @@ async function requestBedrock(req: NextRequest) { }, }); + const newHeaders = new Headers(res.headers); + newHeaders.delete("www-authenticate"); + newHeaders.set("Content-Type", "text/event-stream"); + newHeaders.set("Cache-Control", "no-cache"); + newHeaders.set("Connection", "keep-alive"); + // to disable nginx buffering + newHeaders.set("X-Accel-Buffering", "no"); + return new Response(stream, { - headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", - "X-Accel-Buffering": "no", - }, + status: res.status, + statusText: res.statusText, + headers: newHeaders, }); } catch (e) { console.error("[Bedrock Request Error]:", e); @@ -232,10 +236,6 @@ export async function handle( req: NextRequest, { params }: { params: { path: string[] } }, ) { - if (req.method === "OPTIONS") { - return NextResponse.json({ body: "OK" }, { status: 200 }); - } - const subpath = params.path.join("/"); if (!ALLOWED_PATH.has(subpath)) { return NextResponse.json( diff --git a/app/utils/aws.ts b/app/utils/aws.ts index cb23f60e22f..2f65e81d664 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -245,7 +245,7 @@ export async function sign({ export function parseEventData(chunk: Uint8Array): any { const decoder = new TextDecoder(); const text = decoder.decode(chunk); - // console.info("[AWS Parse ] parsing:", text); + try { const parsed = JSON.parse(text); // AWS Bedrock wraps the response in a 'body' field @@ -282,7 +282,6 @@ export function parseEventData(chunk: Uint8Array): any { // Handle plain text responses if (text.trim()) { - // Clean up any malformed JSON characters const cleanText = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); return { output: cleanText }; } @@ -314,7 +313,6 @@ export function extractMessage(res: any, modelId: string = ""): string { console.error("[AWS Extract Error] extractMessage Empty response"); return ""; } - // console.log("[Response] extractMessage response: ", res); // Handle Mistral model response format if (modelId.toLowerCase().includes("mistral")) { @@ -329,6 +327,11 @@ export function extractMessage(res: any, modelId: string = ""): string { return res?.generation || ""; } + // Handle Titan model response format + if (modelId.toLowerCase().includes("titan")) { + return res?.outputText || ""; + } + // Handle Claude and other models return res?.content?.[0]?.text || ""; } @@ -338,12 +341,10 @@ export async function* transformBedrockStream( modelId: string, ) { const reader = stream.getReader(); - let toolInput = ""; try { while (true) { const { done, value } = await reader.read(); - if (done) break; const parsed = parseEventData(value); @@ -351,14 +352,40 @@ export async function* transformBedrockStream( // console.log("parseEventData========================="); // console.log(parsed); - + // Handle Claude 3 models + if (modelId.startsWith("anthropic.claude")) { + if (parsed.type === "message_start") { + // Initialize message + continue; + } else if (parsed.type === "content_block_start") { + if (parsed.content_block?.type === "tool_use") { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } + continue; + } else if (parsed.type === "content_block_delta") { + if (parsed.delta?.type === "text_delta") { + yield `data: ${JSON.stringify({ + delta: { text: parsed.delta.text }, + })}\n\n`; + } else if (parsed.delta?.type === "input_json_delta") { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } + } else if (parsed.type === "content_block_stop") { + yield `data: ${JSON.stringify(parsed)}\n\n`; + } else if ( + parsed.type === "message_delta" && + parsed.delta?.stop_reason + ) { + yield `data: ${JSON.stringify({ + delta: { stop_reason: parsed.delta.stop_reason }, + })}\n\n`; + } + } // Handle Mistral models - if (modelId.toLowerCase().includes("mistral")) { - // Handle tool calls + else if (modelId.toLowerCase().includes("mistral")) { if (parsed.choices?.[0]?.message?.tool_calls) { const toolCalls = parsed.choices[0].message.tool_calls; for (const toolCall of toolCalls) { - // Emit tool call start yield `data: ${JSON.stringify({ type: "content_block_start", content_block: { @@ -368,7 +395,6 @@ export async function* transformBedrockStream( }, })}\n\n`; - // Emit tool arguments if (toolCall.function?.arguments) { yield `data: ${JSON.stringify({ type: "content_block_delta", @@ -379,66 +405,51 @@ export async function* transformBedrockStream( })}\n\n`; } - // Emit tool call stop yield `data: ${JSON.stringify({ type: "content_block_stop", })}\n\n`; } - continue; - } - - // Handle regular content - const content = parsed.choices?.[0]?.message?.content; - if (content?.trim()) { + } else if (parsed.choices?.[0]?.message?.content) { yield `data: ${JSON.stringify({ - delta: { text: content }, + delta: { text: parsed.choices[0].message.content }, })}\n\n`; } - // Handle stop reason if (parsed.choices?.[0]?.finish_reason) { yield `data: ${JSON.stringify({ delta: { stop_reason: parsed.choices[0].finish_reason }, })}\n\n`; } } - // Handle Claude models - else if (modelId.startsWith("anthropic.claude")) { - if (parsed.type === "content_block_delta") { - if (parsed.delta?.type === "text_delta") { - yield `data: ${JSON.stringify({ - delta: { text: parsed.delta.text }, - })}\n\n`; - } else if (parsed.delta?.type === "input_json_delta") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } - } else if ( - parsed.type === "message_delta" && - parsed.delta?.stop_reason - ) { + // Handle Llama models + else if (modelId.toLowerCase().includes("llama")) { + if (parsed.generation) { yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.delta.stop_reason }, + delta: { text: parsed.generation }, + })}\n\n`; + } + if (parsed.stop_reason) { + yield `data: ${JSON.stringify({ + delta: { stop_reason: parsed.stop_reason }, + })}\n\n`; + } + } + // Handle Titan models + else if (modelId.toLowerCase().includes("titan")) { + if (parsed.outputText) { + yield `data: ${JSON.stringify({ + delta: { text: parsed.outputText }, + })}\n\n`; + } + if (parsed.completionReason) { + yield `data: ${JSON.stringify({ + delta: { stop_reason: parsed.completionReason }, })}\n\n`; - } else if ( - parsed.type === "content_block_start" && - parsed.content_block?.type === "tool_use" - ) { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } else if (parsed.type === "content_block_stop") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } else { - // Handle regular text responses - const text = parsed.response || parsed.output || ""; - if (text) { - yield `data: ${JSON.stringify({ - delta: { text }, - })}\n\n`; - } } } - // Handle other models + // Handle other models with basic text output else { - const text = parsed.outputText || parsed.generation || ""; + const text = parsed.response || parsed.output || ""; if (text) { yield `data: ${JSON.stringify({ delta: { text }, diff --git a/docs/bedrock-response-format.md b/docs/bedrock-response-format.md new file mode 100644 index 00000000000..0b0d05c59c0 --- /dev/null +++ b/docs/bedrock-response-format.md @@ -0,0 +1,258 @@ +# Understanding Bedrock Response Format + +The AWS Bedrock streaming response format consists of multiple Server-Sent Events (SSE) chunks. Each chunk follows this structure: + +``` +:event-type chunk +:content-type application/json +:message-type event +{"bytes":"base64_encoded_data","p":"signature"} +``` + +## Model-Specific Response Formats + +### Claude 3 Format + +When using Claude 3 models (e.g., claude-3-haiku-20240307), the decoded messages include: + +1. **message_start** +```json +{ + "type": "message_start", + "message": { + "id": "msg_bdrk_01A6sahWac4XVTR9sX3rgvsZ", + "type": "message", + "role": "assistant", + "model": "claude-3-haiku-20240307", + "content": [], + "stop_reason": null, + "stop_sequence": null, + "usage": { + "input_tokens": 8, + "output_tokens": 1 + } + } +} +``` + +2. **content_block_start** +```json +{ + "type": "content_block_start", + "index": 0, + "content_block": { + "type": "text", + "text": "" + } +} +``` + +3. **content_block_delta** +```json +{ + "type": "content_block_delta", + "index": 0, + "delta": { + "type": "text_delta", + "text": "Hello" + } +} +``` + +### Mistral Format + +When using Mistral models (e.g., mistral-large-2407), the decoded messages have a different structure: + +```json +{ + "id": "b0098812-0ad9-42da-9f17-a5e2f554eb6b", + "object": "chat.completion.chunk", + "created": 1732582566, + "model": "mistral-large-2407", + "choices": [{ + "index": 0, + "logprobs": null, + "context_logits": null, + "generation_logits": null, + "message": { + "role": null, + "content": "Hello", + "tool_calls": null, + "index": null, + "tool_call_id": null + }, + "stop_reason": null + }], + "usage": null, + "p": null +} +``` + +### Llama Format + +When using Llama models (3.1 or 3.2), the decoded messages use a simpler structure focused on generation tokens: + +```json +{ + "generation": "Hello", + "prompt_token_count": null, + "generation_token_count": 2, + "stop_reason": null +} +``` + +Each chunk contains: +- generation: The generated text piece +- prompt_token_count: Token count of the input (only present in first chunk) +- generation_token_count: Running count of generated tokens +- stop_reason: Indicates completion (null until final chunk) + +First chunk example (includes prompt_token_count): +```json +{ + "generation": "\n\n", + "prompt_token_count": 10, + "generation_token_count": 1, + "stop_reason": null +} +``` + +### Titan Text Format + +When using Amazon's Titan models (text or TG1), the response comes as a single chunk with complete text and metrics: + +```json +{ + "outputText": "\nBot: Hello! How can I help you today?", + "index": 0, + "totalOutputTextTokenCount": 13, + "completionReason": "FINISH", + "inputTextTokenCount": 3, + "amazon-bedrock-invocationMetrics": { + "inputTokenCount": 3, + "outputTokenCount": 13, + "invocationLatency": 833, + "firstByteLatency": 833 + } +} +``` + +Both Titan text and Titan TG1 use the same response format, with only minor differences in token counts and latency values. For example, here's a TG1 response: + +```json +{ + "outputText": "\nBot: Hello! How can I help you?", + "index": 0, + "totalOutputTextTokenCount": 12, + "completionReason": "FINISH", + "inputTextTokenCount": 3, + "amazon-bedrock-invocationMetrics": { + "inputTokenCount": 3, + "outputTokenCount": 12, + "invocationLatency": 845, + "firstByteLatency": 845 + } +} +``` + +Key fields: +- outputText: The complete generated response +- totalOutputTextTokenCount: Total tokens in the response +- completionReason: Reason for completion (e.g., "FINISH") +- inputTextTokenCount: Number of input tokens +- amazon-bedrock-invocationMetrics: Detailed performance metrics + +## Model-Specific Completion Metrics + +### Mistral +```json +{ + "usage": { + "prompt_tokens": 5, + "total_tokens": 29, + "completion_tokens": 24 + }, + "amazon-bedrock-invocationMetrics": { + "inputTokenCount": 5, + "outputTokenCount": 24, + "invocationLatency": 719, + "firstByteLatency": 148 + } +} +``` + +### Claude 3 +Included in the message_delta with stop_reason. + +### Llama +Included in the final chunk with stop_reason "stop": +```json +{ + "amazon-bedrock-invocationMetrics": { + "inputTokenCount": 10, + "outputTokenCount": 11, + "invocationLatency": 873, + "firstByteLatency": 550 + } +} +``` + +### Titan +Both Titan text and TG1 include metrics in the single response chunk: +```json +{ + "amazon-bedrock-invocationMetrics": { + "inputTokenCount": 3, + "outputTokenCount": 12, + "invocationLatency": 845, + "firstByteLatency": 845 + } +} +``` + +## How the Response is Processed + +1. The raw response is first split into chunks based on SSE format +2. For each chunk: + - The base64 encoded data is decoded + - The JSON is parsed to extract the message content + - Based on the model type and message type, different processing is applied: + +### Claude 3 Processing +- message_start: Initializes a new message with model info and usage stats +- content_block_start: Starts a new content block (text, tool use, etc.) +- content_block_delta: Adds incremental content to the current block +- message_delta: Updates message metadata + +### Mistral Processing +- Each chunk contains a complete message object with choices array +- The content is streamed through the message.content field +- Final chunk includes token usage and invocation metrics + +### Llama Processing +- Each chunk contains a generation field with the text piece +- First chunk includes prompt_token_count +- Tracks generation progress through generation_token_count +- Simple streaming format focused on text generation +- Final chunk includes complete metrics + +### Titan Processing +- Single chunk response with complete text +- No streaming - returns full response at once +- Includes comprehensive metrics in the same chunk + +## Handling in Code + +The response is processed by the `transformBedrockStream` function in `app/utils/aws.ts`, which: + +1. Reads the stream chunks +2. Parses each chunk using `parseEventData` +3. Handles model-specific formats: + - For Claude: Processes message_start, content_block_start, content_block_delta + - For Mistral: Extracts content from choices[0].message.content + - For Llama: Uses the generation field directly + - For Titan: Uses the outputText field from the single response +4. Transforms the parsed data into a consistent format for the client +5. Yields the transformed data as SSE events + +This allows for real-time streaming of the model's response while maintaining a consistent format for the client application, regardless of which model is being used. From b39b3f7a5e50b2748537ddf1959e62a2c1309489 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 26 Nov 2024 11:41:56 +0800 Subject: [PATCH 43/72] Remove detailed error logging in decryption function. --- app/utils/aws.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 2f65e81d664..e0b8e479fef 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -42,19 +42,16 @@ export function encrypt(data: string, encryptionKey: string): string { export function decrypt(encryptedData: string, encryptionKey: string): string { if (!encryptedData) return ""; if (!encryptionKey) { - console.error("[AWS Decryption Error] Encryption key is required"); throw new Error("Encryption key is required for AWS credential decryption"); } try { const bytes = AES.decrypt(encryptedData, encryptionKey); const decrypted = bytes.toString(enc.Utf8); if (!decrypted && encryptedData) { - console.error("[AWS Decryption Error] Failed to decrypt data"); throw new Error("Failed to decrypt AWS credentials"); } return decrypted; } catch (error) { - console.error("[AWS Decryption Error]:", error); throw new Error("Failed to decrypt AWS credentials"); } } From 9c648e5b6470d4dec36c3e87fb177da317933412 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 26 Nov 2024 11:46:16 +0800 Subject: [PATCH 44/72] Remove detailed error error message. --- app/api/bedrock.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 78fc4b4dc50..097ac5f9cfc 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -160,8 +160,7 @@ async function requestBedrock(req: NextRequest) { if (!res.ok) { const error = await res.text(); - console.error("[Bedrock Error] Status:", res.status); - console.error("[Bedrock Error] Response:", error); + console.error("[Bedrock Error] Request failed with status:", res.status); try { const errorJson = JSON.parse(error); throw new Error(errorJson.message || error); From 8ce2cf5c3b683a9cbf981fa79da1b1993ec3f9ee Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 26 Nov 2024 11:57:49 +0800 Subject: [PATCH 45/72] Remove detailed error error message. --- app/api/bedrock.ts | 3 +-- app/client/platforms/bedrock.ts | 16 ++++++++-------- app/utils/aws.ts | 2 -- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 097ac5f9cfc..1cc177348ec 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -101,8 +101,7 @@ async function requestBedrock(req: NextRequest) { shouldStream, ); - console.log("[Bedrock Request] Endpoint:", endpoint); - console.log("[Bedrock Request] Model ID:", modelId); + console.log("[Bedrock Request] Initiating request"); // Handle tools for different models const isMistralLargeModel = modelId diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 856c67b47bb..2260eae0565 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -228,14 +228,14 @@ export class BedrockApi implements LLMApi { const headers = getHeaders(); headers.XModelID = modelConfig.model; headers.XEncryptionKey = accessStore.encryptionKey; - - console.log("[Bedrock Client] Request:", { - path: chatPath, - model: modelConfig.model, - messages: messages.length, - stream: shouldStream, - }); - + if (process.env.NODE_ENV !== "production") { + console.debug("[Bedrock Client] Request:", { + path: chatPath, + model: modelConfig.model, + messages: messages.length, + stream: shouldStream, + }); + } const finalRequestBody = this.formatRequestBody(messages, modelConfig); console.log( "[Bedrock Client] Request Body:", diff --git a/app/utils/aws.ts b/app/utils/aws.ts index e0b8e479fef..395c8fe3e57 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -28,13 +28,11 @@ export interface ModelValidationConfig { export function encrypt(data: string, encryptionKey: string): string { if (!data) return ""; if (!encryptionKey) { - console.error("[AWS Encryption Error] Encryption key is required"); throw new Error("Encryption key is required for AWS credential encryption"); } try { return AES.encrypt(data, encryptionKey).toString(); } catch (error) { - console.error("[AWS Encryption Error]:", error); throw new Error("Failed to encrypt AWS credentials"); } } From 471b17831a3535b57ce871d7e3d0b7bb76280e06 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 26 Nov 2024 16:18:46 +0800 Subject: [PATCH 46/72] modify the BEDROCK_BASE_URL to use the region from the access stor --- app/constant.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/constant.ts b/app/constant.ts index 8efee805f8d..7ab495fde27 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -12,8 +12,6 @@ export const RUNTIME_CONFIG_DOM = "danger-runtime-config"; export const STABILITY_BASE_URL = "https://api.stability.ai"; export const OPENAI_BASE_URL = "https://api.openai.com"; -export const BEDROCK_BASE_URL = - "https://bedrock-runtime.us-west-2.amazonaws.com"; export const ANTHROPIC_BASE_URL = "https://api.anthropic.com"; export const GEMINI_BASE_URL = "https://generativelanguage.googleapis.com/"; @@ -247,6 +245,9 @@ export const Bedrock = { `https://bedrock-runtime.${region}.amazonaws.com`, }; +// Get the region from access store for BEDROCK_BASE_URL +export const BEDROCK_BASE_URL = Bedrock.getEndpoint(); + export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang // export const DEFAULT_SYSTEM_TEMPLATE = ` // You are ChatGPT, a large language model trained by {{ServiceProvider}}. From d9d2a27d8f291f2161643e8030c34515e45635b3 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 26 Nov 2024 16:19:54 +0800 Subject: [PATCH 47/72] modify the BEDROCK_BASE_URL to use the region from the access store --- app/constant.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/constant.ts b/app/constant.ts index 7ab495fde27..d53c52846dd 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -244,7 +244,6 @@ export const Bedrock = { getEndpoint: (region: string = "us-west-2") => `https://bedrock-runtime.${region}.amazonaws.com`, }; - // Get the region from access store for BEDROCK_BASE_URL export const BEDROCK_BASE_URL = Bedrock.getEndpoint(); From 0c5585064143aa5d4513f4169b32fd3fe6c2300a Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 7 Dec 2024 12:18:15 +0800 Subject: [PATCH 48/72] =?UTF-8?q?=E4=BC=98=E5=8C=96bedrock=E6=B5=81?= =?UTF-8?q?=E5=BC=8F=E6=B6=88=E6=81=AF=E5=A4=84=E7=90=86=E7=9A=84=E7=BC=93?= =?UTF-8?q?=E5=86=B2=E6=9C=BA=E5=88=B6=EF=BC=8C=E7=AE=80=E5=8C=96app?= =?UTF-8?q?=E5=92=8C=E5=90=8E=E5=8F=B0api=E8=B0=83=E7=94=A8=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=A4=E6=96=AD=E5=92=8C=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 47 +--- app/client/platforms/bedrock.ts | 440 +++++++++++++++++++++-------- app/utils/aws.ts | 481 +++++++++++++++++++------------- 3 files changed, 619 insertions(+), 349 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 1cc177348ec..bf1313eb06c 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -4,8 +4,6 @@ import { sign, decrypt, getBedrockEndpoint, - transformBedrockStream, - parseEventData, BedrockCredentials, } from "../utils/aws"; import { getServerSideConfig } from "../config/server"; @@ -178,50 +176,7 @@ async function requestBedrock(req: NextRequest) { "Empty response from Bedrock. Please check AWS credentials and permissions.", ); } - - // Handle non-streaming response - if (!shouldStream) { - const responseText = await res.text(); - const parsed = parseEventData(new TextEncoder().encode(responseText)); - if (!parsed) { - throw new Error("Failed to parse Bedrock response"); - } - return NextResponse.json(parsed); - } - - // Handle streaming response - const transformedStream = transformBedrockStream(res.body, modelId); - const encoder = new TextEncoder(); - const stream = new ReadableStream({ - async start(controller) { - try { - for await (const chunk of transformedStream) { - // Ensure we're sending non-empty chunks - if (chunk && chunk.trim()) { - controller.enqueue(encoder.encode(chunk)); - } - } - controller.close(); - } catch (err) { - console.error("[Bedrock Stream Error]:", err); - controller.error(err); - } - }, - }); - - const newHeaders = new Headers(res.headers); - newHeaders.delete("www-authenticate"); - newHeaders.set("Content-Type", "text/event-stream"); - newHeaders.set("Cache-Control", "no-cache"); - newHeaders.set("Connection", "keep-alive"); - // to disable nginx buffering - newHeaders.set("X-Accel-Buffering", "no"); - - return new Response(stream, { - status: res.status, - statusText: res.statusText, - headers: newHeaders, - }); + return res; } catch (e) { console.error("[Bedrock Request Error]:", e); throw e; diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 2260eae0565..9f5932698b5 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -7,13 +7,21 @@ import { useAccessStore, ChatMessageTool, } from "@/app/store"; -import { preProcessImageContent, stream } from "@/app/utils/chat"; +import { preProcessImageContent } from "@/app/utils/chat"; import { getMessageTextContent, isVisionModel } from "@/app/utils"; import { ApiPath, BEDROCK_BASE_URL } from "@/app/constant"; import { getClientConfig } from "@/app/config/client"; -import { extractMessage } from "@/app/utils/aws"; +import { + extractMessage, + processMessage, + processChunks, + parseEventData, + sign, +} from "@/app/utils/aws"; import { RequestPayload } from "./openai"; -import { fetch } from "@/app/utils/stream"; +import { REQUEST_TIMEOUT_MS } from "@/app/constant"; +import { prettyObject } from "@/app/utils/format"; +import Locale from "@/app/locales"; const ClaudeMapper = { assistant: "assistant", @@ -26,18 +34,7 @@ const MistralMapper = { user: "user", assistant: "assistant", } as const; - -type ClaudeRole = keyof typeof ClaudeMapper; type MistralRole = keyof typeof MistralMapper; - -interface Tool { - function?: { - name?: string; - description?: string; - parameters?: any; - }; -} - export class BedrockApi implements LLMApi { speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); @@ -47,6 +44,24 @@ export class BedrockApi implements LLMApi { const model = modelConfig.model; const visionModel = isVisionModel(modelConfig.model); + // Handle Nova models + if (model.startsWith("us.amazon.nova")) { + return { + inferenceConfig: { + max_tokens: modelConfig.max_tokens || 1000, + }, + messages: messages.map((message) => ({ + role: message.role, + content: [ + { + type: "text", + text: getMessageTextContent(message), + }, + ], + })), + }; + } + // Handle Titan models if (model.startsWith("amazon.titan")) { const inputText = messages @@ -223,11 +238,34 @@ export class BedrockApi implements LLMApi { ); } + let finalRequestBody = this.formatRequestBody(messages, modelConfig); + try { - const chatPath = this.path("chat"); - const headers = getHeaders(); - headers.XModelID = modelConfig.model; - headers.XEncryptionKey = accessStore.encryptionKey; + const isApp = !!getClientConfig()?.isApp; + const bedrockAPIPath = `${BEDROCK_BASE_URL}/model/${ + modelConfig.model + }/invoke${shouldStream ? "-with-response-stream" : ""}`; + const chatPath = isApp ? bedrockAPIPath : ApiPath.Bedrock + "/chat"; + + const headers = isApp + ? await sign({ + method: "POST", + url: chatPath, + region: accessStore.awsRegion, + accessKeyId: accessStore.awsAccessKey, + secretAccessKey: accessStore.awsSecretKey, + body: finalRequestBody, + service: "bedrock", + isStreaming: shouldStream, + }) + : getHeaders(); + + if (!isApp) { + headers.XModelID = modelConfig.model; + headers.XEncryptionKey = accessStore.encryptionKey; + headers.ShouldStream = shouldStream + ""; + } + if (process.env.NODE_ENV !== "production") { console.debug("[Bedrock Client] Request:", { path: chatPath, @@ -236,20 +274,14 @@ export class BedrockApi implements LLMApi { stream: shouldStream, }); } - const finalRequestBody = this.formatRequestBody(messages, modelConfig); - console.log( - "[Bedrock Client] Request Body:", - JSON.stringify(finalRequestBody, null, 2), - ); if (shouldStream) { - let index = -1; const [tools, funcs] = usePluginStore .getState() .getAsTools( useChatStore.getState().currentSession().mask?.plugin || [], ); - return stream( + return bedrockStream( chatPath, finalRequestBody, headers, @@ -261,59 +293,12 @@ export class BedrockApi implements LLMApi { })), funcs, controller, - // parseSSE - (text: string, runTools: ChatMessageTool[]) => { - // console.log("parseSSE", text, runTools); - let chunkJson: - | undefined - | { - type: "content_block_delta" | "content_block_stop"; - content_block?: { - type: "tool_use"; - id: string; - name: string; - }; - delta?: { - type: "text_delta" | "input_json_delta"; - text?: string; - partial_json?: string; - }; - index: number; - }; - chunkJson = JSON.parse(text); - - if (chunkJson?.content_block?.type == "tool_use") { - index += 1; - const id = chunkJson?.content_block.id; - const name = chunkJson?.content_block.name; - runTools.push({ - id, - type: "function", - function: { - name, - arguments: "", - }, - }); - } - if ( - chunkJson?.delta?.type == "input_json_delta" && - chunkJson?.delta?.partial_json - ) { - // @ts-ignore - runTools[index]["function"]["arguments"] += - chunkJson?.delta?.partial_json; - } - return chunkJson?.delta?.text; - }, // processToolMessage, include tool_calls message and tool call results ( requestPayload: RequestPayload, toolCallMessage: any, toolCallResult: any[], ) => { - // reset index value - index = -1; - const modelId = modelConfig.model; const isMistral = modelId.startsWith("mistral.mistral"); const isClaude = modelId.includes("anthropic.claude"); @@ -384,30 +369,26 @@ export class BedrockApi implements LLMApi { options, ); } else { - headers.ShouldStream = "false"; - const res = await fetch(chatPath, { - method: "POST", - headers, - body: JSON.stringify(finalRequestBody), - }); - - if (!res.ok) { - const errorText = await res.text(); - console.error("[Bedrock Client] Error response:", errorText); - throw new Error(`Request failed: ${errorText}`); - } - - const resJson = await res.json(); - if (!resJson) { - throw new Error("Empty response from server"); - } - - const message = extractMessage(resJson, modelConfig.model); - if (!message) { - throw new Error("Failed to extract message from response"); + try { + controller.signal.onabort = () => + options.onFinish("", new Response(null, { status: 400 })); + const res = await fetch(chatPath, { + method: "POST", + headers: headers, + body: JSON.stringify(finalRequestBody), + }); + const contentType = res.headers.get("content-type"); + console.log( + "[Bedrock Not Stream Request] response content type: ", + contentType, + ); + const resJson = await res.json(); + const message = extractMessage(resJson); + options.onFinish(message, res); + } catch (e) { + console.error("failed to chat", e); + options.onError?.(e as Error); } - - options.onFinish(message, res); } } catch (e) { console.error("[Bedrock Client] Chat error:", e); @@ -415,31 +396,264 @@ export class BedrockApi implements LLMApi { } } - path(path: string): string { - const accessStore = useAccessStore.getState(); - let baseUrl = accessStore.useCustomConfig ? accessStore.bedrockUrl : ""; + async usage() { + return { used: 0, total: 0 }; + } - if (baseUrl.length === 0) { - const isApp = !!getClientConfig()?.isApp; - const apiPath = ApiPath.Bedrock; - baseUrl = isApp ? BEDROCK_BASE_URL : apiPath; - } + async models() { + return []; + } +} - baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - if (!baseUrl.startsWith("http") && !baseUrl.startsWith(ApiPath.Bedrock)) { - baseUrl = "https://" + baseUrl; +function bedrockStream( + chatPath: string, + requestPayload: any, + headers: any, + tools: any[], + funcs: Record, + controller: AbortController, + processToolMessage: ( + requestPayload: any, + toolCallMessage: any, + toolCallResult: any[], + ) => void, + options: any, +) { + let responseText = ""; + let remainText = ""; + let finished = false; + let running = false; + let runTools: any[] = []; + let responseRes: Response; + let index = -1; + let chunks: Uint8Array[] = []; // 使用数组存储二进制数据块 + let pendingChunk: Uint8Array | null = null; // 存储不完整的数据块 + + // Animate response to make it looks smooth + function animateResponseText() { + if (finished || controller.signal.aborted) { + responseText += remainText; + console.log("[Response Animation] finished"); + if (responseText?.length === 0) { + options.onError?.(new Error("empty response from server")); + } + return; } - console.log("[Bedrock Client] API Endpoint:", baseUrl, path); + if (remainText.length > 0) { + const fetchCount = Math.max(1, Math.round(remainText.length / 60)); + const fetchText = remainText.slice(0, fetchCount); + responseText += fetchText; + remainText = remainText.slice(fetchCount); + options.onUpdate?.(responseText, fetchText); + } - return [baseUrl, path].join("/"); + requestAnimationFrame(animateResponseText); } - async usage() { - return { used: 0, total: 0 }; - } + // Start animation + animateResponseText(); - async models() { - return []; + const finish = () => { + if (!finished) { + if (!running && runTools.length > 0) { + const toolCallMessage = { + role: "assistant", + tool_calls: [...runTools], + }; + running = true; + runTools.splice(0, runTools.length); // empty runTools + return Promise.all( + toolCallMessage.tool_calls.map((tool) => { + options?.onBeforeTool?.(tool); + return Promise.resolve( + funcs[tool.function.name]( + tool?.function?.arguments + ? JSON.parse(tool?.function?.arguments) + : {}, + ), + ) + .then((res) => { + let content = res.data || res?.statusText; + content = + typeof content === "string" + ? content + : JSON.stringify(content); + if (res.status >= 300) { + return Promise.reject(content); + } + return content; + }) + .then((content) => { + options?.onAfterTool?.({ + ...tool, + content, + isError: false, + }); + return content; + }) + .catch((e) => { + options?.onAfterTool?.({ + ...tool, + isError: true, + errorMsg: e.toString(), + }); + return e.toString(); + }) + .then((content) => ({ + name: tool.function.name, + role: "tool", + content, + tool_call_id: tool.id, + })); + }), + ).then((toolCallResult) => { + processToolMessage(requestPayload, toolCallMessage, toolCallResult); + setTimeout(() => { + // call again + console.debug("[BedrockAPI for toolCallResult] restart"); + running = false; + bedrockChatApi(chatPath, headers, requestPayload, tools); + }, 60); + }); + } + if (running) { + return; + } + console.debug("[BedrockAPI] end"); + finished = true; + options.onFinish(responseText + remainText, responseRes); + } + }; + + controller.signal.onabort = finish; + + async function bedrockChatApi( + chatPath: string, + headers: any, + requestPayload: any, + tools: any, + ) { + const requestTimeoutId = setTimeout( + () => controller.abort(), + REQUEST_TIMEOUT_MS, + ); + + try { + const res = await fetch(chatPath, { + method: "POST", + headers, + body: JSON.stringify({ + ...requestPayload, + tools: tools && tools.length ? tools : undefined, + }), + redirect: "manual", + // @ts-ignore + duplex: "half", + signal: controller.signal, + }); + + clearTimeout(requestTimeoutId); + responseRes = res; + + const contentType = res.headers.get("content-type"); + console.log( + "[Bedrock Stream Request] response content type: ", + contentType, + ); + + // Handle non-stream responses + if (contentType?.startsWith("text/plain")) { + responseText = await res.text(); + return finish(); + } + + // Handle error responses + if ( + !res.ok || + res.status !== 200 || + !contentType?.startsWith("application/vnd.amazon.eventstream") + ) { + const responseTexts = [responseText]; + let extraInfo = await res.text(); + try { + const resJson = await res.clone().json(); + extraInfo = prettyObject(resJson); + } catch {} + + if (res.status === 401) { + responseTexts.push(Locale.Error.Unauthorized); + } + + if (extraInfo) { + responseTexts.push(extraInfo); + } + + responseText = responseTexts.join("\n\n"); + return finish(); + } + + // Process the stream using chunks + const reader = res.body?.getReader(); + if (!reader) { + throw new Error("No response body reader available"); + } + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) { + // Process final pending chunk + if (pendingChunk) { + try { + const parsed = parseEventData(pendingChunk); + if (parsed) { + const result = processMessage( + parsed, + remainText, + runTools, + index, + ); + remainText = result.remainText; + index = result.index; + } + } catch (e) { + console.error("[Final Chunk Process Error]:", e); + } + } + break; + } + + // Add new chunk to queue + chunks.push(value); + + // Process chunk queue + const result = processChunks( + chunks, + pendingChunk, + remainText, + runTools, + index, + ); + chunks = result.chunks; + pendingChunk = result.pendingChunk; + remainText = result.remainText; + index = result.index; + } + } catch (err) { + console.error("[Bedrock Stream Error]:", err); + throw err; + } finally { + reader.releaseLock(); + finish(); + } + } catch (e) { + console.error("[Bedrock Request] error", e); + options.onError?.(e); + throw e; + } } + + console.debug("[BedrockAPI] start"); + bedrockChatApi(chatPath, headers, requestPayload, tools); } diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 395c8fe3e57..912df4811d4 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -67,8 +67,9 @@ export interface SignParams { region: string; accessKeyId: string; secretAccessKey: string; - body: string; + body: string | object; service: string; + headers?: Record; isStreaming?: boolean; } @@ -99,7 +100,7 @@ function normalizeHeaderValue(value: string): string { return value.replace(/\s+/g, " ").trim(); } -function encodeURIComponent_RFC3986(str: string): string { +function encodeRFC3986(str: string): string { return encodeURIComponent(str) .replace( /[!'()*]/g, @@ -108,41 +109,36 @@ function encodeURIComponent_RFC3986(str: string): string { .replace(/[-_.~]/g, (c) => c); } -function encodeURI_RFC3986(uri: string): string { - if (!uri || uri === "/") return ""; - - const segments = uri.split("/"); - - return segments - .map((segment) => { - if (!segment) return ""; - - if (segment.includes("model/")) { - const parts = segment.split(/(model\/)/); - return parts - .map((part) => { - if (part === "model/") return part; - if (part.includes(".") || part.includes(":")) { +function getCanonicalUri(path: string): string { + if (!path || path === "/") return "/"; + + return ( + "/" + + path + .split("/") + .map((segment) => { + if (!segment) return ""; + if (segment === "invoke-with-response-stream") return segment; + + if (segment.includes("model/")) { + return segment + .split(/(model\/)/) + .map((part) => { + if (part === "model/") return part; return part .split(/([.:])/g) - .map((subpart, i) => { - if (i % 2 === 1) return subpart; - return encodeURIComponent_RFC3986(subpart); - }) + .map((subpart, i) => + i % 2 === 1 ? subpart : encodeRFC3986(subpart), + ) .join(""); - } - return encodeURIComponent_RFC3986(part); - }) - .join(""); - } - - if (segment === "invoke-with-response-stream") { - return segment; - } + }) + .join(""); + } - return encodeURIComponent_RFC3986(segment); - }) - .join("/"); + return encodeRFC3986(segment); + }) + .join("/") + ); } export async function sign({ @@ -153,18 +149,20 @@ export async function sign({ secretAccessKey, body, service, + headers: customHeaders = {}, isStreaming = true, }: SignParams): Promise> { try { const endpoint = new URL(url); - const canonicalUri = "/" + encodeURI_RFC3986(endpoint.pathname.slice(1)); + const canonicalUri = getCanonicalUri(endpoint.pathname.slice(1)); const canonicalQueryString = endpoint.search.slice(1); const now = new Date(); const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, ""); const dateStamp = amzDate.slice(0, 8); - const payloadHash = SHA256(body).toString(Hex); + const bodyString = typeof body === "string" ? body : JSON.stringify(body); + const payloadHash = SHA256(bodyString).toString(Hex); const headers: Record = { accept: isStreaming @@ -174,6 +172,7 @@ export async function sign({ host: endpoint.host, "x-amz-content-sha256": payloadHash, "x-amz-date": amzDate, + ...customHeaders, }; if (isStreaming) { @@ -237,54 +236,274 @@ export async function sign({ } // Bedrock utilities +function decodeBase64(base64String: string): string { + try { + return Buffer.from(base64String, "base64").toString("utf-8"); + } catch (e) { + console.error("[Base64 Decode Error]:", e); + return ""; + } +} + export function parseEventData(chunk: Uint8Array): any { const decoder = new TextDecoder(); const text = decoder.decode(chunk); + const results = []; try { + // First try to parse as JSON const parsed = JSON.parse(text); - // AWS Bedrock wraps the response in a 'body' field + + // Handle bytes field in the response + if (parsed.bytes) { + const decoded = decodeBase64(parsed.bytes); + try { + results.push(JSON.parse(decoded)); + } catch (e) { + results.push({ output: decoded }); + } + return results; + } + + // Handle body field if (typeof parsed.body === "string") { try { - return JSON.parse(parsed.body); + results.push(JSON.parse(parsed.body)); } catch (e) { - return { output: parsed.body }; + results.push({ output: parsed.body }); } + return results; } - return parsed.body || parsed; + + results.push(parsed.body || parsed); + return results; } catch (e) { try { - // Handle base64 encoded responses - const base64Match = text.match(/:"([A-Za-z0-9+/=]+)"/); - if (base64Match) { - const decoded = Buffer.from(base64Match[1], "base64").toString("utf-8"); + // Handle event-stream format + const eventRegex = /:event-type[^\{]+({.*?})/g; + let match; + while ((match = eventRegex.exec(text)) !== null) { try { - return JSON.parse(decoded); + const eventData = match[1]; + const parsed = JSON.parse(eventData); + if (parsed.bytes) { + const decoded = decodeBase64(parsed.bytes); + try { + results.push(JSON.parse(decoded)); + } catch (e) { + results.push({ output: decoded }); + } + } else { + results.push(parsed); + } } catch (e) { - return { output: decoded }; + results.push({ output: match[1] }); } } - // Handle event-type responses - const eventMatch = text.match(/:event-type[^\{]+({.*})/); - if (eventMatch) { - try { - return JSON.parse(eventMatch[1]); - } catch (e) { - return { output: eventMatch[1] }; - } + if (results.length > 0) { + return results; } // Handle plain text responses if (text.trim()) { const cleanText = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); - return { output: cleanText }; + results.push({ output: cleanText.trim() }); + return results; } } catch (innerError) { console.error("[AWS Parse Error] Inner parsing failed:", innerError); } } - return null; + return []; +} + +export function processMessage( + data: any, + remainText: string, + runTools: any[], + index: number, +): { remainText: string; index: number } { + if (!data) return { remainText, index }; + + try { + // Handle message_start event + if (data.type === "message_start") { + // Keep existing text but mark the start of a new message + console.debug("[Message Start] Current text:", remainText); + return { remainText, index }; + } + + // Handle content_block_start event + if (data.type === "content_block_start") { + if (data.content_block?.type === "tool_use") { + index += 1; + runTools.push({ + id: data.content_block.id, + type: "function", + function: { + name: data.content_block.name, + arguments: "", + }, + }); + } + return { remainText, index }; + } + + // Handle content_block_delta event + if (data.type === "content_block_delta") { + if (data.delta?.type === "input_json_delta" && runTools[index]) { + runTools[index].function.arguments += data.delta.partial_json; + } else if (data.delta?.type === "text_delta") { + const newText = data.delta.text || ""; + // console.debug("[Text Delta] Adding:", newText); + remainText += newText; + } + return { remainText, index }; + } + + // Handle tool calls + if (data.choices?.[0]?.message?.tool_calls) { + for (const toolCall of data.choices[0].message.tool_calls) { + index += 1; + runTools.push({ + id: toolCall.id || `tool-${Date.now()}`, + type: "function", + function: { + name: toolCall.function?.name, + arguments: toolCall.function?.arguments || "", + }, + }); + } + return { remainText, index }; + } + + // Handle various response formats + let newText = ""; + if (data.delta?.text) { + newText = data.delta.text; + } else if (data.choices?.[0]?.message?.content) { + newText = data.choices[0].message.content; + } else if (data.content?.[0]?.text) { + newText = data.content[0].text; + } else if (data.generation) { + newText = data.generation; + } else if (data.outputText) { + newText = data.outputText; + } else if (data.response) { + newText = data.response; + } else if (data.output) { + newText = data.output; + } + + // Only append if we have new text + if (newText) { + // console.debug("[New Text] Adding:", newText); + remainText += newText; + } + } catch (e) { + console.error("[Bedrock Request] parse error", e); + } + + return { remainText, index }; +} + +export function processChunks( + chunks: Uint8Array[], + pendingChunk: Uint8Array | null, + remainText: string, + runTools: any[], + index: number, +): { + chunks: Uint8Array[]; + pendingChunk: Uint8Array | null; + remainText: string; + index: number; +} { + let currentText = remainText; + let currentIndex = index; + + while (chunks.length > 0) { + const chunk = chunks[0]; + try { + // Try to process the chunk + const parsedEvents = parseEventData(chunk); + if (parsedEvents.length > 0) { + // Process each event in the chunk + for (const parsed of parsedEvents) { + const result = processMessage( + parsed, + currentText, + runTools, + currentIndex, + ); + currentText = result.remainText; + currentIndex = result.index; + } + chunks.shift(); // Remove processed chunk + + // If there's a pending chunk, try to process it now + if (pendingChunk) { + const pendingEvents = parseEventData(pendingChunk); + if (pendingEvents.length > 0) { + for (const pendingParsed of pendingEvents) { + const pendingResult = processMessage( + pendingParsed, + currentText, + runTools, + currentIndex, + ); + currentText = pendingResult.remainText; + currentIndex = pendingResult.index; + } + pendingChunk = null; + } + } + } else { + // If parsing fails, it might be an incomplete chunk + if (pendingChunk) { + // Merge with pending chunk + const mergedChunk = new Uint8Array( + pendingChunk.length + chunk.length, + ); + mergedChunk.set(pendingChunk); + mergedChunk.set(chunk, pendingChunk.length); + pendingChunk = mergedChunk; + } else { + pendingChunk = chunk; + } + chunks.shift(); + } + } catch (e) { + console.error("[Chunk Process Error]:", e); + chunks.shift(); // Remove error chunk + } + } + + // Try to process any remaining pending chunk one last time + if (pendingChunk) { + const finalEvents = parseEventData(pendingChunk); + if (finalEvents.length > 0) { + for (const finalParsed of finalEvents) { + const finalResult = processMessage( + finalParsed, + currentText, + runTools, + currentIndex, + ); + currentText = finalResult.remainText; + currentIndex = finalResult.index; + } + pendingChunk = null; + } + } + + return { + chunks, + pendingChunk, + remainText: currentText, + index: currentIndex, + }; } export function getBedrockEndpoint( @@ -309,150 +528,32 @@ export function extractMessage(res: any, modelId: string = ""): string { return ""; } + let message = ""; + // Handle Mistral model response format if (modelId.toLowerCase().includes("mistral")) { if (res.choices?.[0]?.message?.content) { - return res.choices[0].message.content; + message = res.choices[0].message.content; + } else { + message = res.output || ""; } - return res.output || ""; } - // Handle Llama model response format - if (modelId.toLowerCase().includes("llama")) { - return res?.generation || ""; + else if (modelId.toLowerCase().includes("llama")) { + message = res?.generation || ""; } - // Handle Titan model response format - if (modelId.toLowerCase().includes("titan")) { - return res?.outputText || ""; + else if (modelId.toLowerCase().includes("titan")) { + message = res?.outputText || ""; } - // Handle Claude and other models - return res?.content?.[0]?.text || ""; -} - -export async function* transformBedrockStream( - stream: ReadableStream, - modelId: string, -) { - const reader = stream.getReader(); - - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const parsed = parseEventData(value); - if (!parsed) continue; - - // console.log("parseEventData========================="); - // console.log(parsed); - // Handle Claude 3 models - if (modelId.startsWith("anthropic.claude")) { - if (parsed.type === "message_start") { - // Initialize message - continue; - } else if (parsed.type === "content_block_start") { - if (parsed.content_block?.type === "tool_use") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } - continue; - } else if (parsed.type === "content_block_delta") { - if (parsed.delta?.type === "text_delta") { - yield `data: ${JSON.stringify({ - delta: { text: parsed.delta.text }, - })}\n\n`; - } else if (parsed.delta?.type === "input_json_delta") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } - } else if (parsed.type === "content_block_stop") { - yield `data: ${JSON.stringify(parsed)}\n\n`; - } else if ( - parsed.type === "message_delta" && - parsed.delta?.stop_reason - ) { - yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.delta.stop_reason }, - })}\n\n`; - } - } - // Handle Mistral models - else if (modelId.toLowerCase().includes("mistral")) { - if (parsed.choices?.[0]?.message?.tool_calls) { - const toolCalls = parsed.choices[0].message.tool_calls; - for (const toolCall of toolCalls) { - yield `data: ${JSON.stringify({ - type: "content_block_start", - content_block: { - type: "tool_use", - id: toolCall.id || `tool-${Date.now()}`, - name: toolCall.function?.name, - }, - })}\n\n`; - - if (toolCall.function?.arguments) { - yield `data: ${JSON.stringify({ - type: "content_block_delta", - delta: { - type: "input_json_delta", - partial_json: toolCall.function.arguments, - }, - })}\n\n`; - } - - yield `data: ${JSON.stringify({ - type: "content_block_stop", - })}\n\n`; - } - } else if (parsed.choices?.[0]?.message?.content) { - yield `data: ${JSON.stringify({ - delta: { text: parsed.choices[0].message.content }, - })}\n\n`; - } - - if (parsed.choices?.[0]?.finish_reason) { - yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.choices[0].finish_reason }, - })}\n\n`; - } - } - // Handle Llama models - else if (modelId.toLowerCase().includes("llama")) { - if (parsed.generation) { - yield `data: ${JSON.stringify({ - delta: { text: parsed.generation }, - })}\n\n`; - } - if (parsed.stop_reason) { - yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.stop_reason }, - })}\n\n`; - } - } - // Handle Titan models - else if (modelId.toLowerCase().includes("titan")) { - if (parsed.outputText) { - yield `data: ${JSON.stringify({ - delta: { text: parsed.outputText }, - })}\n\n`; - } - if (parsed.completionReason) { - yield `data: ${JSON.stringify({ - delta: { stop_reason: parsed.completionReason }, - })}\n\n`; - } - } - // Handle other models with basic text output - else { - const text = parsed.response || parsed.output || ""; - if (text) { - yield `data: ${JSON.stringify({ - delta: { text }, - })}\n\n`; - } - } - } - } finally { - reader.releaseLock(); + else if (res.content?.[0]?.text) { + message = res.content[0].text; } + // Handle other response formats + else { + message = res.output || res.response || res.message || ""; + } + + return message; } From 4254fd34f9a972dc3c1143ffe054ca15bf167e88 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 7 Dec 2024 14:20:59 +0800 Subject: [PATCH 49/72] =?UTF-8?q?=E5=A2=9E=E5=8A=A0bedrock=E6=9C=80?= =?UTF-8?q?=E6=96=B0nova=E6=A8=A1=E5=9E=8B=EF=BC=8C=E5=8C=85=E6=8B=ACimage?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/client/platforms/bedrock.ts | 90 ++++++++++++++++++++++++--------- app/constant.ts | 8 +-- app/utils.ts | 2 + app/utils/aws.ts | 43 +++++++++++++--- 4 files changed, 108 insertions(+), 35 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 9f5932698b5..b2bd2c2bb85 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -46,20 +46,68 @@ export class BedrockApi implements LLMApi { // Handle Nova models if (model.startsWith("us.amazon.nova")) { - return { + // Extract system message if present + const systemMessage = messages.find((m) => m.role === "system"); + const conversationMessages = messages.filter((m) => m.role !== "system"); + + const requestBody: any = { + schemaVersion: "messages-v1", + messages: conversationMessages.map((message) => { + const content = Array.isArray(message.content) + ? message.content + : [{ text: getMessageTextContent(message) }]; + + return { + role: message.role, + content: content.map((item: any) => { + // Handle text content + if (item.text || typeof item === "string") { + return { text: item.text || item }; + } + + // Handle image content + if (item.image_url?.url) { + const { url = "" } = item.image_url; + const colonIndex = url.indexOf(":"); + const semicolonIndex = url.indexOf(";"); + const comma = url.indexOf(","); + + // Extract format from mime type + const mimeType = url.slice(colonIndex + 1, semicolonIndex); + const format = mimeType.split("/")[1]; + const data = url.slice(comma + 1); + + return { + image: { + format, + source: { + bytes: data, + }, + }, + }; + } + return item; + }), + }; + }), inferenceConfig: { - max_tokens: modelConfig.max_tokens || 1000, + temperature: modelConfig.temperature || 0.7, + top_p: modelConfig.top_p || 0.9, + top_k: modelConfig.top_k || 50, + max_new_tokens: modelConfig.max_tokens || 1000, }, - messages: messages.map((message) => ({ - role: message.role, - content: [ - { - type: "text", - text: getMessageTextContent(message), - }, - ], - })), }; + + // Add system message if present + if (systemMessage) { + requestBody.system = [ + { + text: getMessageTextContent(systemMessage), + }, + ]; + } + + return requestBody; } // Handle Titan models @@ -426,10 +474,9 @@ function bedrockStream( let runTools: any[] = []; let responseRes: Response; let index = -1; - let chunks: Uint8Array[] = []; // 使用数组存储二进制数据块 - let pendingChunk: Uint8Array | null = null; // 存储不完整的数据块 + let chunks: Uint8Array[] = []; + let pendingChunk: Uint8Array | null = null; - // Animate response to make it looks smooth function animateResponseText() { if (finished || controller.signal.aborted) { responseText += remainText; @@ -451,7 +498,6 @@ function bedrockStream( requestAnimationFrame(animateResponseText); } - // Start animation animateResponseText(); const finish = () => { @@ -462,7 +508,7 @@ function bedrockStream( tool_calls: [...runTools], }; running = true; - runTools.splice(0, runTools.length); // empty runTools + runTools.splice(0, runTools.length); return Promise.all( toolCallMessage.tool_calls.map((tool) => { options?.onBeforeTool?.(tool); @@ -510,7 +556,6 @@ function bedrockStream( ).then((toolCallResult) => { processToolMessage(requestPayload, toolCallMessage, toolCallResult); setTimeout(() => { - // call again console.debug("[BedrockAPI for toolCallResult] restart"); running = false; bedrockChatApi(chatPath, headers, requestPayload, tools); @@ -562,13 +607,11 @@ function bedrockStream( contentType, ); - // Handle non-stream responses if (contentType?.startsWith("text/plain")) { responseText = await res.text(); return finish(); } - // Handle error responses if ( !res.ok || res.status !== 200 || @@ -593,7 +636,6 @@ function bedrockStream( return finish(); } - // Process the stream using chunks const reader = res.body?.getReader(); if (!reader) { throw new Error("No response body reader available"); @@ -603,7 +645,6 @@ function bedrockStream( while (true) { const { done, value } = await reader.read(); if (done) { - // Process final pending chunk if (pendingChunk) { try { const parsed = parseEventData(pendingChunk); @@ -624,10 +665,8 @@ function bedrockStream( break; } - // Add new chunk to queue chunks.push(value); - // Process chunk queue const result = processChunks( chunks, pendingChunk, @@ -648,6 +687,11 @@ function bedrockStream( finish(); } } catch (e) { + // @ts-ignore + if (e.name === "AbortError") { + console.log("[Bedrock Client] Aborted by user"); + return; + } console.error("[Bedrock Request] error", e); options.onError?.(e); throw e; diff --git a/app/constant.ts b/app/constant.ts index d53c52846dd..1c47ae372ae 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -329,10 +329,10 @@ const openaiModels = [ ]; const bedrockModels = [ - // Amazon Titan Models - "amazon.titan-text-express-v1", - "amazon.titan-text-lite-v1", - "amazon.titan-tg1-large", + // Amazon nova Models + "us.amazon.nova-micro-v1:0", + "us.amazon.nova-lite-v1:0", + "us.amazon.nova-pro-v1:0", // Claude Models "anthropic.claude-3-haiku-20240307-v1:0", "anthropic.claude-3-5-haiku-20241022-v1:0", diff --git a/app/utils.ts b/app/utils.ts index 30c2dde5dbc..a2a4f21dc99 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -264,6 +264,8 @@ export function isVisionModel(model: string) { "learnlm", "qwen-vl", "qwen2-vl", + "nova-lite", + "nova-pro", ]; const isGpt4Turbo = model.includes("gpt-4-turbo") && !model.includes("preview"); diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 912df4811d4..6e5943885e2 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -327,14 +327,35 @@ export function processMessage( if (!data) return { remainText, index }; try { - // Handle message_start event + // Handle Nova's messageStart event + if (data.messageStart) { + return { remainText, index }; + } + + // Handle Nova's contentBlockDelta event + if (data.contentBlockDelta) { + if (data.contentBlockDelta.delta?.text) { + remainText += data.contentBlockDelta.delta.text; + } + return { remainText, index }; + } + + // Handle Nova's contentBlockStop event + if (data.contentBlockStop) { + return { remainText, index }; + } + + // Handle Nova's messageStop event + if (data.messageStop) { + return { remainText, index }; + } + + // Handle message_start event (for other models) if (data.type === "message_start") { - // Keep existing text but mark the start of a new message - console.debug("[Message Start] Current text:", remainText); return { remainText, index }; } - // Handle content_block_start event + // Handle content_block_start event (for other models) if (data.type === "content_block_start") { if (data.content_block?.type === "tool_use") { index += 1; @@ -350,13 +371,12 @@ export function processMessage( return { remainText, index }; } - // Handle content_block_delta event + // Handle content_block_delta event (for other models) if (data.type === "content_block_delta") { if (data.delta?.type === "input_json_delta" && runTools[index]) { runTools[index].function.arguments += data.delta.partial_json; } else if (data.delta?.type === "text_delta") { const newText = data.delta.text || ""; - // console.debug("[Text Delta] Adding:", newText); remainText += newText; } return { remainText, index }; @@ -398,7 +418,6 @@ export function processMessage( // Only append if we have new text if (newText) { - // console.debug("[New Text] Adding:", newText); remainText += newText; } } catch (e) { @@ -530,8 +549,16 @@ export function extractMessage(res: any, modelId: string = ""): string { let message = ""; + // Handle Nova model response format + if (modelId.toLowerCase().includes("nova")) { + if (res.output?.message?.content?.[0]?.text) { + message = res.output.message.content[0].text; + } else { + message = res.output || ""; + } + } // Handle Mistral model response format - if (modelId.toLowerCase().includes("mistral")) { + else if (modelId.toLowerCase().includes("mistral")) { if (res.choices?.[0]?.message?.content) { message = res.choices[0].message.content; } else { From 57dc44a54fa941fee100bf9f96f08faae9638c79 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 7 Dec 2024 16:49:26 +0800 Subject: [PATCH 50/72] =?UTF-8?q?=E5=A2=9E=E5=8A=A0bedrock=E6=9C=80?= =?UTF-8?q?=E6=96=B0nova=E6=A8=A1=E5=9E=8B=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/bedrock.ts | 40 +-------- app/client/platforms/bedrock.ts | 145 ++++++++++++++++++++++++++------ app/utils/aws.ts | 27 +++++- 3 files changed, 148 insertions(+), 64 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index bf1313eb06c..7da14a17bef 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -80,54 +80,16 @@ async function requestBedrock(req: NextRequest) { } catch (e) { throw new Error(`Invalid JSON in request body: ${e}`); } - // console.log( - // "[Bedrock Request] original Body:", - // JSON.stringify(bodyJson, null, 2), - // ); - - // Extract tool configuration if present - let tools: any[] | undefined; - if (bodyJson.tools) { - tools = bodyJson.tools; - delete bodyJson.tools; // Remove from main request body - } - + console.log("[Bedrock Request] Initiating request"); // Get endpoint and prepare request const endpoint = getBedrockEndpoint( credentials.region, modelId, shouldStream, ); - - console.log("[Bedrock Request] Initiating request"); - - // Handle tools for different models - const isMistralLargeModel = modelId - .toLowerCase() - .includes("mistral.mistral-large"); - const isClaudeModel = modelId.toLowerCase().includes("claude"); - const requestBody: any = { ...bodyJson, }; - - if (tools && tools.length > 0) { - if (isMistralLargeModel) { - // Add tools in Mistral's format - requestBody.tool_choice = "auto"; - requestBody.tools = tools.map((tool) => ({ - type: "function", - function: { - name: tool.name, - description: tool.description, - parameters: tool.input_schema, - }, - })); - } else if (isClaudeModel) { - requestBody.tools = tools; - } - } - // Sign request const headers = await sign({ method: "POST", diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index b2bd2c2bb85..cd08cb3bbc7 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -9,7 +9,7 @@ import { } from "@/app/store"; import { preProcessImageContent } from "@/app/utils/chat"; import { getMessageTextContent, isVisionModel } from "@/app/utils"; -import { ApiPath, BEDROCK_BASE_URL } from "@/app/constant"; +import { ApiPath, BEDROCK_BASE_URL, REQUEST_TIMEOUT_MS } from "@/app/constant"; import { getClientConfig } from "@/app/config/client"; import { extractMessage, @@ -18,8 +18,6 @@ import { parseEventData, sign, } from "@/app/utils/aws"; -import { RequestPayload } from "./openai"; -import { REQUEST_TIMEOUT_MS } from "@/app/constant"; import { prettyObject } from "@/app/utils/format"; import Locale from "@/app/locales"; @@ -35,6 +33,15 @@ const MistralMapper = { assistant: "assistant", } as const; type MistralRole = keyof typeof MistralMapper; + +interface Tool { + function?: { + name?: string; + description?: string; + parameters?: any; + }; +} + export class BedrockApi implements LLMApi { speech(options: SpeechOptions): Promise { throw new Error("Speech not implemented for Bedrock."); @@ -44,8 +51,15 @@ export class BedrockApi implements LLMApi { const model = modelConfig.model; const visionModel = isVisionModel(modelConfig.model); + // Get tools if available + const [tools] = usePluginStore + .getState() + .getAsTools(useChatStore.getState().currentSession().mask?.plugin || []); + + const toolsArray = (tools as Tool[]) || []; + // Handle Nova models - if (model.startsWith("us.amazon.nova")) { + if (model.includes("amazon.nova")) { // Extract system message if present const systemMessage = messages.find((m) => m.role === "system"); const conversationMessages = messages.filter((m) => m.role !== "system"); @@ -107,6 +121,26 @@ export class BedrockApi implements LLMApi { ]; } + // Add tools if available - now in correct format + if (toolsArray.length > 0) { + requestBody.toolConfig = { + tools: toolsArray.map((tool) => ({ + toolSpec: { + name: tool?.function?.name || "", + description: tool?.function?.description || "", + inputSchema: { + json: { + type: "object", + properties: tool?.function?.parameters || {}, + required: Object.keys(tool?.function?.parameters || {}), + }, + }, + }, + })), + // toolChoice: { auto: {} } + }; + } + return requestBody; } @@ -160,18 +194,33 @@ export class BedrockApi implements LLMApi { } // Handle Mistral models - if (model.startsWith("mistral.mistral")) { + if (model.includes("mistral.mistral")) { const formattedMessages = messages.map((message) => ({ role: MistralMapper[message.role as MistralRole] || "user", content: getMessageTextContent(message), })); - return { + const requestBody: any = { messages: formattedMessages, max_tokens: modelConfig.max_tokens || 4096, temperature: modelConfig.temperature || 0.7, top_p: modelConfig.top_p || 0.9, }; + + // Add tools if available + if (toolsArray.length > 0) { + requestBody.tool_choice = "auto"; + requestBody.tools = toolsArray.map((tool) => ({ + type: "function", + function: { + name: tool?.function?.name, + description: tool?.function?.description, + parameters: tool?.function?.parameters, + }, + })); + } + + return requestBody; } // Handle Claude models @@ -254,6 +303,16 @@ export class BedrockApi implements LLMApi { top_p: modelConfig.top_p || 0.9, top_k: modelConfig.top_k || 5, }; + + // Add tools if available for Claude models + if (toolsArray.length > 0 && model.includes("anthropic.claude")) { + requestBody.tools = toolsArray.map((tool) => ({ + name: tool?.function?.name || "", + description: tool?.function?.description || "", + input_schema: tool?.function?.parameters || {}, + })); + } + return requestBody; } @@ -333,23 +392,18 @@ export class BedrockApi implements LLMApi { chatPath, finalRequestBody, headers, - // @ts-ignore - tools.map((tool) => ({ - name: tool?.function?.name, - description: tool?.function?.description, - input_schema: tool?.function?.parameters, - })), funcs, controller, // processToolMessage, include tool_calls message and tool call results ( - requestPayload: RequestPayload, + requestPayload: any[], toolCallMessage: any, toolCallResult: any[], ) => { const modelId = modelConfig.model; - const isMistral = modelId.startsWith("mistral.mistral"); + const isMistral = modelId.includes("mistral.mistral"); const isClaude = modelId.includes("anthropic.claude"); + const isNova = modelId.includes("amazon.nova"); if (isClaude) { // Format for Claude @@ -385,7 +439,9 @@ export class BedrockApi implements LLMApi { ); } else if (isMistral) { // Format for Mistral + // @ts-ignore requestPayload?.messages?.splice( + // @ts-ignore requestPayload?.messages?.length, 0, { @@ -408,6 +464,47 @@ export class BedrockApi implements LLMApi { content: result.content, })), ); + } else if (isNova) { + // Format for Nova + // @ts-ignore + requestPayload?.messages?.splice( + // @ts-ignore + requestPayload?.messages?.length, + 0, + { + role: "assistant", + content: [ + { + text: "", // Add empty text content to satisfy type requirements + tool_calls: toolCallMessage.tool_calls.map( + (tool: ChatMessageTool) => ({ + id: tool.id, + name: tool?.function?.name, + arguments: tool?.function?.arguments + ? JSON.parse(tool?.function?.arguments) + : {}, + }), + ), + }, + ], + }, + ...toolCallResult.map((result) => ({ + role: "user", + content: [ + { + toolUseId: result.tool_call_id, + content: [ + { + json: + typeof result.content === "string" + ? JSON.parse(result.content) + : result.content, + }, + ], + }, + ], + })), + ); } else { console.warn( `[Bedrock Client] Unhandled model type for tool calls: ${modelId}`, @@ -457,7 +554,6 @@ function bedrockStream( chatPath: string, requestPayload: any, headers: any, - tools: any[], funcs: Record, controller: AbortController, processToolMessage: ( @@ -512,8 +608,13 @@ function bedrockStream( return Promise.all( toolCallMessage.tool_calls.map((tool) => { options?.onBeforeTool?.(tool); + const funcName = tool?.function?.name || tool?.name; + if (!funcName || !funcs[funcName]) { + console.error(`Function ${funcName} not found in funcs:`, funcs); + return Promise.reject(`Function ${funcName} not found`); + } return Promise.resolve( - funcs[tool.function.name]( + funcs[funcName]( tool?.function?.arguments ? JSON.parse(tool?.function?.arguments) : {}, @@ -547,7 +648,7 @@ function bedrockStream( return e.toString(); }) .then((content) => ({ - name: tool.function.name, + name: funcName, role: "tool", content, tool_call_id: tool.id, @@ -558,7 +659,7 @@ function bedrockStream( setTimeout(() => { console.debug("[BedrockAPI for toolCallResult] restart"); running = false; - bedrockChatApi(chatPath, headers, requestPayload, tools); + bedrockChatApi(chatPath, headers, requestPayload); }, 60); }); } @@ -577,7 +678,6 @@ function bedrockStream( chatPath: string, headers: any, requestPayload: any, - tools: any, ) { const requestTimeoutId = setTimeout( () => controller.abort(), @@ -588,10 +688,7 @@ function bedrockStream( const res = await fetch(chatPath, { method: "POST", headers, - body: JSON.stringify({ - ...requestPayload, - tools: tools && tools.length ? tools : undefined, - }), + body: JSON.stringify(requestPayload), redirect: "manual", // @ts-ignore duplex: "half", @@ -699,5 +796,5 @@ function bedrockStream( } console.debug("[BedrockAPI] start"); - bedrockChatApi(chatPath, headers, requestPayload, tools); + bedrockChatApi(chatPath, headers, requestPayload); } diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 6e5943885e2..161766435b4 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -327,6 +327,31 @@ export function processMessage( if (!data) return { remainText, index }; try { + // Handle Nova's tool calls + // console.log("processMessage data=========================",data); + if ( + data.stopReason === "tool_use" && + data.output?.message?.content?.[0]?.toolUse + ) { + const toolUse = data.output.message.content[0].toolUse; + index += 1; + runTools.push({ + id: `tool-${Date.now()}`, + type: "function", + function: { + name: toolUse.name, + arguments: JSON.stringify(toolUse.input), + }, + }); + return { remainText, index }; + } + + // Handle Nova's text content + if (data.output?.message?.content?.[0]?.text) { + remainText += data.output.message.content[0].text; + return { remainText, index }; + } + // Handle Nova's messageStart event if (data.messageStart) { return { remainText, index }; @@ -382,7 +407,7 @@ export function processMessage( return { remainText, index }; } - // Handle tool calls + // Handle tool calls for other models if (data.choices?.[0]?.message?.tool_calls) { for (const toolCall of data.choices[0].message.tool_calls) { index += 1; From ad49cd0454cc05cdf15fb3598556636c1ba6f5b6 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 7 Dec 2024 17:54:12 +0800 Subject: [PATCH 51/72] =?UTF-8?q?=E4=BC=98=E5=8C=96bedrock=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB=EF=BC=8C=E4=BB=A5=E6=9B=B4=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86=E6=B5=81=E5=BC=8F=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=9A=84=E8=BE=B9=E7=95=8C=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/aws.ts | 146 +++++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 86 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 161766435b4..dffff338da7 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -24,6 +24,10 @@ export interface ModelValidationConfig { customValidation?: (body: any) => string | null; } +// Type definitions for better type safety +type ParsedEvent = Record; +type EventResult = ParsedEvent[]; + // Encryption utilities export function encrypt(data: string, encryptionKey: string): string { if (!data) return ""; @@ -245,30 +249,29 @@ function decodeBase64(base64String: string): string { } } -export function parseEventData(chunk: Uint8Array): any { +export function parseEventData(chunk: Uint8Array): EventResult { const decoder = new TextDecoder(); const text = decoder.decode(chunk); - const results = []; + const results: EventResult = []; try { - // First try to parse as JSON + // First try to parse as regular JSON const parsed = JSON.parse(text); - - // Handle bytes field in the response if (parsed.bytes) { const decoded = decodeBase64(parsed.bytes); try { - results.push(JSON.parse(decoded)); + const decodedJson = JSON.parse(decoded); + results.push(decodedJson); } catch (e) { results.push({ output: decoded }); } return results; } - // Handle body field if (typeof parsed.body === "string") { try { - results.push(JSON.parse(parsed.body)); + const parsedBody = JSON.parse(parsed.body); + results.push(parsedBody); } catch (e) { results.push({ output: parsed.body }); } @@ -278,48 +281,54 @@ export function parseEventData(chunk: Uint8Array): any { results.push(parsed.body || parsed); return results; } catch (e) { - try { - // Handle event-stream format - const eventRegex = /:event-type[^\{]+({.*?})/g; - let match; - while ((match = eventRegex.exec(text)) !== null) { - try { - const eventData = match[1]; - const parsed = JSON.parse(eventData); - if (parsed.bytes) { - const decoded = decodeBase64(parsed.bytes); - try { - results.push(JSON.parse(decoded)); - } catch (e) { - results.push({ output: decoded }); + // If regular JSON parse fails, try to extract event content + const eventRegex = /:event-type[^\{]+(\{[^\}]+\})/g; + let match; + + while ((match = eventRegex.exec(text)) !== null) { + try { + const eventData = match[1]; + const parsed = JSON.parse(eventData); + + if (parsed.bytes) { + const decoded = decodeBase64(parsed.bytes); + try { + const decodedJson = JSON.parse(decoded); + if (decodedJson.choices?.[0]?.message?.content) { + results.push({ output: decodedJson.choices[0].message.content }); + } else { + results.push(decodedJson); } - } else { - results.push(parsed); + } catch (e) { + results.push({ output: decoded }); } - } catch (e) { - results.push({ output: match[1] }); + } else { + results.push(parsed); } + } catch (e) { + console.debug("[Event Parse Warning]:", e); } + } - if (results.length > 0) { - return results; - } + // If no events were found, try to extract clean text + if (results.length === 0) { + // Remove event metadata markers and clean the text + const cleanText = text + .replace(/\{KG[^:]+:event-type[^}]+\}/g, "") // Remove event markers + .replace(/[\x00-\x1F\x7F-\x9F\uFEFF]/g, "") // Remove control characters + .trim(); - // Handle plain text responses - if (text.trim()) { - const cleanText = text.replace(/[\x00-\x1F\x7F-\x9F]/g, ""); - results.push({ output: cleanText.trim() }); - return results; + if (cleanText) { + results.push({ output: cleanText }); } - } catch (innerError) { - console.error("[AWS Parse Error] Inner parsing failed:", innerError); } } - return []; + + return results; } export function processMessage( - data: any, + data: ParsedEvent, remainText: string, runTools: any[], index: number, @@ -470,8 +479,18 @@ export function processChunks( while (chunks.length > 0) { const chunk = chunks[0]; try { + // If there's a pending chunk, try to merge it with the current chunk + let chunkToProcess = chunk; + if (pendingChunk) { + const mergedChunk = new Uint8Array(pendingChunk.length + chunk.length); + mergedChunk.set(pendingChunk); + mergedChunk.set(chunk, pendingChunk.length); + chunkToProcess = mergedChunk; + pendingChunk = null; + } + // Try to process the chunk - const parsedEvents = parseEventData(chunk); + const parsedEvents = parseEventData(chunkToProcess); if (parsedEvents.length > 0) { // Process each event in the chunk for (const parsed of parsedEvents) { @@ -485,60 +504,15 @@ export function processChunks( currentIndex = result.index; } chunks.shift(); // Remove processed chunk - - // If there's a pending chunk, try to process it now - if (pendingChunk) { - const pendingEvents = parseEventData(pendingChunk); - if (pendingEvents.length > 0) { - for (const pendingParsed of pendingEvents) { - const pendingResult = processMessage( - pendingParsed, - currentText, - runTools, - currentIndex, - ); - currentText = pendingResult.remainText; - currentIndex = pendingResult.index; - } - pendingChunk = null; - } - } } else { // If parsing fails, it might be an incomplete chunk - if (pendingChunk) { - // Merge with pending chunk - const mergedChunk = new Uint8Array( - pendingChunk.length + chunk.length, - ); - mergedChunk.set(pendingChunk); - mergedChunk.set(chunk, pendingChunk.length); - pendingChunk = mergedChunk; - } else { - pendingChunk = chunk; - } + pendingChunk = chunkToProcess; chunks.shift(); } } catch (e) { console.error("[Chunk Process Error]:", e); chunks.shift(); // Remove error chunk - } - } - - // Try to process any remaining pending chunk one last time - if (pendingChunk) { - const finalEvents = parseEventData(pendingChunk); - if (finalEvents.length > 0) { - for (const finalParsed of finalEvents) { - const finalResult = processMessage( - finalParsed, - currentText, - runTools, - currentIndex, - ); - currentText = finalResult.remainText; - currentIndex = finalResult.index; - } - pendingChunk = null; + pendingChunk = null; // Reset pending chunk on error } } From 5ac651ad8e259934d183e46d3d284ffc925dfc75 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 7 Dec 2024 20:34:05 +0800 Subject: [PATCH 52/72] Enhance encryption security --- app/api/bedrock.ts | 8 ++--- app/client/platforms/bedrock.ts | 18 ++++------ app/utils/aws.ts | 63 +++++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 22 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 7da14a17bef..3183a1162f3 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -103,10 +103,10 @@ async function requestBedrock(req: NextRequest) { }); // Make request to AWS Bedrock - // console.log( - // "[Bedrock Request] Final Body:", - // JSON.stringify(requestBody, null, 2), - // ); + console.log( + "[Bedrock Request] Final Body:", + JSON.stringify(requestBody, null, 2), + ); const res = await fetch(endpoint, { method: "POST", headers, diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index cd08cb3bbc7..7311c8a6674 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -137,7 +137,8 @@ export class BedrockApi implements LLMApi { }, }, })), - // toolChoice: { auto: {} } + toolChoice: { auto: {} }, + // toolChoice: { any: {} } }; } @@ -339,16 +340,11 @@ export class BedrockApi implements LLMApi { const controller = new AbortController(); options.onController?.(controller); - if (!accessStore.isValidBedrock()) { - throw new Error( - "Invalid AWS credentials. Please check your configuration and ensure ENCRYPTION_KEY is set.", - ); - } - let finalRequestBody = this.formatRequestBody(messages, modelConfig); try { const isApp = !!getClientConfig()?.isApp; + // const isApp = true; const bedrockAPIPath = `${BEDROCK_BASE_URL}/model/${ modelConfig.model }/invoke${shouldStream ? "-with-response-stream" : ""}`; @@ -699,10 +695,10 @@ function bedrockStream( responseRes = res; const contentType = res.headers.get("content-type"); - console.log( - "[Bedrock Stream Request] response content type: ", - contentType, - ); + // console.log( + // "[Bedrock Stream Request] response content type: ", + // contentType, + // ); if (contentType?.startsWith("text/plain")) { responseText = await res.text(); diff --git a/app/utils/aws.ts b/app/utils/aws.ts index dffff338da7..22c6d0baa25 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -2,7 +2,7 @@ import SHA256 from "crypto-js/sha256"; import HmacSHA256 from "crypto-js/hmac-sha256"; import Hex from "crypto-js/enc-hex"; import Utf8 from "crypto-js/enc-utf8"; -import { AES, enc } from "crypto-js"; +import { AES, enc, lib, PBKDF2, mode, pad, algo } from "crypto-js"; // Types and Interfaces export interface BedrockCredentials { @@ -29,13 +29,51 @@ type ParsedEvent = Record; type EventResult = ParsedEvent[]; // Encryption utilities +function generateSalt(): string { + const salt = lib.WordArray.random(128 / 8); + return salt.toString(enc.Base64); +} + +function generateIV(): string { + const iv = lib.WordArray.random(128 / 8); + return iv.toString(enc.Base64); +} + +function deriveKey(password: string, salt: string): lib.WordArray { + // Use PBKDF2 with SHA256 for key derivation + return PBKDF2(password, salt, { + keySize: 256 / 32, + iterations: 10000, + hasher: algo.SHA256, + }); +} + +// Using a dot as separator since it's not used in Base64 +const SEPARATOR = "."; + export function encrypt(data: string, encryptionKey: string): string { if (!data) return ""; if (!encryptionKey) { throw new Error("Encryption key is required for AWS credential encryption"); } try { - return AES.encrypt(data, encryptionKey).toString(); + // Generate salt and IV + const salt = generateSalt(); + const iv = generateIV(); + + // Derive key using PBKDF2 + const key = deriveKey(encryptionKey, salt); + + // Encrypt the data + const encrypted = AES.encrypt(data, key, { + iv: enc.Base64.parse(iv), + mode: mode.CBC, + padding: pad.Pkcs7, + }); + + // Combine salt, IV, and encrypted data + // Format: salt.iv.encryptedData + return [salt, iv, encrypted.toString()].join(SEPARATOR); } catch (error) { throw new Error("Failed to encrypt AWS credentials"); } @@ -47,12 +85,21 @@ export function decrypt(encryptedData: string, encryptionKey: string): string { throw new Error("Encryption key is required for AWS credential decryption"); } try { - const bytes = AES.decrypt(encryptedData, encryptionKey); - const decrypted = bytes.toString(enc.Utf8); - if (!decrypted && encryptedData) { + let components = encryptedData.split(SEPARATOR); + const [salt, iv, data] = components; + // For new format, use the provided salt and IV + const key = deriveKey(encryptionKey, salt); + const decrypted = AES.decrypt(data, key, { + iv: enc.Base64.parse(iv), + mode: mode.CBC, + padding: pad.Pkcs7, + }); + + const result = decrypted.toString(enc.Utf8); + if (!result) { throw new Error("Failed to decrypt AWS credentials"); } - return decrypted; + return result; } catch (error) { throw new Error("Failed to decrypt AWS credentials"); } @@ -61,7 +108,9 @@ export function decrypt(encryptedData: string, encryptionKey: string): string { export function maskSensitiveValue(value: string): string { if (!value) return ""; if (value.length <= 4) return value; - return "*".repeat(value.length - 4) + value.slice(-4); + // Use constant-time operations to prevent timing attacks + const masked = Buffer.alloc(value.length - 4, "*").toString(); + return value.slice(0, 2) + masked + value.slice(-2); } // AWS Signing From 603415f9e1577ce4958f395411574f1422d086dc Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 08:33:45 +0800 Subject: [PATCH 53/72] Enhance log security --- app/api/bedrock.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 3183a1162f3..7da14a17bef 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -103,10 +103,10 @@ async function requestBedrock(req: NextRequest) { }); // Make request to AWS Bedrock - console.log( - "[Bedrock Request] Final Body:", - JSON.stringify(requestBody, null, 2), - ); + // console.log( + // "[Bedrock Request] Final Body:", + // JSON.stringify(requestBody, null, 2), + // ); const res = await fetch(endpoint, { method: "POST", headers, From 26b9fa97cd3f41cba6b1c295ff2801e604329c31 Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 08:47:46 +0800 Subject: [PATCH 54/72] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/aws.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 22c6d0baa25..f612a702ac5 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -11,19 +11,6 @@ export interface BedrockCredentials { secretAccessKey: string; } -export interface BedrockRequestConfig { - modelId: string; - shouldStream: boolean; - body: any; - credentials: BedrockCredentials; -} - -export interface ModelValidationConfig { - requiredFields: string[]; - optionalFields?: string[]; - customValidation?: (body: any) => string | null; -} - // Type definitions for better type safety type ParsedEvent = Record; type EventResult = ParsedEvent[]; From f5ae086d3c031ad4c81aa0e60db1ce8f8d266017 Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 23:28:59 +0800 Subject: [PATCH 55/72] Enhance encryption security with additional safeguards. --- app/api/bedrock.ts | 12 +- app/client/api.ts | 11 -- app/client/platforms/bedrock.ts | 109 ++++++++++++---- app/components/ui-lib.tsx | 26 ++-- app/utils/aws.ts | 224 ++++++++++++++++++++------------ package.json | 4 +- 6 files changed, 245 insertions(+), 141 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 7da14a17bef..85b4937e30c 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -32,14 +32,20 @@ async function getBedrockCredentials( const [encryptedRegion, encryptedAccessKey, encryptedSecretKey] = credentials.split(":"); + // console.log("===========encryptedRegion",encryptedRegion); + // console.log("===========encryptedAccessKey",encryptedAccessKey); + // console.log("===========encryptedSecretKey",encryptedSecretKey); if (!encryptedRegion || !encryptedAccessKey || !encryptedSecretKey) { throw new Error("Invalid Authorization header format"); } const encryptionKey = req.headers.get("XEncryptionKey") || ""; + // console.log("===========encryptionKey",encryptionKey); // Decrypt the credentials - awsRegion = decrypt(encryptedRegion, encryptionKey); - awsAccessKey = decrypt(encryptedAccessKey, encryptionKey); - awsSecretKey = decrypt(encryptedSecretKey, encryptionKey); + [awsRegion, awsAccessKey, awsSecretKey] = await Promise.all([ + decrypt(encryptedRegion, encryptionKey), + decrypt(encryptedAccessKey, encryptionKey), + decrypt(encryptedSecretKey, encryptionKey), + ]); if (!awsRegion || !awsAccessKey || !awsSecretKey) { throw new Error( diff --git a/app/client/api.ts b/app/client/api.ts index 06537d1de52..c476b23d67e 100644 --- a/app/client/api.ts +++ b/app/client/api.ts @@ -23,7 +23,6 @@ import { SparkApi } from "./platforms/iflytek"; import { XAIApi } from "./platforms/xai"; import { ChatGLMApi } from "./platforms/glm"; import { BedrockApi } from "./platforms/bedrock"; -import { encrypt } from "../utils/aws"; export const ROLES = ["system", "user", "assistant"] as const; export type MessageRole = (typeof ROLES)[number]; @@ -276,16 +275,6 @@ export function getHeaders(ignoreHeaders: boolean = false) { ? accessStore.iflytekApiKey && accessStore.iflytekApiSecret ? accessStore.iflytekApiKey + ":" + accessStore.iflytekApiSecret : "" - : isBedrock - ? accessStore.awsRegion && - accessStore.awsAccessKey && - accessStore.awsSecretKey - ? encrypt(accessStore.awsRegion, accessStore.encryptionKey) + - ":" + - encrypt(accessStore.awsAccessKey, accessStore.encryptionKey) + - ":" + - encrypt(accessStore.awsSecretKey, accessStore.encryptionKey) - : "" : accessStore.openaiApiKey; return { isBedrock, diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 7311c8a6674..63de783474c 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -20,6 +20,7 @@ import { } from "@/app/utils/aws"; import { prettyObject } from "@/app/utils/format"; import Locale from "@/app/locales"; +import { encrypt } from "@/app/utils/aws"; const ClaudeMapper = { assistant: "assistant", @@ -41,6 +42,66 @@ interface Tool { parameters?: any; }; } +const isApp = !!getClientConfig()?.isApp; +// const isApp = true; +async function getBedrockHeaders( + modelId: string, + chatPath: string, + finalRequestBody: any, + shouldStream: boolean, +): Promise> { + const accessStore = useAccessStore.getState(); + const bedrockHeaders = isApp + ? await sign({ + method: "POST", + url: chatPath, + region: accessStore.awsRegion, + accessKeyId: accessStore.awsAccessKey, + secretAccessKey: accessStore.awsSecretKey, + body: finalRequestBody, + service: "bedrock", + headers: {}, + isStreaming: shouldStream, + }) + : getHeaders(); + + if (!isApp) { + const { awsRegion, awsAccessKey, awsSecretKey, encryptionKey } = + accessStore; + + const bedrockHeadersConfig = { + XModelID: modelId, + XEncryptionKey: encryptionKey, + ShouldStream: String(shouldStream), + Authorization: await createAuthHeader( + awsRegion, + awsAccessKey, + awsSecretKey, + encryptionKey, + ), + }; + + Object.assign(bedrockHeaders, bedrockHeadersConfig); + } + + return bedrockHeaders; +} + +// Helper function to create Authorization header +async function createAuthHeader( + region: string, + accessKey: string, + secretKey: string, + encryptionKey: string, +): Promise { + const encryptedValues = await Promise.all([ + encrypt(region, encryptionKey), + encrypt(accessKey, encryptionKey), + encrypt(secretKey, encryptionKey), + ]); + + return `Bearer ${encryptedValues.join(":")}`; +} export class BedrockApi implements LLMApi { speech(options: SpeechOptions): Promise { @@ -343,32 +404,11 @@ export class BedrockApi implements LLMApi { let finalRequestBody = this.formatRequestBody(messages, modelConfig); try { - const isApp = !!getClientConfig()?.isApp; - // const isApp = true; const bedrockAPIPath = `${BEDROCK_BASE_URL}/model/${ modelConfig.model }/invoke${shouldStream ? "-with-response-stream" : ""}`; const chatPath = isApp ? bedrockAPIPath : ApiPath.Bedrock + "/chat"; - const headers = isApp - ? await sign({ - method: "POST", - url: chatPath, - region: accessStore.awsRegion, - accessKeyId: accessStore.awsAccessKey, - secretAccessKey: accessStore.awsSecretKey, - body: finalRequestBody, - service: "bedrock", - isStreaming: shouldStream, - }) - : getHeaders(); - - if (!isApp) { - headers.XModelID = modelConfig.model; - headers.XEncryptionKey = accessStore.encryptionKey; - headers.ShouldStream = shouldStream + ""; - } - if (process.env.NODE_ENV !== "production") { console.debug("[Bedrock Client] Request:", { path: chatPath, @@ -385,9 +425,9 @@ export class BedrockApi implements LLMApi { useChatStore.getState().currentSession().mask?.plugin || [], ); return bedrockStream( + modelConfig.model, chatPath, finalRequestBody, - headers, funcs, controller, // processToolMessage, include tool_calls message and tool call results @@ -513,9 +553,15 @@ export class BedrockApi implements LLMApi { try { controller.signal.onabort = () => options.onFinish("", new Response(null, { status: 400 })); + const newHeaders = await getBedrockHeaders( + modelConfig.model, + chatPath, + JSON.stringify(finalRequestBody), + shouldStream, + ); const res = await fetch(chatPath, { method: "POST", - headers: headers, + headers: newHeaders, body: JSON.stringify(finalRequestBody), }); const contentType = res.headers.get("content-type"); @@ -547,9 +593,9 @@ export class BedrockApi implements LLMApi { } function bedrockStream( + modelId: string, chatPath: string, requestPayload: any, - headers: any, funcs: Record, controller: AbortController, processToolMessage: ( @@ -655,7 +701,7 @@ function bedrockStream( setTimeout(() => { console.debug("[BedrockAPI for toolCallResult] restart"); running = false; - bedrockChatApi(chatPath, headers, requestPayload); + bedrockChatApi(modelId, chatPath, requestPayload, true); }, 60); }); } @@ -671,19 +717,26 @@ function bedrockStream( controller.signal.onabort = finish; async function bedrockChatApi( + modelId: string, chatPath: string, - headers: any, requestPayload: any, + shouldStream: boolean, ) { const requestTimeoutId = setTimeout( () => controller.abort(), REQUEST_TIMEOUT_MS, ); + const newHeaders = await getBedrockHeaders( + modelId, + chatPath, + JSON.stringify(requestPayload), + shouldStream, + ); try { const res = await fetch(chatPath, { method: "POST", - headers, + headers: newHeaders, body: JSON.stringify(requestPayload), redirect: "manual", // @ts-ignore @@ -792,5 +845,5 @@ function bedrockStream( } console.debug("[BedrockAPI] start"); - bedrockChatApi(chatPath, headers, requestPayload); + bedrockChatApi(modelId, chatPath, requestPayload, true); } diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 4b7a4798adf..14956103c96 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -276,26 +276,18 @@ export function PasswordInput( }, ) { const [visible, setVisible] = useState(false); - const [displayValue, setDisplayValue] = useState(props.value as string); - const { maskWhenShow, ...inputProps } = props; - - useEffect(() => { - if (maskWhenShow && visible && props.value) { - setDisplayValue(maskSensitiveValue(props.value as string)); - } else { - setDisplayValue(props.value as string); - } - }, [visible, props.value, maskWhenShow]); + const [isEditing, setIsEditing] = useState(false); + const { maskWhenShow, onChange, value, ...inputProps } = props; function changeVisibility() { setVisible(!visible); } - const handleChange = (e: React.ChangeEvent) => { - if (props.onChange) { - props.onChange(e); - } - }; + // Get display value - use masked value only when showing and maskWhenShow is true and not editing + const displayValue = + maskWhenShow && visible && value && !isEditing + ? maskSensitiveValue(value as string) + : value; return (
@@ -308,7 +300,9 @@ export function PasswordInput( setIsEditing(true)} + onBlur={() => setIsEditing(false)} type={visible ? "text" : "password"} className={"password-input"} /> diff --git a/app/utils/aws.ts b/app/utils/aws.ts index f612a702ac5..ec781319dba 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -1,9 +1,3 @@ -import SHA256 from "crypto-js/sha256"; -import HmacSHA256 from "crypto-js/hmac-sha256"; -import Hex from "crypto-js/enc-hex"; -import Utf8 from "crypto-js/enc-utf8"; -import { AES, enc, lib, PBKDF2, mode, pad, algo } from "crypto-js"; - // Types and Interfaces export interface BedrockCredentials { region: string; @@ -15,89 +9,128 @@ export interface BedrockCredentials { type ParsedEvent = Record; type EventResult = ParsedEvent[]; -// Encryption utilities -function generateSalt(): string { - const salt = lib.WordArray.random(128 / 8); - return salt.toString(enc.Base64); -} +// Using a dot as separator since it's not used in Base64 +const SEPARATOR = "."; -function generateIV(): string { - const iv = lib.WordArray.random(128 / 8); - return iv.toString(enc.Base64); +// Unified crypto utilities for both frontend and backend +async function generateKey( + password: string, + salt: Uint8Array, +): Promise { + const enc = new TextEncoder(); + const keyMaterial = await crypto.subtle.importKey( + "raw", + enc.encode(password), + { name: "PBKDF2" }, + false, + ["deriveBits", "deriveKey"], + ); + + return crypto.subtle.deriveKey( + { + name: "PBKDF2", + salt, + iterations: 100000, + hash: "SHA-256", + }, + keyMaterial, + { name: "AES-GCM", length: 256 }, + false, + ["encrypt", "decrypt"], + ); } -function deriveKey(password: string, salt: string): lib.WordArray { - // Use PBKDF2 with SHA256 for key derivation - return PBKDF2(password, salt, { - keySize: 256 / 32, - iterations: 10000, - hasher: algo.SHA256, - }); +function arrayBufferToBase64(buffer: ArrayBuffer | Uint8Array): string { + const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer); + return btoa(String.fromCharCode(...bytes)); } -// Using a dot as separator since it's not used in Base64 -const SEPARATOR = "."; +function base64ToArrayBuffer(base64: string): Uint8Array { + const binaryString = atob(base64); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes; +} -export function encrypt(data: string, encryptionKey: string): string { +export async function encrypt( + data: string, + encryptionKey: string, +): Promise { if (!data) return ""; if (!encryptionKey) { throw new Error("Encryption key is required for AWS credential encryption"); } + try { - // Generate salt and IV - const salt = generateSalt(); - const iv = generateIV(); - - // Derive key using PBKDF2 - const key = deriveKey(encryptionKey, salt); - - // Encrypt the data - const encrypted = AES.encrypt(data, key, { - iv: enc.Base64.parse(iv), - mode: mode.CBC, - padding: pad.Pkcs7, - }); - - // Combine salt, IV, and encrypted data - // Format: salt.iv.encryptedData - return [salt, iv, encrypted.toString()].join(SEPARATOR); + const enc = new TextEncoder(); + const salt = crypto.getRandomValues(new Uint8Array(16)); + const iv = crypto.getRandomValues(new Uint8Array(12)); + const key = await generateKey(encryptionKey, salt); + + const encrypted = await crypto.subtle.encrypt( + { + name: "AES-GCM", + iv, + }, + key, + enc.encode(data), + ); + + // Convert to base64 strings + const encryptedBase64 = arrayBufferToBase64(encrypted); + const saltBase64 = arrayBufferToBase64(salt); + const ivBase64 = arrayBufferToBase64(iv); + + return [saltBase64, ivBase64, encryptedBase64].join(SEPARATOR); } catch (error) { + console.error("[Encryption Error]:", error); throw new Error("Failed to encrypt AWS credentials"); } } -export function decrypt(encryptedData: string, encryptionKey: string): string { +export async function decrypt( + encryptedData: string, + encryptionKey: string, +): Promise { if (!encryptedData) return ""; if (!encryptionKey) { throw new Error("Encryption key is required for AWS credential decryption"); } + try { - let components = encryptedData.split(SEPARATOR); - const [salt, iv, data] = components; - // For new format, use the provided salt and IV - const key = deriveKey(encryptionKey, salt); - const decrypted = AES.decrypt(data, key, { - iv: enc.Base64.parse(iv), - mode: mode.CBC, - padding: pad.Pkcs7, - }); - - const result = decrypted.toString(enc.Utf8); - if (!result) { - throw new Error("Failed to decrypt AWS credentials"); - } - return result; + const [saltBase64, ivBase64, cipherBase64] = encryptedData.split(SEPARATOR); + + // Convert base64 strings back to Uint8Arrays + const salt = base64ToArrayBuffer(saltBase64); + const iv = base64ToArrayBuffer(ivBase64); + const cipherData = base64ToArrayBuffer(cipherBase64); + + const key = await generateKey(encryptionKey, salt); + + const decrypted = await crypto.subtle.decrypt( + { + name: "AES-GCM", + iv, + }, + key, + cipherData, + ); + + const dec = new TextDecoder(); + return dec.decode(decrypted); } catch (error) { + console.error("[Decryption Error]:", error); throw new Error("Failed to decrypt AWS credentials"); } } export function maskSensitiveValue(value: string): string { if (!value) return ""; - if (value.length <= 4) return value; - // Use constant-time operations to prevent timing attacks - const masked = Buffer.alloc(value.length - 4, "*").toString(); - return value.slice(0, 2) + masked + value.slice(-2); + if (value.length <= 6) return value; + const masked = "*".repeat(value.length - 6); + return value.slice(0, 3) + masked + value.slice(-3); } // AWS Signing @@ -113,26 +146,33 @@ export interface SignParams { isStreaming?: boolean; } -function hmac( - key: string | CryptoJS.lib.WordArray, +async function createHmac( + key: ArrayBuffer | Uint8Array, data: string, -): CryptoJS.lib.WordArray { - if (typeof key === "string") { - key = Utf8.parse(key); - } - return HmacSHA256(data, key); +): Promise { + const encoder = new TextEncoder(); + const keyData = key instanceof Uint8Array ? key : new Uint8Array(key); + const keyObject = await crypto.subtle.importKey( + "raw", + keyData, + { name: "HMAC", hash: "SHA-256" }, + false, + ["sign"], + ); + return crypto.subtle.sign("HMAC", keyObject, encoder.encode(data)); } -function getSigningKey( +async function getSigningKey( secretKey: string, dateStamp: string, region: string, service: string, -): CryptoJS.lib.WordArray { - const kDate = hmac("AWS4" + secretKey, dateStamp); - const kRegion = hmac(kDate, region); - const kService = hmac(kRegion, service); - const kSigning = hmac(kService, "aws4_request"); +): Promise { + const encoder = new TextEncoder(); + const kDate = await createHmac(encoder.encode("AWS4" + secretKey), dateStamp); + const kRegion = await createHmac(kDate, region); + const kService = await createHmac(kRegion, service); + const kSigning = await createHmac(kService, "aws4_request"); return kSigning; } @@ -202,7 +242,14 @@ export async function sign({ const dateStamp = amzDate.slice(0, 8); const bodyString = typeof body === "string" ? body : JSON.stringify(body); - const payloadHash = SHA256(bodyString).toString(Hex); + const encoder = new TextEncoder(); + const payloadBuffer = await crypto.subtle.digest( + "SHA-256", + encoder.encode(bodyString), + ); + const payloadHash = Array.from(new Uint8Array(payloadBuffer)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); const headers: Record = { accept: isStreaming @@ -215,6 +262,7 @@ export async function sign({ ...customHeaders, }; + // Add x-amzn-bedrock-accept header for streaming requests if (isStreaming) { headers["x-amzn-bedrock-accept"] = "*/*"; } @@ -244,20 +292,34 @@ export async function sign({ const algorithm = "AWS4-HMAC-SHA256"; const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`; + + const canonicalRequestHash = Array.from( + new Uint8Array( + await crypto.subtle.digest("SHA-256", encoder.encode(canonicalRequest)), + ), + ) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + const stringToSign = [ algorithm, amzDate, credentialScope, - SHA256(canonicalRequest).toString(Hex), + canonicalRequestHash, ].join("\n"); - const signingKey = getSigningKey( + const signingKey = await getSigningKey( secretAccessKey, dateStamp, region, service, ); - const signature = hmac(signingKey, stringToSign).toString(Hex); + + const signature = Array.from( + new Uint8Array(await createHmac(signingKey, stringToSign)), + ) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); const authorization = [ `${algorithm} Credential=${accessKeyId}/${credentialScope}`, @@ -278,7 +340,9 @@ export async function sign({ // Bedrock utilities function decodeBase64(base64String: string): string { try { - return Buffer.from(base64String, "base64").toString("utf-8"); + const bytes = Buffer.from(base64String, "base64"); + const decoder = new TextDecoder("utf-8"); + return decoder.decode(bytes); } catch (e) { console.error("[Base64 Decode Error]:", e); return ""; @@ -286,7 +350,7 @@ function decodeBase64(base64String: string): string { } export function parseEventData(chunk: Uint8Array): EventResult { - const decoder = new TextDecoder(); + const decoder = new TextDecoder("utf-8"); const text = decoder.decode(chunk); const results: EventResult = []; diff --git a/package.json b/package.json index 57a63bcac43..e53c5ba8955 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,9 @@ "@hello-pangea/dnd": "^16.5.0", "@next/third-parties": "^14.1.0", "@svgr/webpack": "^6.5.1", - "@types/crypto-js": "^4.2.2", "@vercel/analytics": "^0.1.11", "@vercel/speed-insights": "^1.0.2", "axios": "^1.7.5", - "crypto-js": "^4.2.0", "clsx": "^2.1.1", "emoji-picker-react": "^4.9.2", "fuse.js": "^7.0.0", @@ -93,4 +91,4 @@ "lint-staged/yaml": "^2.2.2" }, "packageManager": "yarn@1.22.19" -} +} \ No newline at end of file From fb3437ca01b399ecceafd05eb0dc249a6efd9151 Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 23:47:16 +0800 Subject: [PATCH 56/72] Update app/client/platforms/bedrock.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加友好提示 Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/client/platforms/bedrock.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 63de783474c..0368d71db2a 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -583,12 +583,24 @@ export class BedrockApi implements LLMApi { } } + /** + * Usage tracking is not supported for Bedrock API. + * @throws {Error} Always throws an error indicating the operation is not supported. + */ async usage() { - return { used: 0, total: 0 }; + throw new Error( + "Usage tracking is not supported for Bedrock API. Use AWS CloudWatch metrics instead." + ); } + /** + * Model listing is not supported for Bedrock API. + * @throws {Error} Always throws an error indicating the operation is not supported. + */ async models() { - return []; + throw new Error( + "Model listing is not supported for Bedrock API. Configure available models in AWS Console." + ); } } From 7830b37a9030d00a0a0c35451fa09086ae0efdcb Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 23:49:59 +0800 Subject: [PATCH 57/72] Enhance encryption security with additional safeguards. --- app/client/platforms/bedrock.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 0368d71db2a..63de783474c 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -583,24 +583,12 @@ export class BedrockApi implements LLMApi { } } - /** - * Usage tracking is not supported for Bedrock API. - * @throws {Error} Always throws an error indicating the operation is not supported. - */ async usage() { - throw new Error( - "Usage tracking is not supported for Bedrock API. Use AWS CloudWatch metrics instead." - ); + return { used: 0, total: 0 }; } - /** - * Model listing is not supported for Bedrock API. - * @throws {Error} Always throws an error indicating the operation is not supported. - */ async models() { - throw new Error( - "Model listing is not supported for Bedrock API. Configure available models in AWS Console." - ); + return []; } } From 4b2f4474740c1ce7b9348a128c63f139a95a109b Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 23:52:31 +0800 Subject: [PATCH 58/72] Enhance encryption security with additional safeguards. --- app/api/bedrock.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/api/bedrock.ts b/app/api/bedrock.ts index 85b4937e30c..6e390035bb2 100644 --- a/app/api/bedrock.ts +++ b/app/api/bedrock.ts @@ -32,14 +32,10 @@ async function getBedrockCredentials( const [encryptedRegion, encryptedAccessKey, encryptedSecretKey] = credentials.split(":"); - // console.log("===========encryptedRegion",encryptedRegion); - // console.log("===========encryptedAccessKey",encryptedAccessKey); - // console.log("===========encryptedSecretKey",encryptedSecretKey); if (!encryptedRegion || !encryptedAccessKey || !encryptedSecretKey) { throw new Error("Invalid Authorization header format"); } const encryptionKey = req.headers.get("XEncryptionKey") || ""; - // console.log("===========encryptionKey",encryptionKey); // Decrypt the credentials [awsRegion, awsAccessKey, awsSecretKey] = await Promise.all([ decrypt(encryptedRegion, encryptionKey), From 93337b2b924e1a9b13104a2e6822924e2f3bfc16 Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 8 Dec 2024 23:58:05 +0800 Subject: [PATCH 59/72] Update app/client/platforms/bedrock.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/client/platforms/bedrock.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 63de783474c..476a0c64d79 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -51,6 +51,11 @@ async function getBedrockHeaders( shouldStream: boolean, ): Promise> { const accessStore = useAccessStore.getState(); + // Validate credentials + if (!accessStore.awsAccessKey || !accessStore.awsSecretKey || !accessStore.awsRegion) { + throw new Error("Missing required AWS credentials"); + } + const bedrockHeaders = isApp ? await sign({ method: "POST", @@ -66,19 +71,24 @@ async function getBedrockHeaders( : getHeaders(); if (!isApp) { - const { awsRegion, awsAccessKey, awsSecretKey, encryptionKey } = - accessStore; + const { awsRegion, awsAccessKey, awsSecretKey, encryptionKey } = accessStore; + if (!encryptionKey) { + throw new Error("Missing encryption key"); + } const bedrockHeadersConfig = { XModelID: modelId, XEncryptionKey: encryptionKey, ShouldStream: String(shouldStream), - Authorization: await createAuthHeader( - awsRegion, - awsAccessKey, - awsSecretKey, + Authorization: await createAuthHeader({ + region: awsRegion, + accessKey: awsAccessKey, + secretKey: awsSecretKey, encryptionKey, - ), + }).catch(error => { + console.error("[Bedrock] Failed to create auth header:", error); + throw new Error("Failed to create authorization header"); + }), }; Object.assign(bedrockHeaders, bedrockHeadersConfig); From a0886875e13a8fad4b34f60a48081dce2f0888fa Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 9 Dec 2024 00:03:10 +0800 Subject: [PATCH 60/72] Enhance encryption security with additional safeguards. --- app/client/platforms/bedrock.ts | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 476a0c64d79..63de783474c 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -51,11 +51,6 @@ async function getBedrockHeaders( shouldStream: boolean, ): Promise> { const accessStore = useAccessStore.getState(); - // Validate credentials - if (!accessStore.awsAccessKey || !accessStore.awsSecretKey || !accessStore.awsRegion) { - throw new Error("Missing required AWS credentials"); - } - const bedrockHeaders = isApp ? await sign({ method: "POST", @@ -71,24 +66,19 @@ async function getBedrockHeaders( : getHeaders(); if (!isApp) { - const { awsRegion, awsAccessKey, awsSecretKey, encryptionKey } = accessStore; - if (!encryptionKey) { - throw new Error("Missing encryption key"); - } + const { awsRegion, awsAccessKey, awsSecretKey, encryptionKey } = + accessStore; const bedrockHeadersConfig = { XModelID: modelId, XEncryptionKey: encryptionKey, ShouldStream: String(shouldStream), - Authorization: await createAuthHeader({ - region: awsRegion, - accessKey: awsAccessKey, - secretKey: awsSecretKey, + Authorization: await createAuthHeader( + awsRegion, + awsAccessKey, + awsSecretKey, encryptionKey, - }).catch(error => { - console.error("[Bedrock] Failed to create auth header:", error); - throw new Error("Failed to create authorization header"); - }), + ), }; Object.assign(bedrockHeaders, bedrockHeadersConfig); From 44a1cf6d6e24c50139c8f9b19198a4c7d12909fa Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 9 Dec 2024 10:03:06 +0800 Subject: [PATCH 61/72] Update app/client/platforms/bedrock.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/client/platforms/bedrock.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index 63de783474c..f0b14bb4045 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -826,21 +826,26 @@ function bedrockStream( index = result.index; } } catch (err) { - console.error("[Bedrock Stream Error]:", err); - throw err; + console.error( + "[Bedrock Stream]:", + err instanceof Error ? err.message : "Stream processing failed" + ); + throw new Error("Failed to process stream response"); } finally { reader.releaseLock(); finish(); } } catch (e) { - // @ts-ignore - if (e.name === "AbortError") { + if (e instanceof Error && e.name === "AbortError") { console.log("[Bedrock Client] Aborted by user"); return; } - console.error("[Bedrock Request] error", e); + console.error( + "[Bedrock Request] Failed:", + e instanceof Error ? e.message : "Request failed" + ); options.onError?.(e); - throw e; + throw new Error("Request processing failed"); } } From 50a241b715a53cb4aeabf77f54b053aa5617b165 Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 9 Dec 2024 10:18:15 +0800 Subject: [PATCH 62/72] Update app/utils/aws.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/utils/aws.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index ec781319dba..e7596c6aa90 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -332,7 +332,7 @@ export async function sign({ Authorization: authorization, }; } catch (error) { - console.error("[AWS Signing Error]:", error); + console.error("[AWS Signing Error]: Failed to sign request"); throw new Error("Failed to sign AWS request"); } } From 372a327522340160e97550d7c21e5bfd30d61e01 Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 9 Dec 2024 10:22:08 +0800 Subject: [PATCH 63/72] Update app/utils/aws.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/utils/aws.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index e7596c6aa90..de61ac7d8af 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -555,7 +555,7 @@ export function processMessage( remainText += newText; } } catch (e) { - console.error("[Bedrock Request] parse error", e); + console.warn("Failed to process Bedrock message"); } return { remainText, index }; From 2a9f7d72fc35fa62e0e58528523bac4aab144de0 Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 9 Dec 2024 14:26:37 +0800 Subject: [PATCH 64/72] Update app/client/platforms/bedrock.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/client/platforms/bedrock.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index f0b14bb4045..d1d519837f3 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -573,8 +573,9 @@ export class BedrockApi implements LLMApi { const message = extractMessage(resJson); options.onFinish(message, res); } catch (e) { - console.error("failed to chat", e); - options.onError?.(e as Error); + const error = e instanceof Error ? e : new Error('Unknown error occurred'); + console.error("[Bedrock Client] Chat failed:", error.message); + options.onError?.(error); } } } catch (e) { From 12d38aa4b2a3310105bdf5f2978b0a9a722cae4c Mon Sep 17 00:00:00 2001 From: glay Date: Mon, 9 Dec 2024 14:43:52 +0800 Subject: [PATCH 65/72] Update app/utils/aws.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/utils/aws.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index de61ac7d8af..caaec229746 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -642,8 +642,7 @@ export function getBedrockEndpoint( export function extractMessage(res: any, modelId: string = ""): string { if (!res) { - console.error("[AWS Extract Error] extractMessage Empty response"); - return ""; + throw new Error("Empty response received"); } let message = ""; From 19437c7aa120c5dd510c571a39181014c88f7824 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 10 Dec 2024 11:35:26 +0800 Subject: [PATCH 66/72] Enhance encryption security with additional safeguards. --- app/utils/aws.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index caaec229746..abd98fde5f3 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -10,7 +10,7 @@ type ParsedEvent = Record; type EventResult = ParsedEvent[]; // Using a dot as separator since it's not used in Base64 -const SEPARATOR = "."; +const SEPARATOR = "~"; // Unified crypto utilities for both frontend and backend async function generateKey( @@ -121,7 +121,6 @@ export async function decrypt( const dec = new TextDecoder(); return dec.decode(decrypted); } catch (error) { - console.error("[Decryption Error]:", error); throw new Error("Failed to decrypt AWS credentials"); } } From e455840ab344cc54dabac12e392ee62d65b2bd5c Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 10 Dec 2024 11:47:30 +0800 Subject: [PATCH 67/72] Update app/utils/aws.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- app/utils/aws.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index abd98fde5f3..422c4a071bf 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -609,10 +609,15 @@ export function processChunks( chunks.shift(); } } catch (e) { - console.error("[Chunk Process Error]:", e); - chunks.shift(); // Remove error chunk - pendingChunk = null; // Reset pending chunk on error - } + console.warn("Failed to process chunk, attempting recovery"); + // Attempt to recover by processing the next chunk + if (chunks.length > 1) { + chunks.shift(); + pendingChunk = null; + } else { + // If this is the last chunk, throw to prevent data loss + throw new Error("Failed to process final chunk"); + } } return { From cb0422b8f2704b0a2b2ccf2fc8be1bd9830ef7c2 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 10 Dec 2024 11:53:49 +0800 Subject: [PATCH 68/72] Enhance processChunks by attempting to recover by processing the next chunk. --- app/utils/aws.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 422c4a071bf..d7b27013840 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -609,6 +609,9 @@ export function processChunks( chunks.shift(); } } catch (e) { + // console.error("[Chunk Process Error]:", e); + // chunks.shift(); // Remove error chunk + // pendingChunk = null; // Reset pending chunk on error console.warn("Failed to process chunk, attempting recovery"); // Attempt to recover by processing the next chunk if (chunks.length > 1) { @@ -618,6 +621,7 @@ export function processChunks( // If this is the last chunk, throw to prevent data loss throw new Error("Failed to process final chunk"); } + } } return { From 0ec1ae62769139e338db29ffd844787b04089a21 Mon Sep 17 00:00:00 2001 From: glay Date: Tue, 10 Dec 2024 11:55:14 +0800 Subject: [PATCH 69/72] Enhance encryption security with additional safeguards. --- app/utils/aws.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/utils/aws.ts b/app/utils/aws.ts index d7b27013840..5fc78bc7e98 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -85,7 +85,7 @@ export async function encrypt( return [saltBase64, ivBase64, encryptedBase64].join(SEPARATOR); } catch (error) { - console.error("[Encryption Error]:", error); + // console.error("[Encryption Error]:", error); throw new Error("Failed to encrypt AWS credentials"); } } From e839940a26d965403d7872981681c5cf489318b2 Mon Sep 17 00:00:00 2001 From: glay Date: Sat, 14 Dec 2024 11:01:10 +0800 Subject: [PATCH 70/72] feat:add amazon.nova model tool use support. --- app/client/platforms/bedrock.ts | 64 +++++++++++++++++---------------- app/utils.ts | 3 +- app/utils/aws.ts | 38 +++++++++++--------- 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/app/client/platforms/bedrock.ts b/app/client/platforms/bedrock.ts index d1d519837f3..69e9b9137a6 100644 --- a/app/client/platforms/bedrock.ts +++ b/app/client/platforms/bedrock.ts @@ -139,7 +139,6 @@ export class BedrockApi implements LLMApi { if (item.text || typeof item === "string") { return { text: item.text || item }; } - // Handle image content if (item.image_url?.url) { const { url = "" } = item.image_url; @@ -170,6 +169,7 @@ export class BedrockApi implements LLMApi { top_p: modelConfig.top_p || 0.9, top_k: modelConfig.top_k || 50, max_new_tokens: modelConfig.max_tokens || 1000, + stopSequences: modelConfig.stop || [], }, }; @@ -182,7 +182,7 @@ export class BedrockApi implements LLMApi { ]; } - // Add tools if available - now in correct format + // Add tools if available - exact Nova format if (toolsArray.length > 0) { requestBody.toolConfig = { tools: toolsArray.map((tool) => ({ @@ -192,14 +192,13 @@ export class BedrockApi implements LLMApi { inputSchema: { json: { type: "object", - properties: tool?.function?.parameters || {}, - required: Object.keys(tool?.function?.parameters || {}), + properties: tool?.function?.parameters?.properties || {}, + required: tool?.function?.parameters?.required || [], }, }, }, })), toolChoice: { auto: {} }, - // toolChoice: { any: {} } }; } @@ -501,7 +500,7 @@ export class BedrockApi implements LLMApi { })), ); } else if (isNova) { - // Format for Nova + // Format for Nova - Updated format // @ts-ignore requestPayload?.messages?.splice( // @ts-ignore @@ -511,35 +510,39 @@ export class BedrockApi implements LLMApi { role: "assistant", content: [ { - text: "", // Add empty text content to satisfy type requirements - tool_calls: toolCallMessage.tool_calls.map( - (tool: ChatMessageTool) => ({ - id: tool.id, - name: tool?.function?.name, - arguments: tool?.function?.arguments - ? JSON.parse(tool?.function?.arguments) - : {}, - }), - ), + toolUse: { + toolUseId: toolCallMessage.tool_calls[0].id, + name: toolCallMessage.tool_calls[0]?.function?.name, + input: + typeof toolCallMessage.tool_calls[0]?.function + ?.arguments === "string" + ? JSON.parse( + toolCallMessage.tool_calls[0]?.function + ?.arguments, + ) + : toolCallMessage.tool_calls[0]?.function + ?.arguments || {}, + }, }, ], }, - ...toolCallResult.map((result) => ({ + { role: "user", content: [ { - toolUseId: result.tool_call_id, - content: [ - { - json: - typeof result.content === "string" - ? JSON.parse(result.content) - : result.content, - }, - ], + toolResult: { + toolUseId: toolCallResult[0].tool_call_id, + content: [ + { + json: { + content: toolCallResult[0].content, + }, + }, + ], + }, }, ], - })), + }, ); } else { console.warn( @@ -573,7 +576,8 @@ export class BedrockApi implements LLMApi { const message = extractMessage(resJson); options.onFinish(message, res); } catch (e) { - const error = e instanceof Error ? e : new Error('Unknown error occurred'); + const error = + e instanceof Error ? e : new Error("Unknown error occurred"); console.error("[Bedrock Client] Chat failed:", error.message); options.onError?.(error); } @@ -829,7 +833,7 @@ function bedrockStream( } catch (err) { console.error( "[Bedrock Stream]:", - err instanceof Error ? err.message : "Stream processing failed" + err instanceof Error ? err.message : "Stream processing failed", ); throw new Error("Failed to process stream response"); } finally { @@ -843,7 +847,7 @@ function bedrockStream( } console.error( "[Bedrock Request] Failed:", - e instanceof Error ? e.message : "Request failed" + e instanceof Error ? e.message : "Request failed", ); options.onError?.(e); throw new Error("Request processing failed"); diff --git a/app/utils.ts b/app/utils.ts index a2a4f21dc99..9af7aadeeb2 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -296,7 +296,8 @@ export function showPlugins(provider: ServiceProvider, model: string) { } if ( (provider == ServiceProvider.Bedrock && model.includes("claude-3")) || - model.includes("mistral-large") + model.includes("mistral-large") || + model.includes("amazon.nova") ) { return true; } diff --git a/app/utils/aws.ts b/app/utils/aws.ts index 5fc78bc7e98..a976e4d0d46 100644 --- a/app/utils/aws.ts +++ b/app/utils/aws.ts @@ -435,25 +435,31 @@ export function processMessage( if (!data) return { remainText, index }; try { - // Handle Nova's tool calls + // Handle Nova's tool calls with exact schema match // console.log("processMessage data=========================",data); - if ( - data.stopReason === "tool_use" && - data.output?.message?.content?.[0]?.toolUse - ) { - const toolUse = data.output.message.content[0].toolUse; + if (data.contentBlockStart?.start?.toolUse) { + const toolUse = data.contentBlockStart.start.toolUse; index += 1; runTools.push({ - id: `tool-${Date.now()}`, + id: toolUse.toolUseId, type: "function", function: { - name: toolUse.name, - arguments: JSON.stringify(toolUse.input), + name: toolUse.name || "", // Ensure name is always present + arguments: "{}", // Initialize empty arguments }, }); return { remainText, index }; } + // Handle Nova's tool input in contentBlockDelta + if (data.contentBlockDelta?.delta?.toolUse?.input) { + if (runTools[index]) { + runTools[index].function.arguments = + data.contentBlockDelta.delta.toolUse.input; + } + return { remainText, index }; + } + // Handle Nova's text content if (data.output?.message?.content?.[0]?.text) { remainText += data.output.message.content[0].text; @@ -465,11 +471,9 @@ export function processMessage( return { remainText, index }; } - // Handle Nova's contentBlockDelta event - if (data.contentBlockDelta) { - if (data.contentBlockDelta.delta?.text) { - remainText += data.contentBlockDelta.delta.text; - } + // Handle Nova's text delta + if (data.contentBlockDelta?.delta?.text) { + remainText += data.contentBlockDelta.delta.text; return { remainText, index }; } @@ -496,7 +500,7 @@ export function processMessage( id: data.content_block.id, type: "function", function: { - name: data.content_block.name, + name: data.content_block.name || "", // Ensure name is always present arguments: "", }, }); @@ -523,7 +527,7 @@ export function processMessage( id: toolCall.id || `tool-${Date.now()}`, type: "function", function: { - name: toolCall.function?.name, + name: toolCall.function?.name || "", // Ensure name is always present arguments: toolCall.function?.arguments || "", }, }); @@ -554,7 +558,7 @@ export function processMessage( remainText += newText; } } catch (e) { - console.warn("Failed to process Bedrock message"); + console.warn("Failed to process Bedrock message:"); } return { remainText, index }; From 26f79aa6e66f6363029800364217014d7aac4b7f Mon Sep 17 00:00:00 2001 From: glay Date: Sun, 22 Dec 2024 23:38:45 +0800 Subject: [PATCH 71/72] feat:add nova VISION_MODEL_REGEXES --- app/constant.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/constant.ts b/app/constant.ts index bea2af69102..1481543f69f 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -315,6 +315,8 @@ export const VISION_MODEL_REGEXES = [ /qwen2-vl/, /gpt-4-turbo(?!.*preview)/, // Matches "gpt-4-turbo" but not "gpt-4-turbo-preview" /^dall-e-3$/, // Matches exactly "dall-e-3" + /nova-lite/, + /nova-pro/, ]; export const EXCLUDE_VISION_MODEL_REGEXES = [/claude-3-5-haiku-20241022/]; From 29b9a20acf8f2bcd7a0121d5fea1f122cebef33c Mon Sep 17 00:00:00 2001 From: glay Date: Wed, 25 Dec 2024 22:47:53 +0800 Subject: [PATCH 72/72] feat:add meta.llama3-3-70b-instruct model --- app/constant.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/constant.ts b/app/constant.ts index 1481543f69f..490d437b701 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -362,6 +362,7 @@ const bedrockModels = [ "us.meta.llama3-1-70b-instruct-v1:0", "us.meta.llama3-2-11b-instruct-v1:0", "us.meta.llama3-2-90b-instruct-v1:0", + "us.meta.llama3-3-70b-instruct-v1:0", // Mistral Models "mistral.mistral-large-2402-v1:0", "mistral.mistral-large-2407-v1:0",