diff --git a/README.md b/README.md index 227cfc56c3f..09a7b84e8fb 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ fastgpt.run 域名会弃用。 - [x] 源文件引用追踪 - [x] 模块封装,实现多级复用 - [x] 混合检索 & 重排 - - [ ] Tool 模块 + - [x] Tool 模块 - [ ] 嵌入 [Laf](https://github.com/labring/laf),实现在线编写 HTTP 模块 - [ ] 插件封装功能 @@ -114,7 +114,7 @@ fastgpt.run 域名会弃用。 * [多模型配置](https://doc.fastgpt.in/docs/development/one-api/) * [版本更新/升级介绍](https://doc.fastgpt.in/docs/development/upgrading) * [OpenAPI API 文档](https://doc.fastgpt.in/docs/development/openapi/) -* [知识库结构详解](https://doc.fastgpt.in/docs/use-cases/datasetengine/) +* [知识库结构详解](https://doc.fastgpt.in/docs/course/datasetengine/) # @@ -122,9 +122,9 @@ fastgpt.run 域名会弃用。 ## 🏘️ 社区交流群 -添加 wx 小助手加入: +wx 扫一下加入: -![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) +![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg) # diff --git a/README_en.md b/README_en.md index 587b8a539a9..29bdf0b9a4e 100644 --- a/README_en.md +++ b/README_en.md @@ -116,14 +116,12 @@ Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin) - [Configuring Multiple Models](https://doc.fastgpt.in/docs/installation/reference/models) - [Version Updates & Upgrades](https://doc.fastgpt.in/docs/installation/upgrading) - - +| Community Group | +| ------------------------------------------------- | +| ![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg) | # diff --git a/docSite/assets/imgs/gapierTool1.png b/docSite/assets/imgs/gapierTool1.png new file mode 100644 index 00000000000..d9986a6d6a3 Binary files /dev/null and b/docSite/assets/imgs/gapierTool1.png differ diff --git a/docSite/assets/imgs/gapierTool10.png b/docSite/assets/imgs/gapierTool10.png new file mode 100644 index 00000000000..4b3f97e06f9 Binary files /dev/null and b/docSite/assets/imgs/gapierTool10.png differ diff --git a/docSite/assets/imgs/gapierTool11.png b/docSite/assets/imgs/gapierTool11.png new file mode 100644 index 00000000000..bcc8c633c29 Binary files /dev/null and b/docSite/assets/imgs/gapierTool11.png differ diff --git a/docSite/assets/imgs/gapierTool12.png b/docSite/assets/imgs/gapierTool12.png new file mode 100644 index 00000000000..a2be0bea1c0 Binary files /dev/null and b/docSite/assets/imgs/gapierTool12.png differ diff --git a/docSite/assets/imgs/gapierTool13.png b/docSite/assets/imgs/gapierTool13.png new file mode 100644 index 00000000000..1109cfc5e86 Binary files /dev/null and b/docSite/assets/imgs/gapierTool13.png differ diff --git a/docSite/assets/imgs/gapierTool14.png b/docSite/assets/imgs/gapierTool14.png new file mode 100644 index 00000000000..ce8d278176c Binary files /dev/null and b/docSite/assets/imgs/gapierTool14.png differ diff --git a/docSite/assets/imgs/gapierTool15.png b/docSite/assets/imgs/gapierTool15.png new file mode 100644 index 00000000000..4e9717643d2 Binary files /dev/null and b/docSite/assets/imgs/gapierTool15.png differ diff --git a/docSite/assets/imgs/gapierTool16.png b/docSite/assets/imgs/gapierTool16.png new file mode 100644 index 00000000000..0ff1d38c004 Binary files /dev/null and b/docSite/assets/imgs/gapierTool16.png differ diff --git a/docSite/assets/imgs/gapierTool17.png b/docSite/assets/imgs/gapierTool17.png new file mode 100644 index 00000000000..f57c988f233 Binary files /dev/null and b/docSite/assets/imgs/gapierTool17.png differ diff --git a/docSite/assets/imgs/gapierTool2.png b/docSite/assets/imgs/gapierTool2.png new file mode 100644 index 00000000000..4aed354c71a Binary files /dev/null and b/docSite/assets/imgs/gapierTool2.png differ diff --git a/docSite/assets/imgs/gapierTool3.png b/docSite/assets/imgs/gapierTool3.png new file mode 100644 index 00000000000..54b16374f96 Binary files /dev/null and b/docSite/assets/imgs/gapierTool3.png differ diff --git a/docSite/assets/imgs/gapierTool4.png b/docSite/assets/imgs/gapierTool4.png new file mode 100644 index 00000000000..a6f00cfbec0 Binary files /dev/null and b/docSite/assets/imgs/gapierTool4.png differ diff --git a/docSite/assets/imgs/gapierTool5.png b/docSite/assets/imgs/gapierTool5.png new file mode 100644 index 00000000000..635371b1aba Binary files /dev/null and b/docSite/assets/imgs/gapierTool5.png differ diff --git a/docSite/assets/imgs/gapierTool6.png b/docSite/assets/imgs/gapierTool6.png new file mode 100644 index 00000000000..bcccfc36622 Binary files /dev/null and b/docSite/assets/imgs/gapierTool6.png differ diff --git a/docSite/assets/imgs/gapierTool7.png b/docSite/assets/imgs/gapierTool7.png new file mode 100644 index 00000000000..7c372018625 Binary files /dev/null and b/docSite/assets/imgs/gapierTool7.png differ diff --git a/docSite/assets/imgs/gapierTool8.png b/docSite/assets/imgs/gapierTool8.png new file mode 100644 index 00000000000..c97f208c446 Binary files /dev/null and b/docSite/assets/imgs/gapierTool8.png differ diff --git a/docSite/assets/imgs/gapierTool9.png b/docSite/assets/imgs/gapierTool9.png new file mode 100644 index 00000000000..cae83ba622d Binary files /dev/null and b/docSite/assets/imgs/gapierTool9.png differ diff --git a/docSite/assets/imgs/gapierToolResult1.png b/docSite/assets/imgs/gapierToolResult1.png new file mode 100644 index 00000000000..a898f583295 Binary files /dev/null and b/docSite/assets/imgs/gapierToolResult1.png differ diff --git a/docSite/content/docs/commercial/intro.md b/docSite/content/docs/commercial/intro.md index cf9733d48cb..c1da9dd25fb 100644 --- a/docSite/content/docs/commercial/intro.md +++ b/docSite/content/docs/commercial/intro.md @@ -19,16 +19,17 @@ FastGPT 商业版是基于 FastGPT 开源版的增强版本,增加了一些独 | 应用管理与高级编排 | ✅ | ✅ | ✅ | | 文档知识库 | ✅ | ✅ | ✅ | | 外部使用 | ✅ | ✅ | ✅ | -| 自定义版权信息 | ❌ | ✅ | ✅ | +| 自定义版权信息 | ❌ | ✅ | 设计中 | | 多租户与支付 | ❌ | ✅ | ✅ | | 团队空间 | ❌ | ✅ | ✅ | -| 外部使用限制 | ❌ | ✅ | ✅ | +| 应用发布安全配置 | ❌ | ✅ | ✅ | | 内容审核 | ❌ | ✅ | ✅ | | web站点同步 | ❌ | ✅ | ✅ | | 管理后台 | ❌ | ✅ | ✅ | -| Saas服务商业授权 | ❌ | ✅ | ✅ | +| 完整商业授权 | ❌ | ✅ | ✅ | | 图片知识库 | ❌ | 设计中 | 设计中 | | 自动规划召回 | ❌ | 设计中 | 设计中 | +| 对话日志运营分析 | ❌ | 设计中 | 设计中 | {{< /table >}} ## 商业版软件价格 diff --git a/docSite/content/docs/use-cases/ai_settings.md b/docSite/content/docs/course/ai_settings.md similarity index 98% rename from docSite/content/docs/use-cases/ai_settings.md rename to docSite/content/docs/course/ai_settings.md index 378de2eb228..ae3d8c1d702 100644 --- a/docSite/content/docs/use-cases/ai_settings.md +++ b/docSite/content/docs/course/ai_settings.md @@ -4,7 +4,7 @@ description: "FastGPT AI 高级配置说明" icon: "sign_language" draft: false toc: true -weight: 501 +weight: 102 --- 在 FastGPT 的 AI 对话模块中,有一个 AI 高级配置,里面包含了 AI 模型的参数配置,本文详细介绍这些配置的含义。 @@ -48,7 +48,7 @@ Tips: 可以通过点击上下文按键查看完整的上下文组成,便于 FastGPT 知识库采用 QA 对(不一定都是问答格式,仅代表两个变量)的格式存储,在转义成字符串时候会根据**引用模板**来进行格式化。知识库包含多个可用变量: q, a, sourceId(数据的ID), index(第n个数据), source(数据的集合名、文件名),score(距离得分,0-1) 可以通过 {{q}} {{a}} {{sourceId}} {{index}} {{source}} {{score}} 按需引入。下面一个模板例子: -可以通过 [知识库结构讲解](/docs/use-cases/datasetEngine/) 了解详细的知识库的结构。 +可以通过 [知识库结构讲解](/docs/course/datasetEngine/) 了解详细的知识库的结构。 #### 引用模板 diff --git a/docSite/content/docs/use-cases/datasetEngine.md b/docSite/content/docs/course/datasetEngine.md similarity index 98% rename from docSite/content/docs/use-cases/datasetEngine.md rename to docSite/content/docs/course/datasetEngine.md index 26f6723819b..9b867041ea7 100644 --- a/docSite/content/docs/use-cases/datasetEngine.md +++ b/docSite/content/docs/course/datasetEngine.md @@ -4,7 +4,7 @@ description: "本节会详细介绍 FastGPT 知识库结构设计,理解其 QA icon: "dataset" draft: false toc: true -weight: 502 +weight: 102 --- ## 理解向量 @@ -90,4 +90,4 @@ FastGPT 采用了 `PostgresSQL` 的 `PG Vector` 插件作为向量检索器, ## QA的组合与引用提示词构建 -参考[引用模板与引用提示词示例](/docs/use-cases/ai_settings/#示例) +参考[引用模板与引用提示词示例](/docs/course/ai_settings/#示例) diff --git a/docSite/content/docs/use-cases/kb.md b/docSite/content/docs/course/kb.md similarity index 99% rename from docSite/content/docs/use-cases/kb.md rename to docSite/content/docs/course/kb.md index d76e3c3123d..dbbb16c2108 100644 --- a/docSite/content/docs/use-cases/kb.md +++ b/docSite/content/docs/course/kb.md @@ -4,7 +4,7 @@ description: " 利用 FastGPT 打造高质量 AI 知识库" icon: "school" draft: false toc: true -weight: 699 +weight: 106 --- ## 前言 diff --git a/docSite/content/docs/development/configuration.md b/docSite/content/docs/development/configuration.md index 62088eb5f18..847261d9f50 100644 --- a/docSite/content/docs/development/configuration.md +++ b/docSite/content/docs/development/configuration.md @@ -11,7 +11,7 @@ weight: 708 **开发环境下**,你需要将示例配置文件 `config.json` 复制成 `config.local.json` 文件才会生效。 -这个配置文件中包含了系统参数和各个模型配置,使用时务必去掉注释。 +这个配置文件中包含了系统参数和各个模型配置,`使用时务必去掉注释!!!!!!!!!!!!!!` ## 4.6.8+ 版本新配置文件 @@ -28,6 +28,7 @@ llm模型全部合并 { "model": "gpt-3.5-turbo", // 模型名 "name": "gpt-3.5-turbo", // 别名 + "avatar": "/imgs/model/openai.svg", // 模型的logo "maxContext": 16000, // 最大上下文 "maxResponse": 4000, // 最大回复 "quoteMaxToken": 13000, // 最大引用内容 @@ -35,7 +36,7 @@ llm模型全部合并 "charsPointsPrice": 0, "censor": false, "vision": false, // 是否支持图片输入 - "datasetProcess": false, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错 + "datasetProcess": true, // 是否设置为知识库处理模型(QA),务必保证至少有一个为true,否则知识库会报错 "usedInClassify": true, // 是否用于问题分类(务必保证至少有一个为true) "usedInExtractFields": true, // 是否用于内容提取(务必保证至少有一个为true) "usedInToolCall": true, // 是否用于工具调用(务必保证至少有一个为true) @@ -47,31 +48,10 @@ llm模型全部合并 "defaultSystemChatPrompt": "", // 对话默认携带的系统提示词 "defaultConfig":{} // LLM默认配置,可以针对不同模型设置特殊值(比如 GLM4 的 top_p }, - { - "model": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k", - "maxContext": 16000, - "maxResponse": 16000, - "quoteMaxToken": 13000, - "maxTemperature": 1.2, - "charsPointsPrice": 0, - "censor": false, - "vision": false, - "datasetProcess": true, - "usedInClassify": true, - "usedInExtractFields": true, - "usedInToolCall": true, - "usedInQueryExtension": true, - "toolChoice": true, - "functionCall": false, - "customCQPrompt": "", - "customExtractPrompt": "", - "defaultSystemChatPrompt": "", - "defaultConfig":{} - }, { "model": "gpt-4-0125-preview", "name": "gpt-4-turbo", + "avatar": "/imgs/model/openai.svg", "maxContext": 125000, "maxResponse": 4000, "quoteMaxToken": 100000, @@ -94,6 +74,7 @@ llm模型全部合并 { "model": "gpt-4-vision-preview", "name": "gpt-4-vision", + "avatar": "/imgs/model/openai.svg", "maxContext": 128000, "maxResponse": 4000, "quoteMaxToken": 100000, @@ -118,6 +99,7 @@ llm模型全部合并 { "model": "text-embedding-ada-002", "name": "Embedding-2", + "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 700, "maxToken": 3000, @@ -149,6 +131,20 @@ llm模型全部合并 } ``` +## 关于模型 logo + +统一放置在项目的`public/imgs/model/xxx`目录中,目前内置了以下几种,如果有需要,可以PR增加。 + +- /imgs/model/baichuan.svg - 百川 +- /imgs/model/chatglm.svg - 智谱 +- /imgs/model/calude.svg - calude +- /imgs/model/ernie.svg - 文心一言 +- /imgs/model/moonshot.svg - 月之暗面 +- /imgs/model/openai.svg - OpenAI GPT +- /imgs/model/qwen.svg - 通义千问 +- /imgs/model/yi.svg - 零一万物 +- + ## 特殊模型 ### ReRank 接入 diff --git a/docSite/content/docs/development/faq.md b/docSite/content/docs/development/faq.md index f1c6be3ed67..12b22c2ba56 100644 --- a/docSite/content/docs/development/faq.md +++ b/docSite/content/docs/development/faq.md @@ -1,13 +1,13 @@ --- weight: 749 -title: "常见开发 & 部署问题" -description: "FastGPT 常见开发 & 部署问题" +title: "私有部署常见问题" +description: "FastGPT 私有部署常见问题" icon: upgrade draft: false images: [] --- -## 错误排查方式 +## 一、错误排查方式 遇到问题先按下面方式排查。 @@ -17,7 +17,7 @@ images: [] 4. 无法解决时,可以找找[Issue](https://github.com/labring/FastGPT/issues),或新提 Issue,私有部署错误,务必提供详细的日志,否则很难排查。 -## 通用问题 +## 二、通用问题 ### 能否纯本地运行 @@ -46,7 +46,7 @@ OneAPI 的 API Key 配置错误,需要修改`OPENAI_API_KEY`环境变量,并 ### 页面崩溃 1. 关闭翻译 -2. 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。(95%情况,可以F12打开控制台,看具体的空指针情况) +2. 检查配置文件是否正常加载,如果没有正常加载会导致缺失系统信息,在某些操作下会导致空指针。(95%情况是配置文件不对,可以F12打开控制台,看具体的空指针情况) 3. 某些api不兼容问题(较少) ### 开启内容补全后,响应速度变慢 @@ -54,7 +54,11 @@ OneAPI 的 API Key 配置错误,需要修改`OPENAI_API_KEY`环境变量,并 1. 问题补全需要经过一轮AI生成。 2. 会进行3~5轮的查询,如果数据库性能不足,会有明显影响。 -## 私有部署问题 +### 模型响应为空 + +1. 检查 key 问题。 +2. 如果是国内模型,可能是命中风控了。 +3. 查看模型请求日志,检查出入参数是否异常。 ### 知识库索引没有进度 @@ -64,11 +68,7 @@ OneAPI 的 API Key 配置错误,需要修改`OPENAI_API_KEY`环境变量,并 2. 不能对话,也不能索引:API调用失败。可能是没连上OneAPI或OpenAI 3. 有进度,但是非常慢:api key不行,OpenAI的免费号,一分钟只有3次还是60次。一天上限200次。 -## Docker 部署常见问题 - -### 首次部署,root用户提示未注册 - -没有启动 Mongo 副本集模式。 +## 三、Docker 部署常见问题 ### 如何更新? @@ -133,14 +133,6 @@ mongo连接失败,检查 2. 环境变量(账号密码,注意host和port) 3. 副本集启动失败,一直在重启:没挂载mongo key;key没有权限; -## 本地开发问题 - -### TypeError: Cannot read properties of null (reading 'useMemo' ) - -删除所有的`node_modules`,用 Node18 重新 install 试试,可能最新的 Node 有问题。 本地开发流程: +### 首次部署,root用户提示未注册 -1. 根目录: `pnpm i` -2. 复制 `config.json` -> `config.local.json` -3. 复制 `.env.template` -> `.env.local` -4. `cd projects/app` -5. `pnpm dev` +没有启动 Mongo 副本集模式。 diff --git a/docSite/content/docs/development/intro.md b/docSite/content/docs/development/intro.md index 1fafe864f4e..635181c8d28 100644 --- a/docSite/content/docs/development/intro.md +++ b/docSite/content/docs/development/intro.md @@ -48,7 +48,7 @@ git clone git@github.com:/FastGPT.git 第一次开发,需要先部署数据库,建议本地开发可以随便找一台 2C2G 的轻量小数据库实践。数据库部署教程:[Docker 快速部署](/docs/development/docker/)。部署完了,可以本地访问其数据库。 -Mongo 数据库需要修改副本集的`host`,从原来的`mongo:27017`修改为`ip:27017`。 +Mongo 数据库需要修改副本集的`host`,从原来的`mongo:27017`修改为`ip:27017`(ip为对应的公网IP)。 ### 4. 初始配置 @@ -113,7 +113,22 @@ docker build -t dockername/fastgpt:tag --build-arg name=app --build-arg proxy=ta FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI`的`Type`。如果没有权限,可以先执行`chmod -R +x ./scripts/`,再执行`pnpm i`。 -### 加入社区 +### 长时间运行后崩溃 + +似乎是由于 tiktoken 库的开发环境问题,生产环境中未遇到,暂时可忽略。 + +### TypeError: Cannot read properties of null (reading 'useMemo' ) + +删除所有的`node_modules`,用 Node18 重新 install 试试,可能最新的 Node 有问题。 本地开发流程: + +1. 根目录: `pnpm i` +2. 复制 `config.json` -> `config.local.json` +3. 复制 `.env.template` -> `.env.local` +4. `cd projects/app` +5. `pnpm dev` + + +## 加入社区 遇到困难了吗?有任何问题吗? 加入微信群与开发者和用户保持沟通。 diff --git a/docSite/content/docs/development/one-api.md b/docSite/content/docs/development/one-api.md index 4b1a14218d0..30e15d967b6 100644 --- a/docSite/content/docs/development/one-api.md +++ b/docSite/content/docs/development/one-api.md @@ -112,6 +112,7 @@ CHAT_API_KEY=sk-xxxxxx { "model": "ERNIE-Bot", // 这里的模型需要对应 One API 的模型 "name": "文心一言", // 对外展示的名称 + "avatar": "/imgs/model/openai.svg", // 模型的logo "maxContext": 16000, // 最大上下文 "maxResponse": 4000, // 最大回复 "quoteMaxToken": 13000, // 最大引用内容 @@ -135,4 +136,11 @@ CHAT_API_KEY=sk-xxxxxx ], ``` -添加完后,重启 FastGPT 即可在选择文心一言模型进行对话。**添加向量模型也是类似操作,增加到 `vectorModels`里。** +### 3. 重启 FastGPT + +```bash +docker-compose down +docker-compose up -d +``` + +重启 FastGPT 即可在选择文心一言模型进行对话。**添加向量模型也是类似操作,增加到 `vectorModels`里。** diff --git a/docSite/content/docs/development/upgrading/47.md b/docSite/content/docs/development/upgrading/47.md index 512b669d8e7..420eac63eb1 100644 --- a/docSite/content/docs/development/upgrading/47.md +++ b/docSite/content/docs/development/upgrading/47.md @@ -9,11 +9,31 @@ weight: 826 ## 修改配置文件 -增加一些 Boolean 值,用于决定不同功能块可以使用哪些模型:[点击查看最新的配置文件](/docs/development/configuration/) +增加一些 Boolean 值,用于决定不同功能块可以使用哪些模型,同时增加了模型的 logo:[点击查看最新的配置文件](/docs/development/configuration/) +## 初始化脚本 + +从任意终端,发起 1 个 HTTP 请求。其中 {{rootkey}} 替换成环境变量里的 `rootkey`;{{host}} 替换成自己域名 + +```bash +curl --location --request POST 'https://{{host}}/api/admin/initv47' \ +--header 'rootkey: {{rootkey}}' \ +--header 'Content-Type: application/json' +``` + +脚本功能: +1. 初始化插件的 parentId ## V4.7 更新说明 1. 新增 - 工具调用模块,可以让LLM模型根据用户意图,动态的选择其他模型或插件执行。 2. 新增 - 分类和内容提取支持 functionCall 模式。部分模型支持 functionCall 不支持 ToolCall,也可以使用了。需要把 LLM 模型配置文件里的 `functionCall` 设置为 `true`, `toolChoice`设置为 `false`。如果 `toolChoice` 为 true,会走 tool 模式。 -3. 优化 - 高级编排性能 +3. 新增 - HTTP插件,可实现OpenAPI快速生成插件。 +4. 优化 - 高级编排性能。 +5. 优化 - 抽离 Flow controller 到 packages。 +6. 优化 - AI模型选择。 +7. 修复 - 开源版重排选不上。 +8. 修复 - http 请求 body,不使用时,传入undefined。(会造成部分GET请求失败) +9. 新增 - 支持 http url 使用变量。 +10. 修复 - 469 的提取的提示词容易造成幻觉。 +11. 修复 - PG HNSW索引未实际生效问题,本次更新后,搜索速度大幅度提升(但是可能会出现精度损失,如果出现精度损失需要参考PgVector文档,对索引进行调整)。详细见:https://github.com/pgvector/pgvector?tab=readme-ov-file#troubleshooting diff --git a/docSite/content/docs/use-cases/feishu.md b/docSite/content/docs/use-cases/feishu.md index dc494d84dca..d98acfeee22 100644 --- a/docSite/content/docs/use-cases/feishu.md +++ b/docSite/content/docs/use-cases/feishu.md @@ -1,6 +1,6 @@ --- -title: " 接入飞书 " -description: "FastGPT 接入飞书机器人 " +title: " 接入飞书(社区文章)" +description: "FastGPT 接入飞书机器人" icon: "chat" draft: false toc: true diff --git a/docSite/content/docs/use-cases/gapier.md b/docSite/content/docs/use-cases/gapier.md new file mode 100644 index 00000000000..a3c8f3c225c --- /dev/null +++ b/docSite/content/docs/use-cases/gapier.md @@ -0,0 +1,60 @@ +--- +title: "使用 Gapier 快速导入Agent工具" +description: "FastGPT 使用 Gapier 快速导入Agent工具" +icon: "build" +draft: false +toc: true +weight: 501 +--- + +FastGPT V4.7版本加入了工具调用,可以兼容 GPTs 的 Actions。这意味着,你可以直接导入兼容 GPTs 的 Agent 工具。 + +Gapier 是一个在线 GPTs Actions工具,提供了50多种现成工具,并且每天有免费额度进行测试,方便用户试用,官方地址为:[https://gapier.com/](https://gapier.com/)。 + +![](/imgs/gapierToolResult1.png) + +现在,我们开始把 Gapier 的工具导入到 FastGPT 中。 + +## 1. 创建插件 + +| Step1 | Step2 | Step3 | +| --- | --- | --- | +| ![](/imgs/gapierTool1.png) | ![](/imgs/gapierTool2.png) | 登录[Gapier](https://gapier.com/) 复制相关参数
![](/imgs/gapierTool3.png) | +| Step4 | Step5 | Step6 | +| 自定义请求头: Authorization
请求值: Bearer 复制的key
![](/imgs/gapierTool4.png) | ![](/imgs/gapierTool5.png) | ![](/imgs/gapierTool6.png) | + +创建完后,如果需要变更,无需重新创建,只需要修改对应参数即可,会自动做差值比较更新。 + +![](/imgs/gapierTool7.png) + +## 2. 应用绑定工具 + +### 简易模式 + +| Step1 | Step2 | +| --- | --- | --- | +| ![](/imgs/gapierTool8.png) | ![](/imgs/gapierTool9.png) | +| Step3 | Step4 | +| ![](/imgs/gapierTool10.png) | ![](/imgs/gapierTool11.png) | + +### 高级编排 + +| Step1 | Step2 | +| --- | --- | --- | +| ![](/imgs/gapierTool12.png) | ![](/imgs/gapierTool13.png) | +| Step3 | Step4 | +| ![](/imgs/gapierTool14.png) | ![](/imgs/gapierTool15.png) | + +![](/imgs/gapierTool16.png) + +## 3. 工具调用说明 + +### 不同模型的区别 + +不同模型调用工具采用不同的方法,有些模型支持 toolChoice 和 functionCall 效果会更好。不支持这两种方式的模型通过提示词调用,但是效果不是很好,并且为了保证顺利调用,FastGPT内置的提示词,仅支持每次调用一个工具。 + +具体哪些模型支持 functionCall 可以官网查看(当然,也需要OneAPI支持),同时需要调整模型配置文件中的对应字段(详细看配置字段说明)。 + +线上版用户,可以在模型选择时,看到是否支持函数调用的标识。 + +![](/imgs/gapierTool17.png) diff --git a/docSite/content/docs/use-cases/wechat.md b/docSite/content/docs/use-cases/wechat.md index a79c32bd7d8..165421f2e2e 100644 --- a/docSite/content/docs/use-cases/wechat.md +++ b/docSite/content/docs/use-cases/wechat.md @@ -1,5 +1,5 @@ --- -title: " 接入微信和企业微信 " +title: "接入微信和企业微信 " description: "FastGPT 接入微信和企业微信 " icon: "chat" draft: false diff --git a/packages/global/common/error/code/team.ts b/packages/global/common/error/code/team.ts index 3ba187c826b..80674304a55 100644 --- a/packages/global/common/error/code/team.ts +++ b/packages/global/common/error/code/team.ts @@ -15,7 +15,7 @@ export enum TeamErrEnum { const teamErr = [ { statusText: TeamErrEnum.teamOverSize, message: 'error.team.overSize' }, { statusText: TeamErrEnum.unAuthTeam, message: '无权操作该团队' }, - { statusText: TeamErrEnum.aiPointsNotEnough, message: 'AI积分已用完~' }, + { statusText: TeamErrEnum.aiPointsNotEnough, message: '' }, { statusText: TeamErrEnum.datasetSizeNotEnough, message: '知识库容量不足,请先扩容~' }, { statusText: TeamErrEnum.datasetAmountNotEnough, message: '知识库数量已达上限~' }, { statusText: TeamErrEnum.appAmountNotEnough, message: '应用数量已达上限~' }, diff --git a/packages/global/common/error/utils.ts b/packages/global/common/error/utils.ts index 4c0a3276725..e306e54c610 100644 --- a/packages/global/common/error/utils.ts +++ b/packages/global/common/error/utils.ts @@ -1,7 +1,7 @@ import { replaceSensitiveText } from '../string/tools'; export const getErrText = (err: any, def = '') => { - const msg: string = typeof err === 'string' ? err : err?.message || def || ''; + const msg: string = typeof err === 'string' ? err : err?.message ?? def; msg && console.log('error =>', msg); return replaceSensitiveText(msg); }; diff --git a/packages/global/common/file/constants.ts b/packages/global/common/file/constants.ts index 540404822a5..74e0549a059 100644 --- a/packages/global/common/file/constants.ts +++ b/packages/global/common/file/constants.ts @@ -1,3 +1,4 @@ +/* mongo fs bucket */ export enum BucketNameEnum { dataset = 'dataset' } @@ -7,4 +8,4 @@ export const bucketNameMap = { } }; -export const FileBaseUrl = '/api/common/file/read'; +export const ReadFileBaseUrl = '/api/common/file/read'; diff --git a/packages/global/common/file/image/constants.ts b/packages/global/common/file/image/constants.ts index 643d6c21b60..3e5b30cdfca 100644 --- a/packages/global/common/file/image/constants.ts +++ b/packages/global/common/file/image/constants.ts @@ -50,3 +50,7 @@ export const mongoImageTypeMap = { export const uniqueImageTypeList = Object.entries(mongoImageTypeMap) .filter(([key, value]) => value.unique) .map(([key]) => key as `${MongoImageTypeEnum}`); + +export const FolderIcon = 'file/fill/folder'; +export const FolderImgUrl = '/imgs/files/folder.svg'; +export const HttpImgUrl = '/imgs/module/http.png'; diff --git a/packages/global/common/system/constants.ts b/packages/global/common/system/constants.ts index 0e6291ea92f..04ff3ea1d88 100644 --- a/packages/global/common/system/constants.ts +++ b/packages/global/common/system/constants.ts @@ -1,2 +1,3 @@ export const HUMAN_ICON = `/icon/human.svg`; export const LOGO_ICON = `/icon/logo.svg`; +export const HUGGING_FACE_ICON = `/imgs/model/huggingface.svg`; diff --git a/packages/global/core/ai/model.d.ts b/packages/global/core/ai/model.d.ts index 3d9efaa280f..16210cef43d 100644 --- a/packages/global/core/ai/model.d.ts +++ b/packages/global/core/ai/model.d.ts @@ -1,6 +1,7 @@ export type LLMModelItemType = { model: string; name: string; + avatar?: string; maxContext: number; maxResponse: number; quoteMaxToken: number; @@ -31,6 +32,7 @@ export type LLMModelItemType = { export type VectorModelItemType = { model: string; name: string; + avatar?: string; defaultToken: number; charsPointsPrice: number; maxToken: number; diff --git a/projects/app/src/global/core/prompt/AIChat.ts b/packages/global/core/ai/prompt/AIChat.ts similarity index 97% rename from projects/app/src/global/core/prompt/AIChat.ts rename to packages/global/core/ai/prompt/AIChat.ts index ea2a18f809d..7fb9e937ccc 100644 --- a/projects/app/src/global/core/prompt/AIChat.ts +++ b/packages/global/core/ai/prompt/AIChat.ts @@ -1,4 +1,4 @@ -import { PromptTemplateItem } from '@fastgpt/global/core/ai/type.d'; +import { PromptTemplateItem } from '../type.d'; export const Prompt_QuoteTemplateList: PromptTemplateItem[] = [ { diff --git a/projects/app/src/global/core/prompt/agent.ts b/packages/global/core/ai/prompt/agent.ts similarity index 86% rename from projects/app/src/global/core/prompt/agent.ts rename to packages/global/core/ai/prompt/agent.ts index 5e8efa9ca8f..2f7894fa463 100644 --- a/projects/app/src/global/core/prompt/agent.ts +++ b/packages/global/core/ai/prompt/agent.ts @@ -58,5 +58,3 @@ Human:"{{question}}" 类型ID= `; - -export const Prompt_QuestionGuide = `我不太清楚问你什么问题,请帮我生成 3 个问题,引导我继续提问。问题的长度应小于20个字符,按 JSON 格式返回: ["问题1", "问题2", "问题3"]`; diff --git a/packages/global/core/app/api.d.ts b/packages/global/core/app/api.d.ts index e7917f37fe0..d508d60624c 100644 --- a/packages/global/core/app/api.d.ts +++ b/packages/global/core/app/api.d.ts @@ -12,16 +12,9 @@ export type CreateAppParams = { export interface AppUpdateParams { name?: string; type?: `${AppTypeEnum}`; - simpleTemplateId?: string; avatar?: string; intro?: string; modules?: AppSchema['modules']; permission?: AppSchema['permission']; teamTags?: AppSchema['teamTags']; } - -export type FormatForm2ModulesProps = { - formData: AppSimpleEditFormType; - chatModelMaxToken: number; - llmModelList: LLMModelItemType[]; -}; diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index 6bba1ad288c..8c75c3ad200 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -1,7 +1,12 @@ -import type { AppTTSConfigType, ModuleItemType, VariableItemType } from '../module/type.d'; +import type { + AppTTSConfigType, + FlowNodeTemplateType, + ModuleItemType, + VariableItemType +} from '../module/type.d'; import { AppTypeEnum } from './constants'; import { PermissionTypeEnum } from '../../support/permission/constant'; -import type { AIChatModuleProps, DatasetModuleProps } from '../module/node/type.d'; +import type { DatasetModuleProps } from '../module/node/type.d'; import { VariableInputEnum } from '../module/constants'; import { SelectedDatasetType } from '../module/api'; import { DatasetSearchModeEnum } from '../dataset/constants'; @@ -13,7 +18,6 @@ export interface AppSchema { tmbId: string; name: string; type: `${AppTypeEnum}`; - simpleTemplateId: string; avatar: string; intro: string; updateTime: number; @@ -37,19 +41,6 @@ export type AppDetailType = AppSchema & { canWrite: boolean; }; -// export type AppSimpleEditFormType = { -// aiSettings: AIChatModuleProps; -// dataset: DatasetModuleProps & { -// searchEmptyText: string; -// }; -// userGuide: { -// welcomeText: string; -// variables: VariableItemType[]; -// questionGuide: boolean; -// tts: AppTTSConfigType; -// }; -// }; -// Since useform cannot infer enumeration types, all enumeration keys can only be undone manually export type AppSimpleEditFormType = { // templateId: string; aiSettings: { @@ -58,8 +49,7 @@ export type AppSimpleEditFormType = { temperature: number; maxToken: number; isResponseAnswerText: boolean; - quoteTemplate?: string | undefined; - quotePrompt?: string | undefined; + maxHistories: number; }; dataset: { datasets: SelectedDatasetType; @@ -67,11 +57,11 @@ export type AppSimpleEditFormType = { similarity?: number; limit?: number; usingReRank?: boolean; - searchEmptyText?: string; datasetSearchUsingExtensionQuery?: boolean; datasetSearchExtensionModel?: string; datasetSearchExtensionBg?: string; }; + selectedTools: FlowNodeTemplateType[]; userGuide: { welcomeText: string; variables: { @@ -94,34 +84,3 @@ export type AppSimpleEditFormType = { }; }; }; - -/* simple mode template*/ -export type AppSimpleEditConfigTemplateType = { - id: string; - name: string; - desc: string; - systemForm: { - aiSettings?: { - model?: boolean; - systemPrompt?: boolean; - temperature?: boolean; - maxToken?: boolean; - quoteTemplate?: boolean; - quotePrompt?: boolean; - }; - dataset?: { - datasets?: boolean; - similarity?: boolean; - limit?: boolean; - searchMode: `${DatasetSearchModeEnum}`; - usingReRank: boolean; - searchEmptyText?: boolean; - }; - userGuide?: { - welcomeText?: boolean; - variables?: boolean; - questionGuide?: boolean; - tts?: boolean; - }; - }; -}; diff --git a/packages/global/core/app/utils.ts b/packages/global/core/app/utils.ts index f8b24f219eb..8a3c3de023b 100644 --- a/packages/global/core/app/utils.ts +++ b/packages/global/core/app/utils.ts @@ -1,6 +1,10 @@ import type { AppSimpleEditFormType } from '../app/type'; import { FlowNodeTypeEnum } from '../module/node/constant'; -import { ModuleOutputKeyEnum, ModuleInputKeyEnum } from '../module/constants'; +import { + ModuleOutputKeyEnum, + ModuleInputKeyEnum, + FlowNodeTemplateTypeEnum +} from '../module/constants'; import type { FlowNodeInputItemType } from '../module/node/type.d'; import { getGuideModule, splitGuideModule } from '../module/utils'; import { ModuleItemType } from '../module/type.d'; @@ -13,20 +17,19 @@ export const getDefaultAppForm = (): AppSimpleEditFormType => { systemPrompt: '', temperature: 0, isResponseAnswerText: true, - quotePrompt: '', - quoteTemplate: '', + maxHistories: 6, maxToken: 4000 }, dataset: { datasets: [], similarity: 0.4, limit: 1500, - searchEmptyText: '', searchMode: DatasetSearchModeEnum.embedding, usingReRank: false, datasetSearchUsingExtensionQuery: true, datasetSearchExtensionBg: '' }, + selectedTools: [], userGuide: { welcomeText: '', variables: [], @@ -47,7 +50,10 @@ export const appModules2Form = ({ modules }: { modules: ModuleItemType[] }) => { }; modules.forEach((module) => { - if (module.flowType === FlowNodeTypeEnum.chatNode) { + if ( + module.flowType === FlowNodeTypeEnum.chatNode || + module.flowType === FlowNodeTypeEnum.tools + ) { defaultAppForm.aiSettings.model = findInputValueByKey( module.inputs, ModuleInputKeyEnum.aiModel @@ -64,13 +70,9 @@ export const appModules2Form = ({ modules }: { modules: ModuleItemType[] }) => { module.inputs, ModuleInputKeyEnum.aiChatMaxToken ); - defaultAppForm.aiSettings.quoteTemplate = findInputValueByKey( + defaultAppForm.aiSettings.maxHistories = findInputValueByKey( module.inputs, - ModuleInputKeyEnum.aiChatQuoteTemplate - ); - defaultAppForm.aiSettings.quotePrompt = findInputValueByKey( - module.inputs, - ModuleInputKeyEnum.aiChatQuotePrompt + ModuleInputKeyEnum.history ); } else if (module.flowType === FlowNodeTypeEnum.datasetSearchNode) { defaultAppForm.dataset.datasets = findInputValueByKey( @@ -104,17 +106,6 @@ export const appModules2Form = ({ modules }: { modules: ModuleItemType[] }) => { module.inputs, ModuleInputKeyEnum.datasetSearchExtensionBg ); - - // empty text - const emptyOutputs = - module.outputs.find((item) => item.key === ModuleOutputKeyEnum.datasetIsEmpty)?.targets || - []; - const emptyOutput = emptyOutputs[0]; - if (emptyOutput) { - const target = modules.find((item) => item.moduleId === emptyOutput.moduleId); - defaultAppForm.dataset.searchEmptyText = - target?.inputs?.find((item) => item.key === ModuleInputKeyEnum.answerText)?.value || ''; - } } else if (module.flowType === FlowNodeTypeEnum.userGuide) { const { welcomeText, variableModules, questionGuide, ttsConfig } = splitGuideModule( getGuideModule(modules) @@ -125,6 +116,18 @@ export const appModules2Form = ({ modules }: { modules: ModuleItemType[] }) => { questionGuide: questionGuide, tts: ttsConfig }; + } else if (module.flowType === FlowNodeTypeEnum.pluginModule) { + defaultAppForm.selectedTools.push({ + id: module.inputs.find((input) => input.key === ModuleInputKeyEnum.pluginId)?.value || '', + name: module.name, + avatar: module.avatar, + intro: module.intro || '', + flowType: module.flowType, + showStatus: module.showStatus, + inputs: module.inputs, + outputs: module.outputs, + templateType: FlowNodeTemplateTypeEnum.other + }); } }); diff --git a/packages/global/core/chat/adapt.ts b/packages/global/core/chat/adapt.ts index 31320e9d498..4e9709fb2f9 100644 --- a/packages/global/core/chat/adapt.ts +++ b/packages/global/core/chat/adapt.ts @@ -83,6 +83,7 @@ export const chats2GPTMessages = ({ }); } } else { + //AI item.value.forEach((value) => { if (value.type === ChatItemValueTypeEnum.tool && value.tools && reserveTool) { const tool_calls: ChatCompletionMessageToolCall[] = []; diff --git a/packages/global/core/chat/api.d.ts b/packages/global/core/chat/api.d.ts index 453303f43da..ee3d1ef34c7 100644 --- a/packages/global/core/chat/api.d.ts +++ b/packages/global/core/chat/api.d.ts @@ -3,6 +3,8 @@ export type UpdateChatFeedbackProps = { chatId: string; chatItemId: string; shareId?: string; + teamId?: string; + teamToken?: string; outLinkUid?: string; userBadFeedback?: string; userGoodFeedback?: string; diff --git a/packages/global/core/chat/type.d.ts b/packages/global/core/chat/type.d.ts index 211daef3e27..8ab87b390e9 100644 --- a/packages/global/core/chat/type.d.ts +++ b/packages/global/core/chat/type.d.ts @@ -141,7 +141,7 @@ export type ChatHistoryItemResType = DispatchNodeResponseType & { }; /* One tool run response */ -export type ToolRunResponseItemType = Record | Array; +export type ToolRunResponseItemType = any; /* tool module response */ export type ToolModuleResponseItemType = { id: string; diff --git a/packages/global/core/dataset/constants.ts b/packages/global/core/dataset/constants.ts index c744c0fc858..bd89bc8251a 100644 --- a/packages/global/core/dataset/constants.ts +++ b/packages/global/core/dataset/constants.ts @@ -154,8 +154,5 @@ export const SearchScoreTypeMap = { } }; -export const FolderIcon = 'file/fill/folder'; -export const FolderImgUrl = '/imgs/files/folder.svg'; - export const CustomCollectionIcon = 'common/linkBlue'; export const LinkCollectionIcon = 'common/linkBlue'; diff --git a/packages/global/core/module/api.d.ts b/packages/global/core/module/api.d.ts index 7ed7eee79c7..bc48dfddcb4 100644 --- a/packages/global/core/module/api.d.ts +++ b/packages/global/core/module/api.d.ts @@ -13,3 +13,10 @@ export type HttpQueryType = { variables: Record; [key: string]: any; }; + +/* http node */ +export type HttpParamAndHeaderItemType = { + key: string; + type: string; + value: string; +}; diff --git a/packages/global/core/module/constants.ts b/packages/global/core/module/constants.ts index 2bf5c9ed163..8dcabaacf86 100644 --- a/packages/global/core/module/constants.ts +++ b/packages/global/core/module/constants.ts @@ -1,4 +1,4 @@ -export enum ModuleTemplateTypeEnum { +export enum FlowNodeTemplateTypeEnum { userGuide = 'userGuide', systemInput = 'systemInput', tools = 'tools', @@ -87,7 +87,8 @@ export enum ModuleInputKeyEnum { runAppSelectApp = 'app', // plugin - pluginId = 'pluginId' + pluginId = 'pluginId', + pluginStart = 'pluginStart' } export enum ModuleOutputKeyEnum { @@ -117,7 +118,10 @@ export enum ModuleOutputKeyEnum { selectedTools = 'selectedTools', // http - httpRawResponse = 'httpRawResponse' + httpRawResponse = 'httpRawResponse', + + // plugin + pluginStart = 'pluginStart' } export enum VariableInputEnum { diff --git a/packages/global/core/module/node/constant.ts b/packages/global/core/module/node/constant.ts index 9f876097917..e2e4507f037 100644 --- a/packages/global/core/module/node/constant.ts +++ b/packages/global/core/module/node/constant.ts @@ -21,10 +21,12 @@ export enum FlowNodeInputTypeEnum { // ai model select selectLLMModel = 'selectLLMModel', + settingLLMModel = 'settingLLMModel', // dataset special input selectDataset = 'selectDataset', selectDatasetParamsModal = 'selectDatasetParamsModal', + settingDatasetQuotePrompt = 'settingDatasetQuotePrompt', hidden = 'hidden', custom = 'custom' @@ -57,7 +59,8 @@ export enum FlowNodeTypeEnum { pluginInput = 'pluginInput', pluginOutput = 'pluginOutput', queryExtension = 'cfr', - tools = 'tools' + tools = 'tools', + stopTool = 'stopTool' // abandon } diff --git a/packages/global/core/module/node/type.d.ts b/packages/global/core/module/node/type.d.ts index a643e0b501e..2a684bead9d 100644 --- a/packages/global/core/module/node/type.d.ts +++ b/packages/global/core/module/node/type.d.ts @@ -102,6 +102,13 @@ export type EditNodeFieldType = { }; /* ------------- item type --------------- */ +export type SettingAIDataType = { + model: string; + temperature: number; + maxToken: number; + isResponseAnswerText?: boolean; + maxHistories?: number; +}; /* ai chat modules props */ export type AIChatModuleProps = { [ModuleInputKeyEnum.aiModel]: string; diff --git a/packages/global/core/module/runtime/type.d.ts b/packages/global/core/module/runtime/type.d.ts index b0145467265..288e87fd99f 100644 --- a/packages/global/core/module/runtime/type.d.ts +++ b/packages/global/core/module/runtime/type.d.ts @@ -90,6 +90,7 @@ export type DispatchNodeResponseType = { // tool toolCallTokens?: number; toolDetail?: ChatHistoryItemResType[]; + toolStop?: boolean; }; export type DispatchNodeResultType = { diff --git a/packages/global/core/module/template/constants.ts b/packages/global/core/module/template/constants.ts index 2e4c673a093..5126fb24d47 100644 --- a/packages/global/core/module/template/constants.ts +++ b/packages/global/core/module/template/constants.ts @@ -8,7 +8,9 @@ import { ClassifyQuestionModule } from './system/classifyQuestion'; import { ContextExtractModule } from './system/contextExtract'; import { HttpModule468 } from './system/http468'; import { HttpModule } from './system/abandon/http'; + import { ToolModule } from './system/tools'; +import { StopToolNode } from './system/stopTool'; import { RunAppModule } from './system/runApp'; import { PluginInputModule } from './system/pluginInput'; @@ -16,11 +18,11 @@ import { PluginOutputModule } from './system/pluginOutput'; import { RunPluginModule } from './system/runPlugin'; import { AiQueryExtension } from './system/queryExtension'; -import type { FlowModuleTemplateType, moduleTemplateListType } from '../../module/type.d'; -import { ModuleTemplateTypeEnum } from '../../module/constants'; +import type { FlowNodeTemplateType, moduleTemplateListType } from '../../module/type.d'; +import { FlowNodeTemplateTypeEnum } from '../../module/constants'; /* app flow module templates */ -export const appSystemModuleTemplates: FlowModuleTemplateType[] = [ +export const appSystemModuleTemplates: FlowNodeTemplateType[] = [ UserGuideModule, UserInputModule, AiChatModule, @@ -29,13 +31,14 @@ export const appSystemModuleTemplates: FlowModuleTemplateType[] = [ DatasetConcatModule, RunAppModule, ToolModule, + StopToolNode, ClassifyQuestionModule, ContextExtractModule, HttpModule468, AiQueryExtension ]; /* plugin flow module templates */ -export const pluginSystemModuleTemplates: FlowModuleTemplateType[] = [ +export const pluginSystemModuleTemplates: FlowNodeTemplateType[] = [ PluginInputModule, PluginOutputModule, AiChatModule, @@ -44,6 +47,7 @@ export const pluginSystemModuleTemplates: FlowModuleTemplateType[] = [ DatasetConcatModule, RunAppModule, ToolModule, + StopToolNode, ClassifyQuestionModule, ContextExtractModule, HttpModule468, @@ -51,7 +55,7 @@ export const pluginSystemModuleTemplates: FlowModuleTemplateType[] = [ ]; /* all module */ -export const moduleTemplatesFlat: FlowModuleTemplateType[] = [ +export const moduleTemplatesFlat: FlowNodeTemplateType[] = [ UserGuideModule, UserInputModule, AiChatModule, @@ -63,6 +67,7 @@ export const moduleTemplatesFlat: FlowModuleTemplateType[] = [ HttpModule468, HttpModule, ToolModule, + StopToolNode, AiChatModule, RunAppModule, PluginInputModule, @@ -73,43 +78,43 @@ export const moduleTemplatesFlat: FlowModuleTemplateType[] = [ export const moduleTemplatesList: moduleTemplateListType = [ { - type: ModuleTemplateTypeEnum.userGuide, - label: 'core.module.template.Guide module', - list: [] - }, - { - type: ModuleTemplateTypeEnum.systemInput, - label: 'core.module.template.System input module', + type: FlowNodeTemplateTypeEnum.userGuide, + label: '', list: [] }, { - type: ModuleTemplateTypeEnum.textAnswer, + type: FlowNodeTemplateTypeEnum.textAnswer, label: 'core.module.template.Response module', list: [] }, { - type: ModuleTemplateTypeEnum.functionCall, + type: FlowNodeTemplateTypeEnum.functionCall, label: 'core.module.template.Function module', list: [] }, { - type: ModuleTemplateTypeEnum.tools, + type: FlowNodeTemplateTypeEnum.tools, label: 'core.module.template.Tool module', list: [] }, { - type: ModuleTemplateTypeEnum.externalCall, + type: FlowNodeTemplateTypeEnum.externalCall, label: 'core.module.template.External module', list: [] }, { - type: ModuleTemplateTypeEnum.personalPlugin, - label: 'core.module.template.My plugin module', + type: FlowNodeTemplateTypeEnum.personalPlugin, + label: '', list: [] }, { - type: ModuleTemplateTypeEnum.other, + type: FlowNodeTemplateTypeEnum.other, label: '其他', list: [] + }, + { + type: FlowNodeTemplateTypeEnum.systemInput, + label: 'core.module.template.System input module', + list: [] } ]; diff --git a/packages/global/core/module/template/input.ts b/packages/global/core/module/template/input.ts index 32e2787988c..16e5bb8d36d 100644 --- a/packages/global/core/module/template/input.ts +++ b/packages/global/core/module/template/input.ts @@ -59,7 +59,7 @@ export const Input_Template_DynamicInput: FlowNodeInputItemType = { hideInApp: true }; -export const Input_Template_AiModel: FlowNodeInputItemType = { +export const Input_Template_SelectAIModel: FlowNodeInputItemType = { key: ModuleInputKeyEnum.aiModel, type: FlowNodeInputTypeEnum.selectLLMModel, label: 'core.module.input.label.aiModel', @@ -68,6 +68,15 @@ export const Input_Template_AiModel: FlowNodeInputItemType = { showTargetInApp: false, showTargetInPlugin: false }; +export const Input_Template_SettingAiModel: FlowNodeInputItemType = { + key: ModuleInputKeyEnum.aiModel, + type: FlowNodeInputTypeEnum.settingLLMModel, + label: 'core.module.input.label.aiModel', + required: true, + valueType: ModuleIOValueTypeEnum.string, + showTargetInApp: false, + showTargetInPlugin: false +}; export const Input_Template_System_Prompt: FlowNodeInputItemType = { key: ModuleInputKeyEnum.aiSystemPrompt, @@ -83,7 +92,7 @@ export const Input_Template_System_Prompt: FlowNodeInputItemType = { export const Input_Template_Dataset_Quote: FlowNodeInputItemType = { key: ModuleInputKeyEnum.aiChatDatasetQuote, - type: FlowNodeInputTypeEnum.target, + type: FlowNodeInputTypeEnum.settingDatasetQuotePrompt, label: '知识库引用', description: 'core.module.Dataset quote.Input description', valueType: ModuleIOValueTypeEnum.datasetQuote, diff --git a/packages/global/core/module/template/system/abandon/http.ts b/packages/global/core/module/template/system/abandon/http.ts index ad3d44bf60f..3b991a59dc7 100644 --- a/packages/global/core/module/template/system/abandon/http.ts +++ b/packages/global/core/module/template/system/abandon/http.ts @@ -3,11 +3,11 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../../node/constant'; -import { FlowModuleTemplateType } from '../../../type'; +import { FlowNodeTemplateType } from '../../../type'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../../constants'; import { Input_Template_AddInputParam, @@ -16,9 +16,9 @@ import { } from '../../input'; import { Output_Template_AddOutput, Output_Template_Finish } from '../../output'; -export const HttpModule: FlowModuleTemplateType = { +export const HttpModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.httpRequest, - templateType: ModuleTemplateTypeEnum.externalCall, + templateType: FlowNodeTemplateTypeEnum.externalCall, flowType: FlowNodeTypeEnum.httpRequest, avatar: '/imgs/module/http.png', name: 'core.module.template.Http request', diff --git a/packages/global/core/module/template/system/aiChat.ts b/packages/global/core/module/template/system/aiChat.ts index d652a89f7d2..d5b9ab3a688 100644 --- a/packages/global/core/module/template/system/aiChat.ts +++ b/packages/global/core/module/template/system/aiChat.ts @@ -3,15 +3,15 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; import { - Input_Template_AiModel, + Input_Template_SettingAiModel, Input_Template_Dataset_Quote, Input_Template_History, Input_Template_Switch, @@ -21,18 +21,18 @@ import { import { chatNodeSystemPromptTip } from '../tip'; import { Output_Template_Finish, Output_Template_UserChatInput } from '../output'; -export const AiChatModule: FlowModuleTemplateType = { +export const AiChatModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.chatNode, - templateType: ModuleTemplateTypeEnum.textAnswer, + templateType: FlowNodeTemplateTypeEnum.textAnswer, flowType: FlowNodeTypeEnum.chatNode, avatar: '/imgs/module/AI.png', name: 'AI 对话', intro: 'AI 大模型对话', showStatus: true, - // isTool: true, + isTool: true, inputs: [ Input_Template_Switch, - Input_Template_AiModel, + Input_Template_SettingAiModel, // --- settings modal { key: ModuleInputKeyEnum.aiChatTemperature, @@ -83,14 +83,6 @@ export const AiChatModule: FlowModuleTemplateType = { showTargetInApp: false, showTargetInPlugin: false }, - { - key: ModuleInputKeyEnum.aiChatSettingModal, - type: FlowNodeInputTypeEnum.aiSettings, - label: '', - valueType: ModuleIOValueTypeEnum.any, - showTargetInApp: false, - showTargetInPlugin: false - }, // settings modal --- { ...Input_Template_System_Prompt, diff --git a/packages/global/core/module/template/system/assignedAnswer.ts b/packages/global/core/module/template/system/assignedAnswer.ts index a902a70dcf0..6fbf04643b5 100644 --- a/packages/global/core/module/template/system/assignedAnswer.ts +++ b/packages/global/core/module/template/system/assignedAnswer.ts @@ -1,12 +1,16 @@ import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; -import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants'; +import { FlowNodeTemplateType } from '../../type.d'; +import { + ModuleIOValueTypeEnum, + ModuleInputKeyEnum, + FlowNodeTemplateTypeEnum +} from '../../constants'; import { Input_Template_Switch } from '../input'; import { Output_Template_Finish } from '../output'; -export const AssignedAnswerModule: FlowModuleTemplateType = { +export const AssignedAnswerModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.answerNode, - templateType: ModuleTemplateTypeEnum.textAnswer, + templateType: FlowNodeTemplateTypeEnum.textAnswer, flowType: FlowNodeTypeEnum.answerNode, avatar: '/imgs/module/reply.png', name: '指定回复', diff --git a/packages/global/core/module/template/system/classifyQuestion.ts b/packages/global/core/module/template/system/classifyQuestion.ts index af0d26a35cf..0f733c8958c 100644 --- a/packages/global/core/module/template/system/classifyQuestion.ts +++ b/packages/global/core/module/template/system/classifyQuestion.ts @@ -3,10 +3,14 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; -import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants'; +import { FlowNodeTemplateType } from '../../type.d'; import { - Input_Template_AiModel, + ModuleIOValueTypeEnum, + ModuleInputKeyEnum, + FlowNodeTemplateTypeEnum +} from '../../constants'; +import { + Input_Template_SelectAIModel, Input_Template_History, Input_Template_Switch, Input_Template_UserChatInput @@ -15,9 +19,9 @@ import { Output_Template_UserChatInput } from '../output'; import { Input_Template_System_Prompt } from '../input'; import { LLMModelTypeEnum } from '../../../ai/constants'; -export const ClassifyQuestionModule: FlowModuleTemplateType = { +export const ClassifyQuestionModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.classifyQuestion, - templateType: ModuleTemplateTypeEnum.functionCall, + templateType: FlowNodeTemplateTypeEnum.functionCall, flowType: FlowNodeTypeEnum.classifyQuestion, avatar: '/imgs/module/cq.png', name: '问题分类', @@ -26,7 +30,7 @@ export const ClassifyQuestionModule: FlowModuleTemplateType = { inputs: [ Input_Template_Switch, { - ...Input_Template_AiModel, + ...Input_Template_SelectAIModel, llmModelType: LLMModelTypeEnum.classify }, { diff --git a/packages/global/core/module/template/system/contextExtract.ts b/packages/global/core/module/template/system/contextExtract.ts index 003e2fa8b03..fa444ad7a56 100644 --- a/packages/global/core/module/template/system/contextExtract.ts +++ b/packages/global/core/module/template/system/contextExtract.ts @@ -3,19 +3,23 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; -import { Input_Template_AiModel, Input_Template_History, Input_Template_Switch } from '../input'; +import { + Input_Template_SelectAIModel, + Input_Template_History, + Input_Template_Switch +} from '../input'; import { LLMModelTypeEnum } from '../../../ai/constants'; -export const ContextExtractModule: FlowModuleTemplateType = { +export const ContextExtractModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.contentExtract, - templateType: ModuleTemplateTypeEnum.functionCall, + templateType: FlowNodeTemplateTypeEnum.functionCall, flowType: FlowNodeTypeEnum.contentExtract, avatar: '/imgs/module/extract.png', name: '文本内容提取', @@ -25,7 +29,7 @@ export const ContextExtractModule: FlowModuleTemplateType = { inputs: [ Input_Template_Switch, { - ...Input_Template_AiModel, + ...Input_Template_SelectAIModel, llmModelType: LLMModelTypeEnum.extractFields }, { @@ -35,7 +39,6 @@ export const ContextExtractModule: FlowModuleTemplateType = { label: '提取要求描述', description: '给AI一些对应的背景知识或要求描述,引导AI更好的完成任务。\n该输入框可使用全局变量。', - required: true, placeholder: '例如: \n1. 当前时间为: {{cTime}}。你是一个实验室预约助手,你的任务是帮助用户预约实验室,从文本中获取对应的预约信息。\n2. 你是谷歌搜索助手,需要从文本中提取出合适的搜索词。', showTargetInApp: true, diff --git a/packages/global/core/module/template/system/datasetConcat.ts b/packages/global/core/module/template/system/datasetConcat.ts index 0d64bc6e948..ec929b5221d 100644 --- a/packages/global/core/module/template/system/datasetConcat.ts +++ b/packages/global/core/module/template/system/datasetConcat.ts @@ -3,12 +3,12 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; import { Input_Template_Dataset_Quote, Input_Template_Switch } from '../input'; import { Output_Template_Finish } from '../output'; @@ -20,10 +20,10 @@ export const getOneQuoteInputTemplate = (key = getNanoid()) => ({ type: FlowNodeInputTypeEnum.hidden }); -export const DatasetConcatModule: FlowModuleTemplateType = { +export const DatasetConcatModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.datasetConcatNode, flowType: FlowNodeTypeEnum.datasetConcatNode, - templateType: ModuleTemplateTypeEnum.tools, + templateType: FlowNodeTemplateTypeEnum.other, avatar: '/imgs/module/concat.svg', name: '知识库搜索引用合并', intro: '可以将多个知识库搜索结果进行合并输出。使用 RRF 的合并方式进行最终排序输出。', diff --git a/packages/global/core/module/template/system/datasetSearch.ts b/packages/global/core/module/template/system/datasetSearch.ts index d61306d58ea..b831de62da1 100644 --- a/packages/global/core/module/template/system/datasetSearch.ts +++ b/packages/global/core/module/template/system/datasetSearch.ts @@ -3,20 +3,20 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; import { Input_Template_Switch, Input_Template_UserChatInput } from '../input'; import { Output_Template_Finish, Output_Template_UserChatInput } from '../output'; import { DatasetSearchModeEnum } from '../../../dataset/constants'; -export const DatasetSearchModule: FlowModuleTemplateType = { +export const DatasetSearchModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.datasetSearchNode, - templateType: ModuleTemplateTypeEnum.functionCall, + templateType: FlowNodeTemplateTypeEnum.functionCall, flowType: FlowNodeTypeEnum.datasetSearchNode, avatar: '/imgs/module/db.png', name: '知识库搜索', diff --git a/packages/global/core/module/template/system/http468.ts b/packages/global/core/module/template/system/http468.ts index d86e5e13f19..3d556583fcc 100644 --- a/packages/global/core/module/template/system/http468.ts +++ b/packages/global/core/module/template/system/http468.ts @@ -3,12 +3,12 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type'; +import { FlowNodeTemplateType } from '../../type'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; import { Input_Template_AddInputParam, @@ -17,9 +17,9 @@ import { } from '../input'; import { Output_Template_AddOutput, Output_Template_Finish } from '../output'; -export const HttpModule468: FlowModuleTemplateType = { +export const HttpModule468: FlowNodeTemplateType = { id: FlowNodeTypeEnum.httpRequest468, - templateType: ModuleTemplateTypeEnum.externalCall, + templateType: FlowNodeTemplateTypeEnum.externalCall, flowType: FlowNodeTypeEnum.httpRequest468, avatar: '/imgs/module/http.png', name: 'HTTP 请求', diff --git a/packages/global/core/module/template/system/pluginInput.ts b/packages/global/core/module/template/system/pluginInput.ts index 273c1f29c4c..4e8384ee930 100644 --- a/packages/global/core/module/template/system/pluginInput.ts +++ b/packages/global/core/module/template/system/pluginInput.ts @@ -1,15 +1,43 @@ -import { ModuleTemplateTypeEnum } from '../../constants'; -import { FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { + FlowNodeTemplateTypeEnum, + ModuleIOValueTypeEnum, + ModuleInputKeyEnum, + ModuleOutputKeyEnum +} from '../../constants'; +import { + FlowNodeInputTypeEnum, + FlowNodeOutputTypeEnum, + FlowNodeTypeEnum +} from '../../node/constant'; +import { FlowNodeTemplateType } from '../../type.d'; -export const PluginInputModule: FlowModuleTemplateType = { +export const PluginInputModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.pluginInput, - templateType: ModuleTemplateTypeEnum.systemInput, + templateType: FlowNodeTemplateTypeEnum.systemInput, flowType: FlowNodeTypeEnum.pluginInput, avatar: '/imgs/module/input.png', name: '定义插件输入', intro: '自定义配置外部输入,使用插件时,仅暴露自定义配置的输入', showStatus: false, - inputs: [], - outputs: [] + inputs: [ + { + key: ModuleInputKeyEnum.pluginStart, + type: FlowNodeInputTypeEnum.hidden, + valueType: ModuleIOValueTypeEnum.boolean, + label: '插件开始运行', + description: + '插件开始运行时,会输出一个 True 的标识。有时候,插件不会有额外的的输入,为了顺利的进入下一个阶段,你可以将该值连接到下一个节点的触发器中。', + showTargetInApp: true, + showTargetInPlugin: true + } + ], + outputs: [ + { + key: ModuleOutputKeyEnum.pluginStart, + label: '插件开始运行', + type: FlowNodeOutputTypeEnum.source, + valueType: ModuleIOValueTypeEnum.boolean, + targets: [] + } + ] }; diff --git a/packages/global/core/module/template/system/pluginOutput.ts b/packages/global/core/module/template/system/pluginOutput.ts index 8017bb87956..b2f46e99cd5 100644 --- a/packages/global/core/module/template/system/pluginOutput.ts +++ b/packages/global/core/module/template/system/pluginOutput.ts @@ -1,10 +1,10 @@ -import { ModuleTemplateTypeEnum } from '../../constants'; +import { FlowNodeTemplateTypeEnum } from '../../constants'; import { FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; -export const PluginOutputModule: FlowModuleTemplateType = { +export const PluginOutputModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.pluginOutput, - templateType: ModuleTemplateTypeEnum.systemInput, + templateType: FlowNodeTemplateTypeEnum.systemInput, flowType: FlowNodeTypeEnum.pluginOutput, avatar: '/imgs/module/output.png', name: '定义插件输出', diff --git a/packages/global/core/module/template/system/queryExtension.ts b/packages/global/core/module/template/system/queryExtension.ts index e33e3ecb2a0..c5180b71121 100644 --- a/packages/global/core/module/template/system/queryExtension.ts +++ b/packages/global/core/module/template/system/queryExtension.ts @@ -3,25 +3,25 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type'; +import { FlowNodeTemplateType } from '../../type'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; import { Input_Template_History, Input_Template_Switch, Input_Template_UserChatInput, - Input_Template_AiModel + Input_Template_SelectAIModel } from '../input'; import { Output_Template_UserChatInput } from '../output'; import { LLMModelTypeEnum } from '../../../ai/constants'; -export const AiQueryExtension: FlowModuleTemplateType = { +export const AiQueryExtension: FlowNodeTemplateType = { id: FlowNodeTypeEnum.chatNode, - templateType: ModuleTemplateTypeEnum.other, + templateType: FlowNodeTemplateTypeEnum.other, flowType: FlowNodeTypeEnum.queryExtension, avatar: '/imgs/module/cfr.svg', name: '问题优化', @@ -31,7 +31,7 @@ export const AiQueryExtension: FlowModuleTemplateType = { inputs: [ Input_Template_Switch, { - ...Input_Template_AiModel, + ...Input_Template_SelectAIModel, llmModelType: LLMModelTypeEnum.queryExtension }, { diff --git a/packages/global/core/module/template/system/runApp.ts b/packages/global/core/module/template/system/runApp.ts index 3c6976e4f7a..eca1420fbea 100644 --- a/packages/global/core/module/template/system/runApp.ts +++ b/packages/global/core/module/template/system/runApp.ts @@ -3,12 +3,12 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; import { Input_Template_History, @@ -17,9 +17,9 @@ import { } from '../input'; import { Output_Template_Finish, Output_Template_UserChatInput } from '../output'; -export const RunAppModule: FlowModuleTemplateType = { +export const RunAppModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.runApp, - templateType: ModuleTemplateTypeEnum.externalCall, + templateType: FlowNodeTemplateTypeEnum.externalCall, flowType: FlowNodeTypeEnum.runApp, avatar: '/imgs/module/app.png', name: '应用调用', diff --git a/packages/global/core/module/template/system/runPlugin.ts b/packages/global/core/module/template/system/runPlugin.ts index 9889016750e..77a9802dce1 100644 --- a/packages/global/core/module/template/system/runPlugin.ts +++ b/packages/global/core/module/template/system/runPlugin.ts @@ -1,10 +1,10 @@ -import { ModuleTemplateTypeEnum } from '../../constants'; +import { FlowNodeTemplateTypeEnum } from '../../constants'; import { FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; -export const RunPluginModule: FlowModuleTemplateType = { +export const RunPluginModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.pluginModule, - templateType: ModuleTemplateTypeEnum.externalCall, + templateType: FlowNodeTemplateTypeEnum.externalCall, flowType: FlowNodeTypeEnum.pluginModule, intro: '', name: '', diff --git a/packages/global/core/module/template/system/stopTool.ts b/packages/global/core/module/template/system/stopTool.ts new file mode 100644 index 00000000000..c14f610dffa --- /dev/null +++ b/packages/global/core/module/template/system/stopTool.ts @@ -0,0 +1,16 @@ +import { FlowNodeTypeEnum } from '../../node/constant'; +import { FlowNodeTemplateType } from '../../type.d'; +import { FlowNodeTemplateTypeEnum } from '../../constants'; +import { Input_Template_Switch } from '../input'; + +export const StopToolNode: FlowNodeTemplateType = { + id: FlowNodeTypeEnum.stopTool, + templateType: FlowNodeTemplateTypeEnum.functionCall, + flowType: FlowNodeTypeEnum.stopTool, + avatar: '/imgs/module/toolStop.svg', + name: '工具调用终止', + intro: + '该模块需配置工具调用使用。当该模块被执行时,本次工具调用将会强制结束,并且不再调用AI针对工具调用结果回答问题。', + inputs: [Input_Template_Switch], + outputs: [] +}; diff --git a/packages/global/core/module/template/system/tools.ts b/packages/global/core/module/template/system/tools.ts index 73175b7b427..fc1bc3ca327 100644 --- a/packages/global/core/module/template/system/tools.ts +++ b/packages/global/core/module/template/system/tools.ts @@ -1,12 +1,17 @@ -import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { + FlowNodeInputTypeEnum, + FlowNodeOutputTypeEnum, + FlowNodeTypeEnum +} from '../../node/constant'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum, + ModuleInputKeyEnum } from '../../constants'; import { - Input_Template_AiModel, + Input_Template_SettingAiModel, Input_Template_History, Input_Template_Switch, Input_Template_System_Prompt, @@ -16,19 +21,43 @@ import { chatNodeSystemPromptTip } from '../tip'; import { Output_Template_Finish, Output_Template_UserChatInput } from '../output'; import { LLMModelTypeEnum } from '../../../ai/constants'; -export const ToolModule: FlowModuleTemplateType = { +export const ToolModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.tools, flowType: FlowNodeTypeEnum.tools, - templateType: ModuleTemplateTypeEnum.functionCall, + templateType: FlowNodeTemplateTypeEnum.functionCall, avatar: '/imgs/module/tool.svg', name: '工具调用(实验)', - intro: '通过AI模型自动选择一个或多个工具进行调用。工具可以是其他功能块或插件。', + intro: '通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。', showStatus: true, inputs: [ Input_Template_Switch, { - ...Input_Template_AiModel, - llmModelType: LLMModelTypeEnum.toolCall + ...Input_Template_SettingAiModel, + llmModelType: LLMModelTypeEnum.all + }, + { + key: ModuleInputKeyEnum.aiChatTemperature, + type: FlowNodeInputTypeEnum.hidden, // Set in the pop-up window + label: '', + value: 0, + valueType: ModuleIOValueTypeEnum.number, + min: 0, + max: 10, + step: 1, + showTargetInApp: false, + showTargetInPlugin: false + }, + { + key: ModuleInputKeyEnum.aiChatMaxToken, + type: FlowNodeInputTypeEnum.hidden, // Set in the pop-up window + label: '', + value: 2000, + valueType: ModuleIOValueTypeEnum.number, + min: 100, + max: 4000, + step: 50, + showTargetInApp: false, + showTargetInPlugin: false }, { ...Input_Template_System_Prompt, diff --git a/packages/global/core/module/template/system/userGuide.ts b/packages/global/core/module/template/system/userGuide.ts index b0ab565172f..b3b6507fc8a 100644 --- a/packages/global/core/module/template/system/userGuide.ts +++ b/packages/global/core/module/template/system/userGuide.ts @@ -1,11 +1,15 @@ import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { userGuideTip } from '../tip'; -import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleTemplateTypeEnum } from '../../constants'; +import { + ModuleIOValueTypeEnum, + ModuleInputKeyEnum, + FlowNodeTemplateTypeEnum +} from '../../constants'; -export const UserGuideModule: FlowModuleTemplateType = { +export const UserGuideModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.userGuide, - templateType: ModuleTemplateTypeEnum.userGuide, + templateType: FlowNodeTemplateTypeEnum.userGuide, flowType: FlowNodeTypeEnum.userGuide, avatar: '/imgs/module/userGuide.png', name: '全局配置', diff --git a/packages/global/core/module/template/system/userInput.ts b/packages/global/core/module/template/system/userInput.ts index bab65955ff1..abbbeae5094 100644 --- a/packages/global/core/module/template/system/userInput.ts +++ b/packages/global/core/module/template/system/userInput.ts @@ -3,17 +3,17 @@ import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { FlowModuleTemplateType } from '../../type.d'; +import { FlowNodeTemplateType } from '../../type.d'; import { ModuleIOValueTypeEnum, ModuleInputKeyEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum + FlowNodeTemplateTypeEnum } from '../../constants'; -export const UserInputModule: FlowModuleTemplateType = { +export const UserInputModule: FlowNodeTemplateType = { id: FlowNodeTypeEnum.questionInput, - templateType: ModuleTemplateTypeEnum.systemInput, + templateType: FlowNodeTemplateTypeEnum.systemInput, flowType: FlowNodeTypeEnum.questionInput, avatar: '/imgs/module/userChatInput.svg', name: '对话入口', diff --git a/packages/global/core/module/type.d.ts b/packages/global/core/module/type.d.ts index 349938169ee..3d8122aab9e 100644 --- a/packages/global/core/module/type.d.ts +++ b/packages/global/core/module/type.d.ts @@ -2,7 +2,7 @@ import { FlowNodeTypeEnum } from './node/constant'; import { ModuleIOValueTypeEnum, ModuleOutputKeyEnum, - ModuleTemplateTypeEnum, + FlowNodeTemplateTypeEnum, VariableInputEnum } from './constants'; import { DispatchNodeResponseKeyEnum } from './runtime/constants'; @@ -15,10 +15,11 @@ import { } from '../chat/type'; import { ChatNodeUsageType } from '../../support/wallet/bill/type'; import { RunningModuleItemType } from './runtime/type'; +import { PluginTypeEnum } from 'core/plugin/constants'; -export type FlowModuleTemplateType = { +export type FlowNodeTemplateType = { id: string; // module id, unique - templateType: `${ModuleTemplateTypeEnum}`; + templateType: `${FlowNodeTemplateTypeEnum}`; flowType: `${FlowNodeTypeEnum}`; // render node card avatar?: string; name: string; @@ -27,14 +28,18 @@ export type FlowModuleTemplateType = { showStatus?: boolean; // chatting response step status inputs: FlowNodeInputItemType[]; outputs: FlowNodeOutputItemType[]; + + // plugin data + pluginType?: `${PluginTypeEnum}`; + parentId?: string; }; -export type FlowModuleItemType = FlowModuleTemplateType & { +export type FlowModuleItemType = FlowNodeTemplateType & { moduleId: string; }; export type moduleTemplateListType = { - type: `${ModuleTemplateTypeEnum}`; + type: `${FlowNodeTemplateTypeEnum}`; label: string; - list: FlowModuleTemplateType[]; + list: FlowNodeTemplateType[]; }[]; // store module type diff --git a/packages/global/core/module/utils.ts b/packages/global/core/module/utils.ts index 107abd7140e..012fdb0a665 100644 --- a/packages/global/core/module/utils.ts +++ b/packages/global/core/module/utils.ts @@ -9,6 +9,7 @@ import { FlowNodeInputItemType, FlowNodeOutputItemType } from './node/type'; import { AppTTSConfigType, ModuleItemType, VariableItemType } from './type'; import { Input_Template_Switch } from './template/input'; import { EditorVariablePickerType } from '../../../web/components/common/Textarea/PromptEditor/type'; +import { Output_Template_Finish } from './template/output'; /* module */ export const getGuideModule = (modules: ModuleItemType[]) => @@ -92,13 +93,16 @@ export const plugin2ModuleIO = ( connected: false })) ] - : [], + : [Input_Template_Switch], outputs: pluginOutput - ? pluginOutput.outputs.map((item) => ({ - ...item, - edit: false - })) - : [] + ? [ + ...pluginOutput.outputs.map((item) => ({ + ...item, + edit: false + })), + Output_Template_Finish + ] + : [Output_Template_Finish] }; }; diff --git a/packages/global/core/plugin/constants.ts b/packages/global/core/plugin/constants.ts index 35d07e46d18..1011e18cfc1 100644 --- a/packages/global/core/plugin/constants.ts +++ b/packages/global/core/plugin/constants.ts @@ -27,6 +27,26 @@ export const defaultModules: ModuleItemType[] = [ } ]; +export enum PluginTypeEnum { + folder = 'folder', + custom = 'custom', + http = 'http' +} +export const pluginTypeMap = { + [PluginTypeEnum.folder]: { + label: '文件夹', + icon: 'file/fill/folder' + }, + [PluginTypeEnum.custom]: { + label: '自定义', + icon: 'common/custom' + }, + [PluginTypeEnum.http]: { + label: 'HTTP', + icon: 'common/http' + } +}; + export enum PluginSourceEnum { personal = 'personal', community = 'community', diff --git a/packages/global/core/plugin/controller.d.ts b/packages/global/core/plugin/controller.d.ts index 4e1d7c7d202..155aa6148a6 100644 --- a/packages/global/core/plugin/controller.d.ts +++ b/packages/global/core/plugin/controller.d.ts @@ -1,21 +1,40 @@ import type { ModuleItemType } from '../module/type.d'; +import { PluginTypeEnum } from './constants'; +import { HttpAuthMethodType } from './httpPlugin/type'; export type CreateOnePluginParams = { name: string; avatar: string; intro: string; - modules?: ModuleItemType[]; + modules: ModuleItemType[]; + parentId: string | null; + type: `${PluginTypeEnum}`; + metadata?: { + apiSchemaStr?: string; + customHeaders?: string; + }; }; export type UpdatePluginParams = { id: string; + parentId?: string | null; name?: string; avatar?: string; intro?: string; modules?: ModuleItemType[]; + metadata?: { + apiSchemaStr?: string; + customHeaders?: string; + }; }; export type PluginListItemType = { _id: string; + parentId: string; + type: `${PluginTypeEnum}`; name: string; avatar: string; intro: string; + metadata?: { + apiSchemaStr?: string; + customHeaders?: string; + }; }; diff --git a/packages/global/core/plugin/httpPlugin/type.d.ts b/packages/global/core/plugin/httpPlugin/type.d.ts new file mode 100644 index 00000000000..857947dad1d --- /dev/null +++ b/packages/global/core/plugin/httpPlugin/type.d.ts @@ -0,0 +1,13 @@ +export type PathDataType = { + name: string; + description: string; + method: string; + path: string; + params: any[]; + request: any; +}; + +export type OpenApiJsonSchema = { + pathData: PathDataType[]; + serverPath: string; +}; diff --git a/packages/global/core/plugin/httpPlugin/utils.ts b/packages/global/core/plugin/httpPlugin/utils.ts new file mode 100644 index 00000000000..c7187872266 --- /dev/null +++ b/packages/global/core/plugin/httpPlugin/utils.ts @@ -0,0 +1,516 @@ +import { getNanoid } from '../../../common/string/tools'; +import { OpenApiJsonSchema } from './type'; +import yaml from 'js-yaml'; +import { OpenAPIV3 } from 'openapi-types'; +import { PluginTypeEnum } from '../constants'; +import { FlowNodeInputItemType, FlowNodeOutputItemType } from '../../module/node/type'; +import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum } from '../../module/node/constant'; +import { ModuleIOValueTypeEnum } from '../../module/constants'; +import { PluginInputModule } from '../../module/template/system/pluginInput'; +import { PluginOutputModule } from '../../module/template/system/pluginOutput'; +import { HttpModule468 } from '../../module/template/system/http468'; +import { HttpParamAndHeaderItemType } from '../../module/api'; +import { CreateOnePluginParams } from '../controller'; +import { ModuleItemType } from '../../module/type'; +import { HttpImgUrl } from '../../../common/file/image/constants'; + +export const str2OpenApiSchema = (yamlStr = ''): OpenApiJsonSchema => { + try { + const data: OpenAPIV3.Document = (() => { + try { + return JSON.parse(yamlStr); + } catch (jsonError) { + return yaml.load(yamlStr, { schema: yaml.FAILSAFE_SCHEMA }); + } + })(); + + const serverPath = data.servers?.[0].url || ''; + const pathData = Object.keys(data.paths) + .map((path) => { + const methodData: any = data.paths[path]; + return Object.keys(methodData) + .filter((method) => + ['get', 'post', 'put', 'delete', 'patch'].includes(method.toLocaleLowerCase()) + ) + .map((method) => { + const methodInfo = methodData[method]; + if (methodInfo.deprecated) return; + const result = { + path, + method, + name: methodInfo.operationId || path, + description: methodInfo.description, + params: methodInfo.parameters, + request: methodInfo?.requestBody + }; + return result; + }); + }) + .flat() + .filter(Boolean) as OpenApiJsonSchema['pathData']; + + return { pathData, serverPath }; + } catch (err) { + throw new Error('Invalid Schema'); + } +}; + +export const httpApiSchema2Plugins = ({ + parentId, + apiSchemaStr = '', + customHeader = '' +}: { + parentId: string; + apiSchemaStr?: string; + customHeader?: string; +}): CreateOnePluginParams[] => { + const jsonSchema = str2OpenApiSchema(apiSchemaStr); + const baseUrl = jsonSchema.serverPath; + + return jsonSchema.pathData.map((item) => { + const pluginOutputId = getNanoid(); + const httpId = getNanoid(); + const pluginOutputKey = 'result'; + + const properties = item.request?.content?.['application/json']?.schema?.properties; + const propsKeys = properties ? Object.keys(properties) : []; + + const pluginInputs: FlowNodeInputItemType[] = [ + ...(item.params?.map((param: any) => { + return { + key: param.name, + valueType: ModuleIOValueTypeEnum.string, + label: param.name, + type: FlowNodeInputTypeEnum.target, + required: param.required, + description: param.description, + edit: true, + editField: { + key: true, + name: true, + description: true, + required: true, + dataType: true, + inputType: true, + isToolInput: true + }, + connected: true, + toolDescription: param.description + }; + }) || []), + ...(propsKeys?.map((key) => { + const prop = properties[key]; + return { + key, + valueType: ModuleIOValueTypeEnum.string, + label: key, + type: FlowNodeInputTypeEnum.target, + required: false, + description: prop.description, + edit: true, + editField: { + key: true, + name: true, + description: true, + required: true, + dataType: true, + inputType: true, + isToolInput: true + }, + connected: true, + toolDescription: prop.description + }; + }) || []) + ]; + + const pluginOutputs: FlowNodeOutputItemType[] = [ + ...(item.params?.map((param: any) => { + return { + key: param.name, + valueType: ModuleIOValueTypeEnum.string, + label: param.name, + type: FlowNodeOutputTypeEnum.source, + edit: true, + targets: [ + { + moduleId: httpId, + key: param.name + } + ] + }; + }) || []), + ...(propsKeys?.map((key) => { + return { + key, + valueType: ModuleIOValueTypeEnum.string, + label: key, + type: FlowNodeOutputTypeEnum.source, + edit: true, + targets: [ + { + moduleId: httpId, + key + } + ] + }; + }) || []) + ]; + + const httpInputs: FlowNodeInputItemType[] = [ + ...(item.params?.map((param: any) => { + return { + key: param.name, + valueType: ModuleIOValueTypeEnum.string, + label: param.name, + type: FlowNodeInputTypeEnum.target, + description: param.description, + edit: true, + editField: { + key: true, + description: true, + dataType: true + }, + connected: true + }; + }) || []), + ...(propsKeys?.map((key) => { + const prop = properties[key]; + return { + key, + valueType: ModuleIOValueTypeEnum.string, + label: key, + type: FlowNodeInputTypeEnum.target, + description: prop.description, + edit: true, + editField: { + key: true, + description: true, + dataType: true + }, + connected: true + }; + }) || []) + ]; + + /* http node setting */ + const httpNodeParams: HttpParamAndHeaderItemType[] = []; + const httpNodeHeaders: HttpParamAndHeaderItemType[] = []; + let httpNodeBody = '{}'; + const requestUrl = `${baseUrl}${item.path}`; + + if (item.params && item.params.length > 0) { + for (const param of item.params) { + if (param.in === 'header') { + httpNodeHeaders.push({ + key: param.name, + type: param.schema?.type || ModuleIOValueTypeEnum.string, + value: `{{${param.name}}}` + }); + } else if (param.in === 'body') { + httpNodeBody = JSON.stringify( + { ...JSON.parse(httpNodeBody), [param.name]: `{{${param.name}}}` }, + null, + 2 + ); + } else if (param.in === 'query') { + httpNodeParams.push({ + key: param.name, + type: param.schema?.type || ModuleIOValueTypeEnum.string, + value: `{{${param.name}}}` + }); + } + } + } + if (item.request) { + const properties = item.request?.content?.['application/json']?.schema?.properties; + const keys = Object.keys(properties); + if (keys.length > 0) { + httpNodeBody = JSON.stringify( + keys.reduce((acc: any, key) => { + acc[key] = `{{${key}}}`; + return acc; + }, {}), + null, + 2 + ); + } + } + if (customHeader) { + const headersObj = (() => { + try { + return JSON.parse(customHeader) as Record; + } catch (err) { + return {}; + } + })(); + for (const key in headersObj) { + httpNodeHeaders.push({ + key, + type: 'string', + // @ts-ignore + value: headersObj[key] + }); + } + } + + /* Combine complete modules */ + const modules: ModuleItemType[] = [ + { + moduleId: getNanoid(), + name: PluginInputModule.name, + intro: PluginInputModule.intro, + avatar: PluginInputModule.avatar, + flowType: PluginInputModule.flowType, + showStatus: PluginInputModule.showStatus, + position: { + x: 616.4226348688949, + y: -165.05298493910115 + }, + inputs: [ + { + key: 'pluginStart', + type: 'hidden', + valueType: 'boolean', + label: '插件开始运行', + description: + '插件开始运行时,会输出一个 True 的标识。有时候,插件不会有额外的的输入,为了顺利的进入下一个阶段,你可以将该值连接到下一个节点的触发器中。', + showTargetInApp: true, + showTargetInPlugin: true, + connected: true + }, + ...pluginInputs + ], + outputs: [ + { + key: 'pluginStart', + label: '插件开始运行', + type: 'source', + valueType: 'boolean', + targets: + pluginOutputs.length === 0 + ? [ + { + moduleId: httpId, + key: 'switch' + } + ] + : [] + }, + ...pluginOutputs + ] + }, + { + moduleId: pluginOutputId, + name: PluginOutputModule.name, + intro: PluginOutputModule.intro, + avatar: PluginOutputModule.avatar, + flowType: PluginOutputModule.flowType, + showStatus: PluginOutputModule.showStatus, + position: { + x: 1607.7142331269126, + y: -151.8669210746189 + }, + inputs: [ + { + key: pluginOutputKey, + valueType: 'string', + label: pluginOutputKey, + type: 'target', + required: true, + description: '', + edit: true, + editField: { + key: true, + name: true, + description: true, + required: false, + dataType: true, + inputType: false + }, + connected: true + } + ], + outputs: [ + { + key: pluginOutputKey, + valueType: 'string', + label: pluginOutputKey, + type: 'source', + edit: true, + targets: [] + } + ] + }, + { + moduleId: httpId, + name: HttpModule468.name, + intro: HttpModule468.intro, + avatar: HttpModule468.avatar, + flowType: HttpModule468.flowType, + showStatus: true, + position: { + x: 1042.549746602742, + y: -447.77496332641647 + }, + inputs: [ + { + key: 'switch', + type: 'target', + label: 'core.module.input.label.switch', + description: 'core.module.input.description.Trigger', + valueType: 'any', + showTargetInApp: true, + showTargetInPlugin: true, + connected: false + }, + { + key: 'system_httpMethod', + type: 'custom', + valueType: 'string', + label: '', + value: item.method.toUpperCase(), + required: true, + showTargetInApp: false, + showTargetInPlugin: false, + connected: false + }, + { + key: 'system_httpReqUrl', + type: 'hidden', + valueType: 'string', + label: '', + description: 'core.module.input.description.Http Request Url', + placeholder: 'https://api.ai.com/getInventory', + required: false, + showTargetInApp: false, + showTargetInPlugin: false, + value: requestUrl, + connected: false + }, + { + key: 'system_httpHeader', + type: 'custom', + valueType: 'any', + value: httpNodeHeaders, + label: '', + description: 'core.module.input.description.Http Request Header', + placeholder: 'core.module.input.description.Http Request Header', + required: false, + showTargetInApp: false, + showTargetInPlugin: false, + connected: false + }, + { + key: 'system_httpParams', + type: 'hidden', + valueType: 'any', + value: httpNodeParams, + label: '', + required: false, + showTargetInApp: false, + showTargetInPlugin: false, + connected: false + }, + { + key: 'system_httpJsonBody', + type: 'hidden', + valueType: 'any', + value: httpNodeBody, + label: '', + required: false, + showTargetInApp: false, + showTargetInPlugin: false, + connected: false + }, + { + key: 'DYNAMIC_INPUT_KEY', + type: 'target', + valueType: 'any', + label: 'core.module.inputType.dynamicTargetInput', + description: 'core.module.input.description.dynamic input', + required: false, + showTargetInApp: false, + showTargetInPlugin: true, + hideInApp: true, + connected: false + }, + { + key: 'system_addInputParam', + type: 'addInputParam', + valueType: 'any', + label: '', + required: false, + showTargetInApp: false, + showTargetInPlugin: false, + editField: { + key: true, + description: true, + dataType: true + }, + defaultEditField: { + label: '', + key: '', + description: '', + inputType: 'target', + valueType: 'string' + }, + connected: false + }, + ...httpInputs + ], + outputs: [ + { + key: 'finish', + label: 'core.module.output.label.running done', + description: 'core.module.output.description.running done', + valueType: 'boolean', + type: 'source', + targets: [] + }, + { + key: 'httpRawResponse', + label: '原始响应', + description: 'HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。', + valueType: 'any', + type: 'source', + targets: [ + { + moduleId: pluginOutputId, + key: pluginOutputKey + } + ] + }, + { + key: 'system_addOutputParam', + type: 'addOutputParam', + valueType: 'any', + label: '', + targets: [], + editField: { + key: true, + description: true, + dataType: true, + defaultValue: true + }, + defaultEditField: { + label: '', + key: '', + description: '', + outputType: 'source', + valueType: 'string' + } + } + ] + } + ]; + + return { + name: item.name, + avatar: HttpImgUrl, + intro: item.description, + parentId, + type: PluginTypeEnum.http, + modules + }; + }); +}; diff --git a/packages/global/core/plugin/type.d.ts b/packages/global/core/plugin/type.d.ts index bec98a79988..e3572231522 100644 --- a/packages/global/core/plugin/type.d.ts +++ b/packages/global/core/plugin/type.d.ts @@ -1,6 +1,7 @@ import { ModuleTemplateTypeEnum } from 'core/module/constants'; import type { FlowModuleTemplateType, ModuleItemType } from '../module/type.d'; -import { PluginSourceEnum } from './constants'; +import { PluginSourceEnum, PluginTypeEnum } from './constants'; +import { MethodType } from './controller'; export type PluginItemSchema = { _id: string; @@ -12,6 +13,13 @@ export type PluginItemSchema = { intro: string; updateTime: Date; modules: ModuleItemType[]; + parentId: string; + type: `${PluginTypeEnum}`; + metadata?: { + pluginUid?: string; + apiSchemaStr?: string; + customHeaders?: string; + }; }; /* plugin template */ @@ -19,7 +27,7 @@ export type PluginTemplateType = PluginRuntimeType & { author?: string; id: string; source: `${PluginSourceEnum}`; - templateType: FlowModuleTemplateType['templateType']; + templateType: FlowNodeTemplateType['templateType']; intro: string; modules: ModuleItemType[]; }; @@ -29,5 +37,6 @@ export type PluginRuntimeType = { name: string; avatar: string; showStatus?: boolean; + isTool?: boolean; modules: ModuleItemType[]; }; diff --git a/packages/global/package.json b/packages/global/package.json index bfc0b52f450..79d286b0ae7 100644 --- a/packages/global/package.json +++ b/packages/global/package.json @@ -6,11 +6,15 @@ "dayjs": "^1.11.7", "encoding": "^0.1.13", "js-tiktoken": "^1.0.7", + "openapi-types": "^12.1.3", "openai": "4.28.0", "nanoid": "^4.0.1", - "timezones-list": "^3.0.2" + "js-yaml": "^4.1.0", + "timezones-list": "^3.0.2", + "next": "13.5.2" }, "devDependencies": { + "@types/js-yaml": "^4.0.9", "@types/node": "^20.8.5" } } diff --git a/projects/app/src/service/common/censor/index.ts b/packages/service/common/api/requestPlusApi.ts similarity index 85% rename from projects/app/src/service/common/censor/index.ts rename to packages/service/common/api/requestPlusApi.ts index 6ca361c0122..b9d6b7d9cff 100644 --- a/projects/app/src/service/common/censor/index.ts +++ b/packages/service/common/api/requestPlusApi.ts @@ -1,4 +1,4 @@ -import { POST } from '@fastgpt/service/common/api/plusRequest'; +import { POST } from './plusRequest'; export const postTextCensor = (data: { text: string }) => POST<{ code?: number; message: string }>('/common/censor/text_baidu', data) diff --git a/packages/service/common/api/serverRequest.ts b/packages/service/common/api/serverRequest.ts new file mode 100644 index 00000000000..fbe6338e1c8 --- /dev/null +++ b/packages/service/common/api/serverRequest.ts @@ -0,0 +1,114 @@ +import { SERVICE_LOCAL_HOST } from '../system/tools'; +import axios, { Method, InternalAxiosRequestConfig, AxiosResponse } from 'axios'; + +interface ConfigType { + headers?: { [key: string]: string }; + hold?: boolean; + timeout?: number; +} +interface ResponseDataType { + code: number; + message: string; + data: any; +} + +/** + * 请求开始 + */ +function requestStart(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig { + return config; +} + +/** + * 请求成功,检查请求头 + */ +function responseSuccess(response: AxiosResponse) { + return response; +} +/** + * 响应数据检查 + */ +function checkRes(data: ResponseDataType) { + if (data === undefined) { + console.log('error->', data, 'data is empty'); + return Promise.reject('服务器异常'); + } else if (data?.code && (data.code < 200 || data.code >= 400)) { + return Promise.reject(data); + } + return data.data; +} + +/** + * 响应错误 + */ +function responseError(err: any) { + if (!err) { + return Promise.reject({ message: '未知错误' }); + } + if (typeof err === 'string') { + return Promise.reject({ message: err }); + } + + if (err?.response?.data) { + return Promise.reject(err?.response?.data); + } + return Promise.reject(err); +} + +/* 创建请求实例 */ +const instance = axios.create({ + timeout: 60000, // 超时时间 + headers: { + 'content-type': 'application/json', + 'Cache-Control': 'no-cache' + } +}); + +/* 请求拦截 */ +instance.interceptors.request.use(requestStart, (err) => Promise.reject(err)); +/* 响应拦截 */ +instance.interceptors.response.use(responseSuccess, (err) => Promise.reject(err)); + +export function request(url: string, data: any, config: ConfigType, method: Method): any { + /* 去空 */ + for (const key in data) { + if (data[key] === null || data[key] === undefined) { + delete data[key]; + } + } + + return instance + .request({ + baseURL: `http://${SERVICE_LOCAL_HOST}`, + url, + method, + data: ['POST', 'PUT'].includes(method) ? data : null, + params: !['POST', 'PUT'].includes(method) ? data : null, + ...config // custom config + }) + .then((res) => checkRes(res.data)) + .catch((err) => responseError(err)); +} + +/** + * api请求方式 + * @param {String} url + * @param {Any} params + * @param {Object} config + * @returns + */ +export function GET(url: string, params = {}, config: ConfigType = {}): Promise { + return request(url, params, config, 'GET'); +} + +export function POST(url: string, data = {}, config: ConfigType = {}): Promise { + return request(url, data, config, 'POST'); +} + +export function PUT(url: string, data = {}, config: ConfigType = {}): Promise { + return request(url, data, config, 'PUT'); +} + +export function DELETE(url: string, data = {}, config: ConfigType = {}): Promise { + return request(url, data, config, 'DELETE'); +} diff --git a/packages/global/common/string/jieba.ts b/packages/service/common/string/jieba.ts similarity index 98% rename from packages/global/common/string/jieba.ts rename to packages/service/common/string/jieba.ts index 89c3089f6cd..d3e5e0cc702 100644 --- a/packages/global/common/string/jieba.ts +++ b/packages/service/common/string/jieba.ts @@ -1,4 +1,6 @@ -export const stopWords = new Set([ +import { cut } from '@node-rs/jieba'; + +const stopWords = new Set([ '--', '?', '“', @@ -1506,3 +1508,14 @@ export const stopWords = new Set([ 'i' ] ]); + +export function jiebaSplit({ text }: { text: string }) { + const tokens = cut(text, true); + + return ( + tokens + .map((item) => item.replace(/[\u3000-\u303f\uff00-\uffef]/g, '').trim()) + .filter((item) => item && !stopWords.has(item)) + .join(' ') || '' + ); +} diff --git a/packages/service/common/vectorStore/pg/controller.ts b/packages/service/common/vectorStore/pg/controller.ts index daa022677dd..ad551ef561b 100644 --- a/packages/service/common/vectorStore/pg/controller.ts +++ b/packages/service/common/vectorStore/pg/controller.ts @@ -139,11 +139,11 @@ export const embeddingRecall = async ( const results: any = await PgClient.query( `BEGIN; SET LOCAL hnsw.ef_search = ${efSearch}; - select id, collection_id, (vector <#> '[${vectors[0]}]') * -1 AS score + select id, collection_id, vector <#> '[${vectors[0]}]' AS score from ${PgDatasetTableName} where dataset_id IN (${datasetIds.map((id) => `'${String(id)}'`).join(',')}) AND vector <#> '[${vectors[0]}]' < -${similarity} - order by score desc limit ${limit}; + order by score limit ${limit}; COMMIT;` ); @@ -153,7 +153,7 @@ export const embeddingRecall = async ( results: rows.map((item) => ({ id: item.id, collectionId: item.collection_id, - score: item.score + score: item.score * -1 })) }; } catch (error) { diff --git a/packages/service/core/ai/functions/createQuestionGuide.ts b/packages/service/core/ai/functions/createQuestionGuide.ts index 6b16fca395e..5564b7c0494 100644 --- a/packages/service/core/ai/functions/createQuestionGuide.ts +++ b/packages/service/core/ai/functions/createQuestionGuide.ts @@ -2,7 +2,7 @@ import type { ChatCompletionMessageParam } from '@fastgpt/global/core/ai/type.d' import { getAIApi } from '../config'; import { countGptMessagesTokens } from '@fastgpt/global/common/string/tiktoken'; -export const Prompt_QuestionGuide = `我不太清楚问你什么问题,请帮我生成 3 个问题,引导我继续提问。问题的长度应小于20个字符,按 JSON 格式返回: ["问题1", "问题2", "问题3"]`; +export const Prompt_QuestionGuide = `你是一个AI智能助手,可以回答和解决我的问题。请结合前面的对话记录,帮我生成 3 个问题,引导我继续提问。问题的长度应小于20个字符,按 JSON 格式返回: ["问题1", "问题2", "问题3"]`; export async function createQuestionGuide({ messages, diff --git a/packages/service/core/ai/functions/queryExtension.ts b/packages/service/core/ai/functions/queryExtension.ts index 680ff639e19..da36515c4ec 100644 --- a/packages/service/core/ai/functions/queryExtension.ts +++ b/packages/service/core/ai/functions/queryExtension.ts @@ -9,7 +9,7 @@ import { ChatCompletionMessageParam } from '@fastgpt/global/core/ai/type'; 可以根据上下文,消除指代性问题以及扩展问题,利于检索。 */ -const defaultPrompt = `作为一个向量检索助手,你的任务是结合历史记录,从不同角度,为“原问题”生成个不同版本的“检索词”,从而提高向量检索的语义丰富度,提高向量检索的精度。生成的问题要求指向对象清晰明确,并与原问题语言相同。例如: +const defaultPrompt = `作为一个向量检索助手,你的任务是结合历史记录,从不同角度,为“原问题”生成个不同版本的“检索词”,从而提高向量检索的语义丰富度,提高向量检索的精度。生成的问题要求指向对象清晰明确,并与“原问题语言相同”。例如: 历史记录: """ """ diff --git a/projects/app/src/service/core/ai/rerank.ts b/packages/service/core/ai/rerank/index.ts similarity index 89% rename from projects/app/src/service/core/ai/rerank.ts rename to packages/service/core/ai/rerank/index.ts index 5ced9f11015..b7f56a6ae2f 100644 --- a/projects/app/src/service/core/ai/rerank.ts +++ b/packages/service/core/ai/rerank/index.ts @@ -1,5 +1,5 @@ -import { PostReRankProps, PostReRankResponse } from '@fastgpt/global/core/ai/api'; -import { POST } from '@/service/common/api/request'; +import { PostReRankProps, PostReRankResponse } from '@fastgpt/global/core/ai/api.d'; +import { POST } from '../../../common/api/serverRequest'; export function reRankRecall({ query, inputs }: PostReRankProps) { const model = global.reRankModels[0]; diff --git a/packages/service/core/app/schema.ts b/packages/service/core/app/schema.ts index 0dba217b771..93c5f96b7d8 100644 --- a/packages/service/core/app/schema.ts +++ b/packages/service/core/app/schema.ts @@ -34,10 +34,6 @@ const AppSchema = new Schema({ default: 'advanced', enum: Object.keys(AppTypeMap) }, - simpleTemplateId: { - type: String, - required: true - }, avatar: { type: String, default: '/icon/logo.svg' diff --git a/packages/service/core/chat/utils.ts b/packages/service/core/chat/utils.ts index 67db3f8ecc1..baaa1321073 100644 --- a/packages/service/core/chat/utils.ts +++ b/packages/service/core/chat/utils.ts @@ -8,6 +8,15 @@ import axios from 'axios'; import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; /* slice chat context by tokens */ +const filterEmptyMessages = (messages: ChatCompletionMessageParam[]) => { + return messages.filter((item) => { + if (item.role === ChatCompletionRequestMessageRoleEnum.System) return !!item.content; + if (item.role === ChatCompletionRequestMessageRoleEnum.User) return !!item.content; + if (item.role === ChatCompletionRequestMessageRoleEnum.Assistant) + return !!item.content || !!item.function_call || !!item.tool_calls; + return true; + }); +}; export function filterGPTMessageByMaxTokens({ messages = [], maxTokens @@ -38,7 +47,7 @@ export function filterGPTMessageByMaxTokens({ // If the text length is less than half of the maximum token, no calculation is required if (rawTextLen < maxTokens * 0.5) { - return messages; + return filterEmptyMessages(messages); } // filter startWith system prompt @@ -81,7 +90,7 @@ export function filterGPTMessageByMaxTokens({ } } - return [...systemPrompts, ...chats]; + return filterEmptyMessages([...systemPrompts, ...chats]); } export const formatGPTMessagesInRequestBefore = (messages: ChatCompletionMessageParam[]) => { return messages diff --git a/packages/service/core/dataset/schema.ts b/packages/service/core/dataset/schema.ts index 52badd16a6a..1c7c55eee2b 100644 --- a/packages/service/core/dataset/schema.ts +++ b/packages/service/core/dataset/schema.ts @@ -67,7 +67,7 @@ const DatasetSchema = new Schema({ agentModel: { type: String, required: true, - default: 'gpt-3.5-turbo-16k' + default: 'gpt-3.5-turbo' }, intro: { type: String, diff --git a/packages/service/core/dataset/search/controller.ts b/packages/service/core/dataset/search/controller.ts new file mode 100644 index 00000000000..4d42bbe0c96 --- /dev/null +++ b/packages/service/core/dataset/search/controller.ts @@ -0,0 +1,407 @@ +import { + DatasetSearchModeEnum, + DatasetSearchModeMap, + SearchScoreTypeEnum +} from '@fastgpt/global/core/dataset/constants'; +import { recallFromVectorStore } from '../../../common/vectorStore/controller'; +import { getVectorsByText } from '../../ai/embedding'; +import { getVectorModel } from '../../ai/model'; +import { MongoDatasetData } from '../data/schema'; +import { + DatasetDataSchemaType, + DatasetDataWithCollectionType, + SearchDataResponseItemType +} from '@fastgpt/global/core/dataset/type'; +import { MongoDatasetCollection } from '../collection/schema'; +import { reRankRecall } from '../../../core/ai/rerank'; +import { countPromptTokens } from '@fastgpt/global/common/string/tiktoken'; +import { datasetSearchResultConcat } from '@fastgpt/global/core/dataset/search/utils'; +import { hashStr } from '@fastgpt/global/common/string/tools'; +import { jiebaSplit } from '../../../common/string/jieba'; + +type SearchDatasetDataProps = { + teamId: string; + model: string; + similarity?: number; // min distance + limit: number; // max Token limit + datasetIds: string[]; + searchMode?: `${DatasetSearchModeEnum}`; + usingReRank?: boolean; + reRankQuery: string; + queries: string[]; +}; + +export async function searchDatasetData(props: SearchDatasetDataProps) { + let { + teamId, + reRankQuery, + queries, + model, + similarity = 0, + limit: maxTokens, + searchMode = DatasetSearchModeEnum.embedding, + usingReRank = false, + datasetIds = [] + } = props; + + /* init params */ + searchMode = DatasetSearchModeMap[searchMode] ? searchMode : DatasetSearchModeEnum.embedding; + usingReRank = usingReRank && global.reRankModels.length > 0; + + // Compatible with topk limit + if (maxTokens < 50) { + maxTokens = 1500; + } + let set = new Set(); + let usingSimilarityFilter = false; + + /* function */ + const countRecallLimit = () => { + if (searchMode === DatasetSearchModeEnum.embedding) { + return { + embeddingLimit: 150, + fullTextLimit: 0 + }; + } + if (searchMode === DatasetSearchModeEnum.fullTextRecall) { + return { + embeddingLimit: 0, + fullTextLimit: 150 + }; + } + return { + embeddingLimit: 100, + fullTextLimit: 80 + }; + }; + const embeddingRecall = async ({ query, limit }: { query: string; limit: number }) => { + const { vectors, tokens } = await getVectorsByText({ + model: getVectorModel(model), + input: query + }); + + const { results } = await recallFromVectorStore({ + vectors, + limit, + datasetIds, + efSearch: global.systemEnv?.pgHNSWEfSearch + }); + + // get q and a + const dataList = (await MongoDatasetData.find( + { + teamId, + datasetId: { $in: datasetIds }, + 'indexes.dataId': { $in: results.map((item) => item.id?.trim()) } + }, + 'datasetId collectionId q a chunkIndex indexes' + ) + .populate('collectionId', 'name fileId rawLink') + .lean()) as DatasetDataWithCollectionType[]; + + // add score to data(It's already sorted. The first one is the one with the most points) + const concatResults = dataList.map((data) => { + const dataIdList = data.indexes.map((item) => item.dataId); + + const maxScoreResult = results.find((item) => { + return dataIdList.includes(item.id); + }); + + return { + ...data, + score: maxScoreResult?.score || 0 + }; + }); + + concatResults.sort((a, b) => b.score - a.score); + + const formatResult = concatResults + .map((data, index) => { + if (!data.collectionId) { + console.log('Collection is not found', data); + } + + const result: SearchDataResponseItemType = { + id: String(data._id), + q: data.q, + a: data.a, + chunkIndex: data.chunkIndex, + datasetId: String(data.datasetId), + collectionId: String(data.collectionId?._id), + sourceName: data.collectionId?.name || '', + sourceId: data.collectionId?.fileId || data.collectionId?.rawLink, + score: [{ type: SearchScoreTypeEnum.embedding, value: data.score, index }] + }; + + return result; + }) + .filter((item) => item !== null) as SearchDataResponseItemType[]; + + return { + embeddingRecallResults: formatResult, + tokens + }; + }; + const fullTextRecall = async ({ + query, + limit + }: { + query: string; + limit: number; + }): Promise<{ + fullTextRecallResults: SearchDataResponseItemType[]; + tokenLen: number; + }> => { + if (limit === 0) { + return { + fullTextRecallResults: [], + tokenLen: 0 + }; + } + + let searchResults = ( + await Promise.all( + datasetIds.map((id) => + MongoDatasetData.find( + { + teamId, + datasetId: id, + $text: { $search: jiebaSplit({ text: query }) } + }, + { + score: { $meta: 'textScore' }, + _id: 1, + datasetId: 1, + collectionId: 1, + q: 1, + a: 1, + chunkIndex: 1 + } + ) + .sort({ score: { $meta: 'textScore' } }) + .limit(limit) + .lean() + ) + ) + ).flat() as (DatasetDataSchemaType & { score: number })[]; + + // resort + searchResults.sort((a, b) => b.score - a.score); + searchResults.slice(0, limit); + + const collections = await MongoDatasetCollection.find( + { + _id: { $in: searchResults.map((item) => item.collectionId) } + }, + '_id name fileId rawLink' + ); + + return { + fullTextRecallResults: searchResults.map((item, index) => { + const collection = collections.find((col) => String(col._id) === String(item.collectionId)); + return { + id: String(item._id), + datasetId: String(item.datasetId), + collectionId: String(item.collectionId), + sourceName: collection?.name || '', + sourceId: collection?.fileId || collection?.rawLink, + q: item.q, + a: item.a, + chunkIndex: item.chunkIndex, + indexes: item.indexes, + score: [{ type: SearchScoreTypeEnum.fullText, value: item.score, index }] + }; + }), + tokenLen: 0 + }; + }; + const reRankSearchResult = async ({ + data, + query + }: { + data: SearchDataResponseItemType[]; + query: string; + }): Promise => { + try { + const results = await reRankRecall({ + query, + inputs: data.map((item) => ({ + id: item.id, + text: `${item.q}\n${item.a}` + })) + }); + + if (results.length === 0) { + usingReRank = false; + return []; + } + + // add new score to data + const mergeResult = results + .map((item, index) => { + const target = data.find((dataItem) => dataItem.id === item.id); + if (!target) return null; + const score = item.score || 0; + + return { + ...target, + score: [{ type: SearchScoreTypeEnum.reRank, value: score, index }] + }; + }) + .filter(Boolean) as SearchDataResponseItemType[]; + + return mergeResult; + } catch (error) { + usingReRank = false; + return []; + } + }; + const filterResultsByMaxTokens = (list: SearchDataResponseItemType[], maxTokens: number) => { + const results: SearchDataResponseItemType[] = []; + let totalTokens = 0; + + for (let i = 0; i < list.length; i++) { + const item = list[i]; + totalTokens += countPromptTokens(item.q + item.a); + if (totalTokens > maxTokens + 500) { + break; + } + results.push(item); + if (totalTokens > maxTokens) { + break; + } + } + + return results.length === 0 ? list.slice(0, 1) : results; + }; + const multiQueryRecall = async ({ + embeddingLimit, + fullTextLimit + }: { + embeddingLimit: number; + fullTextLimit: number; + }) => { + // multi query recall + const embeddingRecallResList: SearchDataResponseItemType[][] = []; + const fullTextRecallResList: SearchDataResponseItemType[][] = []; + let totalTokens = 0; + + await Promise.all( + queries.map(async (query) => { + const [{ tokens, embeddingRecallResults }, { fullTextRecallResults }] = await Promise.all([ + embeddingRecall({ + query, + limit: embeddingLimit + }), + fullTextRecall({ + query, + limit: fullTextLimit + }) + ]); + totalTokens += tokens; + + embeddingRecallResList.push(embeddingRecallResults); + fullTextRecallResList.push(fullTextRecallResults); + }) + ); + + // rrf concat + const rrfEmbRecall = datasetSearchResultConcat( + embeddingRecallResList.map((list) => ({ k: 60, list })) + ).slice(0, embeddingLimit); + const rrfFTRecall = datasetSearchResultConcat( + fullTextRecallResList.map((list) => ({ k: 60, list })) + ).slice(0, fullTextLimit); + + return { + tokens: totalTokens, + embeddingRecallResults: rrfEmbRecall, + fullTextRecallResults: rrfFTRecall + }; + }; + + /* main step */ + // count limit + const { embeddingLimit, fullTextLimit } = countRecallLimit(); + + // recall + const { embeddingRecallResults, fullTextRecallResults, tokens } = await multiQueryRecall({ + embeddingLimit, + fullTextLimit + }); + + // ReRank results + const reRankResults = await (async () => { + if (!usingReRank) return []; + + set = new Set(embeddingRecallResults.map((item) => item.id)); + const concatRecallResults = embeddingRecallResults.concat( + fullTextRecallResults.filter((item) => !set.has(item.id)) + ); + + // remove same q and a data + set = new Set(); + const filterSameDataResults = concatRecallResults.filter((item) => { + // 删除所有的标点符号与空格等,只对文本进行比较 + const str = hashStr(`${item.q}${item.a}`.replace(/[^\p{L}\p{N}]/gu, '')); + if (set.has(str)) return false; + set.add(str); + return true; + }); + return reRankSearchResult({ + query: reRankQuery, + data: filterSameDataResults + }); + })(); + + // embedding recall and fullText recall rrf concat + const rrfConcatResults = datasetSearchResultConcat([ + { k: 60, list: embeddingRecallResults }, + { k: 60, list: fullTextRecallResults }, + { k: 58, list: reRankResults } + ]); + + // remove same q and a data + set = new Set(); + const filterSameDataResults = rrfConcatResults.filter((item) => { + // 删除所有的标点符号与空格等,只对文本进行比较 + const str = hashStr(`${item.q}${item.a}`.replace(/[^\p{L}\p{N}]/gu, '')); + if (set.has(str)) return false; + set.add(str); + return true; + }); + + // score filter + const scoreFilter = (() => { + if (usingReRank) { + usingSimilarityFilter = true; + + return filterSameDataResults.filter((item) => { + const reRankScore = item.score.find((item) => item.type === SearchScoreTypeEnum.reRank); + if (reRankScore && reRankScore.value < similarity) return false; + return true; + }); + } + if (searchMode === DatasetSearchModeEnum.embedding) { + usingSimilarityFilter = true; + return filterSameDataResults.filter((item) => { + const embeddingScore = item.score.find( + (item) => item.type === SearchScoreTypeEnum.embedding + ); + if (embeddingScore && embeddingScore.value < similarity) return false; + return true; + }); + } + return filterSameDataResults; + })(); + + return { + searchRes: filterResultsByMaxTokens(scoreFilter, maxTokens), + tokens, + searchMode, + limit: maxTokens, + similarity, + usingReRank, + usingSimilarityFilter + }; +} diff --git a/packages/service/core/dataset/training/controller.ts b/packages/service/core/dataset/training/controller.ts index 2ed81b43552..612202454ab 100644 --- a/packages/service/core/dataset/training/controller.ts +++ b/packages/service/core/dataset/training/controller.ts @@ -31,16 +31,14 @@ export async function pushDataListToTrainingQueue({ data, prompt, billId, - trainingMode = TrainingModeEnum.chunk, - - vectorModelList = [], - datasetModelList = [] + trainingMode = TrainingModeEnum.chunk }: { teamId: string; tmbId: string; - vectorModelList: VectorModelItemType[]; - datasetModelList: LLMModelItemType[]; } & PushDatasetDataProps): Promise { + const vectorModelList = global.vectorModels; + const datasetModelList = global.llmModels; + const { datasetId: { _id: datasetId, vectorModel, agentModel } } = await getCollectionWithDataset(collectionId); @@ -48,11 +46,11 @@ export async function pushDataListToTrainingQueue({ const checkModelValid = async () => { const agentModelData = datasetModelList?.find((item) => item.model === agentModel); if (!agentModelData) { - return Promise.reject(`Vector model ${agentModel} is inValid`); + return Promise.reject(`File model ${agentModel} is inValid`); } const vectorModelData = vectorModelList?.find((item) => item.model === vectorModel); if (!vectorModelData) { - return Promise.reject(`File model ${vectorModel} is inValid`); + return Promise.reject(`Vector model ${vectorModel} is inValid`); } if (trainingMode === TrainingModeEnum.chunk) { diff --git a/packages/service/core/dataset/training/schema.ts b/packages/service/core/dataset/training/schema.ts index 66662da883e..96610bb7ae4 100644 --- a/packages/service/core/dataset/training/schema.ts +++ b/packages/service/core/dataset/training/schema.ts @@ -13,11 +13,6 @@ import { export const DatasetTrainingCollectionName = 'dataset.trainings'; const TrainingDataSchema = new Schema({ - userId: { - // abandon - type: Schema.Types.ObjectId, - ref: 'user' - }, teamId: { type: Schema.Types.ObjectId, ref: TeamCollectionName, @@ -100,7 +95,7 @@ try { // lock training data; delete training data TrainingDataSchema.index({ teamId: 1, collectionId: 1 }); // get training data and sort - TrainingDataSchema.index({ lockTime: 1, mode: 1, weight: -1 }); + TrainingDataSchema.index({ mode: 1, lockTime: 1, weight: -1 }); TrainingDataSchema.index({ expireAt: 1 }, { expireAfterSeconds: 7 * 24 * 60 * 60 }); // 7 days } catch (error) { console.log(error); diff --git a/packages/service/core/plugin/controller.ts b/packages/service/core/plugin/controller.ts index 18e59fa8c4e..b7fa546a70c 100644 --- a/packages/service/core/plugin/controller.ts +++ b/packages/service/core/plugin/controller.ts @@ -1,10 +1,11 @@ import { MongoPlugin } from './schema'; -import { FlowModuleTemplateType } from '@fastgpt/global/core/module/type'; +import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import { plugin2ModuleIO } from '@fastgpt/global/core/module/utils'; import { PluginSourceEnum } from '@fastgpt/global/core/plugin/constants'; import type { PluginRuntimeType, PluginTemplateType } from '@fastgpt/global/core/plugin/type.d'; -import { ModuleTemplateTypeEnum } from '@fastgpt/global/core/module/constants'; +import { FlowNodeTemplateTypeEnum } from '@fastgpt/global/core/module/constants'; +import type { PluginItemSchema } from '@fastgpt/global/core/plugin/type.d'; /* plugin id rule: @@ -48,7 +49,7 @@ const getPluginTemplateById = async (id: string): Promise => showStatus: true, source: PluginSourceEnum.personal, modules: item.modules, - templateType: ModuleTemplateTypeEnum.personalPlugin + templateType: FlowNodeTemplateTypeEnum.personalPlugin }; } return Promise.reject('plugin not found'); @@ -59,7 +60,7 @@ export async function getPluginPreviewModule({ id }: { id: string; -}): Promise { +}): Promise { const plugin = await getPluginTemplateById(id); return { @@ -70,6 +71,7 @@ export async function getPluginPreviewModule({ name: plugin.name, intro: plugin.intro, showStatus: plugin.showStatus, + isTool: plugin.isTool, ...plugin2ModuleIO(plugin.id, plugin.modules) }; } diff --git a/packages/service/core/plugin/schema.ts b/packages/service/core/plugin/schema.ts index 48f94a65e44..0de5c481e3b 100644 --- a/packages/service/core/plugin/schema.ts +++ b/packages/service/core/plugin/schema.ts @@ -1,3 +1,4 @@ +import { pluginTypeMap } from '@fastgpt/global/core/plugin/constants'; import { connectionMongo, type Model } from '../../common/mongo'; const { Schema, model, models } = connectionMongo; import type { PluginItemSchema } from '@fastgpt/global/core/plugin/type.d'; @@ -9,9 +10,10 @@ import { export const PluginCollectionName = 'plugins'; const PluginSchema = new Schema({ - userId: { + parentId: { type: Schema.Types.ObjectId, - ref: 'user' + ref: PluginCollectionName, + default: null }, teamId: { type: Schema.Types.ObjectId, @@ -23,6 +25,11 @@ const PluginSchema = new Schema({ ref: TeamMemberCollectionName, required: true }, + type: { + type: String, + enum: Object.keys(pluginTypeMap), + required: true + }, name: { type: String, required: true @@ -42,11 +49,19 @@ const PluginSchema = new Schema({ modules: { type: Array, default: [] + }, + metadata: { + type: { + pluginUid: String, + apiSchemaStr: String, + customHeaders: String + } } }); try { - PluginSchema.index({ tmbId: 1 }); + PluginSchema.index({ teamId: 1, parentId: 1 }); + PluginSchema.index({ teamId: 1, name: 1, intro: 1 }); } catch (error) { console.log(error); } diff --git a/projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts b/packages/service/core/workflow/dispatch/agent/classifyQuestion.ts similarity index 95% rename from projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts rename to packages/service/core/workflow/dispatch/agent/classifyQuestion.ts index 97b5e5e3f34..9fa242615ba 100644 --- a/projects/app/src/service/moduleDispatch/agent/classifyQuestion.ts +++ b/packages/service/core/workflow/dispatch/agent/classifyQuestion.ts @@ -1,22 +1,22 @@ import { chats2GPTMessages } from '@fastgpt/global/core/chat/adapt'; -import { filterGPTMessageByMaxTokens } from '@fastgpt/service/core/chat/utils'; +import { filterGPTMessageByMaxTokens } from '../../../chat/utils'; import { countGptMessagesTokens, countMessagesTokens } from '@fastgpt/global/common/string/tiktoken'; import type { ChatItemType } from '@fastgpt/global/core/chat/type.d'; import { ChatItemValueTypeEnum, ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; -import { getAIApi } from '@fastgpt/service/core/ai/config'; +import { getAIApi } from '../../../ai/config'; import type { ClassifyQuestionAgentItemType } from '@fastgpt/global/core/module/type.d'; import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d'; import { replaceVariable } from '@fastgpt/global/common/string/tools'; -import { Prompt_CQJson } from '@/global/core/prompt/agent'; +import { Prompt_CQJson } from '@fastgpt/global/core/ai/prompt/agent'; import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; -import { ModelTypeEnum, getLLMModel } from '@fastgpt/service/core/ai/model'; +import { ModelTypeEnum, getLLMModel } from '../../../ai/model'; import { getHistories } from '../utils'; -import { formatModelChars2Points } from '@fastgpt/service/support/wallet/usage/utils'; +import { formatModelChars2Points } from '../../../../support/wallet/usage/utils'; import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; import { ChatCompletionCreateParams, diff --git a/projects/app/src/service/moduleDispatch/agent/extract.ts b/packages/service/core/workflow/dispatch/agent/extract.ts similarity index 90% rename from projects/app/src/service/moduleDispatch/agent/extract.ts rename to packages/service/core/workflow/dispatch/agent/extract.ts index a76fe551b55..ba08e7e88f7 100644 --- a/projects/app/src/service/moduleDispatch/agent/extract.ts +++ b/packages/service/core/workflow/dispatch/agent/extract.ts @@ -1,22 +1,22 @@ import { chats2GPTMessages } from '@fastgpt/global/core/chat/adapt'; -import { filterGPTMessageByMaxTokens } from '@fastgpt/service/core/chat/utils'; +import { filterGPTMessageByMaxTokens } from '../../../chat/utils'; import type { ChatItemType } from '@fastgpt/global/core/chat/type.d'; import { countGptMessagesTokens, countMessagesTokens } from '@fastgpt/global/common/string/tiktoken'; import { ChatItemValueTypeEnum, ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; -import { getAIApi } from '@fastgpt/service/core/ai/config'; +import { getAIApi } from '../../../ai/config'; import type { ContextExtractAgentItemType } from '@fastgpt/global/core/module/type'; import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d'; -import { Prompt_ExtractJson } from '@/global/core/prompt/agent'; +import { Prompt_ExtractJson } from '@fastgpt/global/core/ai/prompt/agent'; import { replaceVariable } from '@fastgpt/global/common/string/tools'; import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; import { getHistories } from '../utils'; -import { ModelTypeEnum, getLLMModel } from '@fastgpt/service/core/ai/model'; -import { formatModelChars2Points } from '@fastgpt/service/support/wallet/usage/utils'; +import { ModelTypeEnum, getLLMModel } from '../../../ai/model'; +import { formatModelChars2Points } from '../../../../support/wallet/usage/utils'; import json5 from 'json5'; import { ChatCompletionCreateParams, @@ -42,7 +42,7 @@ type Response = DispatchNodeResultType<{ type ActionProps = Props & { extractModel: LLMModelItemType }; -const agentFunName = 'extract_json_data'; +const agentFunName = 'request_function'; export async function dispatchContentExtract(props: Props): Promise { const { @@ -156,13 +156,15 @@ const getFunctionCallSchema = ({ { type: ChatItemValueTypeEnum.text, text: { - content: `你的任务是根据上下文获取适当的 JSON 字符串。要求: - """ - - 字符串不要换行。 - - 结合上下文和当前问题进行获取。 - """ - - 当前问题: "${content}"` + content: `我正在执行一个函数,需要你提供一些参数,请以 JSON 字符串格式返回这些参数,要求: +""" +${description ? `- ${description}` : ''} +- 不是每个参数都是必须生成的,如果没有合适的参数值,不要生成该参数,或返回空字符串。 +- 需要结合前面的对话内容,一起生成合适的参数。 +""" + +本次输入内容: ${content} + ` } } ] @@ -191,7 +193,7 @@ const getFunctionCallSchema = ({ // function body const agentFunction = { name: agentFunName, - description, + description: '需要执行的函数', parameters: { type: 'object', properties @@ -249,7 +251,6 @@ const toolChoice = async (props: ActionProps) => { tool_calls: response.choices?.[0]?.message?.tool_calls } ]; - return { tokens: countGptMessagesTokens(completeMessages, tools), arg @@ -351,18 +352,24 @@ Human: ${content}` const start = answer.indexOf('{'); const end = answer.lastIndexOf('}'); - if (start === -1 || end === -1) + if (start === -1 || end === -1) { return { rawResponse: answer, tokens: countMessagesTokens(messages), arg: {} }; + } + + const jsonStr = answer + .substring(start, end + 1) + .replace(/(\\n|\\)/g, '') + .replace(/ /g, ''); try { return { rawResponse: answer, tokens: countMessagesTokens(messages), - arg: json5.parse(answer) as Record + arg: json5.parse(jsonStr) as Record }; } catch (error) { console.log(error); diff --git a/packages/service/core/workflow/dispatch/agent/runTool/constants.ts b/packages/service/core/workflow/dispatch/agent/runTool/constants.ts new file mode 100644 index 00000000000..1a91b5f8439 --- /dev/null +++ b/packages/service/core/workflow/dispatch/agent/runTool/constants.ts @@ -0,0 +1,36 @@ +export const Prompt_Tool_Call = ` +你是一个智能机器人,除了可以回答用户问题外,你还掌握工具的使用能力。有时候,你可以依赖工具的运行结果,来更准确的回答用户。 +下面是你可以使用的工具,使用 JSON Schema 的格式声明,其中 toolId 是工具的 description 是工具的描述,parameters 是工具的参数,包括参数的类型和描述,required 是必填参数的列表。 + +""" +{{toolsPrompt}} +""" + +接下来,请你根据工具描述,决定回答问题或是使用工具。在完成任务过程中,USER代表用户的输入,TOOL_RESPONSE代表工具运行结果。ASSISTANT 代表你的输出。 +你的每次输出都必须以0,1开头,代表是否需要调用工具: +0: 不使用工具,直接回答内容。 +1: 使用工具,返回工具调用的参数。 + +例如: + +USER: 你好呀 +ANSWER: 0: 你好,有什么可以帮助你的么? +USER: 今天杭州的天气如何 +ANSWER: 1: {"toolId":"w2121",arguments:{"city": "杭州"}} +TOOL_RESPONSE: """ +晴天...... +""" +ANSWER: 0: 今天杭州是晴天。 +USER: 今天杭州的天气适合去哪里玩? +ANSWER: 1: {"toolId":"as21da",arguments:{"query": "杭州 天气 去哪里玩"}} +TOOL_RESPONSE: """ +晴天. 西湖、灵隐寺、千岛湖…… +""" +ANSWER: 0: 今天杭州是晴天,适合去西湖、灵隐寺、千岛湖等地玩。 + + +现在,我们开始吧! + +USER: {{question}} +ANSWER: +`; diff --git a/projects/app/src/service/moduleDispatch/agent/runTool/functionCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts similarity index 78% rename from projects/app/src/service/moduleDispatch/agent/runTool/functionCall.ts rename to packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts index 50dbbd538c6..e6532cd821c 100644 --- a/projects/app/src/service/moduleDispatch/agent/runTool/functionCall.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts @@ -1,6 +1,6 @@ import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; -import { getAIApi } from '@fastgpt/service/core/ai/config'; -import { filterGPTMessageByMaxTokens } from '@fastgpt/service/core/chat/utils'; +import { getAIApi } from '../../../../ai/config'; +import { filterGPTMessageByMaxTokens } from '../../../../chat/utils'; import { ChatCompletion, StreamChatType, @@ -15,7 +15,7 @@ import { responseWrite, responseWriteController, responseWriteNodeStatus -} from '@fastgpt/service/common/response'; +} from '../../../../../common/response'; import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; import { textAdaptGptResponse } from '@fastgpt/global/core/module/runtime/utils'; import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; @@ -25,8 +25,10 @@ import json5 from 'json5'; import { DispatchFlowResponse } from '../../type'; import { countGptMessagesTokens } from '@fastgpt/global/common/string/tiktoken'; import { getNanoid } from '@fastgpt/global/common/string/tools'; +import { AIChatItemType, AIChatItemValueItemType } from '@fastgpt/global/core/chat/type'; +import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt'; -type ToolRunResponseType = { +type FunctionRunResponseType = { moduleRunResponse: DispatchFlowResponse; functionCallMsg: ChatCompletionFunctionMessageParam; }[]; @@ -49,6 +51,7 @@ export const runToolWithFunctionCall = async ( module, stream } = props; + const assistantResponses = response?.assistantResponses || []; const functions: ChatCompletionCreateParams.Function[] = toolModules.map((module) => { const properties: Record< @@ -161,10 +164,18 @@ export const runToolWithFunctionCall = async ( startParams }); + const stringToolResponse = (() => { + if (typeof moduleRunResponse.toolResponses === 'object') { + return JSON.stringify(moduleRunResponse.toolResponses, null, 2); + } + + return moduleRunResponse.toolResponses ? String(moduleRunResponse.toolResponses) : 'none'; + })(); + const functionCallMsg: ChatCompletionFunctionMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Function, name: tool.name, - content: JSON.stringify(moduleRunResponse.toolResponses, null, 2) + content: stringToolResponse }; if (stream && detail) { @@ -177,7 +188,7 @@ export const runToolWithFunctionCall = async ( toolName: '', toolAvatar: '', params: '', - response: JSON.stringify(moduleRunResponse.toolResponses, null, 2) + response: stringToolResponse } }) }); @@ -189,7 +200,7 @@ export const runToolWithFunctionCall = async ( }; }) ) - ).filter(Boolean) as ToolRunResponseType; + ).filter(Boolean) as FunctionRunResponseType; const flatToolsResponseData = toolsRunResponse.map((item) => item.moduleRunResponse).flat(); @@ -204,9 +215,11 @@ export const runToolWithFunctionCall = async ( ...filterMessages, assistantToolMsgParams ] as ChatCompletionMessageParam[]; - const tokens = countGptMessagesTokens(concatToolMessages, undefined, functions); - + const completeMessages = [ + ...concatToolMessages, + ...toolsRunResponse.map((item) => item?.functionCallMsg) + ]; // console.log(tokens, 'tool'); if (stream && detail) { @@ -216,33 +229,70 @@ export const runToolWithFunctionCall = async ( }); } + // tool assistant + const toolAssistants = toolsRunResponse + .map((item) => { + const assistantResponses = item.moduleRunResponse.assistantResponses || []; + return assistantResponses; + }) + .flat(); + // tool node assistant + const adaptChatMessages = GPTMessages2Chats(completeMessages); + const toolNodeAssistant = adaptChatMessages.pop() as AIChatItemType; + + const toolNodeAssistants = [ + ...assistantResponses, + ...toolAssistants, + ...toolNodeAssistant.value + ]; + + // concat tool responses + const dispatchFlowResponse = response + ? response.dispatchFlowResponse.concat(flatToolsResponseData) + : flatToolsResponseData; + + /* check stop signal */ + const hasStopSignal = flatToolsResponseData.some( + (item) => !!item.flowResponses?.find((item) => item.toolStop) + ); + if (hasStopSignal) { + return { + dispatchFlowResponse, + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + completeMessages: filterMessages, + assistantResponses: toolNodeAssistants + }; + } + return runToolWithFunctionCall( { ...props, - messages: [...concatToolMessages, ...toolsRunResponse.map((item) => item?.functionCallMsg)] + messages: completeMessages }, { - dispatchFlowResponse: response - ? response.dispatchFlowResponse.concat(flatToolsResponseData) - : flatToolsResponseData, - totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens + dispatchFlowResponse, + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + assistantResponses: toolNodeAssistants } ); } else { // No tool is invoked, indicating that the process is over - const completeMessages = filterMessages.concat({ + const gptAssistantResponse: ChatCompletionAssistantMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, content: answer - }); - + }; + const completeMessages = filterMessages.concat(gptAssistantResponse); const tokens = countGptMessagesTokens(completeMessages, undefined, functions); - // console.log(tokens, 'response token'); + // concat tool assistant + const toolNodeAssistant = GPTMessages2Chats([gptAssistantResponse])[0] as AIChatItemType; + return { dispatchFlowResponse: response?.dispatchFlowResponse || [], totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, - completeMessages + completeMessages, + assistantResponses: [...assistantResponses, ...toolNodeAssistant.value] }; } }; diff --git a/projects/app/src/service/moduleDispatch/agent/runTool/index.ts b/packages/service/core/workflow/dispatch/agent/runTool/index.ts similarity index 77% rename from projects/app/src/service/moduleDispatch/agent/runTool/index.ts rename to packages/service/core/workflow/dispatch/agent/runTool/index.ts index ea8ab49d113..18862e5dcf7 100644 --- a/projects/app/src/service/moduleDispatch/agent/runTool/index.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/index.ts @@ -4,7 +4,7 @@ import type { DispatchNodeResultType, RunningModuleItemType } from '@fastgpt/global/core/module/runtime/type'; -import { ModelTypeEnum, getLLMModel } from '@fastgpt/service/core/ai/model'; +import { ModelTypeEnum, getLLMModel } from '../../../../ai/model'; import { getHistories } from '../../utils'; import { runToolWithToolChoice } from './toolChoice'; import { DispatchToolModuleProps, ToolModuleItemType } from './type.d'; @@ -16,9 +16,12 @@ import { getSystemPrompt, runtimePrompt2ChatsValue } from '@fastgpt/global/core/chat/adapt'; -import { formatModelChars2Points } from '@fastgpt/service/support/wallet/usage/utils'; +import { formatModelChars2Points } from '../../../../../support/wallet/usage/utils'; import { getHistoryPreview } from '@fastgpt/global/core/chat/utils'; import { runToolWithFunctionCall } from './functionCall'; +import { runToolWithPromptCall } from './promptCall'; +import { replaceVariable } from '@fastgpt/global/common/string/tools'; +import { Prompt_Tool_Call } from './constants'; type Response = DispatchNodeResultType<{}>; @@ -72,16 +75,19 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< ]; const { - dispatchFlowResponse, + dispatchFlowResponse, // tool flow response totalTokens, - completeMessages = [] + completeMessages = [], // The actual message sent to AI(just save text) + assistantResponses = [] // FastGPT system store assistant.value response } = await (async () => { + const adaptMessages = chats2GPTMessages({ messages, reserveId: false }); + if (toolModel.toolChoice) { return runToolWithToolChoice({ ...props, toolModules, toolModel, - messages: chats2GPTMessages({ messages, reserveId: false }) + messages: adaptMessages }); } if (toolModel.functionCall) { @@ -89,14 +95,25 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< ...props, toolModules, toolModel, - messages: chats2GPTMessages({ messages, reserveId: false }) + messages: adaptMessages }); } - return { - dispatchFlowResponse: [], - totalTokens: 0, - completeMessages: [] - }; + + const lastMessage = adaptMessages[adaptMessages.length - 1]; + if (typeof lastMessage.content !== 'string') { + return Promise.reject('暂时只支持纯文本'); + } + + lastMessage.content = replaceVariable(Prompt_Tool_Call, { + question: userChatInput + }); + + return runToolWithPromptCall({ + ...props, + toolModules, + toolModel, + messages: adaptMessages + }); })(); const { totalPoints, modelName } = formatModelChars2Points({ @@ -105,11 +122,6 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< modelType: ModelTypeEnum.llm }); - const adaptMessages = GPTMessages2Chats(completeMessages); - //@ts-ignore - const startIndex = adaptMessages.findLastIndex((item) => item.obj === ChatRoleEnum.Human); - const assistantResponse = adaptMessages.slice(startIndex + 1); - // flat child tool response const childToolResponse = dispatchFlowResponse.map((item) => item.flowResponses).flat(); @@ -123,9 +135,7 @@ export const dispatchRunTools = async (props: DispatchToolModuleProps): Promise< const flatUsages = dispatchFlowResponse.map((item) => item.flowUsages).flat(); return { - [DispatchNodeResponseKeyEnum.assistantResponses]: assistantResponse - .map((item) => item.value) - .flat(), + [DispatchNodeResponseKeyEnum.assistantResponses]: assistantResponses, [DispatchNodeResponseKeyEnum.nodeResponse]: { totalPoints: totalPointsUsage, toolCallTokens: totalTokens, diff --git a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts new file mode 100644 index 00000000000..9c9f5942a2d --- /dev/null +++ b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts @@ -0,0 +1,385 @@ +import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; +import { getAIApi } from '../../../../ai/config'; +import { filterGPTMessageByMaxTokens } from '../../../../chat/utils'; +import { + ChatCompletion, + StreamChatType, + ChatCompletionMessageParam, + ChatCompletionAssistantMessageParam +} from '@fastgpt/global/core/ai/type'; +import { NextApiResponse } from 'next'; +import { + responseWrite, + responseWriteController, + responseWriteNodeStatus +} from '../../../../../common/response'; +import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; +import { textAdaptGptResponse } from '@fastgpt/global/core/module/runtime/utils'; +import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; +import { dispatchWorkFlow } from '../../index'; +import { DispatchToolModuleProps, RunToolResponse, ToolModuleItemType } from './type.d'; +import json5 from 'json5'; +import { countGptMessagesTokens } from '@fastgpt/global/common/string/tiktoken'; +import { getNanoid, replaceVariable } from '@fastgpt/global/common/string/tools'; +import { AIChatItemType } from '@fastgpt/global/core/chat/type'; +import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt'; + +type FunctionCallCompletion = { + id: string; + name: string; + arguments: string; + toolName?: string; + toolAvatar?: string; +}; + +export const runToolWithPromptCall = async ( + props: DispatchToolModuleProps & { + messages: ChatCompletionMessageParam[]; + toolModules: ToolModuleItemType[]; + toolModel: LLMModelItemType; + }, + response?: RunToolResponse +): Promise => { + const { + toolModel, + toolModules, + messages, + res, + runtimeModules, + detail = false, + module, + stream + } = props; + const assistantResponses = response?.assistantResponses || []; + + const toolsPrompt = JSON.stringify( + toolModules.map((module) => { + const properties: Record< + string, + { + type: string; + description: string; + required?: boolean; + } + > = {}; + module.toolParams.forEach((item) => { + properties[item.key] = { + type: 'string', + description: item.toolDescription || '' + }; + }); + + return { + toolId: module.moduleId, + description: module.intro, + parameters: { + type: 'object', + properties, + required: module.toolParams.filter((item) => item.required).map((item) => item.key) + } + }; + }) + ); + + const lastMessage = messages[messages.length - 1]; + if (typeof lastMessage.content !== 'string') { + return Promise.reject('暂时只支持纯文本'); + } + lastMessage.content = replaceVariable(lastMessage.content, { + toolsPrompt + }); + + const filterMessages = filterGPTMessageByMaxTokens({ + messages, + maxTokens: toolModel.maxContext - 500 // filter token. not response maxToken + }); + // console.log(JSON.stringify(filterMessages, null, 2)); + /* Run llm */ + const ai = getAIApi({ + timeout: 480000 + }); + const aiResponse = await ai.chat.completions.create( + { + ...toolModel?.defaultConfig, + model: toolModel.model, + temperature: 0, + stream, + messages: filterMessages + }, + { + headers: { + Accept: 'application/json, text/plain, */*' + } + } + ); + + const answer = await (async () => { + if (stream) { + const { answer } = await streamResponse({ + res, + detail, + toolModules, + stream: aiResponse + }); + + return answer; + } else { + const result = aiResponse as ChatCompletion; + + return result.choices?.[0]?.message?.content || ''; + } + })(); + + const parseAnswerResult = parseAnswer(answer); + // console.log(answer, '==11=='); + // No tools + if (typeof parseAnswerResult === 'string') { + // No tool is invoked, indicating that the process is over + const gptAssistantResponse: ChatCompletionAssistantMessageParam = { + role: ChatCompletionRequestMessageRoleEnum.Assistant, + content: parseAnswerResult + }; + const completeMessages = filterMessages.concat(gptAssistantResponse); + const tokens = countGptMessagesTokens(completeMessages, undefined); + // console.log(tokens, 'response token'); + + // concat tool assistant + const toolNodeAssistant = GPTMessages2Chats([gptAssistantResponse])[0] as AIChatItemType; + + return { + dispatchFlowResponse: response?.dispatchFlowResponse || [], + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + completeMessages, + assistantResponses: [...assistantResponses, ...toolNodeAssistant.value] + }; + } + + // Run the selected tool. + const toolsRunResponse = await (async () => { + if (!parseAnswerResult) return Promise.reject('tool run error'); + + const toolModule = toolModules.find((module) => module.moduleId === parseAnswerResult.name); + if (!toolModule) return Promise.reject('tool not found'); + + parseAnswerResult.toolName = toolModule.name; + parseAnswerResult.toolAvatar = toolModule.avatar; + + // SSE response to client + if (stream && detail) { + responseWrite({ + res, + event: SseResponseEventEnum.toolCall, + data: JSON.stringify({ + tool: { + id: parseAnswerResult.id, + toolName: toolModule.name, + toolAvatar: toolModule.avatar, + functionName: parseAnswerResult.name, + params: parseAnswerResult.arguments, + response: '' + } + }) + }); + } + + // run tool flow + const startParams = (() => { + try { + return json5.parse(parseAnswerResult.arguments); + } catch (error) { + return {}; + } + })(); + + const moduleRunResponse = await dispatchWorkFlow({ + ...props, + runtimeModules: runtimeModules.map((module) => ({ + ...module, + isEntry: module.moduleId === toolModule.moduleId + })), + startParams + }); + + const stringToolResponse = (() => { + if (typeof moduleRunResponse.toolResponses === 'object') { + return JSON.stringify(moduleRunResponse.toolResponses, null, 2); + } + + return moduleRunResponse.toolResponses ? String(moduleRunResponse.toolResponses) : 'none'; + })(); + + if (stream && detail) { + responseWrite({ + res, + event: SseResponseEventEnum.toolResponse, + data: JSON.stringify({ + tool: { + id: parseAnswerResult.id, + toolName: '', + toolAvatar: '', + params: '', + response: stringToolResponse + } + }) + }); + } + + return { + moduleRunResponse, + toolResponsePrompt: stringToolResponse + }; + })(); + + if (stream && detail) { + responseWriteNodeStatus({ + res, + name: module.name + }); + } + + // 合并工具调用的结果,使用 functionCall 格式存储。 + const assistantToolMsgParams: ChatCompletionAssistantMessageParam = { + role: ChatCompletionRequestMessageRoleEnum.Assistant, + function_call: parseAnswerResult + }; + const concatToolMessages = [ + ...filterMessages, + assistantToolMsgParams + ] as ChatCompletionMessageParam[]; + const tokens = countGptMessagesTokens(concatToolMessages, undefined); + const completeMessages: ChatCompletionMessageParam[] = [ + ...concatToolMessages, + { + role: ChatCompletionRequestMessageRoleEnum.Function, + name: parseAnswerResult.name, + content: toolsRunResponse.toolResponsePrompt + } + ]; + + // tool assistant + const toolAssistants = toolsRunResponse.moduleRunResponse.assistantResponses || []; + // tool node assistant + const adaptChatMessages = GPTMessages2Chats(completeMessages); + const toolNodeAssistant = adaptChatMessages.pop() as AIChatItemType; + + const toolNodeAssistants = [...assistantResponses, ...toolAssistants, ...toolNodeAssistant.value]; + + const dispatchFlowResponse = response + ? response.dispatchFlowResponse.concat(toolsRunResponse.moduleRunResponse) + : [toolsRunResponse.moduleRunResponse]; + + // get the next user prompt + lastMessage.content += `${answer} +TOOL_RESPONSE: ${toolsRunResponse.toolResponsePrompt} +ANSWER: `; + + /* check stop signal */ + const hasStopSignal = toolsRunResponse.moduleRunResponse.flowResponses.some( + (item) => !!item.toolStop + ); + if (hasStopSignal) { + return { + dispatchFlowResponse, + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + completeMessages: filterMessages, + assistantResponses: toolNodeAssistants + }; + } + + return runToolWithPromptCall( + { + ...props, + messages + }, + { + dispatchFlowResponse, + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + assistantResponses: toolNodeAssistants + } + ); +}; + +async function streamResponse({ + res, + detail, + stream +}: { + res: NextApiResponse; + detail: boolean; + toolModules: ToolModuleItemType[]; + stream: StreamChatType; +}) { + const write = responseWriteController({ + res, + readStream: stream + }); + + let startResponseWrite = false; + let textAnswer = ''; + + for await (const part of stream) { + if (res.closed) { + stream.controller?.abort(); + break; + } + + const responseChoice = part.choices?.[0]?.delta; + if (responseChoice.content) { + const content = responseChoice?.content || ''; + textAnswer += content; + + if (startResponseWrite) { + responseWrite({ + write, + event: detail ? SseResponseEventEnum.answer : undefined, + data: textAdaptGptResponse({ + text: content + }) + }); + } else if (textAnswer.length >= 3) { + textAnswer = textAnswer.trim(); + if (textAnswer.startsWith('0')) { + startResponseWrite = true; + // find first : index + const firstIndex = textAnswer.indexOf(':'); + textAnswer = textAnswer.substring(firstIndex + 1).trim(); + responseWrite({ + write, + event: detail ? SseResponseEventEnum.answer : undefined, + data: textAdaptGptResponse({ + text: textAnswer + }) + }); + } + } + } + } + + if (!textAnswer) { + return Promise.reject('LLM api response empty'); + } + // console.log(textAnswer, '---==='); + return { answer: textAnswer.trim() }; +} + +const parseAnswer = (str: string): FunctionCallCompletion | string => { + // 首先,使用正则表达式提取TOOL_ID和TOOL_ARGUMENTS + const prefix = '1:'; + str = str.trim(); + if (str.startsWith(prefix)) { + const toolString = str.substring(prefix.length).trim(); + + try { + const toolCall = json5.parse(toolString); + return { + id: getNanoid(), + name: toolCall.toolId, + arguments: JSON.stringify(toolCall.arguments) + }; + } catch (error) { + return str; + } + } else { + return str; + } +}; diff --git a/packages/service/core/workflow/dispatch/agent/runTool/stopTool.ts b/packages/service/core/workflow/dispatch/agent/runTool/stopTool.ts new file mode 100644 index 00000000000..4edb7c7ac49 --- /dev/null +++ b/packages/service/core/workflow/dispatch/agent/runTool/stopTool.ts @@ -0,0 +1,14 @@ +import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; +import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d'; +import { DispatchNodeResultType } from '@fastgpt/global/core/module/runtime/type'; + +export type AnswerProps = ModuleDispatchProps<{}>; +export type AnswerResponse = DispatchNodeResultType<{}>; + +export const dispatchStopToolCall = (props: Record): AnswerResponse => { + return { + [DispatchNodeResponseKeyEnum.nodeResponse]: { + toolStop: true + } + }; +}; diff --git a/projects/app/src/service/moduleDispatch/agent/runTool/toolChoice.ts b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts similarity index 75% rename from projects/app/src/service/moduleDispatch/agent/runTool/toolChoice.ts rename to packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts index 49323e15cb7..c2b4e019223 100644 --- a/projects/app/src/service/moduleDispatch/agent/runTool/toolChoice.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts @@ -1,6 +1,6 @@ import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; -import { getAIApi } from '@fastgpt/service/core/ai/config'; -import { filterGPTMessageByMaxTokens } from '@fastgpt/service/core/chat/utils'; +import { getAIApi } from '../../../../ai/config'; +import { filterGPTMessageByMaxTokens } from '../../../../chat/utils'; import { ChatCompletion, ChatCompletionMessageToolCall, @@ -8,14 +8,15 @@ import { ChatCompletionToolMessageParam, ChatCompletionAssistantToolParam, ChatCompletionMessageParam, - ChatCompletionTool + ChatCompletionTool, + ChatCompletionAssistantMessageParam } from '@fastgpt/global/core/ai/type'; import { NextApiResponse } from 'next'; import { responseWrite, responseWriteController, responseWriteNodeStatus -} from '@fastgpt/service/common/response'; +} from '../../../../../common/response'; import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; import { textAdaptGptResponse } from '@fastgpt/global/core/module/runtime/utils'; import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; @@ -24,12 +25,21 @@ import { DispatchToolModuleProps, RunToolResponse, ToolModuleItemType } from './ import json5 from 'json5'; import { DispatchFlowResponse } from '../../type'; import { countGptMessagesTokens } from '@fastgpt/global/common/string/tiktoken'; +import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt'; +import { AIChatItemType } from '@fastgpt/global/core/chat/type'; type ToolRunResponseType = { moduleRunResponse: DispatchFlowResponse; toolMsgParams: ChatCompletionToolMessageParam; }[]; +/* + 调用思路 + 1. messages 接收发送给AI的消息 + 2. response 记录递归运行结果(累计计算 dispatchFlowResponse, totalTokens和assistantResponses) + 3. 如果运行工具的话,则需要把工具中的结果累计加到dispatchFlowResponse中。 本次消耗的 token 加到 totalTokens, assistantResponses 记录当前工具运行的内容。 +*/ + export const runToolWithToolChoice = async ( props: DispatchToolModuleProps & { messages: ChatCompletionMessageParam[]; @@ -48,6 +58,7 @@ export const runToolWithToolChoice = async ( module, stream } = props; + const assistantResponses = response?.assistantResponses || []; const tools: ChatCompletionTool[] = toolModules.map((module) => { const properties: Record< @@ -159,11 +170,19 @@ export const runToolWithToolChoice = async ( startParams }); + const stringToolResponse = (() => { + if (typeof moduleRunResponse.toolResponses === 'object') { + return JSON.stringify(moduleRunResponse.toolResponses, null, 2); + } + + return moduleRunResponse.toolResponses ? String(moduleRunResponse.toolResponses) : 'none'; + })(); + const toolMsgParams: ChatCompletionToolMessageParam = { tool_call_id: tool.id, role: ChatCompletionRequestMessageRoleEnum.Tool, name: tool.function.name, - content: JSON.stringify(moduleRunResponse.toolResponses, null, 2) + content: stringToolResponse }; if (stream && detail) { @@ -176,7 +195,7 @@ export const runToolWithToolChoice = async ( toolName: '', toolAvatar: '', params: '', - response: JSON.stringify(moduleRunResponse.toolResponses, null, 2) + response: stringToolResponse } }) }); @@ -202,18 +221,12 @@ export const runToolWithToolChoice = async ( ...filterMessages, assistantToolMsgParams ] as ChatCompletionMessageParam[]; - const tokens = countGptMessagesTokens(concatToolMessages, tools); - // console.log( - // JSON.stringify( - // { - // messages: concatToolMessages, - // tools - // }, - // null, - // 2 - // ) - // ); + const completeMessages = [ + ...concatToolMessages, + ...toolsRunResponse.map((item) => item?.toolMsgParams) + ]; + // console.log(tokens, 'tool'); if (stream && detail) { @@ -223,42 +236,71 @@ export const runToolWithToolChoice = async ( }); } + // tool assistant + const toolAssistants = toolsRunResponse + .map((item) => { + const assistantResponses = item.moduleRunResponse.assistantResponses || []; + return assistantResponses; + }) + .flat(); + + // tool node assistant + const adaptChatMessages = GPTMessages2Chats(completeMessages); + const toolNodeAssistant = adaptChatMessages.pop() as AIChatItemType; + + const toolNodeAssistants = [ + ...assistantResponses, + ...toolAssistants, + ...toolNodeAssistant.value + ]; + + // concat tool responses + const dispatchFlowResponse = response + ? response.dispatchFlowResponse.concat(flatToolsResponseData) + : flatToolsResponseData; + + /* check stop signal */ + const hasStopSignal = flatToolsResponseData.some( + (item) => !!item.flowResponses?.find((item) => item.toolStop) + ); + if (hasStopSignal) { + return { + dispatchFlowResponse, + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + completeMessages, + assistantResponses: toolNodeAssistants + }; + } + return runToolWithToolChoice( { ...props, - messages: [...concatToolMessages, ...toolsRunResponse.map((item) => item?.toolMsgParams)] + messages: completeMessages }, { - dispatchFlowResponse: response - ? response.dispatchFlowResponse.concat(flatToolsResponseData) - : flatToolsResponseData, - totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens + dispatchFlowResponse, + totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, + assistantResponses: toolNodeAssistants } ); } else { // No tool is invoked, indicating that the process is over - const completeMessages = filterMessages.concat({ + const gptAssistantResponse: ChatCompletionAssistantMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, content: answer - }); - + }; + const completeMessages = filterMessages.concat(gptAssistantResponse); const tokens = countGptMessagesTokens(completeMessages, tools); - // console.log( - // JSON.stringify( - // { - // messages: completeMessages, - // tools - // }, - // null, - // 2 - // ) - // ); // console.log(tokens, 'response token'); + // concat tool assistant + const toolNodeAssistant = GPTMessages2Chats([gptAssistantResponse])[0] as AIChatItemType; + return { dispatchFlowResponse: response?.dispatchFlowResponse || [], totalTokens: response?.totalTokens ? response.totalTokens + tokens : tokens, - completeMessages + completeMessages, + assistantResponses: [...assistantResponses, ...toolNodeAssistant.value] }; } }; diff --git a/projects/app/src/service/moduleDispatch/agent/runTool/type.d.ts b/packages/service/core/workflow/dispatch/agent/runTool/type.d.ts similarity index 88% rename from projects/app/src/service/moduleDispatch/agent/runTool/type.d.ts rename to packages/service/core/workflow/dispatch/agent/runTool/type.d.ts index e6b9e3cab9c..6eb4375a6e1 100644 --- a/projects/app/src/service/moduleDispatch/agent/runTool/type.d.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/type.d.ts @@ -8,6 +8,7 @@ import type { import type { RunningModuleItemType } from '@fastgpt/global/core/module/runtime/type'; import { ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type'; import type { DispatchFlowResponse } from '../../type.d'; +import { AIChatItemValueItemType, ChatItemValueItemType } from '@fastgpt/global/core/chat/type'; export type DispatchToolModuleProps = ModuleDispatchProps<{ [ModuleInputKeyEnum.history]?: ChatItemType[]; @@ -20,6 +21,7 @@ export type RunToolResponse = { dispatchFlowResponse: DispatchFlowResponse[]; totalTokens: number; completeMessages?: ChatCompletionMessageParam[]; + assistantResponses?: AIChatItemValueItemType[]; }; export type ToolModuleItemType = RunningModuleItemType & { toolParams: RunningModuleItemType['inputs']; diff --git a/projects/app/src/service/moduleDispatch/chat/oneapi.ts b/packages/service/core/workflow/dispatch/chat/oneapi.ts similarity index 94% rename from projects/app/src/service/moduleDispatch/chat/oneapi.ts rename to packages/service/core/workflow/dispatch/chat/oneapi.ts index 61f12b1e104..ae043a15582 100644 --- a/projects/app/src/service/moduleDispatch/chat/oneapi.ts +++ b/packages/service/core/workflow/dispatch/chat/oneapi.ts @@ -3,20 +3,20 @@ import { filterGPTMessageByMaxTokens, formatGPTMessagesInRequestBefore, loadChatImgToBase64 -} from '@fastgpt/service/core/chat/utils'; +} from '../../../chat/utils'; import type { ChatItemType, UserChatItemValueItemType } from '@fastgpt/global/core/chat/type.d'; import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants'; import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; import { textAdaptGptResponse } from '@fastgpt/global/core/module/runtime/utils'; -import { getAIApi } from '@fastgpt/service/core/ai/config'; +import { getAIApi } from '../../../ai/config'; import type { ChatCompletion, ChatCompletionMessageParam, StreamChatType } from '@fastgpt/global/core/ai/type.d'; -import { formatModelChars2Points } from '@fastgpt/service/support/wallet/usage/utils'; +import { formatModelChars2Points } from '../../../../support/wallet/usage/utils'; import type { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; -import { postTextCensor } from '@/service/common/censor'; +import { postTextCensor } from '../../../../common/api/requestPlusApi'; import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; import type { ModuleItemType } from '@fastgpt/global/core/module/type.d'; import type { DispatchNodeResultType } from '@fastgpt/global/core/module/runtime/type'; @@ -30,12 +30,15 @@ import { GPTMessages2Chats, runtimePrompt2ChatsValue } from '@fastgpt/global/core/chat/adapt'; -import { Prompt_QuotePromptList, Prompt_QuoteTemplateList } from '@/global/core/prompt/AIChat'; +import { + Prompt_QuotePromptList, + Prompt_QuoteTemplateList +} from '@fastgpt/global/core/ai/prompt/AIChat'; import type { AIChatModuleProps } from '@fastgpt/global/core/module/node/type.d'; import { replaceVariable } from '@fastgpt/global/common/string/tools'; import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d'; -import { responseWrite, responseWriteController } from '@fastgpt/service/common/response'; -import { getLLMModel, ModelTypeEnum } from '@fastgpt/service/core/ai/model'; +import { responseWrite, responseWriteController } from '../../../../common/response'; +import { getLLMModel, ModelTypeEnum } from '../../../ai/model'; import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import { ModuleInputKeyEnum, ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; @@ -233,6 +236,7 @@ export const dispatchChatCompletion = async (props: ChatProps): Promise ({ - text: `${item.q}\n${item.a}`.trim(), - chunkIndex: item.chunkIndex + id: item.id, + text: `${item.q}\n${item.a}`.trim() })) }; } diff --git a/projects/app/src/service/moduleDispatch/index.ts b/packages/service/core/workflow/dispatch/index.ts similarity index 96% rename from projects/app/src/service/moduleDispatch/index.ts rename to packages/service/core/workflow/dispatch/index.ts index 5a46824572b..11eecdc1d84 100644 --- a/projects/app/src/service/moduleDispatch/index.ts +++ b/packages/service/core/workflow/dispatch/index.ts @@ -13,7 +13,7 @@ import type { import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import { ModuleItemType } from '@fastgpt/global/core/module/type'; import { replaceVariable } from '@fastgpt/global/common/string/tools'; -import { responseWriteNodeStatus } from '@fastgpt/service/common/response'; +import { responseWriteNodeStatus } from '../../../common/response'; import { getSystemTime } from '@fastgpt/global/common/time/timezone'; import { dispatchHistory } from './init/history'; @@ -36,6 +36,7 @@ import { ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type'; import { dispatchRunTools } from './agent/runTool/index'; import { ChatItemValueTypeEnum } from '@fastgpt/global/core/chat/constants'; import { DispatchFlowResponse } from './type'; +import { dispatchStopToolCall } from './agent/runTool/stopTool'; const callbackMap: Record<`${FlowNodeTypeEnum}`, Function> = { [FlowNodeTypeEnum.historyNode]: dispatchHistory, @@ -54,6 +55,7 @@ const callbackMap: Record<`${FlowNodeTypeEnum}`, Function> = { [FlowNodeTypeEnum.pluginOutput]: dispatchPluginOutput, [FlowNodeTypeEnum.queryExtension]: dispatchQueryExtension, [FlowNodeTypeEnum.tools]: dispatchRunTools, + [FlowNodeTypeEnum.stopTool]: dispatchStopToolCall, // none [FlowNodeTypeEnum.userGuide]: () => Promise.resolve() @@ -93,7 +95,7 @@ export async function dispatchWorkFlow({ let chatResponses: ChatHistoryItemResType[] = []; // response request and save to database let chatAssistantResponse: AIChatItemValueItemType[] = []; // The value will be returned to the user let chatNodeUsages: ChatNodeUsageType[] = []; - let toolRunResponse: ToolRunResponseItemType[] = []; + let toolRunResponse: ToolRunResponseItemType; let runningTime = Date.now(); /* Store special response field */ @@ -124,12 +126,12 @@ export async function dispatchWorkFlow({ if (nodeDispatchUsages) { chatNodeUsages = chatNodeUsages.concat(nodeDispatchUsages); } - if (toolResponses) { - if (Array.isArray(toolResponses) && toolResponses.length > 0) { - toolRunResponse.push(toolResponses); - } else if (Object.keys(toolResponses).length > 0) { - toolRunResponse.push(toolResponses); + if (toolResponses !== undefined) { + if (Array.isArray(toolResponses) && toolResponses.length === 0) return; + if (typeof toolResponses === 'object' && Object.keys(toolResponses).length === 0) { + return; } + toolRunResponse = toolResponses; } if (assistantResponses) { chatAssistantResponse = chatAssistantResponse.concat(assistantResponses); diff --git a/projects/app/src/service/moduleDispatch/init/history.tsx b/packages/service/core/workflow/dispatch/init/history.tsx similarity index 100% rename from projects/app/src/service/moduleDispatch/init/history.tsx rename to packages/service/core/workflow/dispatch/init/history.tsx diff --git a/projects/app/src/service/moduleDispatch/init/userChatInput.tsx b/packages/service/core/workflow/dispatch/init/userChatInput.tsx similarity index 100% rename from projects/app/src/service/moduleDispatch/init/userChatInput.tsx rename to packages/service/core/workflow/dispatch/init/userChatInput.tsx diff --git a/projects/app/src/service/moduleDispatch/plugin/run.ts b/packages/service/core/workflow/dispatch/plugin/run.ts similarity index 95% rename from projects/app/src/service/moduleDispatch/plugin/run.ts rename to packages/service/core/workflow/dispatch/plugin/run.ts index 54e41c006cf..c4cd78bbea6 100644 --- a/projects/app/src/service/moduleDispatch/plugin/run.ts +++ b/packages/service/core/workflow/dispatch/plugin/run.ts @@ -3,8 +3,8 @@ import { dispatchWorkFlow } from '../index'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import { DYNAMIC_INPUT_KEY, ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; -import { getPluginRuntimeById } from '@fastgpt/service/core/plugin/controller'; -import { authPluginCanUse } from '@fastgpt/service/support/permission/auth/plugin'; +import { getPluginRuntimeById } from '../../../plugin/controller'; +import { authPluginCanUse } from '../../../../support/permission/auth/plugin'; import { setEntryEntries } from '../utils'; import { DispatchNodeResultType } from '@fastgpt/global/core/module/runtime/type'; diff --git a/projects/app/src/service/moduleDispatch/plugin/runInput.ts b/packages/service/core/workflow/dispatch/plugin/runInput.ts similarity index 100% rename from projects/app/src/service/moduleDispatch/plugin/runInput.ts rename to packages/service/core/workflow/dispatch/plugin/runInput.ts diff --git a/projects/app/src/service/moduleDispatch/plugin/runOutput.ts b/packages/service/core/workflow/dispatch/plugin/runOutput.ts similarity index 100% rename from projects/app/src/service/moduleDispatch/plugin/runOutput.ts rename to packages/service/core/workflow/dispatch/plugin/runOutput.ts diff --git a/projects/app/src/service/moduleDispatch/tools/answer.ts b/packages/service/core/workflow/dispatch/tools/answer.ts similarity index 82% rename from projects/app/src/service/moduleDispatch/tools/answer.ts rename to packages/service/core/workflow/dispatch/tools/answer.ts index c766c6c387a..e74b08e2c82 100644 --- a/projects/app/src/service/moduleDispatch/tools/answer.ts +++ b/packages/service/core/workflow/dispatch/tools/answer.ts @@ -1,14 +1,15 @@ import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; -import { responseWrite } from '@fastgpt/service/common/response'; +import { responseWrite } from '../../../../common/response'; import { textAdaptGptResponse } from '@fastgpt/global/core/module/runtime/utils'; import type { ModuleDispatchProps } from '@fastgpt/global/core/module/type.d'; import { ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants'; +import { DispatchNodeResultType } from '@fastgpt/global/core/module/runtime/type'; export type AnswerProps = ModuleDispatchProps<{ text: string; }>; -export type AnswerResponse = { +export type AnswerResponse = DispatchNodeResultType<{ [ModuleOutputKeyEnum.answerText]: string; -}; +}>; export const dispatchAnswer = (props: Record): AnswerResponse => { const { diff --git a/projects/app/src/service/moduleDispatch/tools/http.ts b/packages/service/core/workflow/dispatch/tools/http.ts similarity index 98% rename from projects/app/src/service/moduleDispatch/tools/http.ts rename to packages/service/core/workflow/dispatch/tools/http.ts index 03138bcb281..e70045aac86 100644 --- a/projects/app/src/service/moduleDispatch/tools/http.ts +++ b/packages/service/core/workflow/dispatch/tools/http.ts @@ -7,7 +7,7 @@ import { import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; import axios from 'axios'; import { valueTypeFormat } from '../utils'; -import { SERVICE_LOCAL_HOST } from '@fastgpt/service/common/system/tools'; +import { SERVICE_LOCAL_HOST } from '../../../../common/system/tools'; import { DispatchNodeResultType } from '@fastgpt/global/core/module/runtime/type'; type HttpRequestProps = ModuleDispatchProps<{ diff --git a/projects/app/src/service/moduleDispatch/tools/http468.ts b/packages/service/core/workflow/dispatch/tools/http468.ts similarity index 96% rename from projects/app/src/service/moduleDispatch/tools/http468.ts rename to packages/service/core/workflow/dispatch/tools/http468.ts index 08bd33a1f94..cf41ad8e449 100644 --- a/projects/app/src/service/moduleDispatch/tools/http468.ts +++ b/packages/service/core/workflow/dispatch/tools/http468.ts @@ -7,8 +7,8 @@ import { import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; import axios from 'axios'; import { valueTypeFormat } from '../utils'; -import { SERVICE_LOCAL_HOST } from '@fastgpt/service/common/system/tools'; -import { addLog } from '@fastgpt/service/common/system/log'; +import { SERVICE_LOCAL_HOST } from '../../../../common/system/tools'; +import { addLog } from '../../../../common/system/log'; import { DispatchNodeResultType } from '@fastgpt/global/core/module/runtime/type'; type PropsArrType = { @@ -39,7 +39,7 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise { try { @@ -98,7 +99,6 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise import('./icons/core/app/simpleMode/template.svg'), 'core/app/simpleMode/tts': () => import('./icons/core/app/simpleMode/tts.svg'), 'core/app/simpleMode/variable': () => import('./icons/core/app/simpleMode/variable.svg'), + 'core/app/toolCall': () => import('./icons/core/app/toolCall.svg'), 'core/app/ttsFill': () => import('./icons/core/app/ttsFill.svg'), 'core/app/variable/external': () => import('./icons/core/app/variable/external.svg'), 'core/app/variable/input': () => import('./icons/core/app/variable/input.svg'), @@ -101,8 +102,11 @@ export const iconPaths = { 'core/dataset/rerank': () => import('./icons/core/dataset/rerank.svg'), 'core/dataset/tableCollection': () => import('./icons/core/dataset/tableCollection.svg'), 'core/dataset/websiteDataset': () => import('./icons/core/dataset/websiteDataset.svg'), + 'core/modules/basicNode': () => import('./icons/core/modules/basicNode.svg'), 'core/modules/flowLight': () => import('./icons/core/modules/flowLight.svg'), 'core/modules/previewLight': () => import('./icons/core/modules/previewLight.svg'), + 'core/modules/systemPlugin': () => import('./icons/core/modules/systemPlugin.svg'), + 'core/modules/teamPlugin': () => import('./icons/core/modules/teamPlugin.svg'), 'core/modules/variable': () => import('./icons/core/modules/variable.svg'), 'core/modules/welcomeText': () => import('./icons/core/modules/welcomeText.svg'), date: () => import('./icons/date.svg'), @@ -131,6 +135,7 @@ export const iconPaths = { kbTest: () => import('./icons/kbTest.svg'), menu: () => import('./icons/menu.svg'), minus: () => import('./icons/minus.svg'), + 'modal/concat': () => import('./icons/modal/concat.svg'), 'modal/confirmPay': () => import('./icons/modal/confirmPay.svg'), 'modal/edit': () => import('./icons/modal/edit.svg'), 'modal/manualDataset': () => import('./icons/modal/manualDataset.svg'), diff --git a/packages/web/components/common/Icon/icons/common/addLight.svg b/packages/web/components/common/Icon/icons/common/addLight.svg index 6600df5439e..011f635968b 100644 --- a/packages/web/components/common/Icon/icons/common/addLight.svg +++ b/packages/web/components/common/Icon/icons/common/addLight.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/app/toolCall.svg b/packages/web/components/common/Icon/icons/core/app/toolCall.svg new file mode 100644 index 00000000000..6c1ee754f9c --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/app/toolCall.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/modules/basicNode.svg b/packages/web/components/common/Icon/icons/core/modules/basicNode.svg new file mode 100644 index 00000000000..85c18d1ddf6 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/modules/basicNode.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/modules/systemPlugin.svg b/packages/web/components/common/Icon/icons/core/modules/systemPlugin.svg new file mode 100644 index 00000000000..5da1c6dc64d --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/modules/systemPlugin.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/modules/teamPlugin.svg b/packages/web/components/common/Icon/icons/core/modules/teamPlugin.svg new file mode 100644 index 00000000000..237177f62c2 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/modules/teamPlugin.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/modal/concat.svg b/packages/web/components/common/Icon/icons/modal/concat.svg new file mode 100644 index 00000000000..3023552ada1 --- /dev/null +++ b/packages/web/components/common/Icon/icons/modal/concat.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/packages/web/components/common/Input/HttpInput/Editor.tsx b/packages/web/components/common/Input/HttpInput/Editor.tsx index b6f06e70228..dfa28e8cdc3 100644 --- a/packages/web/components/common/Input/HttpInput/Editor.tsx +++ b/packages/web/components/common/Input/HttpInput/Editor.tsx @@ -78,7 +78,7 @@ export default function Editor({ ); return ( - + } diff --git a/packages/web/components/common/CustomModal/index.tsx b/packages/web/components/common/MyModal/index.tsx similarity index 96% rename from packages/web/components/common/CustomModal/index.tsx rename to packages/web/components/common/MyModal/index.tsx index 2e42b1b12eb..cc00ca9ef3b 100644 --- a/packages/web/components/common/CustomModal/index.tsx +++ b/packages/web/components/common/MyModal/index.tsx @@ -18,10 +18,9 @@ export interface MyModalProps extends ModalContentProps { isCentered?: boolean; isOpen: boolean; onClose?: () => void; - isPc?: boolean; } -const CustomModal = ({ +const MyModal = ({ isOpen, onClose, iconSrc, @@ -92,4 +91,4 @@ const CustomModal = ({ ); }; -export default CustomModal; +export default React.memo(MyModal); diff --git a/packages/web/components/common/MySelect/index.tsx b/packages/web/components/common/MySelect/index.tsx index f9b3c1dc2b0..4cf2f42b269 100644 --- a/packages/web/components/common/MySelect/index.tsx +++ b/packages/web/components/common/MySelect/index.tsx @@ -92,7 +92,8 @@ const MySelect = ( : `${width} !important`; })()} w={'auto'} - p={'6px'} + px={'6px'} + py={'6px'} border={'1px solid #fff'} boxShadow={ '0px 2px 4px rgba(161, 167, 179, 0.25), 0px 0px 1px rgba(121, 141, 159, 0.25);' diff --git a/packages/web/components/common/MyTooltip/QuestionTip.tsx b/packages/web/components/common/MyTooltip/QuestionTip.tsx new file mode 100644 index 00000000000..c2a7b81e452 --- /dev/null +++ b/packages/web/components/common/MyTooltip/QuestionTip.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import MyTooltip from '.'; +import { IconProps, QuestionOutlineIcon } from '@chakra-ui/icons'; + +type Props = IconProps & { + label?: string; +}; + +const QuestionTip = ({ label, ...props }: Props) => { + return ( + + + + ); +}; + +export default QuestionTip; diff --git a/packages/web/components/common/Tabs/RowTabs.tsx b/packages/web/components/common/Tabs/RowTabs.tsx index 339e534d233..9246836d7cf 100644 --- a/packages/web/components/common/Tabs/RowTabs.tsx +++ b/packages/web/components/common/Tabs/RowTabs.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import { Flex, Box } from '@chakra-ui/react'; +import { Flex, Box, BoxProps } from '@chakra-ui/react'; import MyIcon from '../Icon'; -type Props = { +type Props = BoxProps & { list: { icon?: string; label: string | React.ReactNode; @@ -12,7 +12,7 @@ type Props = { onChange: (e: string) => void; }; -const RowTabs = ({ list, value, onChange }: Props) => { +const RowTabs = ({ list, value, onChange, py = '7px', px = '12px', ...props }: Props) => { return ( { borderColor={'borderColor.base'} bg={'myGray.50'} gap={'4px'} + {...props} > {list.map((item) => ( { const myToast = useCallback( (options?: UseToastOptions) => { - toast(options); + if (options?.title || options?.description) { + toast(options); + } }, [props] ); diff --git a/packages/web/package.json b/packages/web/package.json index f7142e58f4b..7b2d1ce6673 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,12 +2,12 @@ "name": "@fastgpt/web", "version": "1.0.0", "dependencies": { - "@chakra-ui/anatomy": "^2.2.1", - "@chakra-ui/icons": "^2.1.1", - "@chakra-ui/next-js": "^2.1.5", - "@chakra-ui/react": "^2.8.1", - "@chakra-ui/styled-system": "^2.9.1", - "@chakra-ui/system": "^2.6.1", + "@chakra-ui/anatomy": "2.2.1", + "@chakra-ui/icons": "2.1.1", + "@chakra-ui/next-js": "2.1.5", + "@chakra-ui/react": "2.8.1", + "@chakra-ui/styled-system": "2.9.1", + "@chakra-ui/system": "2.6.1", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@fastgpt/global": "workspace:*", diff --git a/packages/web/styles/theme.ts b/packages/web/styles/theme.ts index e8ef455292b..2c87bcfd1fa 100644 --- a/packages/web/styles/theme.ts +++ b/packages/web/styles/theme.ts @@ -207,6 +207,33 @@ const Button = defineStyleConfig({ _disabled: { bg: 'myGray.50' } + }, + grayDanger: { + bg: 'myGray.150', + color: 'myGray.900', + _hover: { + color: 'red.600', + background: 'red.1', + borderColor: 'red.300' + }, + _active: { + color: 'red.600' + } + }, + transparentBase: { + color: 'myGray.800', + fontWeight: '500', + bg: 'white', + transition: 'background 0.1s', + _hover: { + bg: 'myGray.150' + }, + _active: { + bg: 'myGray.150' + }, + _disabled: { + color: 'myGray.800 !important' + } } }, defaultProps: { @@ -363,6 +390,18 @@ const Checkbox = checkBoxMultiStyle({ }) }); +const Modal = defineMultiStyleConfig({ + baseStyle: definePartsStyle({ + body: { + py: [3, 5], + px: [5, 7] + }, + footer: { + pt: 2 + } + }) +}); + // 全局主题 export const theme = extendTheme({ styles: { @@ -527,6 +566,7 @@ export const theme = extendTheme({ Switch, Select, NumberInput, - Checkbox + Checkbox, + Modal } }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e9df22baae..7cf6541b050 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -19,7 +19,7 @@ importers: version: 23.10.0 lint-staged: specifier: ^13.2.1 - version: 13.2.1 + version: 13.3.0 next-i18next: specifier: 15.2.0 version: 15.2.0(i18next@23.10.0)(next@13.5.2)(react-i18next@13.5.0)(react@18.2.0) @@ -31,35 +31,47 @@ importers: version: 13.5.0(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) zhlint: specifier: ^0.7.1 - version: 0.7.1 + version: 0.7.4 packages/global: dependencies: axios: specifier: ^1.5.1 - version: 1.5.1 + version: 1.6.8 dayjs: specifier: ^1.11.7 - version: 1.11.7 + version: 1.11.10 encoding: specifier: ^0.1.13 version: 0.1.13 js-tiktoken: specifier: ^1.0.7 - version: 1.0.7 + version: 1.0.10 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 nanoid: specifier: ^4.0.1 - version: 4.0.1 + version: 4.0.2 + next: + specifier: 13.5.2 + version: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) openai: specifier: 4.28.0 version: 4.28.0(encoding@0.1.13) + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 timezones-list: specifier: ^3.0.2 - version: 3.0.2 + version: 3.0.3 devDependencies: + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 '@types/node': specifier: ^20.8.5 - version: 20.8.5 + version: 20.11.30 packages/plugins: devDependencies: @@ -71,16 +83,19 @@ importers: version: link:../service '@types/node': specifier: ^20.8.5 - version: 20.8.5 + version: 20.11.30 packages/service: dependencies: '@fastgpt/global': specifier: workspace:* version: link:../global + '@node-rs/jieba': + specifier: 1.10.0 + version: 1.10.0 axios: specifier: ^1.5.1 - version: 1.5.1 + version: 1.6.8 cheerio: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 @@ -92,50 +107,53 @@ importers: version: 2.30.0 dayjs: specifier: ^1.11.7 - version: 1.11.7 + version: 1.11.10 encoding: specifier: ^0.1.13 version: 0.1.13 + json5: + specifier: ^2.2.3 + version: 2.2.3 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 mongoose: specifier: ^7.0.2 - version: 7.0.2 + version: 7.6.10 multer: specifier: 1.4.5-lts.1 version: 1.4.5-lts.1 next: specifier: 13.5.2 - version: 13.5.2(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + version: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) nextjs-cors: specifier: ^2.1.2 - version: 2.1.2(next@13.5.2) + version: 2.2.0(next@13.5.2) node-cron: specifier: ^3.0.3 version: 3.0.3 pg: specifier: ^8.10.0 - version: 8.10.0 + version: 8.11.3 tunnel: specifier: ^0.0.6 version: 0.0.6 devDependencies: '@types/cookie': specifier: ^0.5.2 - version: 0.5.2 + version: 0.5.4 '@types/jsonwebtoken': specifier: ^9.0.3 - version: 9.0.3 + version: 9.0.6 '@types/multer': specifier: ^1.4.10 - version: 1.4.10 + version: 1.4.11 '@types/node-cron': specifier: ^3.0.11 version: 3.0.11 '@types/pg': specifier: ^8.6.6 - version: 8.6.6 + version: 8.11.3 '@types/tunnel': specifier: ^0.0.4 version: 0.0.4 @@ -143,35 +161,35 @@ importers: packages/web: dependencies: '@chakra-ui/anatomy': - specifier: ^2.2.1 + specifier: 2.2.1 version: 2.2.1 '@chakra-ui/icons': - specifier: ^2.1.1 + specifier: 2.1.1 version: 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/next-js': - specifier: ^2.1.5 - version: 2.1.5(@chakra-ui/react@2.8.1)(@emotion/react@11.11.1)(next@13.5.2)(react@18.2.0) + specifier: 2.1.5 + version: 2.1.5(@chakra-ui/react@2.8.1)(@emotion/react@11.11.4)(next@13.5.2)(react@18.2.0) '@chakra-ui/react': - specifier: ^2.8.1 - version: 2.8.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0) + specifier: 2.8.1 + version: 2.8.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/styled-system': - specifier: ^2.9.1 + specifier: 2.9.1 version: 2.9.1 '@chakra-ui/system': - specifier: ^2.6.1 - version: 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + specifier: 2.6.1 + version: 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@emotion/react': specifier: ^11.11.1 - version: 11.11.1(@types/react@18.2.0)(react@18.2.0) + version: 11.11.4(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.0)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.0)(react@18.2.0) '@fastgpt/global': specifier: workspace:* version: link:../global '@fingerprintjs/fingerprintjs': specifier: ^4.2.1 - version: 4.2.1 + version: 4.2.2 '@lexical/react': specifier: 0.12.6 version: 0.12.6(lexical@0.12.6)(react-dom@18.2.0)(react@18.2.0)(yjs@13.6.14) @@ -183,16 +201,16 @@ importers: version: 0.12.6(lexical@0.12.6) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.46.0)(react-dom@18.2.0)(react@18.2.0) + version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': specifier: ^4.24.10 - version: 4.24.10(react-dom@18.2.0)(react@18.2.0) + version: 4.36.1(react-dom@18.2.0)(react@18.2.0) date-fns: specifier: 2.30.0 version: 2.30.0 dayjs: specifier: ^1.11.7 - version: 1.11.7 + version: 1.11.10 i18next: specifier: 23.10.0 version: 23.10.0 @@ -207,7 +225,7 @@ importers: version: 4.17.21 mammoth: specifier: ^1.6.0 - version: 1.6.0 + version: 1.7.0 next-i18next: specifier: 15.2.0 version: 15.2.0(i18next@23.10.0)(next@13.5.2)(react-i18next@13.5.0)(react@18.2.0) @@ -222,7 +240,7 @@ importers: version: 18.2.0 react-day-picker: specifier: ^8.7.1 - version: 8.7.1(date-fns@2.30.0)(react@18.2.0) + version: 8.10.0(date-fns@2.30.0)(react@18.2.0) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) @@ -231,14 +249,14 @@ importers: version: 13.5.0(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) turndown: specifier: ^7.1.2 - version: 7.1.2 + version: 7.1.3 devDependencies: '@types/lodash': specifier: ^4.14.191 - version: 4.14.191 + version: 4.17.0 '@types/papaparse': specifier: ^5.3.7 - version: 5.3.7 + version: 5.3.14 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -251,30 +269,33 @@ importers: projects/app: dependencies: + '@apidevtools/swagger-parser': + specifier: ^10.1.0 + version: 10.1.0(openapi-types@12.1.3) '@chakra-ui/anatomy': - specifier: ^2.2.1 + specifier: 2.2.1 version: 2.2.1 '@chakra-ui/icons': - specifier: ^2.1.1 + specifier: 2.1.1 version: 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/next-js': - specifier: ^2.1.5 - version: 2.1.5(@chakra-ui/react@2.8.1)(@emotion/react@11.11.1)(next@13.5.2)(react@18.2.0) + specifier: 2.1.5 + version: 2.1.5(@chakra-ui/react@2.8.1)(@emotion/react@11.11.4)(next@13.5.2)(react@18.2.0) '@chakra-ui/react': - specifier: ^2.8.1 - version: 2.8.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0) + specifier: 2.8.1 + version: 2.8.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/styled-system': - specifier: ^2.9.1 + specifier: 2.9.1 version: 2.9.1 '@chakra-ui/system': - specifier: ^2.6.1 - version: 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + specifier: 2.6.1 + version: 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@emotion/react': specifier: ^11.11.1 - version: 11.11.1(@types/react@18.2.0)(react@18.2.0) + version: 11.11.4(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.0)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.0)(react@18.2.0) '@fastgpt/global': specifier: workspace:* version: link:../../packages/global @@ -291,35 +312,35 @@ importers: specifier: ^3.0.6 version: 3.0.6 '@node-rs/jieba': - specifier: ^1.7.2 - version: 1.7.2 + specifier: 1.10.0 + version: 1.10.0 '@tanstack/react-query': specifier: ^4.24.10 - version: 4.24.10(react-dom@18.2.0)(react@18.2.0) + version: 4.36.1(react-dom@18.2.0)(react@18.2.0) '@types/nprogress': specifier: ^0.2.0 - version: 0.2.0 + version: 0.2.3 axios: specifier: ^1.5.1 - version: 1.5.1 + version: 1.6.8 date-fns: specifier: 2.30.0 version: 2.30.0 dayjs: specifier: ^1.11.7 - version: 1.11.7 + version: 1.11.10 echarts: - specifier: ^5.4.1 + specifier: 5.4.1 version: 5.4.1 echarts-gl: - specifier: ^2.0.9 + specifier: 2.0.9 version: 2.0.9(echarts@5.4.1) formidable: specifier: ^2.1.1 - version: 2.1.1 + version: 2.1.2 framer-motion: specifier: ^9.0.6 - version: 9.0.6(react-dom@18.2.0)(react@18.2.0) + version: 9.1.7(react-dom@18.2.0)(react@18.2.0) hyperdown: specifier: ^2.4.29 version: 2.4.29 @@ -328,16 +349,13 @@ importers: version: 23.10.0 immer: specifier: ^9.0.19 - version: 9.0.19 + version: 9.0.21 js-yaml: specifier: ^4.1.0 version: 4.1.0 jschardet: specifier: ^3.0.0 - version: 3.0.0 - json5: - specifier: ^2.2.3 - version: 2.2.3 + version: 3.1.0 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 @@ -346,13 +364,13 @@ importers: version: 4.17.21 mermaid: specifier: ^10.2.3 - version: 10.2.3 + version: 10.9.0 nanoid: specifier: ^4.0.1 - version: 4.0.1 + version: 4.0.2 next: specifier: 13.5.2 - version: 13.5.2(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + version: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) next-i18next: specifier: 15.2.0 version: 15.2.0(i18next@23.10.0)(next@13.5.2)(react-i18next@13.5.0)(react@18.2.0) @@ -364,13 +382,13 @@ importers: version: 18.2.0 react-day-picker: specifier: ^8.7.1 - version: 8.7.1(date-fns@2.30.0)(react@18.2.0) + version: 8.10.0(date-fns@2.30.0)(react@18.2.0) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: specifier: ^7.43.1 - version: 7.43.1(react@18.2.0) + version: 7.51.1(react@18.2.0) react-i18next: specifier: 13.5.0 version: 13.5.0(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) @@ -382,10 +400,10 @@ importers: version: 15.5.0(react@18.2.0) reactflow: specifier: ^11.7.4 - version: 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + version: 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) rehype-katex: specifier: ^6.0.2 - version: 6.0.2 + version: 6.0.3 remark-breaks: specifier: ^3.0.3 version: 3.0.3 @@ -400,32 +418,32 @@ importers: version: 3.3.0 sass: specifier: ^1.58.3 - version: 1.58.3 + version: 1.72.0 zustand: specifier: ^4.3.5 - version: 4.3.5(immer@9.0.19)(react@18.2.0) + version: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) devDependencies: '@svgr/webpack': specifier: ^6.5.1 version: 6.5.1 '@types/formidable': specifier: ^2.0.5 - version: 2.0.5 + version: 2.0.6 '@types/js-cookie': specifier: ^3.0.3 - version: 3.0.3 + version: 3.0.6 '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 '@types/jsonwebtoken': specifier: ^9.0.3 - version: 9.0.3 + version: 9.0.6 '@types/lodash': specifier: ^4.14.191 - version: 4.14.191 + version: 4.17.0 '@types/node': specifier: ^20.8.5 - version: 20.8.5 + version: 20.11.30 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -434,7 +452,7 @@ importers: version: 18.2.0 '@types/react-syntax-highlighter': specifier: ^15.5.6 - version: 15.5.6 + version: 15.5.11 '@types/request-ip': specifier: ^0.0.37 version: 0.0.37 @@ -452,7 +470,7 @@ importers: dependencies: express: specifier: ^4.18.2 - version: 4.18.2 + version: 4.19.0 packages: @@ -468,30 +486,62 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@apidevtools/json-schema-ref-parser@9.0.6: + resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} + dependencies: + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + dev: false + + /@apidevtools/openapi-schemas@2.1.0: + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + dev: false + + /@apidevtools/swagger-methods@3.0.2: + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + dev: false + + /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): + resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} + peerDependencies: + openapi-types: '>=7' + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.6 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + dev: false + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4 @@ -501,8 +551,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -528,48 +578,48 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.24.1 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==} + /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.0): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.24.0): - resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3): + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 debug: 4.3.4 @@ -603,21 +653,21 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 @@ -634,25 +684,25 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.0): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.24.0): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -677,8 +727,8 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: @@ -698,999 +748,999 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/helpers@7.24.0: - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.0) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.24.0): - resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.0): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.24.0): - resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3): + resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.24.3 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-classes@7.23.8(@babel/core@7.24.0): - resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.0 dev: true - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.24.0): - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.24.0): - resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.0): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==} + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==} + /@babel/plugin-transform-react-constant-elements@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.0): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) '@babel/types': 7.24.0 dev: true - /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + /@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.0): - resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: true - /@babel/preset-env@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==} + /@babel/preset-env@7.24.3(@babel/core@7.24.3): + resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.24.0 + '@babel/compat-data': 7.24.1 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.24.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.0) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.24.0) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.24.0) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.24.0) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.24.0) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.0) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-object-rest-spread': 7.24.0(@babel/core@7.24.0) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.24.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.0) - babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.24.0) - babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.24.0) - babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.24.0) - core-js-compat: 3.36.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + core-js-compat: 3.36.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.0): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/types': 7.24.0 esutils: 2.0.3 dev: true - /@babel/preset-react@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + /@babel/preset-react@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.0) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) + '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.3) dev: true - /@babel/preset-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + /@babel/preset-typescript@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.0) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) dev: true /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1699,21 +1749,21 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - /@babel/traverse@7.24.0: - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 @@ -1724,7 +1774,7 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -1732,7 +1782,7 @@ packages: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} dev: false - /@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0): + /@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0): resolution: {integrity: sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -1745,9 +1795,9 @@ packages: '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@9.1.7)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1761,7 +1811,7 @@ packages: '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1779,7 +1829,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1792,7 +1842,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1812,7 +1862,7 @@ packages: '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1823,7 +1873,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1842,7 +1892,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@zag-js/focus-visible': 0.16.0 react: 18.2.0 @@ -1878,7 +1928,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1897,7 +1947,7 @@ packages: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1912,13 +1962,13 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/css-reset@2.3.0(@emotion/react@11.11.1)(react@18.2.0): + /@chakra-ui/css-reset@2.3.0(@emotion/react@11.11.4)(react@18.2.0): resolution: {integrity: sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==} peerDependencies: '@emotion/react': '>=10.0.35' react: '>=18' dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1951,7 +2001,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -1982,7 +2032,7 @@ packages: '@chakra-ui/react-types': 2.0.7(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2005,7 +2055,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2016,7 +2066,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2028,7 +2078,7 @@ packages: dependencies: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2043,7 +2093,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2059,7 +2109,7 @@ packages: '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2084,11 +2134,11 @@ packages: '@chakra-ui/breakpoint-utils': 2.0.8 '@chakra-ui/react-env': 3.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0): + /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0): resolution: {integrity: sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2109,13 +2159,13 @@ packages: '@chakra-ui/react-use-outside-click': 2.2.0(react@18.2.0) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@9.1.7)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.1)(@types/react@18.2.0)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.1)(@types/react@18.2.0)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2130,18 +2180,18 @@ packages: '@chakra-ui/react-types': 2.0.7(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6)(react@18.2.0) - aria-hidden: 1.2.3 - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@9.1.7)(react@18.2.0) + aria-hidden: 1.2.4 + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.7(@types/react@18.2.0)(react@18.2.0) + react-remove-scroll: 2.5.9(@types/react@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false - /@chakra-ui/next-js@2.1.5(@chakra-ui/react@2.8.1)(@emotion/react@11.11.1)(next@13.5.2)(react@18.2.0): + /@chakra-ui/next-js@2.1.5(@chakra-ui/react@2.8.1)(@emotion/react@11.11.4)(next@13.5.2)(react@18.2.0): resolution: {integrity: sha512-bBd8zeXlAuVwDsjGN0/5ZZJknSbFeiZgJiGdbJo91v2lxKkOwo26b4ggc1ck1t+JR+daU6SrGBjlbQqSuWzyaA==} peerDependencies: '@chakra-ui/react': '>=2.4.0' @@ -2149,10 +2199,10 @@ packages: next: '>=13' react: '>=18' dependencies: - '@chakra-ui/react': 2.8.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react': 2.8.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0) '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) - next: 13.5.2(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + '@emotion/react': 11.11.4(@types/react@18.2.0)(react@18.2.0) + next: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) react: 18.2.0 dev: false @@ -2174,7 +2224,7 @@ packages: '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2198,11 +2248,11 @@ packages: '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/popover@2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0): + /@chakra-ui/popover@2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0): resolution: {integrity: sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2220,8 +2270,8 @@ packages: '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2255,11 +2305,11 @@ packages: react: '>=18' dependencies: '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/provider@2.4.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/provider@2.4.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-u4g02V9tJ9vVYfkLz5jBn/bKlAyjLdg4Sh3f7uckmYVAZpOL/uUlrStyADrynu3tZhI+BE8XdmXC4zs/SYD7ow==} peerDependencies: '@emotion/react': ^11.0.0 @@ -2267,13 +2317,13 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.1)(react@18.2.0) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.4)(react@18.2.0) '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/react-env': 3.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2289,7 +2339,7 @@ packages: '@chakra-ui/react-types': 2.0.7(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@zag-js/focus-visible': 0.16.0 react: 18.2.0 dev: false @@ -2489,7 +2539,7 @@ packages: react: 18.2.0 dev: false - /@chakra-ui/react@2.8.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/react@2.8.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.0)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UL9Rtj4DovP3+oVbI06gsdfyJJb+wmS2RYnGNXjW9tsjCyXxjlBw9TAUj0jyOfWe0+zd/4juL8+J+QCwmdhptg==} peerDependencies: '@emotion/react': ^11.0.0 @@ -2498,7 +2548,7 @@ packages: react: '>=18' react-dom: '>=18' dependencies: - '@chakra-ui/accordion': 2.3.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0) + '@chakra-ui/accordion': 2.3.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0) '@chakra-ui/alert': 2.2.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) @@ -2508,7 +2558,7 @@ packages: '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/counter': 2.1.0(react@18.2.0) - '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.1)(react@18.2.0) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.4)(react@18.2.0) '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.0)(react@18.2.0) '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) @@ -2519,15 +2569,15 @@ packages: '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/live-region': 2.1.0(react@18.2.0) '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0) - '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.1)(@types/react@18.2.0)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0) + '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.1)(@types/react@18.2.0)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/number-input': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0) + '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0) '@chakra-ui/popper': 3.1.0(react@18.2.0) '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@chakra-ui/provider': 2.4.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/provider': 2.4.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) '@chakra-ui/radio': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/react-env': 3.1.0(react@18.2.0) '@chakra-ui/select': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) @@ -2538,22 +2588,22 @@ packages: '@chakra-ui/stat': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/stepper': 2.3.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/switch': 2.1.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/switch': 2.1.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/tabs': 3.0.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/tag': 3.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/textarea': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/theme': 3.3.0(@chakra-ui/styled-system@2.9.1) '@chakra-ui/theme-utils': 2.0.20 - '@chakra-ui/toast': 7.0.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6)(react@18.2.0) + '@chakra-ui/toast': 7.0.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@9.1.7)(react@18.2.0) '@chakra-ui/utils': 2.0.15 '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.0)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.0)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -2568,7 +2618,7 @@ packages: dependencies: '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2585,7 +2635,7 @@ packages: '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/react-use-previous': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2595,7 +2645,7 @@ packages: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2615,7 +2665,7 @@ packages: '@chakra-ui/react-use-pan-event': 2.1.0(react@18.2.0) '@chakra-ui/react-use-size': 2.1.0(react@18.2.0) '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2626,7 +2676,7 @@ packages: react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2639,7 +2689,7 @@ packages: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2652,7 +2702,7 @@ packages: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2664,7 +2714,7 @@ packages: lodash.mergewith: 4.6.2 dev: false - /@chakra-ui/switch@2.1.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react@18.2.0): + /@chakra-ui/switch@2.1.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react@18.2.0): resolution: {integrity: sha512-cOHIhW5AlLZSFENxFEBYTBniqiduOowa1WdzslP1Fd0usBFaD5iAgOY1Fvr7xKhE8nmzzeMCkPB3XBvUSWnawQ==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2673,12 +2723,12 @@ packages: dependencies: '@chakra-ui/checkbox': 2.3.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false - /@chakra-ui/system@2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0): + /@chakra-ui/system@2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0): resolution: {integrity: sha512-P5Q/XRWy3f1pXJ7IxDkV+Z6AT7GJeR2JlBnQl109xewVQcBLWWMIp702fFMFw8KZ2ALB/aYKtWm5EmQMddC/tg==} peerDependencies: '@emotion/react': ^11.0.0 @@ -2691,8 +2741,8 @@ packages: '@chakra-ui/styled-system': 2.9.1 '@chakra-ui/theme-utils': 2.0.20 '@chakra-ui/utils': 2.0.15 - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.2.0)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 react-fast-compare: 3.2.2 dev: false @@ -2705,7 +2755,7 @@ packages: dependencies: '@chakra-ui/react-context': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2724,7 +2774,7 @@ packages: '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2736,7 +2786,7 @@ packages: dependencies: '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2748,7 +2798,7 @@ packages: dependencies: '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1)(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2783,7 +2833,7 @@ packages: '@chakra-ui/theme-tools': 2.1.1(@chakra-ui/styled-system@2.9.1) dev: false - /@chakra-ui/toast@7.0.1(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/toast@7.0.1(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-V5JUhw6RZxbGRTijvd5k4iEMLCfbzTLNWbZLZhRZk10YvFfAP5OYfRCm68zpE/t3orN/f+4ZLL3P+Wb4E7oSmw==} peerDependencies: '@chakra-ui/system': 2.6.1 @@ -2799,14 +2849,14 @@ packages: '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) '@chakra-ui/theme': 3.3.0(@chakra-ui/styled-system@2.9.1) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/tooltip@2.3.0(@chakra-ui/system@2.6.1)(framer-motion@9.0.6)(react-dom@18.2.0)(react@18.2.0): + /@chakra-ui/tooltip@2.3.0(@chakra-ui/system@2.6.1)(framer-motion@9.1.7)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2s23f93YIij1qEDwIK//KtEu4LLYOslhR1cUhDBk/WUzyFR3Ez0Ee+HlqlGEGfGe9x77E6/UXPnSAKKdF/cpsg==} peerDependencies: '@chakra-ui/system': '>=2.0.0' @@ -2822,20 +2872,20 @@ packages: '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@chakra-ui/transition@2.1.0(framer-motion@9.0.6)(react@18.2.0): + /@chakra-ui/transition@2.1.0(framer-motion@9.1.7)(react@18.2.0): resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} peerDependencies: framer-motion: '>=4.0.0' react: '>=18' dependencies: '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 9.0.6(react-dom@18.2.0)(react@18.2.0) + framer-motion: 9.1.7(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -2854,15 +2904,31 @@ packages: '@chakra-ui/system': '>=2.0.0' react: '>=18' dependencies: - '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) react: 18.2.0 dev: false + /@emnapi/core@0.45.0: + resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@emnapi/runtime@0.45.0: + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/runtime': 7.24.0 + '@babel/helper-module-imports': 7.24.3 + '@babel/runtime': 7.24.1 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.3 @@ -2912,8 +2978,8 @@ packages: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} dev: false - /@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + /@emotion/react@11.11.4(@types/react@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -2921,7 +2987,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.3 @@ -2947,7 +3013,7 @@ packages: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} dev: false - /@emotion/styled@11.11.0(@emotion/react@11.11.1)(@types/react@18.2.0)(react@18.2.0): + /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.0)(react@18.2.0): resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -2957,10 +3023,10 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) + '@emotion/react': 11.11.4(@types/react@18.2.0)(react@18.2.0) '@emotion/serialize': 1.1.3 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 @@ -2988,6 +3054,15 @@ packages: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} dev: false + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -2997,10 +3072,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.15.18: - resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true @@ -3015,6 +3090,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3024,6 +3108,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3033,6 +3126,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3042,6 +3144,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3051,6 +3162,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3060,6 +3180,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3069,6 +3198,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3078,6 +3216,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -3087,10 +3234,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.15.18: - resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -3105,6 +3252,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -3114,6 +3270,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -3123,6 +3288,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -3132,6 +3306,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -3141,6 +3324,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -3150,6 +3342,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -3159,6 +3360,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -3168,6 +3378,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -3177,6 +3396,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -3186,6 +3414,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -3195,6 +3432,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -3204,6 +3450,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint/eslintrc@1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3221,8 +3476,8 @@ packages: - supports-color dev: true - /@fingerprintjs/fingerprintjs@4.2.1: - resolution: {integrity: sha512-uW+GVUNTgCXbVPEbgnbf5Aor22e1dyYR0JRwdUiZBaikfxr7KlhV9y0aahA1FB99fEeQVvhCEvTcPIFSYTy9Pw==} + /@fingerprintjs/fingerprintjs@4.2.2: + resolution: {integrity: sha512-scD+pDgNZW78LuFAr7ms2yxmDx2NWC4+K5iiOjPT2ZlTlHFbLsORUzLJI2rcKicxxLtHbvf3A7BU1drVr4iHGg==} dependencies: tslib: 2.6.2 dev: false @@ -3252,6 +3507,25 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -3277,6 +3551,10 @@ packages: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: false + /@lexical/clipboard@0.12.6(lexical@0.12.6): resolution: {integrity: sha512-rJFp7tXzawCrMWWRsjCR80dZoIkLJ/EPgPmTk3xqpc+9ntlwbkm3LUOdFmgN+pshnhiZTQBwbFqg/QbsA1Pw9g==} peerDependencies: @@ -3507,7 +3785,7 @@ packages: hasBin: true requiresBuild: true dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 https-proxy-agent: 5.0.1 make-dir: 3.1.0 node-fetch: 2.7.0(encoding@0.1.13) @@ -3522,74 +3800,45 @@ packages: dev: false optional: true - /@monaco-editor/loader@1.4.0(monaco-editor@0.46.0): + /@monaco-editor/loader@1.4.0(monaco-editor@0.47.0): resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} peerDependencies: monaco-editor: '>= 0.21.0 < 1' dependencies: - monaco-editor: 0.46.0 + monaco-editor: 0.47.0 state-local: 1.0.7 dev: false - /@monaco-editor/react@4.6.0(monaco-editor@0.46.0)(react-dom@18.2.0)(react@18.2.0): + /@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.46.0) - monaco-editor: 0.46.0 + '@monaco-editor/loader': 1.4.0(monaco-editor@0.47.0) + monaco-editor: 0.47.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@motionone/animation@10.17.0: - resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} - dependencies: - '@motionone/easing': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - tslib: 2.6.2 - dev: false - - /@motionone/dom@10.17.0: - resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} - dependencies: - '@motionone/animation': 10.17.0 - '@motionone/generators': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - hey-listen: 1.0.8 - tslib: 2.6.2 - dev: false - - /@motionone/easing@10.17.0: - resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} - dependencies: - '@motionone/utils': 10.17.0 - tslib: 2.6.2 - dev: false - - /@motionone/generators@10.17.0: - resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} + /@mongodb-js/saslprep@1.1.5: + resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} + requiresBuild: true dependencies: - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - tslib: 2.6.2 - dev: false - - /@motionone/types@10.17.0: - resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} + sparse-bitfield: 3.0.3 dev: false + optional: true - /@motionone/utils@10.17.0: - resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} + /@napi-rs/wasm-runtime@0.1.1: + resolution: {integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==} + requiresBuild: true dependencies: - '@motionone/types': 10.17.0 - hey-listen: 1.0.8 - tslib: 2.6.2 + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.1 dev: false + optional: true /@next/env@13.5.2: resolution: {integrity: sha512-dUseBIQVax+XtdJPzhwww4GetTjlkRSsXeQnisIJWBaHsnxYcN2RGzsPHi58D6qnkATjnhuAtQTJmR1hKYQQPg==} @@ -3676,8 +3925,8 @@ packages: requiresBuild: true optional: true - /@node-rs/jieba-android-arm-eabi@1.7.2: - resolution: {integrity: sha512-FyDHRNSRIHOQO7S6Q4RwuGffnnnuNwaXPH7K8WqSzifEY+zFIaSPcNqrZHrnqyeXc4JiYpBIHeP+0Mkf1kIGRA==} + /@node-rs/jieba-android-arm-eabi@1.10.0: + resolution: {integrity: sha512-bzusJSLHm7I0qL8aQXGLt7IQ51Px35yGGEcQ/Ps4SEt0AxRSJ2/rxNET/8mlwBpOCZ5xiKE3BOBRfQajiPiI3g==} engines: {node: '>= 10'} cpu: [arm] os: [android] @@ -3685,8 +3934,8 @@ packages: dev: false optional: true - /@node-rs/jieba-android-arm64@1.7.2: - resolution: {integrity: sha512-z0UEZCGrAX/IiarhuDMsEIDZBS77UZv4SQyL/J48yrsbWKbb2lJ1vCrYxXIWqwp6auXHEu4r1O/pMriDAcEnPg==} + /@node-rs/jieba-android-arm64@1.10.0: + resolution: {integrity: sha512-g89Oq5U2RPmtlvuQhjNj8YZc5Gq033ODb7Ot4Z/OdIHvg2WMxi2M1GQhcdKu60dO79/tazc53W6I8/y691DUfQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] @@ -3694,8 +3943,8 @@ packages: dev: false optional: true - /@node-rs/jieba-darwin-arm64@1.7.2: - resolution: {integrity: sha512-M2cHIWRaaOmXGKy446SH2+Y2PzREaI2oYznPbg55wYEdioUp01YS/2WRG8CaoCKEj0aUocA7MFM2vVcoIAsbQw==} + /@node-rs/jieba-darwin-arm64@1.10.0: + resolution: {integrity: sha512-IhR5r+XxFcfhVsF93zQ3uCJy8ndotRntXzoW/JCyKqOahUo/ITQRT6vTKHKMyD9xNmjl222OZonBSo2+mlI2fQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3703,8 +3952,8 @@ packages: dev: false optional: true - /@node-rs/jieba-darwin-x64@1.7.2: - resolution: {integrity: sha512-euDawBU2FxB0CGTR803BA6WABsiicIrqa61z2AFFDPkJCDrauEM0jbMg3GDKLAvbaLbZ1Etu3QNN5xyroqp4Qw==} + /@node-rs/jieba-darwin-x64@1.10.0: + resolution: {integrity: sha512-MBIs8ixKY4FPnifdZ7eTx6ht85TXE4kFBK4c8A/VDAbnmzBzpEyuV7tHUA2wAdfR0muC9j7/5FB4kQGZgYfc8g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3712,8 +3961,8 @@ packages: dev: false optional: true - /@node-rs/jieba-freebsd-x64@1.7.2: - resolution: {integrity: sha512-vXCaYxPb90d/xTBVG+ZZXrFLXsO2719pZSyiZCL2tey+UY28U7MOoK6394Wwmf0FCB/eRTQMCKjVIUDi+IRMUg==} + /@node-rs/jieba-freebsd-x64@1.10.0: + resolution: {integrity: sha512-MuY+1QEXONxo3I/uFLFju0/pSN5bzQORhJkIdP8CYv+jZaVB4Uz6rC7A5HrgjiAXOna6QsKlRgx2bYyHfaBUrA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -3721,8 +3970,8 @@ packages: dev: false optional: true - /@node-rs/jieba-linux-arm-gnueabihf@1.7.2: - resolution: {integrity: sha512-HTep79XlJYO3KRYZ2kJChG9HnYr1DKSQTB+HEYWKLK0ifphqybcxGNLAdH0S4dViG2ciD0+iN/refgtqZEidpw==} + /@node-rs/jieba-linux-arm-gnueabihf@1.10.0: + resolution: {integrity: sha512-QfSBnwISdVuTqsi4iThAO1LSbKRSqSsIWiIJgCduhYsTDDiG9+pHyfiZtcTwSf73SDXHZ400QuBNONWLQ/dSag==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -3730,8 +3979,8 @@ packages: dev: false optional: true - /@node-rs/jieba-linux-arm64-gnu@1.7.2: - resolution: {integrity: sha512-P8QJdQydOVewL1MIqYiRpI7LOfrRQag+p4/hwExe+YXH8C7DOrR8rWJD/7XNRTbpOimlHq1UN/e+ZzhxQF/cLw==} + /@node-rs/jieba-linux-arm64-gnu@1.10.0: + resolution: {integrity: sha512-vzA2tX/6dReEd/7tZ9927glWQmKDausM6R9S5CqZx4BA4NSaWAK0xFdWsz0K7np459FXqNavLdNB5FVFJb4zzA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3740,8 +3989,8 @@ packages: dev: false optional: true - /@node-rs/jieba-linux-arm64-musl@1.7.2: - resolution: {integrity: sha512-WjnN0hmDvTXb2h3hMW5VnUGkK1xaqhs+WHfMMilau55+YN+YOYALKZ0TeBY4BapClLuBx54wqwmBX+B4hAXunQ==} + /@node-rs/jieba-linux-arm64-musl@1.10.0: + resolution: {integrity: sha512-gxqoAVOQsn9sgYK6mFO9dsMZ/yOMvVecLZW5rGvLErjiugVvYUlESXIvCqxp2GSws8RtTqJj6p9u/lBmCCuvaw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3750,8 +3999,8 @@ packages: dev: false optional: true - /@node-rs/jieba-linux-x64-gnu@1.7.2: - resolution: {integrity: sha512-gBXds/DwNSA6lNUxJjL6WIaNT6pnlM5juUgV/krLLkBJ8vXpOrQ07p0rrK1tnigz9b20xhsHaFRSwED1Y8zeXw==} + /@node-rs/jieba-linux-x64-gnu@1.10.0: + resolution: {integrity: sha512-rS5Shs8JITxJjFIjoIZ5a9O+GO21TJgKu03g2qwFE3QaN5ZOvXtz+/AqqyfT4GmmMhCujD83AGqfOGXDmItF9w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3760,8 +4009,8 @@ packages: dev: false optional: true - /@node-rs/jieba-linux-x64-musl@1.7.2: - resolution: {integrity: sha512-tNVD3SMuG5zAj7+bLS2Enio3zR7BPxi3PhQtpQ+Hv83jajIcN46QQ0EdoMFz/aB+hkQ9PlLAstu+VREFegs5EA==} + /@node-rs/jieba-linux-x64-musl@1.10.0: + resolution: {integrity: sha512-BvSiF2rR8Birh2oEVHcYwq0WGC1cegkEdddWsPrrSmpKmukJE2zyjcxaOOggq2apb8fIRsjyeeUh6X3R5AgjvA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3770,8 +4019,18 @@ packages: dev: false optional: true - /@node-rs/jieba-win32-arm64-msvc@1.7.2: - resolution: {integrity: sha512-/e1iQ0Dh02lGPNCYTU/H3cfIsWydaGRzZ3TDj6GfWrxkWqXORL98x/VJ/C/uKLpc7GSLLd9ygyZG7SOAfKe2tA==} + /@node-rs/jieba-wasm32-wasi@1.10.0: + resolution: {integrity: sha512-EzeAAbRrFTdYw61rd8Mfwdp/fA21d58z9vLY06CDbI+dqANfMFn1IUdwzKWi8S5J/MRhvbzonbbh3yHlz6F43Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.1.1 + dev: false + optional: true + + /@node-rs/jieba-win32-arm64-msvc@1.10.0: + resolution: {integrity: sha512-eZjRLFUAvq1/E5+xXfJRqIB99Gu6BA+6+EXf/rCLuvEjXrDQuUunhmrSoOL5MjmUXTtazS+bXq9PXV5EFYyOPw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3779,8 +4038,8 @@ packages: dev: false optional: true - /@node-rs/jieba-win32-ia32-msvc@1.7.2: - resolution: {integrity: sha512-cYjA6YUiOwtuEzWErvwMMt/RETNWQDLcmAaiHA8ohsa6c0eB0kRJlQCc683tlaczZxqroY/7C9mxgJNGvoGRbw==} + /@node-rs/jieba-win32-ia32-msvc@1.10.0: + resolution: {integrity: sha512-DrfbeCN7UcLN+MiocZabWo74XZIjfpQsJ/WMOItZzVbU2gDcJSkSyAhML9+OqId66DhGCMFFlGinocElM8iIAw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -3788,8 +4047,8 @@ packages: dev: false optional: true - /@node-rs/jieba-win32-x64-msvc@1.7.2: - resolution: {integrity: sha512-2M+Um3woFF17sa8VBYQQ6E5PNMe9Kf9fdzmeDh/GzuNHXlxW4LyK9VTV8zchIv/bDNAR5Z85kfW4wASULUxvFQ==} + /@node-rs/jieba-win32-x64-msvc@1.10.0: + resolution: {integrity: sha512-RjBkBmjjHmj+bofiq5/han8wzbCkDk24OAPJ+YX8PX20GFSHmdjCiWapv3AooN8/RiKqlBfgodjS1JUngNWo5g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3797,23 +4056,24 @@ packages: dev: false optional: true - /@node-rs/jieba@1.7.2: - resolution: {integrity: sha512-zGto08NDU+KWm670qVHYGTb0YTEJ0A97dwH3WCnnhyRYMqTbOXKC6OwTc/cjzfSJP1UDBSar9Ug9BlmWmEThWg==} + /@node-rs/jieba@1.10.0: + resolution: {integrity: sha512-9oZMCvZVnrAMeWTSnEjJ0OSw7YcV4dJJKSioqq80oUNf3eYLGdEXsgYwCe1AYEMcfUfNVgvjznItJKrsoud0IA==} engines: {node: '>= 10'} optionalDependencies: - '@node-rs/jieba-android-arm-eabi': 1.7.2 - '@node-rs/jieba-android-arm64': 1.7.2 - '@node-rs/jieba-darwin-arm64': 1.7.2 - '@node-rs/jieba-darwin-x64': 1.7.2 - '@node-rs/jieba-freebsd-x64': 1.7.2 - '@node-rs/jieba-linux-arm-gnueabihf': 1.7.2 - '@node-rs/jieba-linux-arm64-gnu': 1.7.2 - '@node-rs/jieba-linux-arm64-musl': 1.7.2 - '@node-rs/jieba-linux-x64-gnu': 1.7.2 - '@node-rs/jieba-linux-x64-musl': 1.7.2 - '@node-rs/jieba-win32-arm64-msvc': 1.7.2 - '@node-rs/jieba-win32-ia32-msvc': 1.7.2 - '@node-rs/jieba-win32-x64-msvc': 1.7.2 + '@node-rs/jieba-android-arm-eabi': 1.10.0 + '@node-rs/jieba-android-arm64': 1.10.0 + '@node-rs/jieba-darwin-arm64': 1.10.0 + '@node-rs/jieba-darwin-x64': 1.10.0 + '@node-rs/jieba-freebsd-x64': 1.10.0 + '@node-rs/jieba-linux-arm-gnueabihf': 1.10.0 + '@node-rs/jieba-linux-arm64-gnu': 1.10.0 + '@node-rs/jieba-linux-arm64-musl': 1.10.0 + '@node-rs/jieba-linux-x64-gnu': 1.10.0 + '@node-rs/jieba-linux-x64-musl': 1.10.0 + '@node-rs/jieba-wasm32-wasi': 1.10.0 + '@node-rs/jieba-win32-arm64-msvc': 1.10.0 + '@node-rs/jieba-win32-ia32-msvc': 1.10.0 + '@node-rs/jieba-win32-x64-msvc': 1.10.0 dev: false /@nodelib/fs.scandir@2.1.5: @@ -3837,42 +4097,51 @@ packages: fastq: 1.17.1 dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + /@popperjs/core@2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@reactflow/background@11.2.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SYQbCRCU0GuxT/40Tm7ZK+l5wByGnNJSLtZhbL9C/Hl7JhsJXV3UGXr0vrlhVZUBEtkWA7XhZM/5S9XEA5XSFA==} + /@reactflow/background@11.3.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-byj/G9pEC8tN0wT/ptcl/LkEP/BBfa33/SvBkqE4XwyofckqF87lKp573qGlisfnsijwAbpDlf81PuFL41So4Q==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.5(immer@9.0.19)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false - /@reactflow/controls@11.1.15(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-//33XfBYu8vQ6brfmlZwKrDoh+8hh93xO2d88XiqfIbrPEEb32SYjsb9mS9VuHKNlSIW+eB27fBA1Gt00mEj5w==} + /@reactflow/controls@11.2.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-e8nWplbYfOn83KN1BrxTXS17+enLyFnjZPbyDgHSRLtI5ZGPKF/8iRXV+VXb2LFVzlu4Wh3la/pkxtfP/0aguA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.5(immer@9.0.19)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false - /@reactflow/core@11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-nt0T8ERp8TE7YCDQViaoEY9lb0StDPrWHVx3zBjhStFYET3wc88t8QRasZdf99xRTmyNtI3U3M40M5EBLNUpMw==} + /@reactflow/core@11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-j3i9b2fsTX/sBbOm+RmNzYEFWbNx4jGWGuGooh2r1jQaE2eV+TLJgiG/VNOp0q5mBl9f6g1IXs3Gm86S9JfcGw==} peerDependencies: react: '>=17' react-dom: '>=17' @@ -3887,18 +4156,19 @@ packages: d3-zoom: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.5(immer@9.0.19)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false - /@reactflow/minimap@11.5.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1tDBj2zX2gxu2oHU6qvH5RGNrOWRfRxu8369KhDotuuBN5yJrGXJzWIKikwhzjsNsQJYOB+B0cS44yWAfwSwzw==} + /@reactflow/minimap@11.7.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-le95jyTtt3TEtJ1qa7tZ5hyM4S7gaEQkW43cixcMOZLu33VAdc2aCpJg/fXcRrrf7moN2Mbl9WIMNXUKsp5ILA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) '@types/d3-selection': 3.0.10 '@types/d3-zoom': 3.0.8 classcat: 5.0.4 @@ -3906,142 +4176,258 @@ packages: d3-zoom: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.5(immer@9.0.19)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false - /@reactflow/node-resizer@2.1.1(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5Q+IBmZfpp/bYsw3+KRVJB1nUbj6W3XAp5ycx4uNWH+K98vbssymyQsW0vvKkIhxEPg6tkiMzO4UWRWvwBwt1g==} + /@reactflow/node-resizer@2.2.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HfickMm0hPDIHt9qH997nLdgLt0kayQyslKE0RS/GZvZ4UMQJlx/NRRyj5y47Qyg0NnC66KYOQWDM9LLzRTnUg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.5(immer@9.0.19)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false - /@reactflow/node-toolbar@1.2.3(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-uFQy9xpog92s0G1wsPLniwV9nyH4i/MmL7QoMsWdnKaOi7XMhd8SJcCzUdHC3imR21HltsuQITff/XQ51ApMbg==} + /@reactflow/node-toolbar@1.3.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VmgxKmToax4sX1biZ9LXA7cj/TBJ+E5cklLGwquCCVVxh+lxpZGTBF3a5FJGVHiUNBBtFsC8ldcSZIK4cAlQww==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - zustand: 4.3.5(immer@9.0.19)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false - /@rushstack/eslint-patch@1.7.2: - resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + requiresBuild: true dev: true + optional: true - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.24.0): - resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} - engines: {node: '>=10'} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/eslint-patch@1.8.0: + resolution: {integrity: sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ==} + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.24.3): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.0): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.3): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.0): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.3): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.24.0): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.24.0): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.24.0): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.24.0): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.24.0): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 dev: true - /@svgr/babel-preset@6.5.1(@babel/core@7.24.0): + /@svgr/babel-preset@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.24.0) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.24.0) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.24.0) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.24.0) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.24.0) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.3) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.3) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.24.3) dev: true /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@svgr/babel-preset': 6.5.1(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.24.3) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -4063,8 +4449,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.24.0 - '@svgr/babel-preset': 6.5.1(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.24.3) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -4088,11 +4474,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-transform-react-constant-elements': 7.23.3(@babel/core@7.24.0) - '@babel/preset-env': 7.24.0(@babel/core@7.24.0) - '@babel/preset-react': 7.23.3(@babel/core@7.24.0) - '@babel/preset-typescript': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-constant-elements': 7.24.1(@babel/core@7.24.3) + '@babel/preset-env': 7.24.3(@babel/core@7.24.3) + '@babel/preset-react': 7.24.1(@babel/core@7.24.3) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.3) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) @@ -4105,12 +4491,12 @@ packages: dependencies: tslib: 2.6.2 - /@tanstack/query-core@4.24.10: - resolution: {integrity: sha512-2QywqXEAGBIUoTdgn1lAB4/C8QEqwXHj2jrCLeYTk2xVGtLiPEUD8jcMoeB2noclbiW2mMt4+Fq7fZStuz3wAQ==} + /@tanstack/query-core@4.36.1: + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} dev: false - /@tanstack/react-query@4.24.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-FY1DixytOcNNCydPQXLxuKEV7VSST32CAuJ55BjhDNqASnMLZn+6c30yQBMrODjmWMNwzfjMZnq0Vw7C62Fwow==} + /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4121,7 +4507,7 @@ packages: react-native: optional: true dependencies: - '@tanstack/query-core': 4.24.10 + '@tanstack/query-core': 4.36.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.2.0(react@18.2.0) @@ -4132,31 +4518,29 @@ packages: engines: {node: '>=10.13.0'} dev: true + /@tybys/wasm-util@0.8.1: + resolution: {integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.8.5 - dev: true - - /@types/chai-subset@1.3.5: - resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} - dependencies: - '@types/chai': 4.3.12 - dev: true - - /@types/chai@4.3.12: - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} + '@types/node': 20.11.30 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true - /@types/cookie@0.5.2: - resolution: {integrity: sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==} + /@types/cookie@0.5.4: + resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==} dev: true /@types/d3-array@3.2.1: @@ -4232,8 +4616,8 @@ packages: '@types/geojson': 7946.0.14 dev: false - /@types/d3-hierarchy@3.1.6: - resolution: {integrity: sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==} + /@types/d3-hierarchy@3.1.7: + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} dev: false /@types/d3-interpolate@3.0.4: @@ -4321,7 +4705,7 @@ packages: '@types/d3-force': 3.0.9 '@types/d3-format': 3.0.4 '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.6 + '@types/d3-hierarchy': 3.1.7 '@types/d3-interpolate': 3.0.4 '@types/d3-path': 3.1.0 '@types/d3-polygon': 3.0.2 @@ -4344,11 +4728,15 @@ packages: '@types/ms': 0.7.34 dev: false + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: - '@types/node': 20.8.5 - '@types/qs': 6.9.12 + '@types/node': 20.11.30 + '@types/qs': 6.9.13 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 dev: true @@ -4358,14 +4746,14 @@ packages: dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.12 + '@types/qs': 6.9.13 '@types/serve-static': 1.15.5 dev: true - /@types/formidable@2.0.5: - resolution: {integrity: sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==} + /@types/formidable@2.0.6: + resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true /@types/geojson@7946.0.14: @@ -4388,8 +4776,8 @@ packages: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} dev: true - /@types/js-cookie@3.0.3: - resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==} + /@types/js-cookie@3.0.6: + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} dev: true /@types/js-yaml@4.0.9: @@ -4400,14 +4788,14 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/jsonwebtoken@9.0.3: - resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} + /@types/jsonwebtoken@9.0.6: + resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true - /@types/katex@0.11.1: - resolution: {integrity: sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==} + /@types/katex@0.14.0: + resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} dev: false /@types/katex@0.16.7: @@ -4417,11 +4805,11 @@ packages: /@types/lodash.mergewith@4.6.7: resolution: {integrity: sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==} dependencies: - '@types/lodash': 4.14.191 + '@types/lodash': 4.17.0 dev: false - /@types/lodash@4.14.191: - resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} /@types/mdast@3.0.15: resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -4441,8 +4829,8 @@ packages: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: false - /@types/multer@1.4.10: - resolution: {integrity: sha512-6l9mYMhUe8wbnz/67YIjc7ZJyQNZoKq7fRXVf7nMdgWgalD0KyzJ2ywI7hoATUSXSbTu9q2HBiEwzy0tNN1v2w==} + /@types/multer@1.4.11: + resolution: {integrity: sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==} dependencies: '@types/express': 4.17.21 dev: true @@ -4454,47 +4842,47 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 form-data: 4.0.0 dev: false - /@types/node@18.19.21: - resolution: {integrity: sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==} + /@types/node@18.19.26: + resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} dependencies: undici-types: 5.26.5 dev: false - /@types/node@20.8.5: - resolution: {integrity: sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==} + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} dependencies: - undici-types: 5.25.3 + undici-types: 5.26.5 - /@types/nprogress@0.2.0: - resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} + /@types/nprogress@0.2.3: + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} dev: false - /@types/papaparse@5.3.7: - resolution: {integrity: sha512-f2HKmlnPdCvS0WI33WtCs5GD7X1cxzzS/aduaxSu3I7TbhWlENjSPs6z5TaB9K0J+BH1jbmqTaM+ja5puis4wg==} + /@types/papaparse@5.3.14: + resolution: {integrity: sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - /@types/pg@8.6.6: - resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + /@types/pg@8.11.3: + resolution: {integrity: sha512-xocw4LvpDcj/Ta7bN52tLZm34mso5SZ0Q8fVC0UtD8s85Itip3YHvBeYZhBmC0OThpdOujHsxXtRbEIRxqXPXg==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 pg-protocol: 1.6.0 - pg-types: 2.2.0 + pg-types: 4.0.2 dev: true /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - /@types/qs@6.9.12: - resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} + /@types/qs@6.9.13: + resolution: {integrity: sha512-iLR+1vTTJ3p0QaOUq6ACbY1mzKTODFDT/XedZI8BksOotFmL4ForwDfRQ/DZeuTHR7/2i4lI1D203gdfxuqTlA==} dev: true /@types/range-parser@1.2.7: @@ -4507,8 +4895,8 @@ packages: '@types/react': 18.2.0 dev: true - /@types/react-syntax-highlighter@15.5.6: - resolution: {integrity: sha512-i7wFuLbIAFlabTeD2I1cLjEOrG/xdMa/rpx2zwzAoGHuXJDhSqp9BSfDlMHSh9JSuNfxHk9eEmMX6D55GiyjGg==} + /@types/react-syntax-highlighter@15.5.11: + resolution: {integrity: sha512-ZqIJl+Pg8kD+47kxUjvrlElrraSUrYa4h0dauY/U/FTUuprSCqvUj+9PNQNQzVc6AJgIWUUxn87/gqsMHNbRjw==} dependencies: '@types/react': 18.2.0 dev: true @@ -4523,7 +4911,7 @@ packages: /@types/request-ip@0.0.37: resolution: {integrity: sha512-uw6/i3rQnpznxD7LtLaeuZytLhKZK6bRoTS6XVJlwxIOoOpEBU7bgKoVXDNtOg4Xl6riUKHa9bjMVrL6ESqYlQ==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true /@types/scheduler@0.16.8: @@ -4533,7 +4921,7 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true /@types/serve-static@1.15.5: @@ -4541,13 +4929,13 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true /@types/tunnel@0.0.4: resolution: {integrity: sha512-bQgDBL5XiqrrPUaZd9bZ2esOXcU4GTmgg0n6LHDqoMJezO3VFRZsW8qN6Gp64/LAmjtzNU3iAHBfV3Z2ht5DSg==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 dev: true /@types/turndown@5.0.4: @@ -4564,7 +4952,7 @@ packages: /@types/whatwg-url@8.2.2: resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} dependencies: - '@types/node': 20.8.5 + '@types/node': 20.11.30 '@types/webidl-conversions': 7.0.3 dev: false @@ -4630,6 +5018,118 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@vitest/expect@1.4.0: + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + dependencies: + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.4.0: + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + dependencies: + '@vitest/utils': 1.4.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.4.0: + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + dependencies: + magic-string: 0.30.8 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.4.0: + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.4.0: + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /@vue/compiler-core@3.4.21: + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} + dependencies: + '@babel/parser': 7.24.1 + '@vue/shared': 3.4.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + dev: true + + /@vue/compiler-dom@3.4.21: + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} + dependencies: + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/compiler-sfc@3.4.21: + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} + dependencies: + '@babel/parser': 7.24.1 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + estree-walker: 2.0.2 + magic-string: 0.30.8 + postcss: 8.4.37 + source-map-js: 1.2.0 + dev: true + + /@vue/compiler-ssr@3.4.21: + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/reactivity@3.4.21: + resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} + dependencies: + '@vue/shared': 3.4.21 + dev: true + + /@vue/runtime-core@3.4.21: + resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} + dependencies: + '@vue/reactivity': 3.4.21 + '@vue/shared': 3.4.21 + dev: true + + /@vue/runtime-dom@3.4.21: + resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} + dependencies: + '@vue/runtime-core': 3.4.21 + '@vue/shared': 3.4.21 + csstype: 3.1.3 + dev: true + + /@vue/server-renderer@3.4.21(vue@3.4.21): + resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} + peerDependencies: + vue: 3.4.21 + dependencies: + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + vue: 3.4.21 + dev: true + + /@vue/shared@3.4.21: + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} + dev: true + /@xmldom/xmldom@0.8.10: resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} @@ -4678,6 +5178,11 @@ packages: acorn: 8.11.3 dev: true + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -4702,13 +5207,16 @@ packages: humanize-ms: 1.2.1 dev: false - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + /ajv-draft-04@1.0.0(ajv@8.12.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true + ajv: 8.12.0 + dev: false /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4719,11 +5227,20 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} dependencies: - type-fest: 0.21.3 + type-fest: 1.4.0 dev: true /ansi-regex@5.0.1: @@ -4748,6 +5265,11 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -4789,8 +5311,8 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} dependencies: tslib: 2.6.2 @@ -4830,25 +5352,27 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 + es-abstract: 1.23.2 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 dev: true - /array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 dev: true @@ -4872,6 +5396,15 @@ packages: es-shim-unscopables: 1.0.2 dev: true + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-shim-unscopables: 1.0.2 + dev: true + /array.prototype.tosorted@1.1.3: resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: @@ -4900,25 +5433,6 @@ packages: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: false - /asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - dev: true - - /assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - dev: true - /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -4927,17 +5441,6 @@ packages: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -4954,10 +5457,10 @@ packages: engines: {node: '>=4'} dev: true - /axios@1.5.1: - resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -4974,43 +5477,43 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.24.0): - resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + '@babel/compat-data': 7.24.1 + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.24.0): - resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) - core-js-compat: 3.36.0 + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.24.0): - resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): + resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) transitivePeerDependencies: - supports-color dev: true @@ -5032,25 +5535,18 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} /bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} dev: false - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: true - - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: true - - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -5062,7 +5558,7 @@ packages: iconv-lite: 0.4.24 on-finished: 2.4.1 qs: 6.11.0 - raw-body: 2.5.1 + raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: @@ -5078,85 +5574,25 @@ packages: balanced-match: 1.0.2 concat-map: 0.0.1 + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: true - - /browser-resolve@2.0.0: - resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} - dependencies: - resolve: 1.22.8 - dev: true - - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - dev: true - - /browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - dependencies: - cipher-base: 1.0.4 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - - /browserify-rsa@4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - dependencies: - bn.js: 5.2.1 - randombytes: 2.1.0 - dev: true - - /browserify-sign@4.2.2: - resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} - engines: {node: '>= 4'} - dependencies: - bn.js: 5.2.1 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.5.4 - inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: true - - /browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - dependencies: - pako: 1.0.11 - dev: true - /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001593 - electron-to-chromium: 1.4.690 + caniuse-lite: 1.0.30001599 + electron-to-chromium: 1.4.711 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -5178,21 +5614,6 @@ packages: engines: {node: '>=4'} dev: false - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - dev: true - /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -5204,6 +5625,11 @@ packages: engines: {node: '>= 0.8'} dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -5212,7 +5638,11 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -5223,8 +5653,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001593: - resolution: {integrity: sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==} + /caniuse-lite@1.0.30001599: + resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} /canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -5232,7 +5662,7 @@ packages: requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.18.0 + nan: 2.19.0 simple-get: 3.1.1 transitivePeerDependencies: - encoding @@ -5281,8 +5711,8 @@ packages: supports-color: 7.2.0 dev: true - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true @@ -5354,13 +5784,6 @@ packages: dev: false optional: true - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - /classcat@5.0.4: resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} dev: false @@ -5369,11 +5792,6 @@ packages: resolution: {integrity: sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==} dev: false - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - /clear-any-console@1.16.2: resolution: {integrity: sha512-OL/7wZpNy9x0GBSzz3poWja84Nr7iaH8aYNsJ5Uet2BVLj6Lm1zvWpZN/yH46Vv3ae7YfHmLLMmfHj911fshJg==} dev: true @@ -5385,11 +5803,11 @@ packages: log-symbols: 3.0.0 dev: true - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - restore-cursor: 3.1.0 + restore-cursor: 4.0.0 dev: true /cli-handle-error@4.4.0: @@ -5405,14 +5823,6 @@ packages: cli-handle-error: 4.4.0 dev: true - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: true - /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5485,9 +5895,9 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} dev: true /commander@7.2.0: @@ -5521,20 +5931,12 @@ packages: typedarray: 0.0.6 dev: false - /console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - dev: true - /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} requiresBuild: true dev: false optional: true - /constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - dev: true - /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -5563,20 +5965,25 @@ packages: engines: {node: '>= 0.6'} dev: false + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: false + /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: toggle-selection: 1.0.6 dev: false - /core-js-compat@3.36.0: - resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + /core-js-compat@3.36.1: + resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} dependencies: browserslist: 4.23.0 dev: true - /core-js@3.36.0: - resolution: {integrity: sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==} + /core-js@3.36.1: + resolution: {integrity: sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==} requiresBuild: true /core-util-is@1.0.3: @@ -5597,12 +6004,6 @@ packages: layout-base: 1.0.2 dev: false - /cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} - dependencies: - layout-base: 2.0.1 - dev: false - /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -5613,38 +6014,6 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - dependencies: - bn.js: 4.12.0 - elliptic: 6.5.4 - dev: true - - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - dev: true - - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -5658,22 +6027,6 @@ packages: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: false - /crypto-browserify@3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.2 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - inherits: 2.0.4 - pbkdf2: 3.1.2 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - dev: true - /css-box-model@1.2.1: resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} dependencies: @@ -5731,15 +6084,6 @@ packages: cytoscape: 3.28.1 dev: false - /cytoscape-fcose@2.2.0(cytoscape@3.28.1): - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 - dependencies: - cose-base: 2.2.0 - cytoscape: 3.28.1 - dev: false - /cytoscape@3.28.1: resolution: {integrity: sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==} engines: {node: '>=0.10'} @@ -5748,6 +6092,12 @@ packages: lodash: 4.17.21 dev: false + /d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: false + /d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} @@ -5846,8 +6196,8 @@ packages: engines: {node: '>=12'} dev: false - /d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + /d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} engines: {node: '>=12'} dependencies: d3-array: 3.2.4 @@ -5865,6 +6215,10 @@ packages: d3-color: 3.1.0 dev: false + /d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: false + /d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} @@ -5885,8 +6239,15 @@ packages: engines: {node: '>=12'} dev: false - /d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + /d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + dev: false + + /d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} engines: {node: '>=12'} dependencies: d3-color: 3.1.0 @@ -5909,6 +6270,12 @@ packages: engines: {node: '>=12'} dev: false + /d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: false + /d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} @@ -5960,8 +6327,8 @@ packages: d3-transition: 3.0.1(d3-selection@3.0.0) dev: false - /d3@7.8.5: - resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + /d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} dependencies: d3-array: 3.2.4 @@ -5978,7 +6345,7 @@ packages: d3-fetch: 3.0.1 d3-force: 3.0.0 d3-format: 3.1.0 - d3-geo: 3.1.0 + d3-geo: 3.1.1 d3-hierarchy: 3.1.2 d3-interpolate: 3.0.1 d3-path: 3.1.0 @@ -5986,7 +6353,7 @@ packages: d3-quadtree: 3.0.1 d3-random: 3.0.1 d3-scale: 4.0.2 - d3-scale-chromatic: 3.0.0 + d3-scale-chromatic: 3.1.0 d3-selection: 3.0.0 d3-shape: 3.2.0 d3-time: 3.1.0 @@ -5999,7 +6366,7 @@ packages: /dagre-d3-es@7.0.10: resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} dependencies: - d3: 7.8.5 + d3: 7.9.0 lodash-es: 4.17.21 dev: false @@ -6007,15 +6374,42 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 dev: false - /dayjs@1.11.7: - resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} dev: false /debug@2.6.9: @@ -6125,20 +6519,13 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - /des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} requiresBuild: true dev: false @@ -6155,19 +6542,16 @@ packages: wrappy: 1.0.2 dev: false + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} dev: false - /diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dependencies: - bn.js: 4.12.0 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - dev: true - /digest-fetch@1.3.0: resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} dependencies: @@ -6216,11 +6600,6 @@ packages: entities: 4.5.0 dev: false - /domain-browser@4.23.0: - resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} - engines: {node: '>=10'} - dev: true - /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -6242,8 +6621,8 @@ packages: resolution: {integrity: sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==} dev: false - /dompurify@3.0.3: - resolution: {integrity: sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==} + /dompurify@3.0.10: + resolution: {integrity: sha512-WZDL8ZHTliEVP3Lk4phtvjg8SNQ3YMc5WVstxE8cszKZrFjzI4PF4ZTIk9VGAc9vZADO7uGO2V/ZiStcRSAT4Q==} dev: false /domutils@2.8.0: @@ -6299,25 +6678,13 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.690: - resolution: {integrity: sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==} + /electron-to-chromium@1.4.711: + resolution: {integrity: sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==} - /elkjs@0.8.2: - resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + /elkjs@0.9.2: + resolution: {integrity: sha512-2Y/RaA1pdgSHpY0YG4TYuYCD2wh97CRvu22eLG3Kz0pgQ/6KbIFTxsTnDc4MH/6hFlg2L/9qXrDMG0nMjP63iw==} dev: false - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6336,8 +6703,8 @@ packages: iconv-lite: 0.6.3 dev: false - /enhanced-resolve@5.15.1: - resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -6377,7 +6744,7 @@ packages: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 @@ -6391,286 +6758,130 @@ packages: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 string.prototype.trimstart: 1.0.7 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 typed-array-length: 1.0.5 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: true - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - /es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + /es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} engines: {node: '>= 0.4'} dependencies: - asynciterator.prototype: 1.0.0 + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 globalthis: 1.0.3 + gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 + hasown: 2.0.2 internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.1 - dev: true - - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.1 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /esbuild-android-64@0.15.18: - resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-android-arm64@0.15.18: - resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-64@0.15.18: - resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-arm64@0.15.18: - resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-64@0.15.18: - resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-arm64@0.15.18: - resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-32@0.15.18: - resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-64@0.15.18: - resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm64@0.15.18: - resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm@0.15.18: - resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-mips64le@0.15.18: - resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-ppc64le@0.15.18: - resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-riscv64@0.15.18: - resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-s390x@0.15.18: - resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-netbsd-64@0.15.18: - resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-openbsd-64@0.15.18: - resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-sunos-64@0.15.18: - resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.2 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 dev: true - optional: true - /esbuild-windows-32@0.15.18: - resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 dev: true - optional: true - /esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 dev: true - optional: true - /esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 dev: true - optional: true - /esbuild@0.15.18: - resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 dev: true /esbuild@0.17.19: @@ -6703,6 +6914,37 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -6734,14 +6976,14 @@ packages: optional: true dependencies: '@next/eslint-plugin-next': 13.1.6 - '@rushstack/eslint-patch': 1.7.2 + '@rushstack/eslint-patch': 1.8.0 '@typescript-eslint/parser': 5.62.0(eslint@8.34.0)(typescript@4.9.5) eslint: 8.34.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.34.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.34.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.34.0) - eslint-plugin-react: 7.33.2(eslint@8.34.0) + eslint-plugin-react: 7.34.1(eslint@8.34.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.34.0) typescript: 4.9.5 transitivePeerDependencies: @@ -6767,12 +7009,12 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - enhanced-resolve: 5.15.1 + enhanced-resolve: 5.16.0 eslint: 8.34.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.34.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.34.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.3 is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: @@ -6824,7 +7066,7 @@ packages: dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.34.0)(typescript@4.9.5) array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 @@ -6832,13 +7074,13 @@ packages: eslint: 8.34.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.34.0) - hasown: 2.0.1 + hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 transitivePeerDependencies: @@ -6853,7 +7095,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -6862,14 +7104,14 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.34.0 - hasown: 2.0.1 + hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 dev: true /eslint-plugin-react-hooks@4.6.0(eslint@8.34.0): @@ -6881,29 +7123,31 @@ packages: eslint: 8.34.0 dev: true - /eslint-plugin-react@7.33.2(eslint@8.34.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + /eslint-plugin-react@7.34.1(eslint@8.34.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: array-includes: 3.1.7 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.34.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 object.hasown: 1.1.3 - object.values: 1.1.7 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 dev: true /eslint-scope@7.2.2: @@ -6991,6 +7235,12 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -7010,6 +7260,16 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -7025,16 +7285,8 @@ packages: engines: {node: '>=6'} dev: false - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true /execa@7.2.0: @@ -7052,16 +7304,31 @@ packages: strip-final-newline: 3.0.0 dev: true - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /express@4.19.0: + resolution: {integrity: sha512-/ERliX0l7UuHEgAy7HU2FRsiz3ScIKNl/iwnoYzHTJC0Sqj3ctWDD3MQ9CbUEfjshvxXImWaeukD0Xo7a2lWLA==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -7096,7 +7363,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -7181,15 +7447,15 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true - /focus-lock@1.3.3: - resolution: {integrity: sha512-hfXkZha7Xt4RQtrL1HBfspAuIj89Y0fb6GX0dfJilb8S2G/lvL4akPAcHq6xoD2NuZnDMCnZL/zQesMyeu6Psg==} + /focus-lock@1.3.4: + resolution: {integrity: sha512-Gv0N3mvej3pD+HWkNryrF8sExzEHqhQ6OSFxD4DPxm9n5HGCaHme98ZMBZroNEAJcsdtHxk+skvThGKyUeoEGA==} engines: {node: '>=10'} dependencies: tslib: 2.6.2 dev: false - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -7204,6 +7470,14 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} dev: false @@ -7229,13 +7503,13 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false - /formidable@2.1.1: - resolution: {integrity: sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==} + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.2 + qs: 6.12.0 dev: false /forwarded@0.2.0: @@ -7243,14 +7517,12 @@ packages: engines: {node: '>= 0.6'} dev: false - /framer-motion@9.0.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-NBETSa14yI/osK6DxKmiiDj1N6Os6YFiXKN6fzxYsNKKeO0vjoQz3m40g0kJYiAWrMdXQjhjyCMJqfOLR+nnRw==} + /framer-motion@9.1.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nKxBkIO4IPkMEqcBbbATxsVjwPYShKl051yhBv9628iAH6JLeHD0siBHxkL62oQzMC1+GNX73XtPjgP753ufuw==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@motionone/dom': 10.17.0 - hey-listen: 1.0.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -7338,7 +7610,7 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -7350,6 +7622,11 @@ packages: engines: {node: '>=10'} dev: true + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -7359,8 +7636,8 @@ packages: get-intrinsic: 1.2.4 dev: true - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -7381,6 +7658,18 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: @@ -7483,27 +7772,37 @@ packages: dev: false optional: true - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: true + function-bind: 1.1.2 - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + /hast-util-from-dom@4.2.0: + resolution: {integrity: sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==} dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true + hastscript: 7.2.0 + web-namespaces: 2.0.1 + dev: false - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} + /hast-util-from-html-isomorphic@1.0.0: + resolution: {integrity: sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==} dependencies: - function-bind: 1.1.2 + '@types/hast': 2.3.10 + hast-util-from-dom: 4.2.0 + hast-util-from-html: 1.0.2 + unist-util-remove-position: 4.0.2 + dev: false + + /hast-util-from-html@1.0.2: + resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} + dependencies: + '@types/hast': 2.3.10 + hast-util-from-parse5: 7.1.2 + parse5: 7.1.2 + vfile: 5.3.7 + vfile-message: 3.1.4 + dev: false /hast-util-from-parse5@7.1.2: resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} @@ -7576,22 +7875,10 @@ packages: engines: {node: '>=8'} dev: false - /hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - dev: false - /highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: true - /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: @@ -7622,10 +7909,6 @@ packages: toidentifier: 1.0.1 dev: false - /https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - dev: true - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -7643,6 +7926,11 @@ packages: engines: {node: '>=14.18.0'} dev: true + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: @@ -7665,7 +7953,7 @@ packages: /i18next@23.10.0: resolution: {integrity: sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -7681,10 +7969,6 @@ packages: safer-buffer: 2.1.2 dev: false - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -7694,8 +7978,8 @@ packages: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: false - /immer@9.0.19: - resolution: {integrity: sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==} + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} dev: false /immutable@4.3.5: @@ -7713,11 +7997,6 @@ packages: engines: {node: '>=0.8.19'} dev: true - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -7736,10 +8015,14 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - hasown: 2.0.1 + hasown: 2.0.2 side-channel: 1.0.6 dev: true + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: false + /internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -7773,14 +8056,6 @@ packages: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -7809,7 +8084,7 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -7835,7 +8110,14 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -7882,16 +8164,9 @@ packages: /is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 dev: true /is-negative-zero@2.0.3: @@ -7933,8 +8208,9 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} dev: true /is-shared-array-buffer@1.0.3: @@ -7967,11 +8243,12 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 dev: true - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} dev: true /is-weakref@1.0.2: @@ -7980,8 +8257,9 @@ packages: call-bind: 1.0.7 dev: true - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -8007,11 +8285,6 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /isomorphic-timers-promises@1.0.1: - resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} - engines: {node: '>=10'} - dev: true - /isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} dev: false @@ -8022,10 +8295,19 @@ packages: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.5 + reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /joplin-turndown-plugin-gfm@1.0.12: resolution: {integrity: sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==} dev: false @@ -8034,8 +8316,8 @@ packages: resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} dev: true - /js-tiktoken@1.0.7: - resolution: {integrity: sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw==} + /js-tiktoken@1.0.10: + resolution: {integrity: sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA==} dependencies: base64-js: 1.5.1 dev: false @@ -8043,6 +8325,18 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + /js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -8053,8 +8347,8 @@ packages: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} dev: false - /jschardet@3.0.0: - resolution: {integrity: sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ==} + /jschardet@3.1.0: + resolution: {integrity: sha512-MND0yjRsoQ/3iFXce7lqV/iBmqH9oWGUTlty36obRBZjhFDWCLKjXgfxY75wYfwlW7EFqw52tyziy/q4WsQmrA==} engines: {node: '>=0.1.90'} dev: false @@ -8079,6 +8373,10 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true @@ -8095,6 +8393,10 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -8118,7 +8420,7 @@ packages: array-includes: 3.1.7 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 dev: true /jszip@3.10.1: @@ -8150,13 +8452,6 @@ packages: engines: {node: '>=12.0.0'} dev: false - /katex@0.15.6: - resolution: {integrity: sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - /katex@0.16.9: resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} hasBin: true @@ -8194,10 +8489,6 @@ packages: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} dev: false - /layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - dev: false - /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -8210,8 +8501,8 @@ packages: resolution: {integrity: sha512-Nlfjc+k9cIWpOMv7XufF0Mv09TAXSemNAuAqFLaOwTcN+RvhvYTDtVLSp9D9r+5I097fYs1Vf/UYwH2xEpkFfQ==} dev: false - /lib0@0.2.90: - resolution: {integrity: sha512-iQmk+fThPq1ZTD2cFUu8xN6JLp9gFWnjs8auR6hmI6QQXoy6sSEh85uKcdkqpuEnkhhwQm4GSlKHOYfSCVp0Mw==} + /lib0@0.2.93: + resolution: {integrity: sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==} engines: {node: '>=16'} hasBin: true dependencies: @@ -8232,51 +8523,49 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /lint-staged@13.2.1: - resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} - engines: {node: ^14.13.1 || >=16.0.0} + /lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: - chalk: 5.2.0 - cli-truncate: 3.1.0 - commander: 10.0.1 + chalk: 5.3.0 + commander: 11.0.0 debug: 4.3.4 execa: 7.2.0 lilconfig: 2.1.0 - listr2: 5.0.8 + listr2: 6.6.1 micromatch: 4.0.5 - normalize-path: 3.0.0 - object-inspect: 1.13.1 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.4.0 + yaml: 2.3.1 transitivePeerDependencies: - enquirer - supports-color dev: true - /listr2@5.0.8: - resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} - engines: {node: ^14.13.1 || >=16.0.0} + /listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: enquirer: optional: true dependencies: - cli-truncate: 2.1.0 + cli-truncate: 3.1.0 colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 + eventemitter3: 5.0.1 + log-update: 5.0.1 rfdc: 1.3.1 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 8.1.0 dev: true - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 dev: true /locate-path@6.0.0: @@ -8341,14 +8630,15 @@ packages: chalk: 2.4.2 dev: true - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 dev: true /longest-streak@3.1.0: @@ -8382,6 +8672,11 @@ packages: highlight.js: 10.7.3 dev: false + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -8393,6 +8688,13 @@ packages: dependencies: yallist: 4.0.0 + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -8402,8 +8704,8 @@ packages: dev: false optional: true - /mammoth@1.6.0: - resolution: {integrity: sha512-jOwbj6BwJzxCf6jr2l1zmSemniIkLnchvELXnDJCANlJawhzyIKObIq48B8kWEPLgUUh57k7FtEO3DHFQMnjMg==} + /mammoth@1.7.0: + resolution: {integrity: sha512-ptFhft61dqieLffpdpHD7PUS0cX9YvHQIO3n3ejRhj1bi5Na+RL5wovtNHHXAK6Oj554XfGrVcyTuxgegN6umw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: @@ -8427,14 +8729,6 @@ packages: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - /md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: @@ -8617,18 +8911,21 @@ packages: engines: {node: '>= 8'} dev: true - /mermaid@10.2.3: - resolution: {integrity: sha512-cMVE5s9PlQvOwfORkyVpr5beMsLdInrycAosdr+tpZ0WFjG4RJ/bUHST7aTgHNJbujHkdBRAm+N50P3puQOfPw==} + /mermaid@10.9.0: + resolution: {integrity: sha512-swZju0hFox/B/qoLKK0rOxxgh8Cf7rJSfAUc1u8fezVihYMvrJAS45GzAxTVf4Q+xn9uMgitBcmWk7nWGXOs/g==} dependencies: '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 cytoscape: 3.28.1 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.28.1) - cytoscape-fcose: 2.2.0(cytoscape@3.28.1) - d3: 7.8.5 + d3: 7.9.0 + d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 - dayjs: 1.11.7 - dompurify: 3.0.3 - elkjs: 0.8.2 + dayjs: 1.11.10 + dompurify: 3.0.10 + elkjs: 0.9.2 + katex: 0.16.9 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 @@ -8913,14 +9210,6 @@ packages: picomatch: 2.3.1 dev: true - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - dev: true - /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -8956,19 +9245,18 @@ packages: dev: false optional: true - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -8988,6 +9276,11 @@ packages: dev: false optional: true + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -9013,8 +9306,17 @@ packages: dev: false optional: true - /monaco-editor@0.46.0: - resolution: {integrity: sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==} + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + dev: true + + /monaco-editor@0.47.0: + resolution: {integrity: sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==} dev: false /mongodb-connection-string-url@2.6.0: @@ -9024,16 +9326,22 @@ packages: whatwg-url: 11.0.0 dev: false - /mongodb@5.1.0: - resolution: {integrity: sha512-qgKb7y+EI90y4weY3z5+lIgm8wmexbonz0GalHkSElQXVKtRuwqXuhXKccyvIjXCJVy9qPV82zsinY0W1FBnJw==} + /mongodb@5.9.1: + resolution: {integrity: sha512-NBGA8AfJxGPeB12F73xXwozt8ZpeIPmCUeWRwl9xejozTXFes/3zaep9zhzs1B/nKKsw4P3I4iPfXl3K7s6g+Q==} engines: {node: '>=14.20.1'} peerDependencies: - '@aws-sdk/credential-providers': ^3.201.0 - mongodb-client-encryption: ^2.3.0 + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.0.0 + kerberos: ^1.0.0 || ^2.0.0 + mongodb-client-encryption: '>=2.3.0 <3' snappy: ^7.2.2 peerDependenciesMeta: '@aws-sdk/credential-providers': optional: true + '@mongodb-js/zstd': + optional: true + kerberos: + optional: true mongodb-client-encryption: optional: true snappy: @@ -9043,22 +9351,24 @@ packages: mongodb-connection-string-url: 2.6.0 socks: 2.8.1 optionalDependencies: - saslprep: 1.0.3 + '@mongodb-js/saslprep': 1.1.5 dev: false - /mongoose@7.0.2: - resolution: {integrity: sha512-whX+5lAOLOs6VXRr9w+6m5qb8m/IXWLLb9+0/HRUh2TiIYtTt7UvajK92zW6wllCjBkrrnz/MDIOTCWMbs8K4g==} - engines: {node: '>=14.0.0'} + /mongoose@7.6.10: + resolution: {integrity: sha512-vfvGxXwFk6rZVRaMC+8pgXj1uOR2RafZpgaA3fO6ygDJN7dXnBQ3ehuacwaVD+U3hmZetqHimORJhvLEpdRl1w==} + engines: {node: '>=14.20.1'} dependencies: bson: 5.5.1 kareem: 2.5.1 - mongodb: 5.1.0 + mongodb: 5.9.1 mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 sift: 16.0.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - kerberos - mongodb-client-encryption - snappy - supports-color @@ -9106,8 +9416,8 @@ packages: xtend: 4.0.2 dev: false - /nan@2.18.0: - resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + /nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} requiresBuild: true dev: false optional: true @@ -9117,8 +9427,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanoid@4.0.1: - resolution: {integrity: sha512-udKGtCCUafD3nQtJg9wBhRP3KMbPglUsgV5JVsXhvyBs/oefqb4sqMEhKBBgqZncYowu58p1prsZQBYvAj/Gww==} + /nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} engines: {node: ^14 || ^16 || >=18} hasBin: true dev: false @@ -9141,17 +9451,17 @@ packages: react: '>= 17.0.2' react-i18next: '>= 13.5.0' dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 '@types/hoist-non-react-statics': 3.3.5 - core-js: 3.36.0 + core-js: 3.36.1 hoist-non-react-statics: 3.3.2 i18next: 23.10.0 i18next-fs-backend: 2.3.1 - next: 13.5.2(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + next: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) react: 18.2.0 react-i18next: 13.5.0(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) - /next@13.5.2(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3): + /next@13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0): resolution: {integrity: sha512-vog4UhUaMYAzeqfiAAmgB/QWLW7p01/sg+2vn6bqc/CxHFYizMzLv6gjxKzl31EVFkfl/F+GbxlKizlkTE9RdA==} engines: {node: '>=16.14.0'} hasBin: true @@ -9169,12 +9479,12 @@ packages: '@next/env': 13.5.2 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001593 + caniuse-lite: 1.0.30001599 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - sass: 1.58.3 - styled-jsx: 5.1.1(@babel/core@7.24.0)(react@18.2.0) + sass: 1.72.0 + styled-jsx: 5.1.1(@babel/core@7.24.3)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: @@ -9191,13 +9501,13 @@ packages: - '@babel/core' - babel-plugin-macros - /nextjs-cors@2.1.2(next@13.5.2): - resolution: {integrity: sha512-2yOVivaaf2ILe4f/qY32hnj3oC77VCOsUQJQfhVMGsXE/YMEWUY2zy78sH9FKUCM7eG42/l3pDofIzMD781XGA==} + /nextjs-cors@2.2.0(next@13.5.2): + resolution: {integrity: sha512-FZu/A+L59J4POJNqwXYyCPDvsLDeu5HjSBvytzS6lsrJeDz5cmnH45zV+VoNic0hjaeER9xGaiIjZIWzEHnxQg==} peerDependencies: - next: ^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + next: ^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 dependencies: cors: 2.8.5 - next: 13.5.2(@babel/core@7.24.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + next: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0) dev: false /node-cron@3.0.3: @@ -9228,39 +9538,6 @@ packages: /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - /node-stdlib-browser@1.2.0: - resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} - engines: {node: '>=10'} - dependencies: - assert: 2.1.0 - browser-resolve: 2.0.0 - browserify-zlib: 0.2.0 - buffer: 5.7.1 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - create-require: 1.1.1 - crypto-browserify: 3.12.0 - domain-browser: 4.23.0 - events: 3.3.0 - https-browserify: 1.0.0 - isomorphic-timers-promises: 1.0.1 - os-browserify: 0.3.0 - path-browserify: 1.0.1 - pkg-dir: 5.0.0 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 3.6.2 - stream-browserify: 3.0.0 - stream-http: 3.2.0 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.1 - url: 0.11.3 - util: 0.12.5 - vm-browserify: 1.1.2 - dev: true - /non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} dev: false @@ -9313,14 +9590,6 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - dev: true - /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -9336,32 +9605,32 @@ packages: object-keys: 1.1.1 dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: - array.prototype.filter: 1.0.3 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.23.2 dev: true /object.hasown@1.1.3: @@ -9371,13 +9640,17 @@ packages: es-abstract: 1.22.5 dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true /on-finished@2.4.1: @@ -9410,7 +9683,7 @@ packages: resolution: {integrity: sha512-JM8fhcpmpGN0vrUwGquYIzdcEQHtFuom6sRCbbCM6CfzZXNuRk33G7KfeRAIfnaCxSpzrP5iHtwJzIm6biUZ2Q==} hasBin: true dependencies: - '@types/node': 18.19.21 + '@types/node': 18.19.26 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -9423,6 +9696,10 @@ packages: - encoding dev: false + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + /option@0.2.4: resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} dev: false @@ -9439,10 +9716,6 @@ packages: type-check: 0.4.0 dev: true - /os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - dev: true - /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -9450,18 +9723,18 @@ packages: yocto-queue: 0.1.0 dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} dependencies: - p-limit: 3.1.0 + yocto-queue: 1.0.0 dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: - aggregate-error: 3.1.0 + p-limit: 3.1.0 dev: true /packet-reader@1.0.0: @@ -9470,6 +9743,7 @@ packages: /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false /papaparse@5.4.1: resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} @@ -9481,16 +9755,6 @@ packages: dependencies: callsites: 3.1.0 - /parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} - dependencies: - asn1.js: 5.4.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.2 - safe-buffer: 5.2.1 - dev: true - /parse-entities@1.2.2: resolution: {integrity: sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==} dependencies: @@ -9517,7 +9781,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9529,10 +9793,6 @@ packages: parse5: 7.1.2 dev: false - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -9544,10 +9804,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -9570,6 +9826,14 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: true + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false @@ -9578,26 +9842,28 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /path2d-polyfill@2.0.1: - resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} - engines: {node: '>=8'} + /path2d-polyfill@2.1.1: + resolution: {integrity: sha512-4Rka5lN+rY/p0CdD8+E+BFv51lFaFvJOrlOhyQ+zjzyQrzyh3ozmxd1vVGGDdIbUFSBtIZLSnspxTgPT0iJhvA==} + engines: {node: '>=18'} + requiresBuild: true + dependencies: + path2d: 0.1.1 + dev: false + optional: true + + /path2d@0.1.1: + resolution: {integrity: sha512-/+S03c8AGsDYKKBtRDqieTJv2GlkMb0bWjnqOgtF6MkjdUQ9a8ARAtxWf9NgKLGm2+WQr6+/tqJdU8HNGsIDoA==} + engines: {node: '>=6'} requiresBuild: true dev: false optional: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true /pdfjs-dist@4.0.269: @@ -9605,12 +9871,18 @@ packages: engines: {node: '>=18'} optionalDependencies: canvas: 2.11.2 - path2d-polyfill: 2.0.1 + path2d-polyfill: 2.1.1 transitivePeerDependencies: - encoding - supports-color dev: false + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + requiresBuild: true + dev: false + optional: true + /pg-connection-string@2.6.2: resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} dev: false @@ -9619,12 +9891,17 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - /pg-pool@3.6.1(pg@8.10.0): + /pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + dev: true + + /pg-pool@3.6.1(pg@8.11.3): resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} peerDependencies: pg: '>=8.0' dependencies: - pg: 8.10.0 + pg: 8.11.3 dev: false /pg-protocol@1.6.0: @@ -9639,9 +9916,23 @@ packages: postgres-bytea: 1.0.0 postgres-date: 1.0.7 postgres-interval: 1.2.0 + dev: false + + /pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + dev: true - /pg@8.10.0: - resolution: {integrity: sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==} + /pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -9652,10 +9943,12 @@ packages: buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.10.0) + pg-pool: 3.6.1(pg@8.11.3) pg-protocol: 1.6.0 pg-types: 2.2.0 pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 dev: false /pgpass@1.0.5: @@ -9677,11 +9970,12 @@ packages: hasBin: true dev: true - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: - find-up: 5.0.0 + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 dev: true /possible-typed-array-names@1.0.0: @@ -9695,34 +9989,64 @@ packages: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.37: + resolution: {integrity: sha512-7iB/v/r7Woof0glKLH8b1SPHrsX7uhdO+Geb41QpF/+mWZHU3uxxSlN+UXGVit1PawOYDToO+AbZzhBzWRDwbQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + dev: false + + /postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + dev: true /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} + dev: false + + /postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + dependencies: + obuf: 1.1.2 + dev: true /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} + dev: false + + /postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + dev: true /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} dependencies: xtend: 4.0.2 + dev: false + + /postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + dev: true + + /postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + dev: true /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9741,6 +10065,15 @@ packages: hasBin: true dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /prismjs@1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} engines: {node: '>=6'} @@ -9755,11 +10088,6 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: true - /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -9789,21 +10117,6 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false - /public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - dependencies: - bn.js: 4.12.0 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - parse-asn1: 5.1.6 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -9815,41 +10128,24 @@ packages: side-channel: 1.0.6 dev: false - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.6 - - /querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - dev: true + dev: false /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: true - /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: false - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 @@ -9863,14 +10159,14 @@ packages: peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 react: 18.2.0 dev: false - /react-day-picker@8.7.1(date-fns@2.30.0)(react@18.2.0): - resolution: {integrity: sha512-Gv426AW8b151CZfh3aP5RUGztLwHB/EyJgWZ5iMgtzbFBkjHfG6Y66CIQFMWGLnYjsQ9DYSJRmJ5S0Pg5HWKjA==} + /react-day-picker@8.10.0(date-fns@2.30.0)(react@18.2.0): + resolution: {integrity: sha512-mz+qeyrOM7++1NCb1ARXmkjMkzWVh2GL9YiPbRjKe0zHccvekk4HE+0MPOZOrosn8r8zTHIIeOUXTmXRqmkRmg==} peerDependencies: - date-fns: ^2.28.0 + date-fns: ^2.28.0 || ^3.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: date-fns: 2.30.0 @@ -9892,7 +10188,7 @@ packages: peerDependencies: react: '>=16.13.1' dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 react: 18.2.0 dev: false @@ -9909,18 +10205,18 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 '@types/react': 18.2.0 - focus-lock: 1.3.3 + focus-lock: 1.3.4 prop-types: 15.8.1 react: 18.2.0 react-clientside-effect: 1.2.6(react@18.2.0) - use-callback-ref: 1.3.1(@types/react@18.2.0)(react@18.2.0) + use-callback-ref: 1.3.2(@types/react@18.2.0)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.0)(react@18.2.0) dev: false - /react-hook-form@7.43.1(react@18.2.0): - resolution: {integrity: sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg==} + /react-hook-form@7.51.1(react@18.2.0): + resolution: {integrity: sha512-ifnBjl+kW0ksINHd+8C/Gp6a4eZOdWyvRv0UBaByShwU8JbVx5hTcTWEcd5VdybvmPTATkVVXk9npXArHmo56w==} engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 @@ -9941,7 +10237,7 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 html-parse-stringify: 3.0.1 i18next: 23.10.0 react: 18.2.0 @@ -9952,7 +10248,6 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false /react-markdown@8.0.7(@types/react@18.2.0)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} @@ -9981,8 +10276,8 @@ packages: - supports-color dev: false - /react-remove-scroll-bar@2.3.5(@types/react@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} + /react-remove-scroll-bar@2.3.6(@types/react@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9997,8 +10292,8 @@ packages: tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.7(@types/react@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + /react-remove-scroll@2.5.9(@types/react@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -10009,10 +10304,10 @@ packages: dependencies: '@types/react': 18.2.0 react: 18.2.0 - react-remove-scroll-bar: 2.3.5(@types/react@18.2.0)(react@18.2.0) + react-remove-scroll-bar: 2.3.6(@types/react@18.2.0)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.0)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.0)(react@18.2.0) + use-callback-ref: 1.3.2(@types/react@18.2.0)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.0)(react@18.2.0) dev: false @@ -10038,7 +10333,7 @@ packages: peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.29.0 @@ -10052,21 +10347,22 @@ packages: dependencies: loose-envify: 1.4.0 - /reactflow@11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QI6+oc1Ft6oFeLSdHlp+SmgymbI5Tm49wj5JyE84O4A54yN/ImfYaBhLit9Cmfzxn9Tz6tDqmGMGbk4bdtB8/w==} + /reactflow@11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0CApYhtYicXEDg/x2kvUHiUk26Qur8lAtTtiSlptNKuyEuGti6P1y5cS32YGaUoDMoCqkm/m+jcKkfMOvSCVRA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/background': 11.2.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.1.15(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.5.4(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.1.1(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.2.3(immer@9.0.19)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/background': 11.3.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.2.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.4(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.7.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.2.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.3.9(@types/react@18.2.0)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: + - '@types/react' - immer dev: false @@ -10085,10 +10381,13 @@ packages: /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + requiresBuild: true dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: false + optional: true /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -10096,13 +10395,13 @@ packages: dependencies: picomatch: 2.3.1 - /reflect.getprototypeof@1.0.5: - resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 @@ -10134,7 +10433,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 dev: true /regexp.prototype.flags@1.5.2: @@ -10171,28 +10470,17 @@ packages: jsesc: 0.5.0 dev: true - /rehype-katex@6.0.2: - resolution: {integrity: sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg==} + /rehype-katex@6.0.3: + resolution: {integrity: sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==} dependencies: '@types/hast': 2.3.10 - '@types/katex': 0.11.1 + '@types/katex': 0.14.0 + hast-util-from-html-isomorphic: 1.0.0 hast-util-to-text: 3.1.2 - katex: 0.15.6 - rehype-parse: 8.0.5 - unified: 10.1.2 - unist-util-remove-position: 4.0.2 + katex: 0.16.9 unist-util-visit: 4.1.2 dev: false - /rehype-parse@8.0.5: - resolution: {integrity: sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A==} - dependencies: - '@types/hast': 2.3.10 - hast-util-from-parse5: 7.1.2 - parse5: 6.0.1 - unified: 10.1.2 - dev: false - /remark-breaks@3.0.3: resolution: {integrity: sha512-C7VkvcUp1TPUc2eAYzsPdaUh8Xj4FSbQnYA5A9f80diApLZscTDeG7efiWP65W8hV2sEy3JuGVU0i6qr5D8Hug==} dependencies: @@ -10276,6 +10564,11 @@ packages: resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} dev: false + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -10301,9 +10594,9 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 @@ -10324,22 +10617,30 @@ packages: dependencies: glob: 7.2.3 - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - dev: true - /robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: false - /rollup@2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 dev: true @@ -10353,12 +10654,6 @@ packages: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} dev: false - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: true - /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -10366,8 +10661,8 @@ packages: mri: 1.2.0 dev: false - /safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 @@ -10382,6 +10677,7 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} @@ -10394,24 +10690,16 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /saslprep@1.0.3: - resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - sparse-bitfield: 3.0.3 dev: false - optional: true - /sass@1.58.3: - resolution: {integrity: sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==} - engines: {node: '>=12.0.0'} + /sass@1.72.0: + resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==} + engines: {node: '>=14.0.0'} hasBin: true dependencies: chokidar: 3.6.0 immutable: 4.3.5 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} @@ -10468,8 +10756,8 @@ packages: dev: false optional: true - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -10491,19 +10779,12 @@ packages: /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: true - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -10529,9 +10810,18 @@ packages: resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} dev: false + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} requiresBuild: true @@ -10553,24 +10843,6 @@ packages: engines: {node: '>=8'} dev: true - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -10592,8 +10864,8 @@ packages: smart-buffer: 4.2.0 dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} /source-map@0.5.7: @@ -10640,6 +10912,10 @@ packages: deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + /state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} dev: false @@ -10653,20 +10929,8 @@ packages: engines: {node: '>= 0.8'} dev: false - /stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true /streamsearch@1.1.0: @@ -10695,13 +10959,17 @@ packages: strip-ansi: 7.1.0 dev: true - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.2 @@ -10709,21 +10977,22 @@ packages: side-channel: 1.0.6 dev: true - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true /string.prototype.trimstart@1.0.7: @@ -10742,8 +11011,11 @@ packages: /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 + dev: false + optional: true /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -10773,13 +11045,19 @@ packages: engines: {node: '>=8'} dev: true + /strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + dependencies: + js-tokens: 8.0.3 + dev: true + /style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: inline-style-parser: 0.1.1 dev: false - /styled-jsx@5.1.1(@babel/core@7.24.0)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.24.3)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -10792,7 +11070,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 client-only: 0.0.1 react: 18.2.0 @@ -10862,32 +11140,25 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - dependencies: - setimmediate: 1.0.5 - dev: true - - /timezones-list@3.0.2: - resolution: {integrity: sha512-I698hm6Jp/xxkwyTSOr39pZkYKETL8LDJeSIhjxXBfPUAHM5oZNuQ4o9UK3PSkDBOkjATecSOBb3pR1IkIBUsg==} + /timezones-list@3.0.3: + resolution: {integrity: sha512-C+Vdvvj2c1xB6pu81pOX8geo6mrk/QsudFVlTVQET7QQwu8WAIyhDNeCrK5grU7EMzmbKLWqz7uU6dN8fvQvPQ==} dev: false /tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} dev: false - /tinypool@0.2.4: - resolution: {integrity: sha512-Vs3rhkUH6Qq1t5bqtb816oT+HeJTXfwt2cbPH17sWHIYKTotQIFPk3tf2fgqRrVyMDVOc1EnPgzIxfIulXVzwQ==} + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} dev: true @@ -10981,17 +11252,13 @@ packages: typescript: 4.9.5 dev: true - /tty-browserify@0.0.1: - resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - dev: true - /tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} dev: false - /turndown@7.1.2: - resolution: {integrity: sha512-ntI9R7fcUKjqBP6QU8rBK2Ehyt8LAzt3UBT9JR9tgo6GtuKvyUzpayWmeMKJw1DPdXzktvtIT8m2mVXz+bL/Qg==} + /turndown@7.1.3: + resolution: {integrity: sha512-Z3/iJ6IWh8VBiACWQJaA5ulPQE5E1QwvBHj00uGzdQxdRnd8fh1DPqNOJqzQDu6DkOstORrtXzf/9adB+vMtEA==} dependencies: domino: 2.1.6 dev: false @@ -11013,8 +11280,8 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} dev: true @@ -11080,6 +11347,10 @@ packages: hasBin: true dev: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -11093,12 +11364,8 @@ packages: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} dev: false - /undici-types@5.25.3: - resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} - /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: false /unherit@1.1.3: resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} @@ -11251,17 +11518,9 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - dev: true - /url@0.11.3: - resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} - dependencies: - punycode: 1.4.1 - qs: 6.11.2 - dev: true - - /use-callback-ref@1.3.1(@types/react@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + /use-callback-ref@1.3.2(@types/react@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -11301,16 +11560,7 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.14 - dev: true + dev: false /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} @@ -11386,13 +11636,35 @@ packages: vfile-message: 3.1.4 dev: false - /vite@3.2.8(@types/node@20.8.5): - resolution: {integrity: sha512-EtQU16PLIJpAZol2cTLttNP1mX6L0SyI0pgQB1VOoWeQnMSvtiwovV3D6NcjN8CZQWWyESD2v5NGnpz5RvgOZA==} - engines: {node: ^14.18.0 || >=16.0.0} + /vite-node@1.4.0: + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.2 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.2.2: + resolution: {integrity: sha512-FWZbz0oSdLq5snUI0b6sULbz58iXFXdvkZfZWR/F0ZJuKTSPO7v72QPXt6KqYeMFb0yytNp6kZosxJ96Nr/wDQ==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': '>= 14' + '@types/node': ^18.0.0 || >=20.0.0 less: '*' + lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -11402,6 +11674,8 @@ packages: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true stylus: @@ -11411,51 +11685,61 @@ packages: terser: optional: true dependencies: - '@types/node': 20.8.5 - esbuild: 0.15.18 - postcss: 8.4.35 - resolve: 1.22.8 - rollup: 2.79.1 + esbuild: 0.20.2 + postcss: 8.4.37 + rollup: 4.13.0 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@0.21.1: - resolution: {integrity: sha512-WBIxuFmIDPuK47GO6Lu9eNeRMqHj/FWL3dk73OHH3eyPPWPiu+UB3QHLkLK2PEggCqJW4FaWoWg8R68S7p9+9Q==} - engines: {node: '>=v14.16.0'} + /vitest@1.4.0: + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - c8: '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/node': + optional: true '@vitest/browser': optional: true '@vitest/ui': optional: true - c8: - optional: true happy-dom: optional: true jsdom: optional: true dependencies: - '@types/chai': 4.3.12 - '@types/chai-subset': 1.3.5 - '@types/node': 20.8.5 + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + acorn-walk: 8.3.2 chai: 4.4.1 debug: 4.3.4 - local-pkg: 0.4.3 - tinypool: 0.2.4 - tinyspy: 1.1.1 - vite: 3.2.8(@types/node@20.8.5) + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.8 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.2.2 + vite-node: 1.4.0 + why-is-node-running: 2.2.2 transitivePeerDependencies: - less + - lightningcss - sass - stylus - sugarss @@ -11463,14 +11747,25 @@ packages: - terser dev: true - /vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - dev: true - /void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} + /vue@3.4.21: + resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-sfc': 3.4.21 + '@vue/runtime-dom': 3.4.21 + '@vue/server-renderer': 3.4.21(vue@3.4.21) + '@vue/shared': 3.4.21 + dev: true + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -11544,21 +11839,22 @@ packages: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 dev: true - /which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 @@ -11576,6 +11872,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} requiresBuild: true @@ -11584,15 +11889,6 @@ packages: dev: false optional: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -11602,6 +11898,15 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -11624,17 +11929,16 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yaml@2.4.0: - resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==} + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} - hasBin: true dev: true /yjs@13.6.14: resolution: {integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} dependencies: - lib0: 0.2.90 + lib0: 0.2.93 dev: false /yocto-queue@0.1.0: @@ -11642,31 +11946,39 @@ packages: engines: {node: '>=10'} dev: true - /zhlint@0.7.1: - resolution: {integrity: sha512-FwwBm1JKyvIBm16exTqyG5gfnvp1fCKn9hIkjXj3cmbCn3aWE6FQaPTkmJfrLR0JNP1CIZjBDdD5Wkbts2r8PA==} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zhlint@0.7.4: + resolution: {integrity: sha512-E1rA6TyQJ1cWWfMoM8KE1hMdDDi5B8Gv+8OYPXe733Lf0C3EwJ+jh1cpoK/KTrYeITumRZQ0KSPkBRMNZuC8oA==} hasBin: true dependencies: chalk: 4.1.2 - glob: 7.2.3 + glob: 10.3.10 + ignore: 5.3.1 minimist: 1.2.8 - node-stdlib-browser: 1.2.0 remark-frontmatter: 1.3.3 remark-parse: 7.0.2 unified: 8.4.2 - vitest: 0.21.1 + vitest: 1.4.0 + vue: 3.4.21 transitivePeerDependencies: - '@edge-runtime/vm' + - '@types/node' - '@vitest/browser' - '@vitest/ui' - - c8 - happy-dom - jsdom - less + - lightningcss - sass - stylus - sugarss - supports-color - terser + - typescript dev: true /zod@3.21.4: @@ -11684,19 +11996,23 @@ packages: tslib: 2.3.0 dev: false - /zustand@4.3.5(immer@9.0.19)(react@18.2.0): - resolution: {integrity: sha512-2iPUzfwx+g3f0PagOMz2vDO9mZzEp2puFpNe7vrAymVPOEIEUjCPkC4/zy84eAscxIWmTU4j9g6upXYkJdzEFQ==} + /zustand@4.5.2(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0): + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} engines: {node: '>=12.7.0'} peerDependencies: - immer: '>=9.0' + '@types/react': '>=16.8' + immer: '>=9.0.6' react: '>=16.8' peerDependenciesMeta: + '@types/react': + optional: true immer: optional: true react: optional: true dependencies: - immer: 9.0.19 + '@types/react': 18.2.0 + immer: 9.0.21 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) dev: false diff --git a/projects/app/data/config.json b/projects/app/data/config.json index e8003eaddfc..a91fdb55c20 100644 --- a/projects/app/data/config.json +++ b/projects/app/data/config.json @@ -10,41 +10,20 @@ "model": "gpt-3.5-turbo", "name": "gpt-3.5-turbo", "maxContext": 16000, + "avatar": "/imgs/model/openai.svg", "maxResponse": 4000, "quoteMaxToken": 13000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": false, - "datasetProcess": false, - "usedInClassify": true, - "usedInExtractFields": true, - "usedInToolCall": true, - "usedInQueryExtension": true, - "toolChoice": true, - "functionCall": false, - "customCQPrompt": "", - "customExtractPrompt": "", - "defaultSystemChatPrompt": "", - "defaultConfig": {} - }, - { - "model": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k", - "maxContext": 16000, - "maxResponse": 16000, - "quoteMaxToken": 13000, - "maxTemperature": 1.2, - "charsPointsPrice": 0, - "censor": false, - "vision": false, "datasetProcess": true, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": true, - "functionCall": false, + "functionCall": true, "customCQPrompt": "", "customExtractPrompt": "", "defaultSystemChatPrompt": "", @@ -53,6 +32,7 @@ { "model": "gpt-4-0125-preview", "name": "gpt-4-turbo", + "avatar": "/imgs/model/openai.svg", "maxContext": 125000, "maxResponse": 4000, "quoteMaxToken": 100000, @@ -75,6 +55,7 @@ { "model": "gpt-4-vision-preview", "name": "gpt-4-vision", + "avatar": "/imgs/model/openai.svg", "maxContext": 128000, "maxResponse": 4000, "quoteMaxToken": 100000, @@ -99,6 +80,7 @@ { "model": "text-embedding-ada-002", "name": "Embedding-2", + "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 700, "maxToken": 3000, diff --git a/projects/app/data/pluginTemplates/README.md b/projects/app/data/pluginTemplates/README.md index b1b1567e1ee..dc288f36592 100644 --- a/projects/app/data/pluginTemplates/README.md +++ b/projects/app/data/pluginTemplates/README.md @@ -14,7 +14,7 @@ type TemplateType = type pluginType = { author: string; // 填写作者信息 - templateType: FlowModuleTemplateType['templateType']; + templateType: FlowNodeTemplateType['templateType']; name: string; avatar: string; intro: string; diff --git a/projects/app/data/pluginTemplates/customFeedback.json b/projects/app/data/pluginTemplates/customFeedback.json index f71ebadd4dd..cac50568596 100644 --- a/projects/app/data/pluginTemplates/customFeedback.json +++ b/projects/app/data/pluginTemplates/customFeedback.json @@ -5,6 +5,7 @@ "avatar": "/imgs/module/customFeedback.svg", "intro": "该模块被触发时,会给当前的对话记录增加一条反馈。可用于自动记录对话效果等。", "showStatus": false, + "isTool": false, "modules": [ { "moduleId": "w90mfp", diff --git a/projects/app/data/pluginTemplates/textEditor.json b/projects/app/data/pluginTemplates/textEditor.json index 2658e75c69e..3a8f0e2a80c 100644 --- a/projects/app/data/pluginTemplates/textEditor.json +++ b/projects/app/data/pluginTemplates/textEditor.json @@ -1,10 +1,11 @@ { "author": "FastGPT Team", "templateType": "tools", - "name": "core.module.template.textEditor", + "name": "文本加工", "avatar": "/imgs/module/textEditor.svg", - "intro": "core.module.template.textEditor intro", + "intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。", "showStatus": false, + "isTool": false, "modules": [ { "moduleId": "w90mfp", diff --git a/projects/app/data/pluginTemplates/tfSwitch.json b/projects/app/data/pluginTemplates/tfSwitch.json index 2b807eca3c5..7f805f28261 100644 --- a/projects/app/data/pluginTemplates/tfSwitch.json +++ b/projects/app/data/pluginTemplates/tfSwitch.json @@ -1,10 +1,11 @@ { "author": "FastGPT Team", "templateType": "tools", - "name": "core.module.template.TFSwitch", + "name": "判断器", "avatar": "/imgs/module/tfSwitch.svg", - "intro": "core.module.template.TFSwitch intro", + "intro": "根据传入的内容进行 True False 输出。默认情况下,当传入的内容为 false, undefined, null, 0, none 时,会输出 false。你也可以增加一些自定义的字符串来补充输出 false 的内容。非字符、非数字、非布尔类型,直接输出 True。", "showStatus": false, + "isTool": false, "modules": [ { "moduleId": "w90mfp", diff --git a/projects/app/data/simpleTemplates/fastgpt-simple.json b/projects/app/data/simpleTemplates/fastgpt-simple.json deleted file mode 100644 index cc18023bb89..00000000000 --- a/projects/app/data/simpleTemplates/fastgpt-simple.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "core.app.template.Simple template", - "desc": "core.app.template.Simple template tip", - "systemForm": { - "aiSettings": { - "model": true, - "systemPrompt": true, - "temperature": false, - "maxToken": false, - "quoteTemplate": false, - "quotePrompt": false - }, - "dataset": { - "datasets": true, - "similarity": false, - "limit": false, - "searchMode": false, - "usingReRank": false, - "searchEmptyText": false - }, - "userGuide": { - "welcomeText": true, - "variables": false, - "questionGuide": false, - "tts": true - } - } -} diff --git a/projects/app/package.json b/projects/app/package.json index 51c53bb5dee..1be8f9f5cf0 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -9,12 +9,13 @@ "lint": "next lint" }, "dependencies": { - "@chakra-ui/anatomy": "^2.2.1", - "@chakra-ui/icons": "^2.1.1", - "@chakra-ui/next-js": "^2.1.5", - "@chakra-ui/react": "^2.8.1", - "@chakra-ui/styled-system": "^2.9.1", - "@chakra-ui/system": "^2.6.1", + "@apidevtools/swagger-parser": "^10.1.0", + "@chakra-ui/anatomy": "2.2.1", + "@chakra-ui/icons": "2.1.1", + "@chakra-ui/next-js": "2.1.5", + "@chakra-ui/react": "2.8.1", + "@chakra-ui/styled-system": "2.9.1", + "@chakra-ui/system": "2.6.1", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@fastgpt/global": "workspace:*", @@ -22,14 +23,13 @@ "@fastgpt/service": "workspace:*", "@fastgpt/web": "workspace:*", "@fortaine/fetch-event-source": "^3.0.6", - "@node-rs/jieba": "^1.7.2", "@tanstack/react-query": "^4.24.10", "@types/nprogress": "^0.2.0", "axios": "^1.5.1", "date-fns": "2.30.0", "dayjs": "^1.11.7", - "echarts": "^5.4.1", - "echarts-gl": "^2.0.9", + "echarts": "5.4.1", + "echarts-gl": "2.0.9", "formidable": "^2.1.1", "framer-motion": "^9.0.6", "hyperdown": "^2.4.29", @@ -37,10 +37,10 @@ "immer": "^9.0.19", "js-yaml": "^4.1.0", "jschardet": "^3.0.0", - "json5": "^2.2.3", "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "mermaid": "^10.2.3", + "@node-rs/jieba": "1.10.0", "nanoid": "^4.0.1", "next": "13.5.2", "next-i18next": "15.2.0", diff --git a/projects/app/public/docs/chatProblem.md b/projects/app/public/docs/chatProblem.md index 7bd770887db..6c2f304e6a3 100644 --- a/projects/app/public/docs/chatProblem.md +++ b/projects/app/public/docs/chatProblem.md @@ -9,6 +9,6 @@ - [计费规则](https://doc.fastgpt.in/docs/pricing/) **其他问题** -| 添加小助手进入交流群 | +| 扫码进入交流群 | | ----------------------- | -| ![](https://otnvvf-imgs.oss.laf.run/wx300.jpg) | +| ![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg) | diff --git a/projects/app/public/imgs/modal/concat.svg b/projects/app/public/imgs/modal/concat.svg deleted file mode 100644 index f721d5fdbce..00000000000 --- a/projects/app/public/imgs/modal/concat.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/projects/app/public/imgs/model/baichuan.svg b/projects/app/public/imgs/model/baichuan.svg new file mode 100644 index 00000000000..f16848e0acc --- /dev/null +++ b/projects/app/public/imgs/model/baichuan.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/chatglm.svg b/projects/app/public/imgs/model/chatglm.svg new file mode 100644 index 00000000000..eee824cb849 --- /dev/null +++ b/projects/app/public/imgs/model/chatglm.svg @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/claude.svg b/projects/app/public/imgs/model/claude.svg new file mode 100644 index 00000000000..95e714e8189 --- /dev/null +++ b/projects/app/public/imgs/model/claude.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/ernie.svg b/projects/app/public/imgs/model/ernie.svg new file mode 100644 index 00000000000..ca91863f644 --- /dev/null +++ b/projects/app/public/imgs/model/ernie.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/huggingface.svg b/projects/app/public/imgs/model/huggingface.svg new file mode 100644 index 00000000000..d3695420849 --- /dev/null +++ b/projects/app/public/imgs/model/huggingface.svg @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/moonshot.svg b/projects/app/public/imgs/model/moonshot.svg new file mode 100644 index 00000000000..aa4e41e2024 --- /dev/null +++ b/projects/app/public/imgs/model/moonshot.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/openai.svg b/projects/app/public/imgs/model/openai.svg new file mode 100644 index 00000000000..eeca4abc23a --- /dev/null +++ b/projects/app/public/imgs/model/openai.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/qwen.svg b/projects/app/public/imgs/model/qwen.svg new file mode 100644 index 00000000000..dc90972d940 --- /dev/null +++ b/projects/app/public/imgs/model/qwen.svg @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/sparkDesk.svg b/projects/app/public/imgs/model/sparkDesk.svg new file mode 100644 index 00000000000..3d9a934f160 --- /dev/null +++ b/projects/app/public/imgs/model/sparkDesk.svg @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/model/yi.svg b/projects/app/public/imgs/model/yi.svg new file mode 100644 index 00000000000..06372ab65af --- /dev/null +++ b/projects/app/public/imgs/model/yi.svg @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/module/toolStop.svg b/projects/app/public/imgs/module/toolStop.svg new file mode 100644 index 00000000000..814dcf07842 --- /dev/null +++ b/projects/app/public/imgs/module/toolStop.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/projects/app/public/locales/en/common.json b/projects/app/public/locales/en/common.json index c40bcdb6e68..1f146cc6534 100644 --- a/projects/app/public/locales/en/common.json +++ b/projects/app/public/locales/en/common.json @@ -62,6 +62,7 @@ "Back": "Back", "Beta": "Beta", "Business edition features": "This is the commercial version function ~", + "Cancel": "Cancel", "Choose": "Choose", "Close": "Close", "Collect": "Collect", @@ -113,6 +114,7 @@ "Not open": "Close", "Number of words": "{{amount}} words", "OK": "OK", + "Open": "Open", "Opened": "Opened", "Other": "Other", "Output": "Output", @@ -122,6 +124,7 @@ "Price used": "Usage", "Read document": "Read document", "Read intro": "Read intro", + "Remove": "Remove", "Rename": "Rename", "Rename Failed": "Rename Failed", "Rename Success": "Rename Success", @@ -159,6 +162,7 @@ "Upload File Failed": "Upload File Failed", "Username": "UserName", "Waiting": "Waiting", + "Warning": "", "Website": "Website", "avatar": { "Select Avatar": "Select Avatar", @@ -244,8 +248,12 @@ "Total chars": "Total chars: {{total}}", "Total tokens": "Tokens: {{total}}", "ai": { + "AI settings": "AI settings", + "Ai point price": "AI points", + "Max context": "Max context", "Model": "Model", "Prompt": "Prompt", + "Support tool": "Function call", "model": { "Dataset Agent Model": "Agent Model", "Vector Model": "Vector Model" @@ -260,6 +268,7 @@ "Chat Variable": "", "External using": "External use", "Make a brief introduction of your app": "Make a brief introduction of your app", + "Max histories": "Dialog round", "Max tokens": "Max tokens", "Name and avatar": "Avatar & Name", "Next Step Guide": "Next step guide", @@ -282,6 +291,15 @@ "TTS Tip": "After this function is enabled, the voice playback function can be used after each conversation. Use of this feature may incur additional charges.", "Team tags": "Team tags", "Temperature": "Temperature", + "Tool call": "Tool call", + "Tool call tip": "The AI model automatically selects one or more tools to use. If this feature is enabled, the knowledge base call is also called as a tool. Please try to choose the AI model that supports \"function call\", the effect is better.", + "ToolCall": { + "No plugin": "No plugins", + "Setting tool": "Setting tool", + "System": "System", + "Team": "Team", + "This plugin cannot be called as a tool": "This tool cannot be used in easy mode" + }, "Welcome Text": "Welcome Text", "create app": "Create App", "deterministic": "Deterministic", @@ -692,6 +710,7 @@ "Search type": "Type", "Source id": "Source ID", "Source name": "Source", + "Tool description": "Description", "Top K": "Top K", "Using cfr": "Open query extension", "Using query extension": "Open query extension", @@ -770,6 +789,7 @@ "module": { "Add question type": "Add type", "Can not connect self": "Cannot connect itself", + "Confirm Delete Node": "", "Data Type": "Data Type", "Dataset quote": { "Add quote": "Add quote", @@ -792,6 +812,9 @@ "placeholder": "Questions about python introduction and usage, etc. The current conversation is related to the game GTA5.", "tip": "Describes the scope of the current conversation, making it easier for the AI to complete first or vague questions, thereby enhancing the knowledge base's ability to continue conversations.If \n is empty, the question completion function is not used in the first conversation. " }, + "Quote prompt setting": "Quote prompt setting", + "Qupte prompt setting": "", + "Setting quote prompt": "Setting quote prompt", "Unlink tip": "[{{name}}] An unfilled or unconnected parameter exists", "Variable": "Variables", "Variable Setting": "Variable Setting", @@ -900,10 +923,13 @@ } }, "template": { + "AI response switch tip": "If you want the current node not to output content, you can turn this switch off. AI output content will not be shown to the user, you can manually use the \"AI reply content\" for special processing.", + "AI support tool tip": "A model that supports function calls allows better use of tool calls.", "Ai chat": "LLM Chat", "Ai chat intro": "Request LLM chat", "Assigned reply": "Assigned reply", "Assigned reply intro": "The module can respond directly to a specified piece of content. Often used to guide and prompt. When non-string content is passed in, it is converted to a string for output.", + "Basic Node": "Basic Node", "Chat entrance": "Chat entrance", "Chat entrance intro": "When the user sends a content, the flow will start from this module.", "Classify question": "Classify question", @@ -924,9 +950,11 @@ "Response module": "Text output", "Running app": "Running app", "Running app intro": "You can select a different app to run", + "System Plugin": "System Plugin", "System input module": "System input", "TFSwitch": "TF Switch", "TFSwitch intro": "Output True False based on what is passed in. By default, false is printed when the content passed in is false, undefined, null, 0, none. You can also add some custom strings to supplement the output of false.", + "Team Plugin": "Team Plugin", "Tool module": "Tools", "UnKnow Module": "UnKnow Module", "User guide": "User guide", @@ -934,6 +962,9 @@ "textEditor": "Text Editor", "textEditor intro": "Output of fixed or incoming text after edit" }, + "templates": { + "Load plugin error": "Load plugin error" + }, "textEditor": { "Text Edit": "Text Edit" }, @@ -971,7 +1002,10 @@ "variable add option": "Add Option" }, "plugin": { - "Get Plugin Module Detail Failed": "Load plugin failed" + "Custom headers": "Custom Headers", + "Delete http plugin": "Are you sure to delete this group of HTTP plug-ins? All plug-ins in the directory are deleted.", + "Get Plugin Module Detail Failed": "Load plugin failed", + "Intro placeholder": "If the plug-in is called as a tool, the introduction is used as the prompt word." }, "shareChat": { "Init Error": "Init Chat Error", @@ -1178,18 +1212,38 @@ "Set Public": "Set to public" }, "plugin": { + "Auth Header Prefix": "Auth header prefix", + "Auth Method": "Auth method", + "Auth Type": "Auth Type", "Confirm Delete": "Confirm to delete the plugin?", "Create Your Plugin": "Create Plugin", + "Custom Plugin": "Custom plugin", + "Description": "Description", + "Edit Http Plugin": "Edit HTTP plugin", "Get Plugin Module Detail Failed": "Get plugin detail failed", + "HTTP Plugin": "HTTP plugin", + "Import Plugin": "Import HTTP plugin", + "Import from URL": "Import from URL", "Intro": "Plugin Intro", + "Invalid Schema": "Invalid Schema", + "Invalid URL": "Invalid URL", + "Key": "Key", "Load Plugin Failed": "Load Plugin Failed", + "Method": "Method", "My Plugins": "My Plugins", "No Intro": "This plugin is not introduced", + "None": "None", + "Path": "Path", + "Plugin List": "Plugin list", "Plugin Module": "Plugin", + "Privacy Agreement": "privacy agreement", + "Search plugin": "Search plugins", "Set Name": "Plugin Name", "Synchronous version": "Sync Version", "To Edit Plugin": "To Edit", - "Update Your Plugin": "Update Plugin" + "Update Your Plugin": "Update Plugin", + "Value": "Value", + "path": "" }, "support": { "account": { @@ -1229,6 +1283,7 @@ } }, "user": { + "AI point standard": "AI points price", "Avatar": "Avatar", "Need to login": "Please log in first", "Price": "Price", @@ -1267,15 +1322,20 @@ } }, "wallet": { + "Ai point every thoundsand tokens": "", + "Ai point every thounsand tokens": "{{points}}Points/1K Tokens", + "Ai point every thousand tokens": "{{points}}Points/1K Tokens", "Amount": "Amount", "Balance not enough tip": "The balance is insufficient, please go to the account page first", "Bills": "Bill", "Buy": "Buy", "Buy more": "Buy more", "Confirm pay": "Confirm pay", + "Not sufficient": "Your AI points are insufficient, please upgrade the package or purchase additional AI points before continuing to use.", "Pay error": "Pay error", "Pay success": "Pay success", "Standard Plan Detail": "Standard Plan Detail", + "To read plan": "Read plan", "bill": { "AI Model": "AI Model", "AI Type": "AI Type", @@ -1302,6 +1362,10 @@ "noBill": "Not Bills", "subscription": { "AI points": "AI points", + "AI points click to read tip": "Each time an AI model is invoked, a certain amount of AI credits (similar to Tokens) are consumed. Click to view the detailed calculation rules.", + "AI points tip": "", + "AI points usage": "AI point usage", + "AI points usage tip": "Each time the AI model is invoked, a certain amount of AI credits are consumed. Please refer to the \"Charging Standard\" above for specific calculation standards.", "Ai points": "AI Points Standard", "Buy now": "Buy now", "Change will take effect after the current subscription expires": "Change will take effect after the current subscription expires", @@ -1395,7 +1459,7 @@ "Help Document": "Document" }, "template": { - "Quote Content Tip": "This configuration takes effect only when reference content is passed in (knowledge base search).\nYou can customize the structure of the reference content to better suit different scenarios. Some variables can be used for template configuration:\n{{q}} - retrieve content, {{a}} - expected content, {{source}} - source, {{sourceId}} - source file name, {{index}} - the first n references, {{with}} - the reference points (0-1), they are optional, Here are the default values:\n{{default}}", + "Quote Content Tip": "This configuration takes effect only when reference content is passed in (knowledge base search).\nYou can customize the structure of the reference content to better suit different scenarios. Some variables can be used for template configuration:\n{{q}} - retrieve content, {{a}} - expected content, {{source}} - source, {{sourceId}} - source file name, {{index}} - the first n references, they are optional, Here are the default values:\n{{default}}", "Quote Prompt Tip": "This configuration takes effect only when the knowledge base is searched.\nYou can use {{quote}} to insert the reference content template and {{question}} to insert the question. Here are the default values:\n{{default}}" }, "user": { diff --git a/projects/app/public/locales/zh/common.json b/projects/app/public/locales/zh/common.json index 8b4b9ee5c9e..dcd232e38b2 100644 --- a/projects/app/public/locales/zh/common.json +++ b/projects/app/public/locales/zh/common.json @@ -62,6 +62,7 @@ "Back": "返回", "Beta": "实验版", "Business edition features": "这是商业版功能~", + "Cancel": "取消", "Choose": "选择", "Close": "关闭", "Collect": "收藏", @@ -113,6 +114,7 @@ "Not open": "未开启", "Number of words": "{{amount}}字", "OK": "好的", + "Open": "打开", "Opened": "已开启", "Other": "其他", "Output": "输出", @@ -122,6 +124,7 @@ "Price used": "金额消耗", "Read document": "查看文档", "Read intro": "查看说明", + "Remove": "移除", "Rename": "重命名", "Rename Failed": "重命名失败", "Rename Success": "重命名成功", @@ -159,6 +162,7 @@ "Upload File Failed": "上传文件失败", "Username": "用户名", "Waiting": "等待中", + "Warning": "警告", "Website": "网站", "avatar": { "Select Avatar": "点击选择头像", @@ -244,8 +248,12 @@ "Total chars": "总字数: {{total}}", "Total tokens": "总 Tokens: {{total}}", "ai": { + "AI settings": "AI 配置", + "Ai point price": "AI积分消耗", + "Max context": "最大上下文", "Model": "AI 模型", "Prompt": "提示词", + "Support tool": "函数调用", "model": { "Dataset Agent Model": "文件处理模型", "Vector Model": "索引模型" @@ -260,6 +268,7 @@ "Chat Variable": "对话框变量", "External using": "外部使用途径", "Make a brief introduction of your app": "给你的 AI 应用一个介绍", + "Max histories": "聊天记录数量", "Max tokens": "回复上限", "Name and avatar": "头像 & 名称", "Next Step Guide": "下一步指引", @@ -282,6 +291,15 @@ "TTS Tip": "开启后,每次对话后可使用语音播放功能。使用该功能可能产生额外费用。", "Team tags": "团队标签", "Temperature": "温度", + "Tool call": "工具调用", + "Tool call tip": "通过AI模型自动选择一个或多个工具进行使用。如果启动该功能,知识库调用也会被当做一个工具调用。请尽量选择支持“函数调用”的AI模型,效果更好。", + "ToolCall": { + "No plugin": "没有可用的插件", + "Setting tool": "配置工具", + "System": "系统", + "Team": "团队", + "This plugin cannot be called as a tool": "该工具无法在简易模式中使用" + }, "Welcome Text": "对话开场白", "create app": "创建属于你的 AI 应用", "deterministic": "严谨", @@ -355,7 +373,7 @@ }, "tip": { "Add a intro to app": "快来给应用一个介绍~", - "chatNodeSystemPromptTip": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}", + "chatNodeSystemPromptTip": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}\n如果关联了知识库,你还可以通过适当的描述,来引导模型何时去调用知识库搜索。例如:\n你是电影《星际穿越》的助手,当用户询问与《星际穿越》相关的内容时,请搜索知识库并结合搜索结果进行回答。", "userGuideTip": "可以在对话前设置引导语,设置全局变量,设置下一步指引", "variableTip": "可以在对话开始前,要求用户填写一些内容作为本轮对话的特定变量。该模块位于开场引导之后。\n变量可以通过 {{变量key}} 的形式注入到其他模块 string 类型的输入中,例如:提示词、限定词等", "welcomeTextTip": "每次对话开始前,发送一个初始内容。支持标准 Markdown 语法,可使用的额外标记:\n[快捷按键]: 用户点击后可以直接发送该问题" @@ -694,6 +712,7 @@ "Search type": "类型", "Source id": "来源ID", "Source name": "引用来源名", + "Tool description": "调用时机", "Top K": "单次搜索上限", "Using cfr": "", "Using query extension": "使用问题优化", @@ -772,6 +791,7 @@ "module": { "Add question type": "添加问题类型", "Can not connect self": "不能连接自身", + "Confirm Delete Node": "确认删除该节点?", "Data Type": "数据类型", "Dataset quote": { "Add quote": "添加引用", @@ -794,6 +814,9 @@ "placeholder": "例如:\n关于 python 的介绍和使用等问题。\n当前对话与游戏《GTA5》有关。", "tip": "描述当前对话的范围,便于AI补全首次问题或模糊的问题,从而增强知识库连续对话的能力。建议开启该功能后,都简单的描述在对话的背景,否则容易造成补全对象不准确。" }, + "Quote prompt setting": "引用提示词配置", + "Qupte prompt setting": "", + "Setting quote prompt": "配置引用提示词", "Unlink tip": "【{{name}}】存在未填或未连接参数", "Variable": "全局变量", "Variable Setting": "变量设置", @@ -902,10 +925,13 @@ } }, "template": { + "AI response switch tip": "如果你希望当前节点不输出内容,可以关闭该开关。AI输出的内容不会展示给用户,你可以手动的使用“AI回复内容”进行特殊处理。", + "AI support tool tip": "支持函数调用的模型,可以更好的使用工具调用。", "Ai chat": "AI 对话", "Ai chat intro": "AI 大模型对话", "Assigned reply": "指定回复", "Assigned reply intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。", + "Basic Node": "基础功能", "Chat entrance": "对话入口", "Chat entrance intro": "当用户发送一个内容后,流程将会从这个模块开始执行。", "Classify question": "问题分类", @@ -926,9 +952,11 @@ "Response module": "文本输出", "Running app": "应用调用", "Running app intro": "可以选择一个其他应用进行调用", + "System Plugin": "系统插件", "System input module": "系统输入", "TFSwitch": "判断器", "TFSwitch intro": "根据传入的内容进行 True False 输出。默认情况下,当传入的内容为 false, undefined, null, 0, none 时,会输出 false。你也可以增加一些自定义的字符串来补充输出 false 的内容。非字符、非数字、非布尔类型,直接输出 True。", + "Team Plugin": "团队插件", "Tool module": "工具", "UnKnow Module": "未知模块", "User guide": "用户引导", @@ -936,6 +964,9 @@ "textEditor": "文本加工", "textEditor intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。" }, + "templates": { + "Load plugin error": "加载插件失败" + }, "textEditor": { "Text Edit": "文本加工" }, @@ -973,7 +1004,10 @@ "variable add option": "添加选项" }, "plugin": { - "Get Plugin Module Detail Failed": "加载插件异常" + "Custom headers": "自定义请求头", + "Delete http plugin": "确认删除该组HTTP插件?会删除该目录下所有插件。", + "Get Plugin Module Detail Failed": "加载插件异常", + "Intro placeholder": "如果该插件作为工具被调用,则会使用该介绍作为提示词。" }, "shareChat": { "Init Error": "初始化对话框失败", @@ -1180,18 +1214,38 @@ "Set Public": "设为团队可用" }, "plugin": { + "Auth Header Prefix": "鉴权头部前缀", + "Auth Method": "鉴权方法", + "Auth Type": "鉴权类型", "Confirm Delete": "确认删除该插件?", "Create Your Plugin": "创建你的插件", + "Custom Plugin": "自定义插件", + "Description": "描述", + "Edit Http Plugin": "编辑 HTTP 插件", "Get Plugin Module Detail Failed": "获取插件信息异常", + "HTTP Plugin": "HTTP 插件", + "Import Plugin": "导入 HTTP 插件", + "Import from URL": "URL 导入", "Intro": "插件介绍", + "Invalid Schema": "Schema 无效", + "Invalid URL": "URL 无效", + "Key": "键", "Load Plugin Failed": "加载插件异常", + "Method": "方法", "My Plugins": "我的插件", "No Intro": "这个插件没有介绍~", + "None": "无", + "Path": "路径", + "Plugin List": "插件列表", "Plugin Module": "插件模块", + "Privacy Agreement": "隐私协议", + "Search plugin": "搜索插件", "Set Name": "给插件取个名字", "Synchronous version": "同步版本", "To Edit Plugin": "去编辑", - "Update Your Plugin": "更新插件" + "Update Your Plugin": "更新插件", + "Value": "值", + "path": "" }, "support": { "account": { @@ -1231,6 +1285,7 @@ } }, "user": { + "AI point standard": "AI积分标准", "Avatar": "头像", "Need to login": "请先登录", "Price": "计费标准", @@ -1269,15 +1324,20 @@ } }, "wallet": { + "Ai point every thoundsand tokens": "{{points}}积分/1K tokens", + "Ai point every thounsand tokens": "{{points}}积分/1K tokens", + "Ai point every thousand tokens": "{{points}}积分/1K tokens", "Amount": "金额", "Balance not enough tip": "余额不足,请先到账号页充值", "Bills": "账单", "Buy": "购买", "Buy more": "扩容", "Confirm pay": "支付确认", + "Not sufficient": "您的 AI 积分不足,请先升级套餐或购买额外 AI 积分后继续使用。", "Pay error": "支付失败", "Pay success": "支付成功", "Standard Plan Detail": "套餐详情", + "To read plan": "查看套餐", "bill": { "AI Model": "AI 模型", "AI Type": "AI 类型", @@ -1304,6 +1364,10 @@ "noBill": "无账单记录~", "subscription": { "AI points": "AI积分", + "AI points click to read tip": "每次调用AI模型时,都会消耗一定的AI积分(类似于 Tokens)。点击可查看详细计算规则。", + "AI points tip": "每次调用AI模型时,都会消耗一定的AI积分。具体的计算标准可参考下方的“计费标准”", + "AI points usage": "AI积分使用量", + "AI points usage tip": "每次调用AI模型时,都会消耗一定的AI积分。具体的计算标准可参考上方的“计费标准”", "Ai points": "AI 积分计算标准", "Buy now": "切换套餐", "Change will take effect after the current subscription expires": "更新成功。将会再下个订阅周期生效。", @@ -1337,7 +1401,7 @@ "Upgrade plan": "升级套餐", "function": { "History store": "{{amount}} 天对话记录保留", - "Max app": "{{amount}} 个应用与插件", + "Max app": "{{amount}} 个应用", "Max dataset": "{{amount}} 个知识库", "Max dataset size": "{{amount}} 组知识库索引", "Max members": "{{amount}} 个团队成员", @@ -1354,7 +1418,7 @@ "experience": "体验版", "experience desc": "", "free": "免费版", - "free desc": "每月均可免费使用基础功能,15天不活跃时,将会清除知识库", + "free desc": "每月均可免费使用基础功能,15天无使用记录时,将会清除知识库", "team": "团队版" }, "type": { @@ -1397,8 +1461,8 @@ "Help Document": "帮助文档" }, "template": { - "Quote Content Tip": "该配置只有传入引用内容(知识库搜索)时生效。\n可以自定义引用内容的结构,以更好的适配不同场景。可以使用一些变量来进行模板配置:\n{{q}} - 检索内容, {{a}} - 预期内容, {{source}} - 来源,{{sourceId}} - 来源文件名,{{index}} - 第n个引用,{{score}} - 该引用的得分(0-1),他们都是可选的,下面是默认值:\n{{default}}", - "Quote Prompt Tip": "该配置只在知识库搜索时生效。\n可以用 {{quote}} 来插入引用内容模板,使用 {{question}} 来插入问题。下面是默认值:\n{{default}}" + "Quote Content Tip": "可以自定义引用内容的结构,以更好的适配不同场景。可以使用一些变量来进行模板配置:\n{{q}} - 检索内容, {{a}} - 预期内容, {{source}} - 来源,{{sourceId}} - 来源文件名,{{index}} - 第n个引用,他们都是可选的,下面是默认值:\n{{default}}", + "Quote Prompt Tip": "可以用 {{quote}} 来插入引用内容模板,使用 {{question}} 来插入问题。下面是默认值:\n{{default}}" }, "user": { "Account": "账号", diff --git a/projects/app/src/components/Avatar/index.tsx b/projects/app/src/components/Avatar/index.tsx index 42a2ebcc516..45767d3d3d9 100644 --- a/projects/app/src/components/Avatar/index.tsx +++ b/projects/app/src/components/Avatar/index.tsx @@ -14,7 +14,7 @@ const Avatar = ({ w = '30px', src, ...props }: ImageProps) => { w={w} h={w} p={'1px'} - src={src || LOGO_ICON} + src={src} {...props} /> ); diff --git a/projects/app/src/components/ChatBox/ContextModal.tsx b/projects/app/src/components/ChatBox/ContextModal.tsx index 91cfe92c961..721cbd96fd2 100644 --- a/projects/app/src/components/ChatBox/ContextModal.tsx +++ b/projects/app/src/components/ChatBox/ContextModal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ModalBody, Box, useTheme } from '@chakra-ui/react'; -import MyModal from '../MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { DispatchNodeResponseType } from '@fastgpt/global/core/module/runtime/type.d'; const ContextModal = ({ diff --git a/projects/app/src/components/ChatBox/FeedbackModal.tsx b/projects/app/src/components/ChatBox/FeedbackModal.tsx index b05f11581cf..3915e14bfb5 100644 --- a/projects/app/src/components/ChatBox/FeedbackModal.tsx +++ b/projects/app/src/components/ChatBox/FeedbackModal.tsx @@ -1,6 +1,6 @@ import React, { useRef } from 'react'; import { ModalBody, Textarea, ModalFooter, Button } from '@chakra-ui/react'; -import MyModal from '../MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useRequest } from '@/web/common/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import { updateChatUserFeedback } from '@/web/core/chat/api'; @@ -9,6 +9,8 @@ const FeedbackModal = ({ appId, chatId, chatItemId, + teamId, + teamToken, shareId, outLinkUid, onSuccess, @@ -18,6 +20,8 @@ const FeedbackModal = ({ chatId: string; chatItemId: string; shareId?: string; + teamId?: string; + teamToken?: string; outLinkUid?: string; onSuccess: (e: string) => void; onClose: () => void; @@ -33,6 +37,8 @@ const FeedbackModal = ({ chatId, chatItemId, shareId, + teamId, + teamToken, outLinkUid, userBadFeedback: val }); diff --git a/projects/app/src/components/ChatBox/QuoteModal.tsx b/projects/app/src/components/ChatBox/QuoteModal.tsx index b6a6dd7f6c4..4ad5ded0d39 100644 --- a/projects/app/src/components/ChatBox/QuoteModal.tsx +++ b/projects/app/src/components/ChatBox/QuoteModal.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; import { ModalBody, Box, useTheme } from '@chakra-ui/react'; -import MyModal from '../MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import QuoteItem from '../core/dataset/QuoteItem'; diff --git a/projects/app/src/components/ChatBox/ReadFeedbackModal.tsx b/projects/app/src/components/ChatBox/ReadFeedbackModal.tsx index 7ff0ee33352..633353472aa 100644 --- a/projects/app/src/components/ChatBox/ReadFeedbackModal.tsx +++ b/projects/app/src/components/ChatBox/ReadFeedbackModal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ModalBody, ModalFooter, Button } from '@chakra-ui/react'; -import MyModal from '../MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; const ReadFeedbackModal = ({ diff --git a/projects/app/src/components/ChatBox/WholeResponseModal.tsx b/projects/app/src/components/ChatBox/WholeResponseModal.tsx index c5224c50531..baefb2f89e2 100644 --- a/projects/app/src/components/ChatBox/WholeResponseModal.tsx +++ b/projects/app/src/components/ChatBox/WholeResponseModal.tsx @@ -5,7 +5,7 @@ import { useTranslation } from 'next-i18next'; import { moduleTemplatesFlat } from '@fastgpt/global/core/module/template/constants'; import Tabs from '../Tabs'; -import MyModal from '../MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import MyTooltip from '../MyTooltip'; import { QuestionOutlineIcon } from '@chakra-ui/icons'; import Markdown from '../Markdown'; diff --git a/projects/app/src/components/ChatBox/components/ChatItem.tsx b/projects/app/src/components/ChatBox/components/ChatItem.tsx index 31f9792eb19..024f2714a8b 100644 --- a/projects/app/src/components/ChatBox/components/ChatItem.tsx +++ b/projects/app/src/components/ChatBox/components/ChatItem.tsx @@ -9,9 +9,7 @@ import { AccordionButton, AccordionPanel, AccordionIcon, - Button, - Image, - Grid + Image } from '@chakra-ui/react'; import React, { useMemo } from 'react'; import ChatController, { type ChatControllerProps } from './ChatController'; @@ -88,7 +86,7 @@ const ChatItem = ({ return ( <> {files.length > 0 && } - + ); } @@ -100,13 +98,26 @@ const ChatItem = ({ if (value.text) { let source = value.text?.content || ''; - if (isLastChild && !isChatting && questionGuides.length > 0) { + if (!source && chat.value.length > 1) return <>; + + if ( + isLastChild && + !isChatting && + questionGuides.length > 0 && + i === chat.value.length - 1 + ) { source = `${source} \`\`\`${CodeClassName.questionGuide} ${JSON.stringify(questionGuides)}`; } - return ; + return ( + + ); } if (value.type === ChatItemValueTypeEnum.tool && value.tools) { return ( @@ -233,4 +244,4 @@ ${toolResponse}`} ); }; -export default ChatItem; +export default React.memo(ChatItem); diff --git a/projects/app/src/components/ChatBox/components/WelcomeBox.tsx b/projects/app/src/components/ChatBox/components/WelcomeBox.tsx index 8fac6284396..ad274117829 100644 --- a/projects/app/src/components/ChatBox/components/WelcomeBox.tsx +++ b/projects/app/src/components/ChatBox/components/WelcomeBox.tsx @@ -18,7 +18,7 @@ const WelcomeBox = ({ appAvatar, welcomeText }: { appAvatar?: string; welcomeTex bg={'white'} boxShadow={'0 0 8px rgba(0,0,0,0.15)'} > - + diff --git a/projects/app/src/components/ChatBox/index.tsx b/projects/app/src/components/ChatBox/index.tsx index 25e197c84a3..e5378020691 100644 --- a/projects/app/src/components/ChatBox/index.tsx +++ b/projects/app/src/components/ChatBox/index.tsx @@ -257,10 +257,7 @@ const ChatBox = ( }; return { ...item, - value: - lastValue && lastValue.text - ? item.value.slice(0, -1).concat(val) - : item.value.concat(val) + value: item.value.concat(val) }; } else if ( event === SseResponseEventEnum.toolParams && @@ -441,6 +438,7 @@ const ChatBox = ( chatController.current = abortSignal; const messages = chats2GPTMessages({ messages: newChatList, reserveId: true }); + const { responseData, responseText, @@ -537,10 +535,9 @@ const ChatBox = ( setLoading(true); const index = chatHistories.findIndex((item) => item.dataId === dataId); const delHistory = chatHistories.slice(index); - try { await Promise.all( - delHistory.map(async (item) => { + delHistory.map((item) => { if (item.dataId) { return onDelMessage({ contentId: item.dataId }); } @@ -563,14 +560,29 @@ const ChatBox = ( }, [chatHistories, onDelMessage, sendPrompt, setLoading, toast] ); - // delete one message + // delete one message(One human and the ai response) const delOneMessage = useCallback( (dataId?: string) => { if (!dataId || !onDelMessage) return; return () => { - setChatHistories((state) => state.filter((chat) => chat.dataId !== dataId)); - onDelMessage({ - contentId: dataId + setChatHistories((state) => { + let aiIndex = -1; + + return state.filter((chat, i) => { + if (chat.dataId === dataId) { + aiIndex = i + 1; + onDelMessage({ + contentId: dataId + }); + return false; + } else if (aiIndex === i && chat.obj === ChatRoleEnum.AI && chat.dataId) { + onDelMessage({ + contentId: chat.dataId + }); + return false; + } + return true; + }); }); }; }, @@ -630,6 +642,8 @@ const ChatBox = ( updateChatUserFeedback({ appId, chatId, + teamId, + teamToken, chatItemId: chat.dataId, shareId, outLinkUid, @@ -654,6 +668,8 @@ const ChatBox = ( ); updateChatUserFeedback({ appId, + teamId, + teamToken, chatId, chatItemId: chat.dataId, userGoodFeedback: undefined @@ -687,6 +703,8 @@ const ChatBox = ( chatId, chatItemId: chat.dataId, shareId, + teamId, + teamToken, outLinkUid }); } catch (error) {} @@ -869,7 +887,6 @@ const ChatBox = ( avatar={appAvatar} chat={item} isChatting={isChatting} - onDelete={delOneMessage(item.dataId)} {...(item.obj === 'AI' && { setChatHistories, showVoiceIcon, @@ -955,6 +972,8 @@ const ChatBox = ( {!!feedbackId && chatId && appId && ( void }) => { const { feConfigs } = useSystemStore(); return ( - + diff --git a/projects/app/src/components/Layout/index.tsx b/projects/app/src/components/Layout/index.tsx index d02e6029e32..1262318b9df 100644 --- a/projects/app/src/components/Layout/index.tsx +++ b/projects/app/src/components/Layout/index.tsx @@ -12,10 +12,8 @@ import dynamic from 'next/dynamic'; import Auth from './auth'; import Navbar from './navbar'; import NavbarPhone from './navbarPhone'; -const UpdateInviteModal = dynamic( - () => import('@/components/support/user/team/UpdateInviteModal'), - { ssr: false } -); +const UpdateInviteModal = dynamic(() => import('@/components/support/user/team/UpdateInviteModal')); +const NotSufficientModal = dynamic(() => import('@/components/support/wallet/NotSufficientModal')); const pcUnShowLayoutRoute: Record = { '/': true, @@ -44,7 +42,7 @@ const Layout = ({ children }: { children: JSX.Element }) => { const router = useRouter(); const { colorMode, setColorMode } = useColorMode(); const { Loading } = useLoading(); - const { loading, setScreenWidth, isPc, feConfigs } = useSystemStore(); + const { loading, setScreenWidth, isPc, feConfigs, isNotSufficientModal } = useSystemStore(); const { userInfo } = useUserStore(); const isChatPage = useMemo( @@ -118,6 +116,7 @@ const Layout = ({ children }: { children: JSX.Element }) => { )} {!!userInfo && } + {isNotSufficientModal && !isHideNavbar && } diff --git a/projects/app/src/components/Markdown/index.tsx b/projects/app/src/components/Markdown/index.tsx index 46daffb7a05..ef0f733f95c 100644 --- a/projects/app/src/components/Markdown/index.tsx +++ b/projects/app/src/components/Markdown/index.tsx @@ -36,10 +36,10 @@ export enum CodeClassName { const Markdown = ({ source = '', - isChatting = false + showAnimation = false }: { source?: string; - isChatting?: boolean; + showAnimation?: boolean; }) => { const components = useMemo( () => ({ @@ -60,7 +60,7 @@ const Markdown = ({ return ( void; -} - -const MyModal = ({ - isOpen, - onClose, - iconSrc, - title, - children, - isCentered, - w = 'auto', - maxW = ['90vw', '600px'], - ...props -}: MyModalProps) => { - const { isPc } = useSystemStore(); - return ( - - {children} - - ); -}; - -export default MyModal; diff --git a/projects/app/src/components/PromptTemplate/index.tsx b/projects/app/src/components/PromptTemplate/index.tsx index 10890377611..46e38b14f93 100644 --- a/projects/app/src/components/PromptTemplate/index.tsx +++ b/projects/app/src/components/PromptTemplate/index.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import MyModal from '../MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { Box, Button, Flex, Grid, useTheme } from '@chakra-ui/react'; import { PromptTemplateItem } from '@fastgpt/global/core/ai/type.d'; import { ModalBody, ModalFooter } from '@chakra-ui/react'; diff --git a/projects/app/src/components/Select/AIModelSelector.tsx b/projects/app/src/components/Select/AIModelSelector.tsx new file mode 100644 index 00000000000..5b3d58703dc --- /dev/null +++ b/projects/app/src/components/Select/AIModelSelector.tsx @@ -0,0 +1,70 @@ +import React, { useMemo } from 'react'; + +import { useTranslation } from 'next-i18next'; +import { useSystemStore } from '@/web/common/system/useSystemStore'; +import { useRouter } from 'next/router'; +import { AI_POINT_USAGE_CARD_ROUTE } from '@/web/support/wallet/sub/constants'; +import MySelect, { SelectProps } from '@fastgpt/web/components/common/MySelect'; +import { HUGGING_FACE_ICON, LOGO_ICON } from '@fastgpt/global/common/system/constants'; +import { Box, Flex } from '@chakra-ui/react'; +import Avatar from '../Avatar'; + +const AIModelSelector = ({ list, ...props }: SelectProps) => { + const { t } = useTranslation(); + const { feConfigs, llmModelList, vectorModelList } = useSystemStore(); + const router = useRouter(); + + const avatarList = list.map((item) => { + const modelData = + llmModelList.find((model) => model.model === item.value) || + vectorModelList.find((model) => model.model === item.value); + + return { + value: item.value, + label: ( + + + {item.label} + + ) + }; + }); + + const expandList = useMemo(() => { + return feConfigs.show_pay + ? avatarList.concat({ + label: ( + + + {t('support.user.Price')} + + ), + value: 'price' + }) + : avatarList; + }, [feConfigs.show_pay, avatarList, t]); + + return ( + <> + { + if (e === 'price') { + router.push(AI_POINT_USAGE_CARD_ROUTE); + return; + } + props.onchange?.(e); + }} + /> + + ); +}; + +export default AIModelSelector; diff --git a/projects/app/src/components/Select/SelectAiModel.tsx b/projects/app/src/components/Select/SelectAiModel.tsx deleted file mode 100644 index 222e9a50600..00000000000 --- a/projects/app/src/components/Select/SelectAiModel.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { useMemo } from 'react'; - -import { useTranslation } from 'next-i18next'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; -import { useRouter } from 'next/router'; -import { AI_POINT_USAGE_CARD_ROUTE } from '@/web/support/wallet/sub/constants'; -import MySelect, { SelectProps } from '@fastgpt/web/components/common/MySelect'; - -const SelectAiModel = ({ list, ...props }: SelectProps) => { - const { t } = useTranslation(); - const { feConfigs } = useSystemStore(); - const router = useRouter(); - - const expandList = useMemo(() => { - return feConfigs.show_pay - ? list.concat({ - label: t('support.user.Price'), - value: 'price' - }) - : list; - }, [feConfigs.show_pay, list, t]); - - return ( - <> - { - if (e === 'price') { - router.push(AI_POINT_USAGE_CARD_ROUTE); - return; - } - props.onchange?.(e); - }} - /> - - ); -}; - -export default SelectAiModel; diff --git a/projects/app/src/components/common/MyBox/index.tsx b/projects/app/src/components/common/MyBox/index.tsx index 6f296b30a67..fd46ea78819 100644 --- a/projects/app/src/components/common/MyBox/index.tsx +++ b/projects/app/src/components/common/MyBox/index.tsx @@ -10,8 +10,8 @@ type Props = BoxProps & { const MyBox = ({ text, isLoading, children, ...props }: Props) => { return ( - {children} {isLoading && } + {children} ); }; diff --git a/projects/app/src/components/common/ParentPaths/index.tsx b/projects/app/src/components/common/ParentPaths/index.tsx index 561ce270a81..b18d24ee49a 100644 --- a/projects/app/src/components/common/ParentPaths/index.tsx +++ b/projects/app/src/components/common/ParentPaths/index.tsx @@ -9,9 +9,16 @@ const ParentPaths = (props: { rootName?: string; FirstPathDom?: React.ReactNode; onClick: (parentId: string) => void; + fontSize?: string; }) => { const { t } = useTranslation(); - const { paths = [], rootName = t('common.folder.Root Path'), FirstPathDom, onClick } = props; + const { + paths = [], + rootName = t('common.folder.Root Path'), + FirstPathDom, + onClick, + fontSize + } = props; const concatPaths = useMemo( () => [ { @@ -30,7 +37,7 @@ const ParentPaths = (props: { {concatPaths.map((item, i) => ( void; + onSuccess: (e: SettingAIDataType) => void; + defaultData: SettingAIDataType; + llmModels?: LLMModelItemType[]; +}) => { + const { t } = useTranslation(); + const [refresh, setRefresh] = useState(false); + const { feConfigs, llmModelList } = useSystemStore(); + + const { handleSubmit, getValues, setValue, watch } = useForm({ + defaultValues: defaultData + }); + const model = watch('model'); + const showResponseAnswerText = watch(ModuleInputKeyEnum.aiChatIsResponseText) !== undefined; + const showMaxHistoriesSlider = watch('maxHistories') !== undefined; + const selectedModel = llmModelList.find((item) => item.model === model) || llmModelList[0]; + + const tokenLimit = useMemo(() => { + return llmModelList.find((item) => item.model === model)?.maxResponse || 4096; + }, [llmModelList, model]); + + const onChangeModel = (e: string) => { + setValue('model', e); + + // update max tokens + const modelData = llmModelList.find((item) => item.model === e); + if (modelData) { + setValue('maxToken', modelData.maxResponse / 2); + } + + setRefresh(!refresh); + }; + + const LabelStyles: BoxProps = { + display: 'flex', + alignItems: 'center', + fontSize: ['sm', 'md'], + width: ['80px', '90px'] + }; + + return ( + + {t('core.ai.AI settings')} + {feConfigs?.docUrl && ( + + {t('common.Read intro')} + + )} + + } + w={'500px'} + > + + + + {t('core.ai.Model')} + + + ({ + value: item.model, + label: item.name + }))} + onchange={onChangeModel} + /> + + + {feConfigs && ( + + + {t('core.ai.Ai point price')} + + + {t('support.wallet.Ai point every thousand tokens', { + points: selectedModel?.charsPointsPrice || 0 + })} + + + )} + + + {t('core.ai.Max context')} + + + {selectedModel?.maxContext || 4096}Tokens + + + + + {t('core.ai.Support tool')} + + + + {selectedModel?.usedInToolCall ? '支持' : '不支持'} + + + + + {t('core.app.Temperature')} + + + { + setValue(ModuleInputKeyEnum.aiChatTemperature, e); + setRefresh(!refresh); + }} + /> + + + + + {t('core.app.Max tokens')} + + + { + setValue(ModuleInputKeyEnum.aiChatMaxToken, val); + setRefresh(!refresh); + }} + /> + + + {showMaxHistoriesSlider && ( + + + {t('core.app.Max histories')} + + + { + setValue('maxHistories', e); + setRefresh(!refresh); + }} + /> + + + )} + {showResponseAnswerText && ( + + + {t('core.app.Ai response')} + + + + + + { + const value = e.target.checked; + setValue(ModuleInputKeyEnum.aiChatIsResponseText, value); + setRefresh((state) => !state); + }} + /> + + + )} + + + + + + + ); +}; + +export default AIChatSettingsModal; diff --git a/projects/app/src/components/core/ai/SettingLLMModel/index.tsx b/projects/app/src/components/core/ai/SettingLLMModel/index.tsx new file mode 100644 index 00000000000..e206752ca9b --- /dev/null +++ b/projects/app/src/components/core/ai/SettingLLMModel/index.tsx @@ -0,0 +1,83 @@ +import React, { useEffect } from 'react'; +import { useSystemStore } from '@/web/common/system/useSystemStore'; +import { LLMModelTypeEnum, llmModelTypeFilterMap } from '@fastgpt/global/core/ai/constants'; +import { Box, Button, useDisclosure } from '@chakra-ui/react'; +import { SettingAIDataType } from '@fastgpt/global/core/module/node/type'; +import AISettingModal from '@/components/core/ai/AISettingModal'; +import Avatar from '@/components/Avatar'; +import { HUGGING_FACE_ICON } from '@fastgpt/global/common/system/constants'; + +type Props = { + llmModelType?: `${LLMModelTypeEnum}`; + defaultData: SettingAIDataType; + onChange: (e: SettingAIDataType) => void; +}; + +const SettingLLMModel = ({ llmModelType = LLMModelTypeEnum.all, defaultData, onChange }: Props) => { + const { llmModelList } = useSystemStore(); + + const model = defaultData.model; + + const modelList = llmModelList.filter((model) => { + if (!llmModelType) return true; + const filterField = llmModelTypeFilterMap[llmModelType]; + if (!filterField) return true; + //@ts-ignore + return !!model[filterField]; + }); + + const selectedModel = modelList.find((item) => item.model === model) || modelList[0]; + + const { + isOpen: isOpenAIChatSetting, + onOpen: onOpenAIChatSetting, + onClose: onCloseAIChatSetting + } = useDisclosure(); + + useEffect(() => { + if (!model && modelList.length > 0) { + onChange({ + ...defaultData, + model: modelList[0].model + }); + } + }, [defaultData, model, modelList, onChange]); + + return ( + + + } + pl={4} + onClick={onOpenAIChatSetting} + > + {selectedModel?.name} + + {isOpenAIChatSetting && ( + { + onChange(e); + onCloseAIChatSetting(); + }} + defaultData={defaultData} + llmModels={modelList} + /> + )} + + ); +}; + +export default React.memo(SettingLLMModel); diff --git a/projects/app/src/components/core/dataset/SearchParamsTip.tsx b/projects/app/src/components/core/dataset/SearchParamsTip.tsx index 991031dd125..04c7eb225d5 100644 --- a/projects/app/src/components/core/dataset/SearchParamsTip.tsx +++ b/projects/app/src/components/core/dataset/SearchParamsTip.tsx @@ -50,7 +50,7 @@ const SearchParamsTip = ({
- + - + {limit} - + {hasSimilarityMode ? similarity : t('core.dataset.search.Nonsupport')} {hasReRankModel && ( - + {usingReRank ? '✅' : '❌'} )} - + {usingQueryExtension ? '✅' : '❌'} {hasEmptyResponseMode && {responseEmptyText !== '' ? '✅' : '❌'}} diff --git a/projects/app/src/components/core/dataset/SelectModal.tsx b/projects/app/src/components/core/dataset/SelectModal.tsx index ceb93676795..65e82956721 100644 --- a/projects/app/src/components/core/dataset/SelectModal.tsx +++ b/projects/app/src/components/core/dataset/SelectModal.tsx @@ -1,5 +1,5 @@ import { getDatasets, getDatasetPaths } from '@/web/core/dataset/api'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useQuery } from '@tanstack/react-query'; import React, { Dispatch, useMemo, useState } from 'react'; import { useTranslation } from 'next-i18next'; diff --git a/projects/app/src/components/core/module/AIChatSettingsModal.tsx b/projects/app/src/components/core/module/AIChatSettingsModal.tsx deleted file mode 100644 index 09183e9f214..00000000000 --- a/projects/app/src/components/core/module/AIChatSettingsModal.tsx +++ /dev/null @@ -1,293 +0,0 @@ -import React, { useMemo, useState } from 'react'; -import MyModal from '@/components/MyModal'; -import { useTranslation } from 'next-i18next'; -import { useForm } from 'react-hook-form'; -import { - Box, - BoxProps, - Button, - Flex, - Link, - ModalBody, - ModalFooter, - Switch -} from '@chakra-ui/react'; -import MyTooltip from '@/components/MyTooltip'; -import { QuestionOutlineIcon } from '@chakra-ui/icons'; -import { Prompt_QuotePromptList, Prompt_QuoteTemplateList } from '@/global/core/prompt/AIChat'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; -import MySlider from '@/components/Slider'; -import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; -import dynamic from 'next/dynamic'; -import { PromptTemplateItem } from '@fastgpt/global/core/ai/type.d'; -import type { AIChatModuleProps } from '@fastgpt/global/core/module/node/type.d'; -import type { AppSimpleEditConfigTemplateType } from '@fastgpt/global/core/app/type.d'; -import { SimpleModeTemplate_FastGPT_Universal } from '@/global/core/app/constants'; -import { getDocPath } from '@/web/common/system/doc'; -import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor'; -import { EditorVariablePickerType } from '@fastgpt/web/components/common/Textarea/PromptEditor/type'; - -const PromptTemplate = dynamic(() => import('@/components/PromptTemplate')); - -const AIChatSettingsModal = ({ - isAdEdit, - onClose, - onSuccess, - defaultData, - pickerMenu = [] -}: { - isAdEdit?: boolean; - onClose: () => void; - onSuccess: (e: AIChatModuleProps) => void; - defaultData: AIChatModuleProps; - pickerMenu?: EditorVariablePickerType[]; -}) => { - const { t } = useTranslation(); - const [refresh, setRefresh] = useState(false); - const { feConfigs, llmModelList } = useSystemStore(); - - const { handleSubmit, getValues, setValue, watch } = useForm({ - defaultValues: defaultData - }); - const aiChatQuoteTemplate = watch(ModuleInputKeyEnum.aiChatQuoteTemplate); - const aiChatQuotePrompt = watch(ModuleInputKeyEnum.aiChatQuotePrompt); - - const [selectTemplateData, setSelectTemplateData] = useState<{ - title: string; - templates: PromptTemplateItem[]; - }>(); - - const tokenLimit = useMemo(() => { - return ( - llmModelList.find((item) => item.model === getValues(ModuleInputKeyEnum.aiModel)) - ?.maxResponse || 4000 - ); - }, [getValues, llmModelList]); - - const quoteTemplateVariables = (() => [ - { - key: 'q', - label: 'q', - icon: 'core/app/simpleMode/variable' - }, - { - key: 'a', - label: 'a', - icon: 'core/app/simpleMode/variable' - }, - { - key: 'source', - label: t('core.dataset.search.Source name'), - icon: 'core/app/simpleMode/variable' - }, - { - key: 'sourceId', - label: t('core.dataset.search.Source id'), - icon: 'core/app/simpleMode/variable' - }, - { - key: 'index', - label: t('core.dataset.search.Quote index'), - icon: 'core/app/simpleMode/variable' - }, - ...pickerMenu - ])(); - const quotePromptVariables = (() => [ - { - key: 'quote', - label: t('core.app.Quote templates'), - icon: 'core/app/simpleMode/variable' - }, - { - key: 'question', - label: t('core.module.input.label.user question'), - icon: 'core/app/simpleMode/variable' - }, - ...pickerMenu - ])(); - - const LabelStyles: BoxProps = { - fontSize: ['sm', 'md'] - }; - const selectTemplateBtn: BoxProps = { - color: 'primary.500', - cursor: 'pointer' - }; - - return ( - - {t('common.More settings')} - {feConfigs?.docUrl && ( - - {t('common.Read intro')} - - )} - - } - isCentered - w={'700px'} - h={['90vh', 'auto']} - > - - {isAdEdit && ( - - - {t('core.app.Ai response')} - - - { - const value = e.target.checked; - setValue(ModuleInputKeyEnum.aiChatIsResponseText, value); - setRefresh((state) => !state); - }} - /> - - - )} - - - {t('core.app.Temperature')} - - - { - setValue(ModuleInputKeyEnum.aiChatTemperature, e); - setRefresh(!refresh); - }} - /> - - - - - {t('core.app.Max tokens')} - - - { - setValue(ModuleInputKeyEnum.aiChatMaxToken, val); - setRefresh(!refresh); - }} - /> - - - - - - {t('core.app.Quote templates')} - - - - - - setSelectTemplateData({ - title: t('core.app.Select quote template'), - templates: Prompt_QuoteTemplateList - }) - } - > - {t('common.Select template')} - - - - { - setValue(ModuleInputKeyEnum.aiChatQuoteTemplate, e); - // setRefresh(!refresh); - }} - /> - - - - {t('core.app.Quote prompt')} - - - - - { - setValue(ModuleInputKeyEnum.aiChatQuotePrompt, e); - }} - /> - - - - - - - {!!selectTemplateData && ( - setSelectTemplateData(undefined)} - onSuccess={(e) => { - const quoteVal = e.value; - const promptVal = Prompt_QuotePromptList.find((item) => item.title === e.title)?.value; - setValue(ModuleInputKeyEnum.aiChatQuoteTemplate, quoteVal); - setValue(ModuleInputKeyEnum.aiChatQuotePrompt, promptVal); - }} - /> - )} - - ); -}; - -export default AIChatSettingsModal; diff --git a/projects/app/src/components/core/module/DatasetParamsModal.tsx b/projects/app/src/components/core/module/DatasetParamsModal.tsx index a06122a3114..75edb45fc4e 100644 --- a/projects/app/src/components/core/module/DatasetParamsModal.tsx +++ b/projects/app/src/components/core/module/DatasetParamsModal.tsx @@ -15,7 +15,7 @@ import { useForm } from 'react-hook-form'; import { QuestionOutlineIcon } from '@chakra-ui/icons'; import MySlider from '@/components/Slider'; import MyTooltip from '@/components/MyTooltip'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants'; import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; @@ -28,7 +28,7 @@ import Tabs from '@/components/Tabs'; import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor'; import { useUserStore } from '@/web/support/user/useUserStore'; import { useToast } from '@fastgpt/web/hooks/useToast'; -import SelectAiModel from '@/components/Select/SelectAiModel'; +import SelectAiModel from '@/components/Select/AIModelSelector'; export type DatasetParamsProps = { searchMode: `${DatasetSearchModeEnum}`; @@ -40,7 +40,6 @@ export type DatasetParamsProps = { datasetSearchExtensionBg?: string; maxTokens?: number; // limit max tokens - searchEmptyText?: string; }; enum SearchSettingTabEnum { searchMode = 'searchMode', @@ -50,7 +49,6 @@ enum SearchSettingTabEnum { const DatasetParamsModal = ({ searchMode = DatasetSearchModeEnum.embedding, - searchEmptyText, limit, similarity, usingReRank, @@ -71,11 +69,10 @@ const DatasetParamsModal = ({ const { register, setValue, getValues, handleSubmit, watch } = useForm({ defaultValues: { - searchEmptyText, limit, similarity, searchMode, - usingReRank: !!usingReRank && !!teamPlanStatus?.standardConstants?.permissionReRank, + usingReRank: !!usingReRank && teamPlanStatus?.standardConstants?.permissionReRank !== false, datasetSearchUsingExtensionQuery, datasetSearchExtensionModel: datasetSearchExtensionModel ?? llmModelList[0]?.model, datasetSearchExtensionBg @@ -272,21 +269,6 @@ const DatasetParamsModal = ({
)} - {searchEmptyText !== undefined && ( - - - {t('core.dataset.search.Empty result response')} - - - - - - )} )} {currentTabType === SearchSettingTabEnum.queryExtension && ( diff --git a/projects/app/src/components/core/module/Flow/FlowProvider.tsx b/projects/app/src/components/core/module/Flow/FlowProvider.tsx index 271788081d1..b8e1b2e87ee 100644 --- a/projects/app/src/components/core/module/Flow/FlowProvider.tsx +++ b/projects/app/src/components/core/module/Flow/FlowProvider.tsx @@ -8,10 +8,7 @@ import { Connection, addEdge } from 'reactflow'; -import type { - FlowModuleItemType, - FlowModuleTemplateType -} from '@fastgpt/global/core/module/type.d'; +import type { FlowModuleItemType, FlowNodeTemplateType } from '@fastgpt/global/core/module/type.d'; import type { FlowNodeChangeProps, FlowNodeInputItemType @@ -64,7 +61,7 @@ export type useFlowProviderStoreType = { onDelNode: (nodeId: string) => void; onChangeNode: (e: FlowNodeChangeProps) => void; onCopyNode: (nodeId: string) => void; - onResetNode: (e: { id: string; module: FlowModuleTemplateType }) => void; + onResetNode: (e: { id: string; module: FlowNodeTemplateType }) => void; onDelEdge: (e: { moduleId: string; sourceHandle?: string | undefined; @@ -417,7 +414,7 @@ export const FlowProvider = ({ // reset a node data. delete edge and replace it const onResetNode = useCallback( - ({ id, module }: { id: string; module: FlowModuleTemplateType }) => { + ({ id, module }: { id: string; module: FlowNodeTemplateType }) => { setNodes((state) => state.map((node) => { if (node.id === id) { @@ -549,12 +546,6 @@ export const onResetNode = (e: Parameters { - eventBus.emit(EventNameEnum.requestFlowEvent, { - type: 'onDelNode', - data: nodeId - }); -}; export const onDelConnect = (e: Parameters[0]) => { eventBus.emit(EventNameEnum.requestFlowEvent, { type: 'onDelConnect', diff --git a/projects/app/src/components/core/module/Flow/ImportSettings.tsx b/projects/app/src/components/core/module/Flow/ImportSettings.tsx index ee13108e14e..58bae427e62 100644 --- a/projects/app/src/components/core/module/Flow/ImportSettings.tsx +++ b/projects/app/src/components/core/module/Flow/ImportSettings.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { Textarea, Button, ModalBody, ModalFooter } from '@chakra-ui/react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useFlowProviderStore } from './FlowProvider'; diff --git a/projects/app/src/components/core/module/Flow/ModuleTemplateList.tsx b/projects/app/src/components/core/module/Flow/ModuleTemplateList.tsx index 42a406533ef..540acf2cd35 100644 --- a/projects/app/src/components/core/module/Flow/ModuleTemplateList.tsx +++ b/projects/app/src/components/core/module/Flow/ModuleTemplateList.tsx @@ -1,13 +1,13 @@ -import React, { useCallback, useMemo } from 'react'; -import { Box, Flex } from '@chakra-ui/react'; +import React, { useCallback, useMemo, useState } from 'react'; +import { Box, Flex, IconButton, Input, InputGroup, InputLeftElement } from '@chakra-ui/react'; import type { - FlowModuleTemplateType, + FlowNodeTemplateType, moduleTemplateListType } from '@fastgpt/global/core/module/type.d'; import { useViewport, XYPosition } from 'reactflow'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import Avatar from '@/components/Avatar'; -import { getFlowStore, onSetNodes } from './FlowProvider'; +import { onSetNodes, useFlowProviderStore } from './FlowProvider'; import { customAlphabet } from 'nanoid'; import { appModule2FlowNode } from '@/utils/adapt'; import { useTranslation } from 'next-i18next'; @@ -18,22 +18,83 @@ import { getPreviewPluginModule } from '@/web/core/plugin/api'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { moduleTemplatesList } from '@fastgpt/global/core/module/template/constants'; +import RowTabs from '@fastgpt/web/components/common/Tabs/RowTabs'; +import { useWorkflowStore } from '@/web/core/workflow/store/workflow'; +import { useRequest } from '@/web/common/hooks/useRequest'; +import ParentPaths from '@/components/common/ParentPaths'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import { useRouter } from 'next/router'; +import { PluginTypeEnum } from '@fastgpt/global/core/plugin/constants'; +import { useQuery } from '@tanstack/react-query'; +import { debounce } from 'lodash'; -export type ModuleTemplateProps = { - templates: FlowModuleTemplateType[]; -}; - -type ModuleTemplateListProps = ModuleTemplateProps & { +type ModuleTemplateListProps = { isOpen: boolean; onClose: () => void; }; type RenderListProps = { - templates: FlowModuleTemplateType[]; + templates: FlowNodeTemplateType[]; onClose: () => void; + currentParent?: { parentId: string; parentName: string }; + setCurrentParent: (e: { parentId: string; parentName: string }) => void; }; -const ModuleTemplateList = ({ templates, isOpen, onClose }: ModuleTemplateListProps) => { +enum TemplateTypeEnum { + 'basic' = 'basic', + 'systemPlugin' = 'systemPlugin', + 'teamPlugin' = 'teamPlugin' +} + +const sliderWidth = 380; + +const ModuleTemplateList = ({ isOpen, onClose }: ModuleTemplateListProps) => { const { t } = useTranslation(); + const router = useRouter(); + const [currentParent, setCurrentParent] = useState(); + const [searchKey, setSearchKey] = useState(''); + + const { + basicNodeTemplates, + systemNodeTemplates, + loadSystemNodeTemplates, + teamPluginNodeTemplates, + loadTeamPluginNodeTemplates + } = useWorkflowStore(); + const [templateType, setTemplateType] = useState(TemplateTypeEnum.basic); + + const templates = useMemo(() => { + const map = { + [TemplateTypeEnum.basic]: basicNodeTemplates, + [TemplateTypeEnum.systemPlugin]: systemNodeTemplates, + [TemplateTypeEnum.teamPlugin]: teamPluginNodeTemplates.filter((item) => + searchKey ? item.pluginType !== PluginTypeEnum.folder : true + ) + }; + return map[templateType]; + }, [basicNodeTemplates, searchKey, systemNodeTemplates, teamPluginNodeTemplates, templateType]); + + const { mutate: onChangeTab } = useRequest({ + mutationFn: async (e: any) => { + const val = e as TemplateTypeEnum; + if (val === TemplateTypeEnum.systemPlugin) { + await loadSystemNodeTemplates(); + } else if (val === TemplateTypeEnum.teamPlugin) { + await loadTeamPluginNodeTemplates({ + parentId: currentParent?.parentId + }); + } + setTemplateType(val); + }, + errorToast: t('core.module.templates.Load plugin error') + }); + + useQuery(['teamNodeTemplate', currentParent?.parentId, searchKey], () => + loadTeamPluginNodeTemplates({ + parentId: currentParent?.parentId, + searchKey, + init: true + }) + ); return ( <> @@ -44,27 +105,108 @@ const ModuleTemplateList = ({ templates, isOpen, onClose }: ModuleTemplateListPr top={0} left={0} bottom={0} - w={'360px'} + w={`${sliderWidth}px`} onClick={onClose} /> - + + + + {/* close icon */} + } + w={'26px'} + h={'26px'} + borderColor={'myGray.300'} + variant={'grayBase'} + aria-label={''} + onClick={onClose} + /> + + {templateType === TemplateTypeEnum.teamPlugin && ( + + + + + + + + router.push('/plugin/list')} + > + 去创建 + + + + )} + {templateType === TemplateTypeEnum.teamPlugin && !searchKey && currentParent && ( + + { + setCurrentParent(undefined); + }} + fontSize="md" + /> + + )} + + ); @@ -72,12 +214,18 @@ const ModuleTemplateList = ({ templates, isOpen, onClose }: ModuleTemplateListPr export default React.memo(ModuleTemplateList); -const RenderList = React.memo(function RenderList({ templates, onClose }: RenderListProps) { +const RenderList = React.memo(function RenderList({ + templates, + onClose, + currentParent, + setCurrentParent +}: RenderListProps) { const { t } = useTranslation(); const { isPc } = useSystemStore(); const { x, y, zoom } = useViewport(); const { setLoading } = useSystemStore(); const { toast } = useToast(); + const { reactFlowWrapper, nodes } = useFlowProviderStore(); const formatTemplates = useMemo(() => { const copy: moduleTemplateListType = JSON.parse(JSON.stringify(moduleTemplatesList)); @@ -87,11 +235,11 @@ const RenderList = React.memo(function RenderList({ templates, onClose }: Render copy[index].list.push(item); }); return copy.filter((item) => item.list.length > 0); - }, [templates]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [templates, currentParent]); const onAddNode = useCallback( - async ({ template, position }: { template: FlowModuleTemplateType; position: XYPosition }) => { - const { reactFlowWrapper, nodes } = await getFlowStore(); + async ({ template, position }: { template: FlowNodeTemplateType; position: XYPosition }) => { if (!reactFlowWrapper?.current) return; const templateModule = await (async () => { @@ -131,34 +279,24 @@ const RenderList = React.memo(function RenderList({ templates, onClose }: Render ) ); }, - [setLoading, t, toast, x, y, zoom] + [nodes, reactFlowWrapper, setLoading, t, toast, x, y, zoom] ); return templates.length === 0 ? ( ) : ( - - + + {formatTemplates.map((item, i) => ( - - - {t(item.label)} - - {/* {isPlugin && item.type === ModuleTemplateTypeEnum.personalPlugin && ( - router.push('/plugin/list')} - > - - {t('plugin.To Edit Plugin')} - - - - )} */} - + {item.label && ( + + + {t(item.label)} + + + )} + <> {item.list.map((template) => ( { - if (e.clientX < 360) return; + if (e.clientX < sliderWidth) return; onAddNode({ template: template, position: { x: e.clientX, y: e.clientY } }); }} onClick={(e) => { - if (isPc) return; - onClose(); + if (template.pluginType === PluginTypeEnum.folder) { + return setCurrentParent({ + parentId: template.id, + parentName: template.name + }); + } + if (isPc) { + return onAddNode({ + template, + position: { x: sliderWidth * 1.5, y: 200 } + }); + } onAddNode({ template: template, position: { x: e.clientX, y: e.clientY } }); + onClose(); }} > - {formLabel} - + { const results = formatEditorVariablePickerIcon(variables); return results.map((item) => { @@ -114,17 +104,20 @@ const VariableEdit = ({ - } + iconSpacing={1} + size={'sm'} + mr={'-5px'} + fontSize={'md'} onClick={() => { resetEdit({ variable: addVariable() }); onOpenEdit(); }} > - {t('common.Add New')} -
+ {formatVariables.length > 0 && ( diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/ExtractFieldModal.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/ExtractFieldModal.tsx index 1a4868f7971..9733c23dc3e 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/ExtractFieldModal.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodeExtract/ExtractFieldModal.tsx @@ -11,7 +11,7 @@ import { } from '@chakra-ui/react'; import type { ContextExtractAgentItemType } from '@fastgpt/global/core/module/type'; import { useForm } from 'react-hook-form'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import MyTooltip from '@/components/MyTooltip'; import { QuestionOutlineIcon } from '@chakra-ui/icons'; diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/OpenApiImportModal.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/OpenApiImportModal.tsx index ec83f551d0c..0f62ac795b9 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/OpenApiImportModal.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/OpenApiImportModal.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { ModalBody, Button, ModalFooter, useDisclosure, Textarea, Box } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { onChangeNode } from '../../../FlowProvider'; diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/index.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/index.tsx index c5e03e79648..3893d7a5519 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/index.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodeHttp/index.tsx @@ -41,6 +41,47 @@ import MySelect from '@fastgpt/web/components/common/MySelect'; import RenderToolInput from '../../render/RenderToolInput'; const OpenApiImportModal = dynamic(() => import('./OpenApiImportModal')); +export const HttpHeaders = [ + { key: 'A-IM', label: 'A-IM' }, + { key: 'Accept', label: 'Accept' }, + { key: 'Accept-Charset', label: 'Accept-Charset' }, + { key: 'Accept-Encoding', label: 'Accept-Encoding' }, + { key: 'Accept-Language', label: 'Accept-Language' }, + { key: 'Accept-Datetime', label: 'Accept-Datetime' }, + { key: 'Access-Control-Request-Method', label: 'Access-Control-Request-Method' }, + { key: 'Access-Control-Request-Headers', label: 'Access-Control-Request-Headers' }, + { key: 'Authorization', label: 'Authorization' }, + { key: 'Cache-Control', label: 'Cache-Control' }, + { key: 'Connection', label: 'Connection' }, + { key: 'Content-Length', label: 'Content-Length' }, + { key: 'Content-Type', label: 'Content-Type' }, + { key: 'Cookie', label: 'Cookie' }, + { key: 'Date', label: 'Date' }, + { key: 'Expect', label: 'Expect' }, + { key: 'Forwarded', label: 'Forwarded' }, + { key: 'From', label: 'From' }, + { key: 'Host', label: 'Host' }, + { key: 'If-Match', label: 'If-Match' }, + { key: 'If-Modified-Since', label: 'If-Modified-Since' }, + { key: 'If-None-Match', label: 'If-None-Match' }, + { key: 'If-Range', label: 'If-Range' }, + { key: 'If-Unmodified-Since', label: 'If-Unmodified-Since' }, + { key: 'Max-Forwards', label: 'Max-Forwards' }, + { key: 'Origin', label: 'Origin' }, + { key: 'Pragma', label: 'Pragma' }, + { key: 'Proxy-Authorization', label: 'Proxy-Authorization' }, + { key: 'Range', label: 'Range' }, + { key: 'Referer', label: 'Referer' }, + { key: 'TE', label: 'TE' }, + { key: 'User-Agent', label: 'User-Agent' }, + { key: 'Upgrade', label: 'Upgrade' }, + { key: 'Via', label: 'Via' }, + { key: 'Warning', label: 'Warning' }, + { key: 'Dnt', label: 'Dnt' }, + { key: 'X-Requested-With', label: 'X-Requested-With' }, + { key: 'X-CSRF-Token', label: 'X-CSRF-Token' } +]; + enum TabEnum { params = 'params', headers = 'headers', @@ -342,47 +383,6 @@ const RenderForm = ({ const [shouldUpdateNode, setShouldUpdateNode] = useState(false); const leftVariables = useMemo(() => { - const HttpHeaders = [ - { key: 'A-IM', label: 'A-IM' }, - { key: 'Accept', label: 'Accept' }, - { key: 'Accept-Charset', label: 'Accept-Charset' }, - { key: 'Accept-Encoding', label: 'Accept-Encoding' }, - { key: 'Accept-Language', label: 'Accept-Language' }, - { key: 'Accept-Datetime', label: 'Accept-Datetime' }, - { key: 'Access-Control-Request-Method', label: 'Access-Control-Request-Method' }, - { key: 'Access-Control-Request-Headers', label: 'Access-Control-Request-Headers' }, - { key: 'Authorization', label: 'Authorization' }, - { key: 'Cache-Control', label: 'Cache-Control' }, - { key: 'Connection', label: 'Connection' }, - { key: 'Content-Length', label: 'Content-Length' }, - { key: 'Content-Type', label: 'Content-Type' }, - { key: 'Cookie', label: 'Cookie' }, - { key: 'Date', label: 'Date' }, - { key: 'Expect', label: 'Expect' }, - { key: 'Forwarded', label: 'Forwarded' }, - { key: 'From', label: 'From' }, - { key: 'Host', label: 'Host' }, - { key: 'If-Match', label: 'If-Match' }, - { key: 'If-Modified-Since', label: 'If-Modified-Since' }, - { key: 'If-None-Match', label: 'If-None-Match' }, - { key: 'If-Range', label: 'If-Range' }, - { key: 'If-Unmodified-Since', label: 'If-Unmodified-Since' }, - { key: 'Max-Forwards', label: 'Max-Forwards' }, - { key: 'Origin', label: 'Origin' }, - { key: 'Pragma', label: 'Pragma' }, - { key: 'Proxy-Authorization', label: 'Proxy-Authorization' }, - { key: 'Range', label: 'Range' }, - { key: 'Referer', label: 'Referer' }, - { key: 'TE', label: 'TE' }, - { key: 'User-Agent', label: 'User-Agent' }, - { key: 'Upgrade', label: 'Upgrade' }, - { key: 'Via', label: 'Via' }, - { key: 'Warning', label: 'Warning' }, - { key: 'Dnt', label: 'Dnt' }, - { key: 'X-Requested-With', label: 'X-Requested-With' }, - { key: 'X-CSRF-Token', label: 'X-CSRF-Token' } - ]; - return (tabType === TabEnum.headers ? HttpHeaders : variables).filter((variable) => { const existVariables = list.map((item) => item.key); return !existVariables.includes(variable.key); @@ -455,7 +455,7 @@ const RenderForm = ({ }; return ( - +
diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodePluginInput.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodePluginInput.tsx index c85c0f581f7..d9707f410d8 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodePluginInput.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodePluginInput.tsx @@ -62,44 +62,48 @@ const NodePluginInput = ({ data, selected }: NodeProps) => { position={'relative'} mb={7} > - - setEditField({ - inputType: item.type, - valueType: item.valueType, - key: item.key, - label: item.label, - description: item.description, - required: item.required, - isToolInput: !!item.toolDescription - }) - } - /> - { - onChangeNode({ - moduleId, - type: 'delInput', - key: item.key - }); - onChangeNode({ - moduleId, - type: 'delOutput', - key: item.key - }); - }} - /> + {item.edit && ( + <> + + setEditField({ + inputType: item.type, + valueType: item.valueType, + key: item.key, + label: item.label, + description: item.description, + required: item.required, + isToolInput: !!item.toolDescription + }) + } + /> + { + onChangeNode({ + moduleId, + type: 'delInput', + key: item.key + }); + onChangeNode({ + moduleId, + type: 'delOutput', + key: item.key + }); + }} + /> + + )} {item.description && ( diff --git a/projects/app/src/components/core/module/Flow/components/nodes/NodeSimple.tsx b/projects/app/src/components/core/module/Flow/components/nodes/NodeSimple.tsx index e0bda0989ee..41460d707a9 100644 --- a/projects/app/src/components/core/module/Flow/components/nodes/NodeSimple.tsx +++ b/projects/app/src/components/core/module/Flow/components/nodes/NodeSimple.tsx @@ -10,7 +10,12 @@ import RenderToolInput from '../render/RenderToolInput'; import { useTranslation } from 'next-i18next'; import { useFlowProviderStore } from '../../FlowProvider'; -const NodeSimple = ({ data, selected }: NodeProps) => { +const NodeSimple = ({ + data, + selected, + minW = '350px', + maxW +}: NodeProps & { minW?: string | number; maxW?: string | number }) => { const { t } = useTranslation(); const { splitToolInputs } = useFlowProviderStore(); const { moduleId, inputs, outputs } = data; @@ -22,7 +27,7 @@ const NodeSimple = ({ data, selected }: NodeProps) => { ); return ( - + {toolInputs.length > 0 && ( <> diff --git a/projects/app/src/components/core/module/Flow/components/render/FieldEditModal.tsx b/projects/app/src/components/core/module/Flow/components/render/FieldEditModal.tsx index 6018b59af78..ef2595fd11d 100644 --- a/projects/app/src/components/core/module/Flow/components/render/FieldEditModal.tsx +++ b/projects/app/src/components/core/module/Flow/components/render/FieldEditModal.tsx @@ -10,10 +10,10 @@ import { Textarea } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { DYNAMIC_INPUT_KEY, ModuleIOValueTypeEnum } from '@fastgpt/global/core/module/constants'; import { useTranslation } from 'next-i18next'; -import { FlowValueTypeMap } from '@/web/core/modules/constants/dataType'; +import { FlowValueTypeMap } from '@/web/core/workflow/constants/dataType'; import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum @@ -265,10 +265,6 @@ const FieldEditModal = ({ placeholder="appointment/sql" {...register('key', { required: true, - pattern: { - value: /^[a-zA-Z]+[0-9]*$/, - message: '字段key必须是纯英文字母或数字,并且不能以数字开头。' - }, onChange: (e) => { const value = e.target.value; // auto fill label diff --git a/projects/app/src/components/core/module/Flow/components/render/NodeCard.tsx b/projects/app/src/components/core/module/Flow/components/render/NodeCard.tsx index c6652a0441c..b2856ad3422 100644 --- a/projects/app/src/components/core/module/Flow/components/render/NodeCard.tsx +++ b/projects/app/src/components/core/module/Flow/components/render/NodeCard.tsx @@ -6,13 +6,7 @@ import type { FlowModuleItemType } from '@fastgpt/global/core/module/type.d'; import { useTranslation } from 'next-i18next'; import { useEditTitle } from '@/web/common/hooks/useEditTitle'; import { useToast } from '@fastgpt/web/hooks/useToast'; -import { - onChangeNode, - onCopyNode, - onResetNode, - onDelNode, - useFlowProviderStore -} from '../../FlowProvider'; +import { onChangeNode, onCopyNode, onResetNode, useFlowProviderStore } from '../../FlowProvider'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; import { useSystemStore } from '@/web/common/system/useSystemStore'; @@ -26,6 +20,7 @@ import { useEditTextarea } from '@fastgpt/web/hooks/useEditTextarea'; type Props = FlowModuleItemType & { children?: React.ReactNode | React.ReactNode[] | string; minW?: string | number; + maxW?: string | number; forbidMenu?: boolean; selected?: boolean; }; @@ -38,6 +33,7 @@ const NodeCard = (props: Props) => { name = t('core.module.template.UnKnow Module'), intro, minW = '300px', + maxW = '600px', moduleId, flowType, inputs, @@ -48,21 +44,25 @@ const NodeCard = (props: Props) => { const { toast } = useToast(); const { setLoading } = useSystemStore(); - const { nodes, splitToolInputs } = useFlowProviderStore(); + const { nodes, splitToolInputs, onDelNode } = useFlowProviderStore(); + // edit intro const { onOpenModal: onOpenIntroModal, EditModal: EditIntroModal } = useEditTextarea({ title: t('core.module.Edit intro'), tip: '调整该模块会对工具调用时机有影响。\n你可以通过精确的描述该模块功能,引导模型进行工具调用。', canEmpty: false }); - // custom title edit const { onOpenModal, EditModal: EditTitleModal } = useEditTitle({ title: t('common.Custom Title'), placeholder: t('app.module.Custom Title Tip') || '' }); - const { openConfirm, ConfirmModal } = useConfirm({ + const { openConfirm: onOpenConfirmSync, ConfirmModal: ConfirmSyncModal } = useConfirm({ content: t('module.Confirm Sync Plugin') }); + const { openConfirm: onOpenConfirmDeleteNode, ConfirmModal: ConfirmDeleteModal } = useConfirm({ + content: t('core.module.Confirm Delete Node'), + type: 'delete' + }); const showToolHandle = useMemo( () => isTool && !!nodes.find((item) => item.data?.flowType === FlowNodeTypeEnum.tools), @@ -86,7 +86,7 @@ const NodeCard = (props: Props) => { (item) => item.key === ModuleInputKeyEnum.pluginId )?.value; if (!pluginId) return; - openConfirm(async () => { + onOpenConfirmSync(async () => { try { setLoading(true); const pluginModule = await getPreviewPluginModule(pluginId); @@ -140,7 +140,7 @@ const NodeCard = (props: Props) => { icon: 'delete', label: t('common.Delete'), variant: 'whiteDanger', - onClick: () => onDelNode(moduleId) + onClick: onOpenConfirmDeleteNode(() => onDelNode(moduleId)) } ]; @@ -211,21 +211,23 @@ const NodeCard = (props: Props) => { ); }, [ - avatar, flowType, + t, + onOpenConfirmDeleteNode, + showToolHandle, + moduleId, + avatar, + name, forbidMenu, - inputs, intro, - moduleId, moduleIsTool, - name, - onOpenIntroModal, - onOpenModal, - openConfirm, + inputs, + onOpenConfirmSync, setLoading, - showToolHandle, - t, - toast + toast, + onOpenModal, + onDelNode, + onOpenIntroModal ]); const RenderModal = useMemo(() => { @@ -233,15 +235,16 @@ const NodeCard = (props: Props) => { <> {moduleIsTool && } - + + ); - }, [ConfirmModal, EditIntroModal, EditTitleModal, moduleIsTool]); + }, [ConfirmDeleteModal, ConfirmSyncModal, EditIntroModal, EditTitleModal, moduleIsTool]); return ( import('./templates/SelectApp')) }, { - types: [FlowNodeInputTypeEnum.aiSettings], - Component: dynamic(() => import('./templates/AiSetting')) + types: [FlowNodeInputTypeEnum.selectLLMModel], + Component: dynamic(() => import('./templates/SelectLLMModel')) }, { - types: [FlowNodeInputTypeEnum.selectLLMModel], - Component: dynamic(() => import('./templates/SelectAiModel')) + types: [FlowNodeInputTypeEnum.settingLLMModel], + Component: dynamic(() => import('./templates/SettingLLMModel')) }, { types: [FlowNodeInputTypeEnum.selectDataset], @@ -64,6 +64,10 @@ const RenderList: { { types: [FlowNodeInputTypeEnum.JSONEditor], Component: dynamic(() => import('./templates/JsonEditor')) + }, + { + types: [FlowNodeInputTypeEnum.settingDatasetQuotePrompt], + Component: dynamic(() => import('./templates/SettingQuotePrompt')) } ]; const UserChatInput = dynamic(() => import('./templates/UserChatInput')); diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/AiSetting.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/AiSetting.tsx deleted file mode 100644 index 17aa406c6a9..00000000000 --- a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/AiSetting.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, { useMemo } from 'react'; -import type { RenderInputProps } from '../type'; -import { onChangeNode } from '../../../../FlowProvider'; -import { useTranslation } from 'next-i18next'; -import { Button, useDisclosure } from '@chakra-ui/react'; -import { AIChatModuleProps } from '@fastgpt/global/core/module/node/type'; -import MyIcon from '@fastgpt/web/components/common/Icon'; -import AIChatSettingsModal from '@/components/core/module/AIChatSettingsModal'; - -const AiSettingRender = ({ inputs = [], moduleId }: RenderInputProps) => { - const { t } = useTranslation(); - const chatModulesData = useMemo(() => { - const obj: Record = {}; - inputs.forEach((item) => { - obj[item.key] = item.value; - }); - return obj as AIChatModuleProps; - }, [inputs]); - - const { - isOpen: isOpenAIChatSetting, - onOpen: onOpenAIChatSetting, - onClose: onCloseAIChatSetting - } = useDisclosure(); - - return ( - <> - - {isOpenAIChatSetting && ( - { - for (let key in e) { - const item = inputs.find((input) => input.key === key); - if (!item) continue; - onChangeNode({ - moduleId, - type: 'updateInput', - key, - value: { - ...item, - //@ts-ignore - value: e[key] - } - }); - } - onCloseAIChatSetting(); - }} - defaultData={chatModulesData} - /> - )} - - ); -}; - -export default React.memo(AiSettingRender); diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SelectAiModel.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SelectAiModel.tsx deleted file mode 100644 index 2d52f3475b7..00000000000 --- a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SelectAiModel.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, { useCallback, useEffect } from 'react'; -import type { RenderInputProps } from '../type'; -import { onChangeNode } from '../../../../FlowProvider'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; -import SelectAiModel from '@/components/Select/SelectAiModel'; -import { llmModelTypeFilterMap } from '@fastgpt/global/core/ai/constants'; - -const SelectAiModelRender = ({ item, inputs = [], moduleId }: RenderInputProps) => { - const { llmModelList } = useSystemStore(); - - const modelList = llmModelList - .filter((model) => { - if (!item.llmModelType) return true; - const filterField = llmModelTypeFilterMap[item.llmModelType]; - if (!filterField) return true; - //@ts-ignore - return !!model[filterField]; - }) - .map((item) => ({ - model: item.model, - name: item.name, - maxResponse: item.maxResponse - })); - - const onChangeModel = useCallback( - (e: string) => { - onChangeNode({ - moduleId, - type: 'updateInput', - key: item.key, - value: { - ...item, - value: e - } - }); - - // update max tokens - const model = modelList.find((item) => item.model === e) || modelList[0]; - if (!model) return; - - onChangeNode({ - moduleId, - type: 'updateInput', - key: 'maxToken', - value: { - ...inputs.find((input) => input.key === 'maxToken'), - markList: [ - { label: '100', value: 100 }, - { label: `${model.maxResponse}`, value: model.maxResponse } - ], - max: model.maxResponse, - value: model.maxResponse / 2 - } - }); - }, - [inputs, item, modelList, moduleId] - ); - - const list = modelList.map((item) => { - return { - value: item.model, - label: item.name - }; - }); - - useEffect(() => { - if (!item.value && list.length > 0) { - onChangeModel(list[0].value); - } - }, [item.value, list, onChangeModel]); - - return ( - - ); -}; - -export default React.memo(SelectAiModelRender); diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SelectLLMModel.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SelectLLMModel.tsx new file mode 100644 index 00000000000..3b08fea0a73 --- /dev/null +++ b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SelectLLMModel.tsx @@ -0,0 +1,54 @@ +import React, { useCallback, useEffect } from 'react'; +import type { RenderInputProps } from '../type'; +import { onChangeNode } from '../../../../FlowProvider'; +import { useSystemStore } from '@/web/common/system/useSystemStore'; +import { llmModelTypeFilterMap } from '@fastgpt/global/core/ai/constants'; +import AIModelSelector from '@/components/Select/AIModelSelector'; + +const SelectAiModelRender = ({ item, moduleId }: RenderInputProps) => { + const { llmModelList } = useSystemStore(); + + const modelList = llmModelList.filter((model) => { + if (!item.llmModelType) return true; + const filterField = llmModelTypeFilterMap[item.llmModelType]; + if (!filterField) return true; + //@ts-ignore + return !!model[filterField]; + }); + + const onChangeModel = useCallback( + (e: string) => { + onChangeNode({ + moduleId, + type: 'updateInput', + key: item.key, + value: { + ...item, + value: e + } + }); + }, + [item, moduleId] + ); + + useEffect(() => { + if (!item.value && modelList.length > 0) { + onChangeModel(modelList[0].model); + } + }, [item.value, modelList, onChangeModel]); + + return ( + ({ + value: item.model, + label: item.name + }))} + onchange={onChangeModel} + /> + ); +}; + +export default React.memo(SelectAiModelRender); diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SettingLLMModel.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SettingLLMModel.tsx new file mode 100644 index 00000000000..c77d5410b18 --- /dev/null +++ b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SettingLLMModel.tsx @@ -0,0 +1,49 @@ +import React, { useCallback } from 'react'; +import type { RenderInputProps } from '../type'; +import { onChangeNode } from '../../../../FlowProvider'; +import { SettingAIDataType } from '@fastgpt/global/core/module/node/type'; +import SettingLLMModel from '@/components/core/ai/SettingLLMModel'; +import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; + +const SelectAiModelRender = ({ item, inputs = [], moduleId }: RenderInputProps) => { + const onChangeModel = useCallback( + (e: SettingAIDataType) => { + for (const key in e) { + const input = inputs.find((input) => input.key === key); + input && + onChangeNode({ + moduleId, + type: 'updateInput', + key, + value: { + ...input, + // @ts-ignore + value: e[key] + } + }); + } + }, + [inputs, moduleId] + ); + + const llmModelData: SettingAIDataType = { + model: inputs.find((input) => input.key === ModuleInputKeyEnum.aiModel)?.value ?? '', + maxToken: + inputs.find((input) => input.key === ModuleInputKeyEnum.aiChatMaxToken)?.value ?? 2048, + temperature: + inputs.find((input) => input.key === ModuleInputKeyEnum.aiChatTemperature)?.value ?? 1, + isResponseAnswerText: inputs.find( + (input) => input.key === ModuleInputKeyEnum.aiChatIsResponseText + )?.value + }; + + return ( + + ); +}; + +export default React.memo(SelectAiModelRender); diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SettingQuotePrompt.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SettingQuotePrompt.tsx new file mode 100644 index 00000000000..8ee1c11a4a8 --- /dev/null +++ b/projects/app/src/components/core/module/Flow/components/render/RenderInput/templates/SettingQuotePrompt.tsx @@ -0,0 +1,243 @@ +import React, { useMemo, useState } from 'react'; +import type { RenderInputProps } from '../type'; +import { Box, BoxProps, Button, Flex, ModalFooter, useDisclosure } from '@chakra-ui/react'; +import { onChangeNode, useFlowProviderStore } from '../../../../FlowProvider'; +import MyModal from '@fastgpt/web/components/common/MyModal'; +import { useForm } from 'react-hook-form'; +import { PromptTemplateItem } from '@fastgpt/global/core/ai/type'; +import { useTranslation } from 'next-i18next'; +import { + formatEditorVariablePickerIcon, + getGuideModule, + splitGuideModule +} from '@fastgpt/global/core/module/utils'; +import { ModalBody } from '@chakra-ui/react'; +import MyTooltip from '@/components/MyTooltip'; +import { + Prompt_QuotePromptList, + Prompt_QuoteTemplateList +} from '@fastgpt/global/core/ai/prompt/AIChat'; +import { QuestionOutlineIcon } from '@chakra-ui/icons'; +import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor'; +import PromptTemplate from '@/components/PromptTemplate'; +import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; + +const SettingQuotePrompt = ({ inputs = [], moduleId }: RenderInputProps) => { + const { t } = useTranslation(); + const { isOpen, onOpen, onClose } = useDisclosure(); + const { nodes } = useFlowProviderStore(); + const { watch, setValue, handleSubmit } = useForm({ + defaultValues: { + quoteTemplate: inputs.find((input) => input.key === 'quoteTemplate')?.value || '', + quotePrompt: inputs.find((input) => input.key === 'quotePrompt')?.value || '' + } + }); + const aiChatQuoteTemplate = watch('quoteTemplate'); + const aiChatQuotePrompt = watch('quotePrompt'); + + const variables = useMemo(() => { + const globalVariables = formatEditorVariablePickerIcon( + splitGuideModule(getGuideModule(nodes.map((node) => node.data)))?.variableModules || [] + ); + const moduleVariables = formatEditorVariablePickerIcon( + inputs + .filter((input) => input.edit) + .map((item) => ({ + key: item.key, + label: item.label + })) + ); + const systemVariables = [ + { + key: 'cTime', + label: t('core.module.http.Current time') + } + ]; + + return [...globalVariables, ...moduleVariables, ...systemVariables]; + }, [inputs, t]); + const [selectTemplateData, setSelectTemplateData] = useState<{ + title: string; + templates: PromptTemplateItem[]; + }>(); + const quoteTemplateVariables = (() => [ + { + key: 'q', + label: 'q', + icon: 'core/app/simpleMode/variable' + }, + { + key: 'a', + label: 'a', + icon: 'core/app/simpleMode/variable' + }, + { + key: 'source', + label: t('core.dataset.search.Source name'), + icon: 'core/app/simpleMode/variable' + }, + { + key: 'sourceId', + label: t('core.dataset.search.Source id'), + icon: 'core/app/simpleMode/variable' + }, + { + key: 'index', + label: t('core.dataset.search.Quote index'), + icon: 'core/app/simpleMode/variable' + }, + ...variables + ])(); + const quotePromptVariables = (() => [ + { + key: 'quote', + label: t('core.app.Quote templates'), + icon: 'core/app/simpleMode/variable' + }, + { + key: 'question', + label: t('core.module.input.label.user question'), + icon: 'core/app/simpleMode/variable' + }, + ...variables + ])(); + + const LabelStyles: BoxProps = { + fontSize: ['sm', 'md'] + }; + const selectTemplateBtn: BoxProps = { + color: 'primary.500', + cursor: 'pointer' + }; + + const onSubmit = (data: { quoteTemplate: string; quotePrompt: string }) => { + const quoteTemplateInput = inputs.find( + (input) => input.key === ModuleInputKeyEnum.aiChatQuoteTemplate + ); + const quotePromptInput = inputs.find( + (input) => input.key === ModuleInputKeyEnum.aiChatQuotePrompt + ); + if (quoteTemplateInput) { + onChangeNode({ + moduleId, + type: 'updateInput', + key: quoteTemplateInput.key, + value: { + ...quoteTemplateInput, + value: data.quoteTemplate + } + }); + } + if (quotePromptInput) { + onChangeNode({ + moduleId, + type: 'updateInput', + key: quotePromptInput.key, + value: { + ...quotePromptInput, + value: data.quotePrompt + } + }); + } + onClose(); + }; + + return ( + <> + + + + + + {t('core.app.Quote templates')} + + + + + + setSelectTemplateData({ + title: t('core.app.Select quote template'), + templates: Prompt_QuoteTemplateList + }) + } + > + {t('common.Select template')} + + + + { + setValue('quoteTemplate', e); + }} + /> + + + + {t('core.app.Quote prompt')} + + + + + { + setValue('quotePrompt', e); + }} + /> + + + + + + + + {!!selectTemplateData && ( + setSelectTemplateData(undefined)} + onSuccess={(e) => { + const quoteVal = e.value; + const promptVal = Prompt_QuotePromptList.find((item) => item.title === e.title)?.value; + setValue('quoteTemplate', quoteVal); + setValue('quotePrompt', promptVal); + }} + /> + )} + + ); +}; + +export default React.memo(SettingQuotePrompt); diff --git a/projects/app/src/components/core/module/Flow/components/render/RenderToolInput/EditFieldModal.tsx b/projects/app/src/components/core/module/Flow/components/render/RenderToolInput/EditFieldModal.tsx index a8fdbc09c74..4042e2ae0a3 100644 --- a/projects/app/src/components/core/module/Flow/components/render/RenderToolInput/EditFieldModal.tsx +++ b/projects/app/src/components/core/module/Flow/components/render/RenderToolInput/EditFieldModal.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useRef } from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import type { EditFieldModalProps } from './type.d'; import { useTranslation } from 'next-i18next'; import { diff --git a/projects/app/src/components/core/module/Flow/components/render/SourceHandle.tsx b/projects/app/src/components/core/module/Flow/components/render/SourceHandle.tsx index 89cee29dc2f..af0f96e5ab2 100644 --- a/projects/app/src/components/core/module/Flow/components/render/SourceHandle.tsx +++ b/projects/app/src/components/core/module/Flow/components/render/SourceHandle.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; import { Box, BoxProps } from '@chakra-ui/react'; import { Handle, Position } from 'reactflow'; -import { FlowValueTypeMap } from '@/web/core/modules/constants/dataType'; +import { FlowValueTypeMap } from '@/web/core/workflow/constants/dataType'; import MyTooltip from '@/components/MyTooltip'; import { useTranslation } from 'next-i18next'; import { ModuleIOValueTypeEnum } from '@fastgpt/global/core/module/constants'; diff --git a/projects/app/src/components/core/module/Flow/components/render/TargetHandle.tsx b/projects/app/src/components/core/module/Flow/components/render/TargetHandle.tsx index 7985cd0a303..70da91a145d 100644 --- a/projects/app/src/components/core/module/Flow/components/render/TargetHandle.tsx +++ b/projects/app/src/components/core/module/Flow/components/render/TargetHandle.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; import { Box, BoxProps } from '@chakra-ui/react'; import { Handle, OnConnect, Position } from 'reactflow'; -import { FlowValueTypeMap } from '@/web/core/modules/constants/dataType'; +import { FlowValueTypeMap } from '@/web/core/workflow/constants/dataType'; import MyTooltip from '@/components/MyTooltip'; import { useTranslation } from 'next-i18next'; import { ModuleIOValueTypeEnum } from '@fastgpt/global/core/module/constants'; diff --git a/projects/app/src/components/core/module/Flow/components/render/ToolHandle.tsx b/projects/app/src/components/core/module/Flow/components/render/ToolHandle.tsx index 087723e93b6..1119889d124 100644 --- a/projects/app/src/components/core/module/Flow/components/render/ToolHandle.tsx +++ b/projects/app/src/components/core/module/Flow/components/render/ToolHandle.tsx @@ -1,5 +1,5 @@ import MyTooltip from '@/components/MyTooltip'; -import { FlowValueTypeMap } from '@/web/core/modules/constants/dataType'; +import { FlowValueTypeMap } from '@/web/core/workflow/constants/dataType'; import { Box, BoxProps } from '@chakra-ui/react'; import { ModuleIOValueTypeEnum, diff --git a/projects/app/src/components/core/module/Flow/index.tsx b/projects/app/src/components/core/module/Flow/index.tsx index 5a8862c2cf5..66ccc28716f 100644 --- a/projects/app/src/components/core/module/Flow/index.tsx +++ b/projects/app/src/components/core/module/Flow/index.tsx @@ -1,5 +1,11 @@ import React, { useCallback, useMemo } from 'react'; -import ReactFlow, { Background, Connection, Controls, ReactFlowProvider } from 'reactflow'; +import ReactFlow, { + Background, + Connection, + Controls, + NodeProps, + ReactFlowProvider +} from 'reactflow'; import { Box, Flex, IconButton, useDisclosure } from '@chakra-ui/react'; import { SmallCloseIcon } from '@chakra-ui/icons'; import { EDGE_TYPE, FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; @@ -7,12 +13,13 @@ import { EDGE_TYPE, FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/co import dynamic from 'next/dynamic'; import ButtonEdge from './components/modules/ButtonEdge'; -import ModuleTemplateList, { type ModuleTemplateProps } from './ModuleTemplateList'; +import ModuleTemplateList from './ModuleTemplateList'; import { useFlowProviderStore } from './FlowProvider'; import 'reactflow/dist/style.css'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useTranslation } from 'next-i18next'; +import { FlowModuleItemType } from '@fastgpt/global/core/module/type'; const NodeSimple = dynamic(() => import('./components/nodes/NodeSimple')); const nodeTypes: Record<`${FlowNodeTypeEnum}`, any> = { @@ -34,7 +41,10 @@ const nodeTypes: Record<`${FlowNodeTypeEnum}`, any> = { [FlowNodeTypeEnum.pluginOutput]: dynamic(() => import('./components/nodes/NodePluginOutput')), [FlowNodeTypeEnum.pluginModule]: NodeSimple, [FlowNodeTypeEnum.queryExtension]: NodeSimple, - [FlowNodeTypeEnum.tools]: dynamic(() => import('./components/nodes/NodeTools')) + [FlowNodeTypeEnum.tools]: dynamic(() => import('./components/nodes/NodeTools')), + [FlowNodeTypeEnum.stopTool]: (data: NodeProps) => ( + + ) }; const edgeTypes = { [EDGE_TYPE]: ButtonEdge @@ -99,11 +109,7 @@ const Container = React.memo(function Container() { ); }); -const Flow = ({ - Header, - templates, - ...data -}: ModuleTemplateProps & { Header: React.ReactNode }) => { +const Flow = ({ Header, ...data }: { Header: React.ReactNode }) => { const { isOpen: isOpenTemplate, onOpen: onOpenTemplate, @@ -143,14 +149,10 @@ const Flow = ({ - + ); - }, [data, isOpenTemplate, onCloseTemplate, onOpenTemplate, templates]); + }, [data, isOpenTemplate, onCloseTemplate, onOpenTemplate]); return ( diff --git a/projects/app/src/components/support/apikey/Table.tsx b/projects/app/src/components/support/apikey/Table.tsx index b8820d820ee..7632b24dfa8 100644 --- a/projects/app/src/components/support/apikey/Table.tsx +++ b/projects/app/src/components/support/apikey/Table.tsx @@ -35,7 +35,7 @@ import { useCopyData } from '@/web/common/hooks/useCopyData'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useTranslation } from 'next-i18next'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useForm } from 'react-hook-form'; import { useRequest } from '@/web/common/hooks/useRequest'; import MyTooltip from '@/components/MyTooltip'; diff --git a/projects/app/src/components/support/permission/IconText/index.tsx b/projects/app/src/components/support/permission/IconText/index.tsx index 7dfde2572dd..8659aeab398 100644 --- a/projects/app/src/components/support/permission/IconText/index.tsx +++ b/projects/app/src/components/support/permission/IconText/index.tsx @@ -12,7 +12,9 @@ const PermissionIconText = ({ return PermissionTypeMap[permission] ? ( - {t(PermissionTypeMap[permission]?.label)} + + {t(PermissionTypeMap[permission]?.label)} + ) : null; }; diff --git a/projects/app/src/components/support/user/team/TeamManageModal/EditModal.tsx b/projects/app/src/components/support/user/team/TeamManageModal/EditModal.tsx index 1df7db1a9dd..40ef454f519 100644 --- a/projects/app/src/components/support/user/team/TeamManageModal/EditModal.tsx +++ b/projects/app/src/components/support/user/team/TeamManageModal/EditModal.tsx @@ -6,7 +6,7 @@ import { compressImgFileAndUpload } from '@/web/common/file/controller'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useRequest } from '@/web/common/hooks/useRequest'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { Box, Button, Flex, Input, ModalBody, ModalFooter } from '@chakra-ui/react'; import MyTooltip from '@/components/MyTooltip'; import Avatar from '@/components/Avatar'; diff --git a/projects/app/src/components/support/user/team/TeamManageModal/InviteModal.tsx b/projects/app/src/components/support/user/team/TeamManageModal/InviteModal.tsx index 536fcc2ef87..d2de2226633 100644 --- a/projects/app/src/components/support/user/team/TeamManageModal/InviteModal.tsx +++ b/projects/app/src/components/support/user/team/TeamManageModal/InviteModal.tsx @@ -1,5 +1,5 @@ import React, { useMemo, useState } from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { ModalCloseButton, ModalBody, Box, ModalFooter, Button } from '@chakra-ui/react'; import TagTextarea from '@/components/common/Textarea/TagTextarea'; diff --git a/projects/app/src/components/support/user/team/TeamManageModal/index.tsx b/projects/app/src/components/support/user/team/TeamManageModal/index.tsx index d4b542044f1..1e468eff0da 100644 --- a/projects/app/src/components/support/user/team/TeamManageModal/index.tsx +++ b/projects/app/src/components/support/user/team/TeamManageModal/index.tsx @@ -1,5 +1,5 @@ import React, { useMemo, useState } from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useQuery } from '@tanstack/react-query'; import { DragHandleIcon } from '@chakra-ui/icons'; @@ -194,7 +194,6 @@ const TeamManageModal = ({ onClose }: { onClose: () => void }) => { bg: 'myGray.100' } })} - onClick={() => onSwitchTeam(team.teamId)} > { + const { t } = useTranslation(); + const router = useRouter(); + const { setIsNotSufficientModal } = useSystemStore(); + + const onClose = () => setIsNotSufficientModal(false); + + return ( + + {t('support.wallet.Not sufficient')} + + + + + + ); +}; + +export default NotSufficientModal; diff --git a/projects/app/src/components/support/wallet/QRCodePayModal.tsx b/projects/app/src/components/support/wallet/QRCodePayModal.tsx index 52147915449..8aaa777ff1e 100644 --- a/projects/app/src/components/support/wallet/QRCodePayModal.tsx +++ b/projects/app/src/components/support/wallet/QRCodePayModal.tsx @@ -1,4 +1,4 @@ -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import React, { useEffect } from 'react'; import { useTranslation } from 'next-i18next'; import { Box, ModalBody, ModalFooter } from '@chakra-ui/react'; diff --git a/projects/app/src/components/support/wallet/StandardPlanContentList.tsx b/projects/app/src/components/support/wallet/StandardPlanContentList.tsx index 6a5eda48769..1614dd9ac33 100644 --- a/projects/app/src/components/support/wallet/StandardPlanContentList.tsx +++ b/projects/app/src/components/support/wallet/StandardPlanContentList.tsx @@ -5,6 +5,10 @@ import { standardSubLevelMap } from '@fastgpt/global/support/wallet/sub/constant import { Box, Flex, Grid } from '@chakra-ui/react'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useTranslation } from 'next-i18next'; +import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; +import { QuestionOutlineIcon } from '@chakra-ui/icons'; +import { useRouter } from 'next/router'; +import { AI_POINT_USAGE_CARD_ROUTE } from '@/web/support/wallet/sub/constants'; const StandardPlanContentList = ({ level, @@ -15,6 +19,7 @@ const StandardPlanContentList = ({ }) => { const { t } = useTranslation(); const { subPlans } = useSystemStore(); + const router = useRouter(); const planContent = useMemo(() => { const plan = subPlans?.standard?.[level]; @@ -87,6 +92,14 @@ const StandardPlanContentList = ({ amount: planContent.totalPoints })} + + { + router.push(AI_POINT_USAGE_CARD_ROUTE); + }} + /> + diff --git a/projects/app/src/constants/app.ts b/projects/app/src/constants/app.ts index de53fbab3d9..0d4c5963fd9 100644 --- a/projects/app/src/constants/app.ts +++ b/projects/app/src/constants/app.ts @@ -6,7 +6,6 @@ export const defaultApp: AppDetailType = { userId: 'userId', name: '应用加载中', type: 'simple', - simpleTemplateId: 'fastgpt-universal', avatar: '/icon/logo.svg', intro: '', updateTime: Date.now(), diff --git a/projects/app/src/global/common/api/systemRes.d.ts b/projects/app/src/global/common/api/systemRes.d.ts index 1262e3dadea..8ddf3369766 100644 --- a/projects/app/src/global/common/api/systemRes.d.ts +++ b/projects/app/src/global/common/api/systemRes.d.ts @@ -7,7 +7,6 @@ import type { } from '@fastgpt/global/core/ai/model.d'; import type { FastGPTFeConfigsType } from '@fastgpt/global/common/system/types/index.d'; -import { AppSimpleEditConfigTemplateType } from '@fastgpt/global/core/app/type'; import { SubPlanType } from '@fastgpt/global/support/wallet/sub/type'; export type InitDateResponse = { @@ -19,5 +18,4 @@ export type InitDateResponse = { feConfigs: FastGPTFeConfigsType; subPlans?: SubPlanType; systemVersion: string; - simpleModeTemplates: AppSimpleEditConfigTemplateType[]; }; diff --git a/projects/app/src/global/core/app/constants.ts b/projects/app/src/global/core/app/constants.ts deleted file mode 100644 index a397ff99233..00000000000 --- a/projects/app/src/global/core/app/constants.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AppSimpleEditConfigTemplateType } from '@fastgpt/global/core/app/type.d'; -import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants'; - -export const SimpleModeTemplate_FastGPT_Universal: AppSimpleEditConfigTemplateType = { - id: 'fastgpt-universal', - name: 'core.app.template.Common template', - desc: 'core.app.template.Common template tip', - systemForm: { - aiSettings: { - model: true, - systemPrompt: true, - temperature: true, - maxToken: true, - quoteTemplate: true, - quotePrompt: true - }, - dataset: { - datasets: true, - similarity: true, - limit: true, - searchMode: DatasetSearchModeEnum.embedding, - usingReRank: true, - searchEmptyText: true - }, - userGuide: { - welcomeText: true, - variables: true, - questionGuide: true, - tts: true - } - } -}; diff --git a/projects/app/src/global/core/dataset/api.d.ts b/projects/app/src/global/core/dataset/api.d.ts index 53a42244098..314a4fe77e8 100644 --- a/projects/app/src/global/core/dataset/api.d.ts +++ b/projects/app/src/global/core/dataset/api.d.ts @@ -19,7 +19,6 @@ export type CreateDatasetParams = { avatar: string; vectorModel?: string; agentModel?: string; - type: `${DatasetTypeEnum}`; }; /* ================= collection ===================== */ diff --git a/projects/app/src/pages/account/components/BillTable.tsx b/projects/app/src/pages/account/components/BillTable.tsx index ad394837ac7..a8bfd5ec5d2 100644 --- a/projects/app/src/pages/account/components/BillTable.tsx +++ b/projects/app/src/pages/account/components/BillTable.tsx @@ -30,7 +30,7 @@ import MyBox from '@/components/common/MyBox'; import { useRequest } from '@/web/common/hooks/useRequest'; import { standardSubLevelMap, subModeMap } from '@fastgpt/global/support/wallet/sub/constants'; import MySelect from '@fastgpt/web/components/common/MySelect'; -import MyModal from '@fastgpt/web/components/common/CustomModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; const BillTable = () => { diff --git a/projects/app/src/pages/account/components/Info.tsx b/projects/app/src/pages/account/components/Info.tsx index 646977b52f2..659b9e50d04 100644 --- a/projects/app/src/pages/account/components/Info.tsx +++ b/projects/app/src/pages/account/components/Info.tsx @@ -16,6 +16,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast'; import { useUserStore } from '@/web/support/user/useUserStore'; import type { UserType } from '@fastgpt/global/support/user/type.d'; import { useQuery } from '@tanstack/react-query'; +import { QuestionOutlineIcon } from '@chakra-ui/icons'; import dynamic from 'next/dynamic'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { compressImgFileAndUpload } from '@/web/common/file/controller'; @@ -29,16 +30,24 @@ import { formatStorePrice2Read } from '@fastgpt/global/support/wallet/usage/tool import { putUpdateMemberName } from '@/web/support/user/team/api'; import { getDocPath } from '@/web/common/system/doc'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; -import { standardSubLevelMap } from '@fastgpt/global/support/wallet/sub/constants'; +import { + StandardSubLevelEnum, + standardSubLevelMap +} from '@fastgpt/global/support/wallet/sub/constants'; import { formatTime2YMD } from '@fastgpt/global/common/string/time'; -import { AI_POINT_USAGE_CARD_ROUTE } from '@/web/support/wallet/sub/constants'; +import { + AI_POINT_USAGE_CARD_ROUTE, + EXTRA_PLAN_CARD_ROUTE +} from '@/web/support/wallet/sub/constants'; import StandardPlanContentList from '@/components/support/wallet/StandardPlanContentList'; + const StandDetailModal = dynamic(() => import('./standardDetailModal')); const TeamMenu = dynamic(() => import('@/components/support/user/team/TeamMenu')); const PayModal = dynamic(() => import('./PayModal')); const UpdatePswModal = dynamic(() => import('./UpdatePswModal')); const OpenAIAccountModal = dynamic(() => import('./OpenAIAccountModal')); +const CommunityModal = dynamic(() => import('@/components/CommunityModal')); const Account = () => { const { isPc } = useSystemStore(); @@ -113,11 +122,11 @@ const MyInfo = () => { }); reset(data); toast({ - title: '更新数据成功', + title: t('dataset.data.Update Success Tip'), status: 'success' }); }, - [reset, toast, updateUserInfo] + [reset, t, toast, updateUserInfo] ); const onSelectFile = useCallback( @@ -184,7 +193,7 @@ const MyInfo = () => { cursor={'pointer'} onClick={onOpenSelectFile} > - + { ); }; const PlanUsage = () => { - const { isPc } = useSystemStore(); const router = useRouter(); const { t } = useTranslation(); const { userInfo, initUserInfo, teamPlanStatus } = useUserStore(); @@ -288,6 +296,21 @@ const PlanUsage = () => { return standardSubLevelMap[teamPlanStatus.standard.currentSubLevel].label; }, [teamPlanStatus?.standard?.currentSubLevel]); const standardPlan = teamPlanStatus?.standard; + const isFreeTeam = useMemo(() => { + if (!teamPlanStatus || !teamPlanStatus?.standardConstants) return false; + const hasExtraDatasetSize = + teamPlanStatus.datasetMaxSize > teamPlanStatus.standardConstants.maxDatasetSize; + const hasExtraPoints = + teamPlanStatus.totalPoints > teamPlanStatus.standardConstants.totalPoints; + if ( + teamPlanStatus?.standard?.currentSubLevel === StandardSubLevelEnum.free && + !hasExtraDatasetSize && + !hasExtraPoints + ) { + return true; + } + return false; + }, [teamPlanStatus]); useQuery(['init'], initUserInfo, { onSuccess(res) { @@ -374,6 +397,11 @@ const PlanUsage = () => { {t(planName)} + {isFreeTeam && ( + + 免费版用户15天无任何使用记录时,系统会自动清理账号知识库。 + + )} {t('common.Expired Time')}: {formatTime2YMD(standardPlan?.expiredTime)} @@ -399,9 +427,29 @@ const PlanUsage = () => { borderColor={'borderColor.low'} borderRadius={'md'} px={[5, 10]} - py={[4, 7]} + pt={[2, 4]} + pb={[4, 7]} > - + + + 资源用量 + + (包含标准套餐与额外资源包) + + + + 购买额外套餐 + + + + {t('support.user.team.Dataset usage')} @@ -426,7 +474,10 @@ const PlanUsage = () => { - {t('support.wallet.subscription.AI points')} + {t('support.wallet.subscription.AI points usage')} + + + {aiPointsUsageMap.used}/{aiPointsUsageMap.max} @@ -445,7 +496,6 @@ const PlanUsage = () => { /> - {isOpenStandardModal && } @@ -462,6 +512,7 @@ const Other = () => { }); const { isOpen: isOpenOpenai, onClose: onCloseOpenai, onOpen: onOpenOpenai } = useDisclosure(); + const { isOpen: isOpenConcat, onClose: onCloseConcat, onOpen: onOpenConcat } = useDisclosure(); const onclickSave = useCallback( async (data: UserType) => { @@ -552,6 +603,17 @@ const Other = () => { /> )} + {feConfigs?.concatMd && ( + + )} {isOpenOpenai && userInfo && ( @@ -566,6 +628,7 @@ const Other = () => { onClose={onCloseOpenai} /> )} + {isOpenConcat && } ); }; diff --git a/projects/app/src/pages/account/components/OpenAIAccountModal.tsx b/projects/app/src/pages/account/components/OpenAIAccountModal.tsx index 81d22f85d36..10b8e1dea0d 100644 --- a/projects/app/src/pages/account/components/OpenAIAccountModal.tsx +++ b/projects/app/src/pages/account/components/OpenAIAccountModal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ModalBody, Box, Flex, Input, ModalFooter, Button } from '@chakra-ui/react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useForm } from 'react-hook-form'; import { useRequest } from '@/web/common/hooks/useRequest'; diff --git a/projects/app/src/pages/account/components/PayModal.tsx b/projects/app/src/pages/account/components/PayModal.tsx index b61e3211cc8..fe4e754d901 100644 --- a/projects/app/src/pages/account/components/PayModal.tsx +++ b/projects/app/src/pages/account/components/PayModal.tsx @@ -1,15 +1,16 @@ import React, { useState, useCallback, useMemo } from 'react'; -import { ModalFooter, ModalBody, Button, Input, Box, Grid } from '@chakra-ui/react'; +import { ModalFooter, ModalBody, Button, Input, Box, Grid, Link } from '@chakra-ui/react'; import { getWxPayQRCode } from '@/web/support/wallet/bill/api'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useRouter } from 'next/router'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useTranslation } from 'next-i18next'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { BillTypeEnum } from '@fastgpt/global/support/wallet/bill/constants'; import QRCodePayModal, { type QRPayProps } from '@/components/support/wallet/QRCodePayModal'; import { useSystemStore } from '@/web/common/system/useSystemStore'; +import { EXTRA_PLAN_CARD_ROUTE } from '@/web/support/wallet/sub/constants'; const PayModal = ({ onClose, @@ -59,8 +60,12 @@ const PayModal = ({ return ( - - 该余额仅用于自动续费标准套餐。如需购买额外套餐,可直接下单,无需充值余额。 + + 该余额仅用于自动续费标准套餐。如需购买额外套餐,可 + + 直接下单 + + ,无需充值余额。 {payList.map((item) => ( diff --git a/projects/app/src/pages/account/components/UpdatePswModal.tsx b/projects/app/src/pages/account/components/UpdatePswModal.tsx index 1c6a915c7e1..5decc22ea2e 100644 --- a/projects/app/src/pages/account/components/UpdatePswModal.tsx +++ b/projects/app/src/pages/account/components/UpdatePswModal.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ModalBody, Box, Flex, Input, ModalFooter, Button } from '@chakra-ui/react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useForm } from 'react-hook-form'; import { useRequest } from '@/web/common/hooks/useRequest'; diff --git a/projects/app/src/pages/account/components/UsageDetail.tsx b/projects/app/src/pages/account/components/UsageDetail.tsx index 3482f5df728..2acb1172024 100644 --- a/projects/app/src/pages/account/components/UsageDetail.tsx +++ b/projects/app/src/pages/account/components/UsageDetail.tsx @@ -14,7 +14,7 @@ import { import { UsageItemType } from '@fastgpt/global/support/wallet/usage/type.d'; import dayjs from 'dayjs'; import { UsageSourceMap } from '@fastgpt/global/support/wallet/usage/constants'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { formatNumber } from '@fastgpt/global/common/math/tools'; diff --git a/projects/app/src/pages/account/components/standardDetailModal.tsx b/projects/app/src/pages/account/components/standardDetailModal.tsx index 657099fb3a4..ae607061960 100644 --- a/projects/app/src/pages/account/components/standardDetailModal.tsx +++ b/projects/app/src/pages/account/components/standardDetailModal.tsx @@ -11,7 +11,7 @@ import { TableContainer, ModalCloseButton } from '@chakra-ui/react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useQuery } from '@tanstack/react-query'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; diff --git a/projects/app/src/pages/api/admin/initv462.ts b/projects/app/src/pages/api/admin/initv462.ts deleted file mode 100644 index 7678e778cd5..00000000000 --- a/projects/app/src/pages/api/admin/initv462.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@fastgpt/service/common/response'; -import { connectToDatabase } from '@/service/mongo'; -import { delay } from '@fastgpt/global/common/system/utils'; -import { authCert } from '@fastgpt/service/support/permission/auth/common'; -import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema'; -import { jiebaSplit } from '@/service/common/string/jieba'; - -let success = 0; -/* pg 中的数据搬到 mongo dataset.datas 中,并做映射 */ -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - const { limit = 50 } = req.body as { limit: number }; - await authCert({ req, authRoot: true }); - await connectToDatabase(); - success = 0; - - console.log( - 'total', - await MongoDatasetData.countDocuments({ - fullTextToken: { $exists: false }, - updateTime: { $lt: new Date() } - }) - ); - - await initFullTextToken(limit, new Date()); - - jsonRes(res, { - message: 'success' - }); - } catch (error) { - console.log(error); - - jsonRes(res, { - code: 500, - error - }); - } -} -export async function initFullTextToken(limit = 50, endDate: Date): Promise { - try { - const dataList = await MongoDatasetData.find( - { fullTextToken: { $exists: false }, updateTime: { $lt: endDate } }, - '_id q a' - ) - .limit(limit) - .lean(); - if (dataList.length === 0) return; - - const result = await Promise.allSettled( - dataList.map((item) => { - const text = item.q + (item.a || ''); - const tokens = jiebaSplit({ text }); - - return MongoDatasetData.findByIdAndUpdate(item._id, { - $set: { - fullTextToken: tokens - } - }); - }) - ); - - success += result.filter((item) => item.status === 'fulfilled').length; - console.log(`success: ${success}`); - return initFullTextToken(limit, endDate); - } catch (error) { - await delay(1000); - return initFullTextToken(limit, endDate); - } -} diff --git a/projects/app/src/pages/api/admin/initv463-2.ts b/projects/app/src/pages/api/admin/initv463-2.ts deleted file mode 100644 index ae9d3378840..00000000000 --- a/projects/app/src/pages/api/admin/initv463-2.ts +++ /dev/null @@ -1,62 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@fastgpt/service/common/response'; -import { connectToDatabase } from '@/service/mongo'; -import { delay } from '@fastgpt/global/common/system/utils'; -import { authCert } from '@fastgpt/service/support/permission/auth/common'; -import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema'; -import { jiebaSplit } from '@/service/common/string/jieba'; - -let success = 0; -/* pg 中的数据搬到 mongo dataset.datas 中,并做映射 */ -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - const { limit = 50 } = req.body as { limit: number }; - await authCert({ req, authRoot: true }); - await connectToDatabase(); - success = 0; - - console.log('total', await MongoDatasetData.countDocuments({ inited: { $exists: false } })); - - await initFullTextToken(limit); - - jsonRes(res, { - message: 'success' - }); - } catch (error) { - console.log(error); - - jsonRes(res, { - code: 500, - error - }); - } -} -export async function initFullTextToken(limit = 50): Promise { - try { - const dataList = await MongoDatasetData.find({ inited: { $exists: false } }, '_id q a') - .limit(limit) - .lean(); - if (dataList.length === 0) return; - - const result = await Promise.allSettled( - dataList.map((item) => { - const text = item.q + (item.a || ''); - const tokens = jiebaSplit({ text }); - - return MongoDatasetData.findByIdAndUpdate(item._id, { - $set: { - inited: true, - fullTextToken: tokens - } - }); - }) - ); - - success += result.filter((item) => item.status === 'fulfilled').length; - console.log(`success: ${success}`); - return initFullTextToken(limit); - } catch (error) { - await delay(1000); - return initFullTextToken(limit); - } -} diff --git a/projects/app/src/pages/api/admin/initv463.ts b/projects/app/src/pages/api/admin/initv463.ts deleted file mode 100644 index 3142b98d04e..00000000000 --- a/projects/app/src/pages/api/admin/initv463.ts +++ /dev/null @@ -1,109 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@fastgpt/service/common/response'; -import { connectToDatabase } from '@/service/mongo'; -import { authCert } from '@fastgpt/service/support/permission/auth/common'; -import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema'; -import { MongoDatasetCollection } from '@fastgpt/service/core/dataset/collection/schema'; -import { DatasetStatusEnum, TrainingModeEnum } from '@fastgpt/global/core/dataset/constants'; -import { MongoDataset } from '@fastgpt/service/core/dataset/schema'; - -let success = 0; -/* pg 中的数据搬到 mongo dataset.datas 中,并做映射 */ -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - const { limit = 50 } = req.body as { limit: number }; - await authCert({ req, authRoot: true }); - await connectToDatabase(); - success = 0; - - await MongoDatasetCollection.updateMany({ createTime: { $exists: false } }, [ - { - $set: { - createTime: '$updateTime' - } - } - ]); - await MongoDatasetCollection.updateMany({ trainingType: { $exists: false } }, [ - { - $set: { - trainingType: { - $cond: { - if: { $ifNull: ['$a', false] }, - then: TrainingModeEnum.qa, - else: TrainingModeEnum.chunk - } - } - } - } - ]); - await MongoDatasetCollection.updateMany({ chunkSize: { $exists: false } }, [ - { - $set: { - chunkSize: 0 - } - } - ]); - await MongoDatasetCollection.updateMany({ fileId: { $exists: false } }, [ - { - $set: { - fileId: '$metadata.fileId' - } - } - ]); - await MongoDatasetCollection.updateMany({ rawLink: { $exists: false } }, [ - { - $set: { - rawLink: '$metadata.rawLink' - } - } - ]); - - await MongoDatasetData.updateMany( - { chunkIndex: { $exists: false } }, - { - chunkIndex: 0 - } - ); - await MongoDatasetData.updateMany( - { updateTime: { $exists: false } }, - { - updateTime: new Date() - } - ); - - await MongoDataset.updateMany( - { status: { $exists: false } }, - { - $set: { - status: DatasetStatusEnum.active - } - } - ); - - // dataset tags to intro - await MongoDataset.updateMany({ tags: { $exists: true } }, [ - { - $set: { - intro: { - $reduce: { - input: '$tags', - initialValue: '', - in: { $concat: ['$$value', ' ', '$$this'] } - } - } - } - } - ]); - - jsonRes(res, { - message: 'success' - }); - } catch (error) { - console.log(error); - - jsonRes(res, { - code: 500, - error - }); - } -} diff --git a/projects/app/src/pages/api/admin/initv47.ts b/projects/app/src/pages/api/admin/initv47.ts new file mode 100644 index 00000000000..2892c571409 --- /dev/null +++ b/projects/app/src/pages/api/admin/initv47.ts @@ -0,0 +1,49 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@fastgpt/service/common/response'; +import { connectToDatabase } from '@/service/mongo'; +import { authCert } from '@fastgpt/service/support/permission/auth/common'; +import { MongoUsage } from '@fastgpt/service/support/wallet/usage/schema'; +import { connectionMongo } from '@fastgpt/service/common/mongo'; +import { checkFiles } from '../timerTask/dataset/checkInValidDatasetFiles'; +import { addHours } from 'date-fns'; +import { checkInvalid as checkInvalidImg } from '../timerTask/dataset/checkInvalidDatasetImage'; +import { checkInvalidCollection } from '../timerTask/dataset/checkInvalidMongoCollection'; +import { checkInvalidVector } from '../timerTask/dataset/checkInvalidVector'; +import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; +import { PluginTypeEnum } from '@fastgpt/global/core/plugin/constants'; + +/* pg 中的数据搬到 mongo dataset.datas 中,并做映射 */ +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await connectToDatabase(); + await authCert({ req, authRoot: true }); + + await MongoPlugin.updateMany( + { type: { $exists: false } }, + { + $set: { + type: PluginTypeEnum.custom + } + } + ); + await MongoPlugin.updateMany( + { parentId: { $exists: false } }, + { + $set: { + parentId: null + } + } + ); + + jsonRes(res, { + message: 'success' + }); + } catch (error) { + console.log(error); + + jsonRes(res, { + code: 500, + error + }); + } +} diff --git a/projects/app/src/pages/api/common/system/getInitData.ts b/projects/app/src/pages/api/common/system/getInitData.ts index 0003d1b45b5..0efaeb7372f 100644 --- a/projects/app/src/pages/api/common/system/getInitData.ts +++ b/projects/app/src/pages/api/common/system/getInitData.ts @@ -30,8 +30,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) })) || [], whisperModel: global.whisperModel, audioSpeechModels: global.audioSpeechModels, - systemVersion: global.systemVersion || '0.0.0', - simpleModeTemplates: global.simpleModeTemplates + systemVersion: global.systemVersion || '0.0.0' } }); } @@ -43,7 +42,7 @@ const defaultFeConfigs: FastGPTFeConfigsType = { openAPIDocUrl: 'https://doc.fastgpt.in/docs/development/openapi', systemTitle: 'FastGPT', concatMd: - '* 项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n* 交流群: ![](https://doc.fastgpt.in/wechat-fastgpt.webp)', + '* 项目开源地址: [FastGPT GitHub](https://github.com/labring/FastGPT)\n* 交流群: ![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg)', limit: { exportDatasetLimitMinutes: 0, websiteSyncLimitMinuted: 0 @@ -68,7 +67,6 @@ export async function getInitConfig() { ]); console.log({ - // simpleModeTemplates: global.simpleModeTemplates, communityPlugins: global.communityPlugins }); } catch (error) { @@ -141,39 +139,6 @@ export function getSystemVersion() { } } -// async function getSimpleModeTemplates() { -// if (global.simpleModeTemplates && global.simpleModeTemplates.length > 0) return; - -// try { -// const basePath = -// process.env.NODE_ENV === 'development' ? 'data/simpleTemplates' : '/app/data/simpleTemplates'; -// // read data/simpleTemplates directory, get all json file -// const files = readdirSync(basePath); -// // filter json file -// const filterFiles = files.filter((item) => item.endsWith('.json')); - -// // read json file -// const fileTemplates = filterFiles.map((item) => { -// const content = readFileSync(`${basePath}/${item}`, 'utf-8'); -// return { -// id: item.replace('.json', ''), -// ...JSON.parse(content) -// }; -// }); - -// // fetch templates from plus -// const plusTemplates = await getSimpleTemplatesFromPlus(); - -// global.simpleModeTemplates = [ -// SimpleModeTemplate_FastGPT_Universal, -// ...plusTemplates, -// ...fileTemplates -// ]; -// } catch (error) { -// global.simpleModeTemplates = [SimpleModeTemplate_FastGPT_Universal]; -// } -// } - function getSystemPlugin() { if (global.communityPlugins && global.communityPlugins.length > 0) return; diff --git a/projects/app/src/pages/api/core/app/create.ts b/projects/app/src/pages/api/core/app/create.ts index aa3f9a83853..6dcb130bfc0 100644 --- a/projects/app/src/pages/api/core/app/create.ts +++ b/projects/app/src/pages/api/core/app/create.ts @@ -5,7 +5,6 @@ import type { CreateAppParams } from '@fastgpt/global/core/app/api.d'; import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { MongoApp } from '@fastgpt/service/core/app/schema'; import { authUserNotVisitor } from '@fastgpt/service/support/permission/auth/user'; -import { SimpleModeTemplate_FastGPT_Universal } from '@/global/core/app/constants'; import { checkTeamAppLimit } from '@fastgpt/service/support/permission/teamLimit'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { @@ -35,8 +34,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< teamId, tmbId, modules, - type, - simpleTemplateId: SimpleModeTemplate_FastGPT_Universal.id + type }); jsonRes(res, { diff --git a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts b/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts deleted file mode 100644 index 668b9c0dede..00000000000 --- a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-simple.ts +++ /dev/null @@ -1,620 +0,0 @@ -/* - universal mode. - @author: FastGpt Team -*/ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@fastgpt/service/common/response'; -import type { AppSimpleEditFormType } from '@fastgpt/global/core/app/type.d'; -import type { ModuleItemType } from '@fastgpt/global/core/module/type'; -import { FormatForm2ModulesProps } from '@fastgpt/global/core/app/api'; -import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - const { formData, chatModelMaxToken } = req.body as FormatForm2ModulesProps; - - const modules = [ - ...(formData.dataset.datasets.length > 0 - ? datasetTemplate({ formData, maxToken: chatModelMaxToken }) - : simpleChatTemplate({ formData, maxToken: chatModelMaxToken })) - ]; - - jsonRes(res, { - data: modules - }); - } catch (err) { - jsonRes(res, { - code: 500, - error: err - }); - } -} - -type Props = { formData: AppSimpleEditFormType; maxToken: number }; - -function simpleChatTemplate({ formData, maxToken }: Props): ModuleItemType[] { - return [ - { - moduleId: 'userChatInput', - name: 'core.module.template.Chat entrance', - avatar: '/imgs/module/userChatInput.png', - flowType: 'questionInput', - position: { - x: 464.32198615344566, - y: 1602.2698463081606 - }, - inputs: [ - { - key: 'userChatInput', - type: 'systemInput', - valueType: 'string', - label: 'core.module.input.label.user question', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - } - ], - outputs: [ - { - key: 'userChatInput', - label: 'core.module.input.label.user question', - type: 'source', - valueType: 'string', - targets: [ - { - moduleId: 'chatModule', - key: 'userChatInput' - } - ] - } - ] - }, - { - moduleId: 'chatModule', - name: 'AI 对话', - avatar: '/imgs/module/AI.png', - flowType: 'chatNode', - showStatus: true, - position: { - x: 981.9682828103937, - y: 890.014595014464 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'model', - type: 'selectLLMModel', - label: 'core.module.input.label.aiModel', - required: true, - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.model, - connected: false - }, - { - key: 'temperature', - type: 'hidden', - label: '温度', - value: 1, - valueType: 'number', - min: 0, - max: 10, - step: 1, - markList: [ - { - label: '严谨', - value: 0 - }, - { - label: '发散', - value: 10 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'maxToken', - type: 'hidden', - label: '回复上限', - value: maxToken, - valueType: 'number', - min: 100, - max: 4000, - step: 50, - markList: [ - { - label: '100', - value: 100 - }, - { - label: '4000', - value: 4000 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'isResponseAnswerText', - type: 'hidden', - label: '返回AI内容', - value: true, - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'quoteTemplate', - type: 'hidden', - label: '引用内容模板', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.quoteTemplate, - connected: false - }, - { - key: 'quotePrompt', - type: 'hidden', - label: '引用内容提示词', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.quotePrompt, - connected: false - }, - { - key: 'aiSettings', - type: 'aiSettings', - label: '', - valueType: 'any', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'systemPrompt', - type: 'textarea', - label: 'core.ai.Prompt', - max: 300, - valueType: 'string', - description: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - placeholder: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - showTargetInApp: true, - showTargetInPlugin: true, - value: formData.aiSettings.systemPrompt, - connected: false - }, - { - key: 'history', - type: 'numberInput', - label: 'core.module.input.label.chat history', - required: true, - min: 0, - max: 30, - valueType: 'chatHistory', - value: 8, - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'quoteQA', - type: 'target', - label: '引用内容', - description: "对象数组格式,结构:\n [{q:'问题',a:'回答'}]", - valueType: 'datasetQuote', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'userChatInput', - type: 'target', - label: 'core.module.input.label.user question', - required: true, - valueType: 'string', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - } - ], - outputs: [ - { - key: 'answerText', - label: 'AI回复', - description: '将在 stream 回复完毕后触发', - valueType: 'string', - type: 'source', - targets: [] - }, - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - }, - { - key: 'history', - label: '新的上下文', - description: '将本次回复内容拼接上历史记录,作为新的上下文返回', - valueType: 'chatHistory', - type: 'source', - targets: [] - } - ] - } - ]; -} -function datasetTemplate({ formData, maxToken }: Props): ModuleItemType[] { - const modules: ModuleItemType[] = [ - { - moduleId: 'userChatInput', - name: 'core.module.template.Chat entrance', - avatar: '/imgs/module/userChatInput.png', - flowType: 'questionInput', - position: { - x: 324.81436595478294, - y: 1527.0012457753612 - }, - inputs: [ - { - key: 'userChatInput', - type: 'systemInput', - valueType: 'string', - label: 'core.module.input.label.user question', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - } - ], - outputs: [ - { - key: 'userChatInput', - label: 'core.module.input.label.user question', - type: 'source', - valueType: 'string', - targets: [ - { - moduleId: 'datasetSearch', - key: 'userChatInput' - } - ] - } - ] - }, - { - moduleId: 'datasetSearch', - name: 'core.module.template.Dataset search', - avatar: '/imgs/module/db.png', - flowType: 'datasetSearchNode', - showStatus: true, - position: { - x: 1351.5043753345153, - y: 947.0780385418003 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'datasets', - type: 'selectDataset', - label: '关联的知识库', - value: formData.dataset.datasets, - valueType: 'selectDataset', - list: [], - required: true, - showTargetInApp: false, - showTargetInPlugin: true, - connected: false - }, - { - key: 'similarity', - type: 'hidden', - label: '最低相关性', - value: 0.15, - valueType: 'number', - min: 0, - max: 1, - step: 0.01, - markList: [ - { - label: '0', - value: 0 - }, - { - label: '1', - value: 1 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'limit', - type: 'hidden', - label: '引用上限', - description: '单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens', - value: 2000, - valueType: 'number', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'searchMode', - type: 'hidden', - label: '', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: DatasetSearchModeEnum.mixedRecall, - connected: false - }, - { - key: 'usingReRank', - type: 'hidden', - label: '', - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - value: true, - connected: false - }, - { - key: 'userChatInput', - type: 'target', - label: 'core.module.input.label.user question', - required: true, - valueType: 'string', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - } - ], - outputs: [ - { - key: 'isEmpty', - label: '搜索结果为空', - type: 'source', - valueType: 'boolean', - targets: [] - }, - { - key: 'unEmpty', - label: '搜索结果不为空', - type: 'source', - valueType: 'boolean', - targets: [] - }, - { - key: 'quoteQA', - label: '引用内容', - description: - '始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器', - type: 'source', - valueType: 'datasetQuote', - targets: [ - { - moduleId: 'chatModule', - key: 'quoteQA' - } - ] - }, - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - }, - { - key: 'userChatInput', - label: 'core.module.input.label.user question', - type: 'hidden', - valueType: 'string', - targets: [ - { - moduleId: 'chatModule', - key: 'userChatInput' - } - ] - } - ] - }, - { - moduleId: 'chatModule', - name: 'AI 对话', - avatar: '/imgs/module/AI.png', - flowType: 'chatNode', - showStatus: true, - position: { - x: 2022.7264786978908, - y: 1006.3102431257475 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'model', - type: 'selectLLMModel', - label: 'core.module.input.label.aiModel', - required: true, - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.model, - connected: false - }, - { - key: 'temperature', - type: 'hidden', - label: '温度', - value: 0, - valueType: 'number', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'maxToken', - type: 'hidden', - label: '回复上限', - value: maxToken, - valueType: 'number', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'isResponseAnswerText', - type: 'hidden', - label: '返回AI内容', - value: true, - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'quoteTemplate', - type: 'hidden', - label: '引用内容模板', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: '', - connected: false - }, - { - key: 'quotePrompt', - type: 'hidden', - label: '引用内容提示词', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: '', - connected: false - }, - { - key: 'aiSettings', - type: 'aiSettings', - label: '', - valueType: 'any', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'systemPrompt', - type: 'textarea', - label: 'core.ai.Prompt', - max: 300, - valueType: 'string', - description: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - placeholder: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - showTargetInApp: true, - showTargetInPlugin: true, - value: formData.aiSettings.systemPrompt, - connected: false - }, - { - key: 'history', - type: 'numberInput', - label: 'core.module.input.label.chat history', - required: true, - min: 0, - max: 30, - valueType: 'chatHistory', - value: 6, - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'quoteQA', - type: 'target', - label: '引用内容', - description: "对象数组格式,结构:\n [{q:'问题',a:'回答'}]", - valueType: 'datasetQuote', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - }, - { - key: 'userChatInput', - type: 'target', - label: 'core.module.input.label.user question', - required: true, - valueType: 'string', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - } - ], - outputs: [ - { - key: 'answerText', - label: 'AI回复', - description: '将在 stream 回复完毕后触发', - valueType: 'string', - type: 'source', - targets: [] - }, - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - }, - { - key: 'history', - label: '新的上下文', - description: '将本次回复内容拼接上历史记录,作为新的上下文返回', - valueType: 'chatHistory', - type: 'source', - targets: [] - } - ] - } - ]; - - return modules; -} diff --git a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts b/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts deleted file mode 100644 index 0aedf254d03..00000000000 --- a/projects/app/src/pages/api/core/app/form2Modules/fastgpt-universal.ts +++ /dev/null @@ -1,721 +0,0 @@ -/* - universal mode. - @author: FastGpt Team -*/ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@fastgpt/service/common/response'; -import type { AppSimpleEditFormType } from '@fastgpt/global/core/app/type.d'; -import type { ModuleItemType } from '@fastgpt/global/core/module/type'; -import { FormatForm2ModulesProps } from '@fastgpt/global/core/app/api'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - const { formData } = req.body as FormatForm2ModulesProps; - - const modules = - formData.dataset.datasets.length > 0 - ? datasetTemplate(formData) - : simpleChatTemplate(formData); - - jsonRes(res, { - data: modules - }); - } catch (err) { - jsonRes(res, { - code: 500, - error: err - }); - } -} - -function simpleChatTemplate(formData: AppSimpleEditFormType): ModuleItemType[] { - return [ - { - moduleId: 'userChatInput', - name: 'core.module.template.Chat entrance', - avatar: '/imgs/module/userChatInput.png', - flowType: 'questionInput', - position: { - x: 464.32198615344566, - y: 1602.2698463081606 - }, - inputs: [ - { - key: 'userChatInput', - type: 'systemInput', - valueType: 'string', - label: 'core.module.input.label.user question', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - } - ], - outputs: [ - { - key: 'userChatInput', - label: 'core.module.input.label.user question', - type: 'source', - valueType: 'string', - targets: [ - { - moduleId: 'chatModule', - key: 'userChatInput' - } - ] - } - ] - }, - { - moduleId: 'chatModule', - name: 'AI 对话', - avatar: '/imgs/module/AI.png', - flowType: 'chatNode', - showStatus: true, - position: { - x: 981.9682828103937, - y: 890.014595014464 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'model', - type: 'selectLLMModel', - label: 'core.module.input.label.aiModel', - required: true, - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.model, - connected: false - }, - { - key: 'temperature', - type: 'hidden', - label: '温度', - value: formData.aiSettings.temperature, - valueType: 'number', - min: 0, - max: 10, - step: 1, - markList: [ - { - label: '严谨', - value: 0 - }, - { - label: '发散', - value: 10 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'maxToken', - type: 'hidden', - label: '回复上限', - value: formData.aiSettings.maxToken, - valueType: 'number', - min: 100, - max: 4000, - step: 50, - markList: [ - { - label: '100', - value: 100 - }, - { - label: '4000', - value: 4000 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'isResponseAnswerText', - type: 'hidden', - label: '返回AI内容', - value: true, - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'quoteTemplate', - type: 'hidden', - label: '引用内容模板', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.quoteTemplate, - connected: false - }, - { - key: 'quotePrompt', - type: 'hidden', - label: '引用内容提示词', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.quotePrompt, - connected: false - }, - { - key: 'aiSettings', - type: 'aiSettings', - label: '', - valueType: 'any', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'systemPrompt', - type: 'textarea', - label: 'core.ai.Prompt', - max: 300, - valueType: 'string', - description: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - placeholder: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - showTargetInApp: true, - showTargetInPlugin: true, - value: formData.aiSettings.systemPrompt, - connected: false - }, - { - key: 'history', - type: 'numberInput', - label: 'core.module.input.label.chat history', - required: true, - min: 0, - max: 30, - valueType: 'chatHistory', - value: 6, - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'quoteQA', - type: 'target', - label: '引用内容', - description: "对象数组格式,结构:\n [{q:'问题',a:'回答'}]", - valueType: 'datasetQuote', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'userChatInput', - type: 'target', - label: 'core.module.input.label.user question', - required: true, - valueType: 'string', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - } - ], - outputs: [ - { - key: 'answerText', - label: 'AI回复', - description: '将在 stream 回复完毕后触发', - valueType: 'string', - type: 'source', - targets: [] - }, - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - }, - { - key: 'history', - label: '新的上下文', - description: '将本次回复内容拼接上历史记录,作为新的上下文返回', - valueType: 'chatHistory', - type: 'source', - targets: [] - } - ] - } - ]; -} -function datasetTemplate(formData: AppSimpleEditFormType): ModuleItemType[] { - const modules: ModuleItemType[] = [ - { - moduleId: 'userChatInput', - name: 'core.module.template.Chat entrance', - avatar: '/imgs/module/userChatInput.png', - flowType: 'questionInput', - position: { - x: 324.81436595478294, - y: 1527.0012457753612 - }, - inputs: [ - { - key: 'userChatInput', - type: 'systemInput', - valueType: 'string', - label: 'core.module.input.label.user question', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - } - ], - outputs: [ - { - key: 'userChatInput', - label: 'core.module.input.label.user question', - type: 'source', - valueType: 'string', - targets: [ - { - moduleId: 'datasetSearch', - key: 'userChatInput' - } - ] - } - ] - }, - { - moduleId: 'datasetSearch', - name: 'core.module.template.Dataset search', - avatar: '/imgs/module/db.png', - flowType: 'datasetSearchNode', - showStatus: true, - position: { - x: 1351.5043753345153, - y: 947.0780385418003 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'datasets', - type: 'selectDataset', - label: '关联的知识库', - value: formData.dataset.datasets, - valueType: 'selectDataset', - list: [], - required: true, - showTargetInApp: false, - showTargetInPlugin: true, - connected: false - }, - { - key: 'similarity', - type: 'hidden', - label: '最低相关性', - value: formData.dataset.similarity, - valueType: 'number', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'limit', - type: 'hidden', - label: '引用上限', - description: '单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens', - value: formData.dataset.limit, - valueType: 'number', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'searchMode', - type: 'hidden', - label: 'core.dataset.search.Mode', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.dataset.searchMode, - connected: false - }, - { - key: 'usingReRank', - type: 'hidden', - label: '', - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.dataset.usingReRank, - connected: false - }, - { - key: 'datasetSearchUsingExtensionQuery', - type: 'hidden', - label: '', - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.dataset.datasetSearchUsingExtensionQuery, - connected: false - }, - { - key: 'datasetSearchExtensionBg', - type: 'hidden', - label: '', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.dataset.datasetSearchExtensionBg, - connected: false - }, - { - key: 'datasetSearchExtensionModel', - type: 'hidden', - label: '', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.dataset.datasetSearchExtensionModel, - connected: false - }, - { - key: 'userChatInput', - type: 'target', - label: 'core.module.input.label.user question', - required: true, - valueType: 'string', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - } - ], - outputs: [ - { - key: 'isEmpty', - label: '搜索结果为空', - type: 'source', - valueType: 'boolean', - targets: formData.dataset.searchEmptyText - ? [ - { - moduleId: '6dtsvu', - key: 'switch' - } - ] - : [] - }, - { - key: 'unEmpty', - label: '搜索结果不为空', - type: 'source', - valueType: 'boolean', - targets: formData.dataset.searchEmptyText - ? [ - { - moduleId: 'chatModule', - key: 'switch' - } - ] - : [] - }, - { - key: 'quoteQA', - label: '引用内容', - description: - '始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器', - type: 'source', - valueType: 'datasetQuote', - targets: [ - { - moduleId: 'chatModule', - key: 'quoteQA' - } - ] - }, - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - }, - { - key: 'userChatInput', - label: 'core.module.input.label.user question', - type: 'hidden', - valueType: 'string', - targets: [ - { - moduleId: 'chatModule', - key: 'userChatInput' - } - ] - } - ] - }, - { - moduleId: 'chatModule', - name: 'AI 对话', - avatar: '/imgs/module/AI.png', - flowType: 'chatNode', - showStatus: true, - position: { - x: 2022.7264786978908, - y: 1006.3102431257475 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: !!formData.dataset?.searchEmptyText - }, - { - key: 'model', - type: 'selectLLMModel', - label: 'core.module.input.label.aiModel', - required: true, - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.model, - connected: false - }, - { - key: 'temperature', - type: 'hidden', - label: '温度', - value: formData.aiSettings.temperature, - valueType: 'number', - min: 0, - max: 10, - step: 1, - markList: [ - { - label: '严谨', - value: 0 - }, - { - label: '发散', - value: 10 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'maxToken', - type: 'hidden', - label: '回复上限', - value: formData.aiSettings.maxToken, - valueType: 'number', - min: 100, - max: 4000, - step: 50, - markList: [ - { - label: '100', - value: 100 - }, - { - label: '4000', - value: 4000 - } - ], - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'isResponseAnswerText', - type: 'hidden', - label: '返回AI内容', - value: true, - valueType: 'boolean', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'quoteTemplate', - type: 'hidden', - label: '引用内容模板', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.quoteTemplate, - connected: false - }, - { - key: 'quotePrompt', - type: 'hidden', - label: '引用内容提示词', - valueType: 'string', - showTargetInApp: false, - showTargetInPlugin: false, - value: formData.aiSettings.quotePrompt, - connected: false - }, - { - key: 'aiSettings', - type: 'aiSettings', - label: '', - valueType: 'any', - showTargetInApp: false, - showTargetInPlugin: false, - connected: false - }, - { - key: 'systemPrompt', - type: 'textarea', - label: 'core.ai.Prompt', - max: 300, - valueType: 'string', - description: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - placeholder: - '模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}', - showTargetInApp: true, - showTargetInPlugin: true, - value: formData.aiSettings.systemPrompt, - connected: false - }, - { - key: 'history', - type: 'numberInput', - label: 'core.module.input.label.chat history', - required: true, - min: 0, - max: 30, - valueType: 'chatHistory', - value: 6, - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - }, - { - key: 'quoteQA', - type: 'target', - label: '引用内容', - description: "对象数组格式,结构:\n [{q:'问题',a:'回答'}]", - valueType: 'datasetQuote', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - }, - { - key: 'userChatInput', - type: 'target', - label: 'core.module.input.label.user question', - required: true, - valueType: 'string', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - } - ], - outputs: [ - { - key: 'answerText', - label: 'AI回复', - description: '将在 stream 回复完毕后触发', - valueType: 'string', - type: 'source', - targets: [] - }, - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - }, - { - key: 'history', - label: '新的上下文', - description: '将本次回复内容拼接上历史记录,作为新的上下文返回', - valueType: 'chatHistory', - type: 'source', - targets: [] - } - ] - } - ]; - - if (formData.dataset?.searchEmptyText) { - modules.push({ - moduleId: '6dtsvu', - name: '指定回复', - avatar: '/imgs/module/reply.png', - flowType: 'answerNode', - position: { - x: 2018.2744321961648, - y: 616.1220817209096 - }, - inputs: [ - { - key: 'switch', - type: 'target', - label: 'core.module.input.label.switch', - valueType: 'any', - showTargetInApp: true, - showTargetInPlugin: true, - connected: true - }, - { - key: 'text', - type: 'textarea', - value: formData.dataset.searchEmptyText, - valueType: 'any', - label: '回复的内容', - description: - '可以使用 \\n 来实现连续换行。\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n如传入非字符串类型数据将会自动转成字符串', - placeholder: - '可以使用 \\n 来实现连续换行。\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n如传入非字符串类型数据将会自动转成字符串', - showTargetInApp: true, - showTargetInPlugin: true, - connected: false - } - ], - outputs: [ - { - key: 'finish', - label: 'core.module.output.label.running done', - description: 'core.module.output.description.running done', - valueType: 'boolean', - type: 'source', - targets: [] - } - ] - }); - } - - return modules; -} diff --git a/projects/app/src/pages/api/core/app/update.ts b/projects/app/src/pages/api/core/app/update.ts index df90ee75d2e..dbe410754b9 100644 --- a/projects/app/src/pages/api/core/app/update.ts +++ b/projects/app/src/pages/api/core/app/update.ts @@ -12,7 +12,7 @@ import { getLLMModel } from '@fastgpt/service/core/ai/model'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { await connectToDatabase(); - const { name, avatar, type, simpleTemplateId, intro, modules, permission, teamTags } = + const { name, avatar, type, intro, modules, permission, teamTags } = req.body as AppUpdateParams; const { appId } = req.query as { appId: string }; @@ -29,7 +29,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< let maxTokens = 3000; modules.forEach((item) => { - if (item.flowType === FlowNodeTypeEnum.chatNode) { + if ( + item.flowType === FlowNodeTypeEnum.chatNode || + item.flowType === FlowNodeTypeEnum.tools + ) { const model = item.inputs.find((item) => item.key === ModuleInputKeyEnum.aiModel)?.value || ''; const chatModel = getLLMModel(model); @@ -61,7 +64,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< { name, type, - simpleTemplateId, avatar, intro, permission, diff --git a/projects/app/src/pages/api/core/app/updateTeamTasg.ts b/projects/app/src/pages/api/core/app/updateTeamTasg.ts index 0647c6eb38b..5c0871f4c00 100644 --- a/projects/app/src/pages/api/core/app/updateTeamTasg.ts +++ b/projects/app/src/pages/api/core/app/updateTeamTasg.ts @@ -12,7 +12,7 @@ import { getLLMModel } from '@fastgpt/service/core/ai/model'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { await connectToDatabase(); - const { name, avatar, type, simpleTemplateId, intro, modules, permission, teamTags } = + const { name, avatar, type, intro, modules, permission, teamTags } = req.body as AppUpdateParams; const { appId } = req.query as { appId: string }; @@ -61,7 +61,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< { name, type, - simpleTemplateId, avatar, intro, permission, diff --git a/projects/app/src/pages/api/core/chat/chatTest.ts b/projects/app/src/pages/api/core/chat/chatTest.ts index 63b6ea17ad2..7c178f524d8 100644 --- a/projects/app/src/pages/api/core/chat/chatTest.ts +++ b/projects/app/src/pages/api/core/chat/chatTest.ts @@ -8,10 +8,10 @@ import { pushChatUsage } from '@/service/support/wallet/usage/push'; import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; import type { ChatItemType, ChatItemValueItemType } from '@fastgpt/global/core/chat/type'; import { authApp } from '@fastgpt/service/support/permission/auth/app'; -import { dispatchWorkFlow } from '@/service/moduleDispatch'; +import { dispatchWorkFlow } from '@fastgpt/service/core/workflow/dispatch'; import { authCert } from '@fastgpt/service/support/permission/auth/common'; import { getUserChatInfoAndAuthTeamPoints } from '@/service/support/permission/auth/team'; -import { setEntryEntries } from '@/service/moduleDispatch/utils'; +import { setEntryEntries } from '@fastgpt/service/core/workflow/dispatch/utils'; import { chatValue2RuntimePrompt } from '@fastgpt/global/core/chat/adapt'; export type Props = { diff --git a/projects/app/src/pages/api/core/chat/feedback/updateUserFeedback.ts b/projects/app/src/pages/api/core/chat/feedback/updateUserFeedback.ts index 6cdd9867598..b02274a0d7d 100644 --- a/projects/app/src/pages/api/core/chat/feedback/updateUserFeedback.ts +++ b/projects/app/src/pages/api/core/chat/feedback/updateUserFeedback.ts @@ -7,8 +7,17 @@ import { autChatCrud } from '@/service/support/permission/auth/chat'; /* 初始化我的聊天框,需要身份验证 */ export default async function handler(req: NextApiRequest, res: NextApiResponse) { - const { appId, chatId, chatItemId, shareId, outLinkUid, userBadFeedback, userGoodFeedback } = - req.body as UpdateChatFeedbackProps; + const { + appId, + chatId, + chatItemId, + shareId, + teamId, + teamToken, + outLinkUid, + userBadFeedback, + userGoodFeedback + } = req.body as UpdateChatFeedbackProps; try { await connectToDatabase(); @@ -17,6 +26,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) req, authToken: true, appId, + teamId, + teamToken, chatId, shareId, outLinkUid, diff --git a/projects/app/src/pages/api/core/chat/updateHistory.ts b/projects/app/src/pages/api/core/chat/updateHistory.ts index 634604894e3..7a434d7ac3d 100644 --- a/projects/app/src/pages/api/core/chat/updateHistory.ts +++ b/projects/app/src/pages/api/core/chat/updateHistory.ts @@ -9,12 +9,13 @@ import { autChatCrud } from '@/service/support/permission/auth/chat'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { await connectToDatabase(); - const { appId, chatId, shareId, outLinkUid, customTitle, top } = req.body as UpdateHistoryProps; - + const { appId, chatId, teamId, shareId, outLinkUid, customTitle, top } = + req.body as UpdateHistoryProps; await autChatCrud({ req, authToken: true, appId, + teamId, chatId, shareId, outLinkUid, diff --git a/projects/app/src/pages/api/core/dataset/collection/create/text.ts b/projects/app/src/pages/api/core/dataset/collection/create/text.ts index af700c1010f..686c748d1ed 100644 --- a/projects/app/src/pages/api/core/dataset/collection/create/text.ts +++ b/projects/app/src/pages/api/core/dataset/collection/create/text.ts @@ -14,7 +14,7 @@ import { import { splitText2Chunks } from '@fastgpt/global/common/string/textSplitter'; import { checkDatasetLimit } from '@fastgpt/service/support/permission/teamLimit'; import { predictDataLimitLength } from '@fastgpt/global/core/dataset/utils'; -import { pushDataToTrainingQueue } from '@/service/core/dataset/data/controller'; +import { pushDataListToTrainingQueue } from '@fastgpt/service/core/dataset/training/controller'; import { hashStr } from '@fastgpt/global/common/string/tools'; import { createTrainingUsage } from '@fastgpt/service/support/wallet/usage/controller'; import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; @@ -83,7 +83,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< ]); // 4. push chunks to training queue - const insertResults = await pushDataToTrainingQueue({ + const insertResults = await pushDataListToTrainingQueue({ teamId, tmbId, collectionId, diff --git a/projects/app/src/pages/api/core/dataset/data/insertData.ts b/projects/app/src/pages/api/core/dataset/data/insertData.ts index fa8e2de1bd1..35d114ca9ca 100644 --- a/projects/app/src/pages/api/core/dataset/data/insertData.ts +++ b/projects/app/src/pages/api/core/dataset/data/insertData.ts @@ -23,11 +23,11 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex const { collectionId, q, a, indexes } = req.body as InsertOneDatasetDataProps; if (!q) { - return Promise.reject('q is required'); + throw new Error('q is required'); } if (!collectionId) { - return Promise.reject('collectionId is required'); + throw new Error('collectionId is required'); } // 凭证校验 diff --git a/projects/app/src/pages/api/core/dataset/data/pushData.ts b/projects/app/src/pages/api/core/dataset/data/pushData.ts index 186d58fc6f4..de5efc81fc3 100644 --- a/projects/app/src/pages/api/core/dataset/data/pushData.ts +++ b/projects/app/src/pages/api/core/dataset/data/pushData.ts @@ -10,7 +10,7 @@ import type { import { authDatasetCollection } from '@fastgpt/service/support/permission/auth/dataset'; import { checkDatasetLimit } from '@fastgpt/service/support/permission/teamLimit'; import { predictDataLimitLength } from '@fastgpt/global/core/dataset/utils'; -import { pushDataToTrainingQueue } from '@/service/core/dataset/data/controller'; +import { pushDataListToTrainingQueue } from '@fastgpt/service/core/dataset/training/controller'; export default withNextCors(async function handler(req: NextApiRequest, res: NextApiResponse) { try { @@ -41,7 +41,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex }); jsonRes(res, { - data: await pushDataToTrainingQueue({ + data: await pushDataListToTrainingQueue({ ...req.body, teamId, tmbId diff --git a/projects/app/src/pages/api/core/dataset/file/getPreviewUrl.ts b/projects/app/src/pages/api/core/dataset/file/getPreviewUrl.ts index 7b0eb8358e2..db65d8df577 100644 --- a/projects/app/src/pages/api/core/dataset/file/getPreviewUrl.ts +++ b/projects/app/src/pages/api/core/dataset/file/getPreviewUrl.ts @@ -3,7 +3,7 @@ import { jsonRes } from '@fastgpt/service/common/response'; import { connectToDatabase } from '@/service/mongo'; import { authDatasetFile } from '@fastgpt/service/support/permission/auth/dataset'; import { createFileToken } from '@fastgpt/service/support/permission/controller'; -import { BucketNameEnum, FileBaseUrl } from '@fastgpt/global/common/file/constants'; +import { BucketNameEnum, ReadFileBaseUrl } from '@fastgpt/global/common/file/constants'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { @@ -25,7 +25,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< }); jsonRes(res, { - data: `${FileBaseUrl}?token=${token}` + data: `${ReadFileBaseUrl}?token=${token}` }); } catch (error) { jsonRes(res, { diff --git a/projects/app/src/pages/api/core/dataset/searchTest.ts b/projects/app/src/pages/api/core/dataset/searchTest.ts index 9e6efeb717d..0ce21715625 100644 --- a/projects/app/src/pages/api/core/dataset/searchTest.ts +++ b/projects/app/src/pages/api/core/dataset/searchTest.ts @@ -5,7 +5,7 @@ import type { SearchTestProps, SearchTestResponse } from '@/global/core/dataset/ import { connectToDatabase } from '@/service/mongo'; import { authDataset } from '@fastgpt/service/support/permission/auth/dataset'; import { pushGenerateVectorUsage } from '@/service/support/wallet/usage/push'; -import { searchDatasetData } from '@/service/core/dataset/data/controller'; +import { searchDatasetData } from '@fastgpt/service/core/dataset/search/controller'; import { updateApiKeyUsage } from '@fastgpt/service/support/openapi/tools'; import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; import { getLLMModel } from '@fastgpt/service/core/ai/model'; diff --git a/projects/app/src/pages/api/core/plugin/create.ts b/projects/app/src/pages/api/core/plugin/create.ts index 71232711d2f..7b58b789a0a 100644 --- a/projects/app/src/pages/api/core/plugin/create.ts +++ b/projects/app/src/pages/api/core/plugin/create.ts @@ -5,6 +5,8 @@ import type { CreateOnePluginParams } from '@fastgpt/global/core/plugin/controll import { authUserNotVisitor } from '@fastgpt/service/support/permission/auth/user'; import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; import { checkTeamPluginLimit } from '@fastgpt/service/support/permission/teamLimit'; +import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun'; +import { httpApiSchema2Plugins } from '@fastgpt/global/core/plugin/httpPlugin/utils'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { @@ -12,17 +14,58 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< const { teamId, tmbId } = await authUserNotVisitor({ req, authToken: true }); const body = req.body as CreateOnePluginParams; - await checkTeamPluginLimit(teamId); + // await checkTeamPluginLimit(teamId); - const { _id } = await MongoPlugin.create({ - ...body, - teamId, - tmbId - }); + // create parent plugin and child plugin + if (body.metadata?.apiSchemaStr) { + const parentId = await mongoSessionRun(async (session) => { + const [{ _id: parentId }] = await MongoPlugin.create( + [ + { + ...body, + parentId: null, + teamId, + tmbId + } + ], + { session } + ); - jsonRes(res, { - data: _id - }); + const childrenPlugins = httpApiSchema2Plugins({ + parentId, + apiSchemaStr: body.metadata?.apiSchemaStr, + customHeader: body.metadata?.customHeaders + }); + + await MongoPlugin.create( + childrenPlugins.map((item) => ({ + ...item, + metadata: { + pluginUid: item.name + }, + teamId, + tmbId + })), + { + session + } + ); + return parentId; + }); + + jsonRes(res, { + data: parentId + }); + } else { + const { _id } = await MongoPlugin.create({ + ...body, + teamId, + tmbId + }); + jsonRes(res, { + data: _id + }); + } } catch (err) { jsonRes(res, { code: 500, diff --git a/projects/app/src/pages/api/core/plugin/delete.ts b/projects/app/src/pages/api/core/plugin/delete.ts index c843dad3960..50906ab7503 100644 --- a/projects/app/src/pages/api/core/plugin/delete.ts +++ b/projects/app/src/pages/api/core/plugin/delete.ts @@ -3,14 +3,32 @@ import { jsonRes } from '@fastgpt/service/common/response'; import { connectToDatabase } from '@/service/mongo'; import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; import { authPluginCrud } from '@fastgpt/service/support/permission/auth/plugin'; +import { authUserNotVisitor } from '@fastgpt/service/support/permission/auth/user'; +import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { - const { id } = req.query as { id: string }; await connectToDatabase(); - await authPluginCrud({ req, authToken: true, id, per: 'owner' }); + const { teamId } = await authUserNotVisitor({ req, authToken: true }); + const { pluginId } = req.query as { pluginId: string }; - await MongoPlugin.findByIdAndRemove(id); + if (!pluginId) { + throw new Error('缺少参数'); + } + await authPluginCrud({ req, authToken: true, id: pluginId, per: 'owner' }); + + await mongoSessionRun(async (session) => { + await MongoPlugin.deleteMany( + { + teamId, + parentId: pluginId + }, + { + session + } + ); + await MongoPlugin.findByIdAndDelete(pluginId, { session }); + }); jsonRes(res, {}); } catch (err) { diff --git a/projects/app/src/pages/api/core/plugin/getPreviewModule.ts b/projects/app/src/pages/api/core/plugin/getPreviewModule.ts index 09d1c11fb06..2dae0d16479 100644 --- a/projects/app/src/pages/api/core/plugin/getPreviewModule.ts +++ b/projects/app/src/pages/api/core/plugin/getPreviewModule.ts @@ -6,7 +6,7 @@ import { jsonRes } from '@fastgpt/service/common/response'; import { connectToDatabase } from '@/service/mongo'; import { getPluginPreviewModule } from '@fastgpt/service/core/plugin/controller'; import { authPluginCanUse } from '@fastgpt/service/support/permission/auth/plugin'; -import { FlowModuleTemplateType } from '@fastgpt/global/core/module/type'; +import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type'; import { authCert } from '@fastgpt/service/support/permission/auth/common'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { @@ -16,7 +16,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< const { teamId, tmbId } = await authCert({ req, authToken: true }); await authPluginCanUse({ id, teamId, tmbId }); - jsonRes(res, { + jsonRes(res, { data: await getPluginPreviewModule({ id }) }); } catch (err) { diff --git a/projects/app/src/pages/api/core/plugin/httpPlugin/getApiSchemaByUrl.ts b/projects/app/src/pages/api/core/plugin/httpPlugin/getApiSchemaByUrl.ts new file mode 100644 index 00000000000..1fb17800076 --- /dev/null +++ b/projects/app/src/pages/api/core/plugin/httpPlugin/getApiSchemaByUrl.ts @@ -0,0 +1,20 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@fastgpt/service/common/response'; +import * as SwaggerParser from '@apidevtools/swagger-parser'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + const apiURL = req.body.url as string; + + const api = await (SwaggerParser as any).validate(apiURL); + + return jsonRes(res, { + data: api + }); + } catch (err) { + jsonRes(res, { + code: 500, + error: err + }); + } +} diff --git a/projects/app/src/pages/api/core/plugin/list.ts b/projects/app/src/pages/api/core/plugin/list.ts index ec965e825cd..94f676b4a55 100644 --- a/projects/app/src/pages/api/core/plugin/list.ts +++ b/projects/app/src/pages/api/core/plugin/list.ts @@ -1,16 +1,31 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@fastgpt/service/common/response'; import { connectToDatabase } from '@/service/mongo'; +import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { authCert } from '@fastgpt/service/support/permission/auth/common'; import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; +import { PluginListItemType } from '@fastgpt/global/core/plugin/controller'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { await connectToDatabase(); + const { parentId, type } = req.query as { parentId?: string; type?: `${DatasetTypeEnum}` }; + const { teamId } = await authCert({ req, authToken: true }); - jsonRes(res, { - data: await MongoPlugin.find({ teamId }) + const plugins = await MongoPlugin.find( + { + teamId, + ...(parentId !== undefined && { parentId: parentId || null }), + ...(type && { type }) + }, + '_id parentId type name avatar intro metadata' + ) + .sort({ updateTime: -1 }) + .lean(); + + jsonRes(res, { + data: plugins }); } catch (err) { jsonRes(res, { diff --git a/projects/app/src/pages/api/core/plugin/paths.ts b/projects/app/src/pages/api/core/plugin/paths.ts new file mode 100644 index 00000000000..d25c75af447 --- /dev/null +++ b/projects/app/src/pages/api/core/plugin/paths.ts @@ -0,0 +1,46 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@fastgpt/service/common/response'; +import { connectToDatabase } from '@/service/mongo'; +import type { ParentTreePathItemType } from '@fastgpt/global/common/parentFolder/type.d'; +import { authCert } from '@fastgpt/service/support/permission/auth/common'; +import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await connectToDatabase(); + + const { parentId } = req.query as { parentId: string }; + + if (!parentId) { + return jsonRes(res, { + data: [] + }); + } + + await authCert({ req, authToken: true }); + + jsonRes(res, { + data: await getParents(parentId) + }); + } catch (err) { + jsonRes(res, { + code: 500, + error: err + }); + } +} + +async function getParents(parentId?: string): Promise { + if (!parentId) { + return []; + } + + const parent = await MongoPlugin.findById(parentId, 'name parentId'); + + if (!parent) return []; + + const paths = await getParents(parent.parentId); + paths.push({ parentId, parentName: parent.name }); + + return paths; +} diff --git a/projects/app/src/pages/api/core/plugin/pluginTemplate/getSystemPluginTemplates.ts b/projects/app/src/pages/api/core/plugin/pluginTemplate/getSystemPluginTemplates.ts new file mode 100644 index 00000000000..2eaf6331344 --- /dev/null +++ b/projects/app/src/pages/api/core/plugin/pluginTemplate/getSystemPluginTemplates.ts @@ -0,0 +1,37 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@fastgpt/service/common/response'; +import { connectToDatabase } from '@/service/mongo'; +import { authCert } from '@fastgpt/service/support/permission/auth/common'; +import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; +import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type'; +import { FlowNodeTemplateTypeEnum } from '@fastgpt/global/core/module/constants'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await connectToDatabase(); + await authCert({ req, authToken: true }); + + const data: FlowNodeTemplateType[] = + global.communityPlugins?.map((plugin) => ({ + id: plugin.id, + templateType: plugin.templateType ?? FlowNodeTemplateTypeEnum.other, + flowType: FlowNodeTypeEnum.pluginModule, + avatar: plugin.avatar, + name: plugin.name, + intro: plugin.intro, + showStatus: true, + isTool: plugin.isTool, + inputs: [], + outputs: [] + })) || []; + + jsonRes(res, { + data + }); + } catch (err) { + jsonRes(res, { + code: 500, + error: err + }); + } +} diff --git a/projects/app/src/pages/api/core/plugin/pluginTemplate/getTeamPluginTemplates.ts b/projects/app/src/pages/api/core/plugin/pluginTemplate/getTeamPluginTemplates.ts new file mode 100644 index 00000000000..c6deff26df2 --- /dev/null +++ b/projects/app/src/pages/api/core/plugin/pluginTemplate/getTeamPluginTemplates.ts @@ -0,0 +1,62 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@fastgpt/service/common/response'; +import { connectToDatabase } from '@/service/mongo'; +import { authCert } from '@fastgpt/service/support/permission/auth/common'; +import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; +import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; +import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type'; +import { FlowNodeTemplateTypeEnum } from '@fastgpt/global/core/module/constants'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await connectToDatabase(); + const { parentId, searchKey } = req.query as { parentId?: string; searchKey?: string }; + const { teamId } = await authCert({ req, authToken: true }); + + const userPlugins = await (async () => { + if (searchKey) { + return MongoPlugin.find({ + teamId, + // search name or intro + $or: [ + { name: { $regex: searchKey, $options: 'i' } }, + { intro: { $regex: searchKey, $options: 'i' } } + ] + }) + .sort({ + updateTime: -1 + }) + .lean(); + } else { + return MongoPlugin.find({ teamId, parentId: parentId || null }) + .sort({ + updateTime: -1 + }) + .lean(); + } + })(); + + const data: FlowNodeTemplateType[] = userPlugins.map((plugin) => ({ + id: String(plugin._id), + parentId: String(plugin.parentId), + pluginType: plugin.type, + templateType: FlowNodeTemplateTypeEnum.personalPlugin, + flowType: FlowNodeTypeEnum.pluginModule, + avatar: plugin.avatar, + name: plugin.name, + intro: plugin.intro, + showStatus: false, + inputs: [], + outputs: [] + })); + + jsonRes(res, { + data + }); + } catch (err) { + jsonRes(res, { + code: 500, + error: err + }); + } +} diff --git a/projects/app/src/pages/api/core/plugin/templates.ts b/projects/app/src/pages/api/core/plugin/templates.ts deleted file mode 100644 index 99d640e61cc..00000000000 --- a/projects/app/src/pages/api/core/plugin/templates.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; -import { jsonRes } from '@fastgpt/service/common/response'; -import { connectToDatabase } from '@/service/mongo'; -import { authCert } from '@fastgpt/service/support/permission/auth/common'; -import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; -import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; -import { FlowModuleTemplateType } from '@fastgpt/global/core/module/type'; -import { ModuleTemplateTypeEnum } from '@fastgpt/global/core/module/constants'; -import { GET } from '@fastgpt/service/common/api/plusRequest'; -import type { PluginTemplateType } from '@fastgpt/global/core/plugin/type.d'; -import { FastGPTProUrl } from '@fastgpt/service/common/system/constants'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - try { - await connectToDatabase(); - const { teamId } = await authCert({ req, authToken: true }); - - const [userPlugins, plusPlugins] = await Promise.all([ - MongoPlugin.find({ teamId }).lean(), - FastGPTProUrl ? GET('/core/plugin/getTemplates') : [] - ]); - - const data: FlowModuleTemplateType[] = [ - ...userPlugins.map((plugin) => ({ - id: String(plugin._id), - templateType: ModuleTemplateTypeEnum.personalPlugin, - flowType: FlowNodeTypeEnum.pluginModule, - avatar: plugin.avatar, - name: plugin.name, - intro: plugin.intro, - showStatus: false, - inputs: [], - outputs: [] - })), - ...(global.communityPlugins?.map((plugin) => ({ - id: plugin.id, - templateType: plugin.templateType ?? ModuleTemplateTypeEnum.other, - flowType: FlowNodeTypeEnum.pluginModule, - avatar: plugin.avatar, - name: plugin.name, - intro: plugin.intro, - showStatus: true, - inputs: [], - outputs: [] - })) || []) - ]; - - jsonRes(res, { - data - }); - } catch (err) { - jsonRes(res, { - code: 500, - error: err - }); - } -} diff --git a/projects/app/src/pages/api/core/plugin/update.ts b/projects/app/src/pages/api/core/plugin/update.ts index 20279c3b664..216bb9a249c 100644 --- a/projects/app/src/pages/api/core/plugin/update.ts +++ b/projects/app/src/pages/api/core/plugin/update.ts @@ -4,17 +4,37 @@ import { connectToDatabase } from '@/service/mongo'; import type { UpdatePluginParams } from '@fastgpt/global/core/plugin/controller'; import { authPluginCrud } from '@fastgpt/service/support/permission/auth/plugin'; import { MongoPlugin } from '@fastgpt/service/core/plugin/schema'; +import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun'; +import { ClientSession } from '@fastgpt/service/common/mongo'; +import { httpApiSchema2Plugins } from '@fastgpt/global/core/plugin/httpPlugin/utils'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { await connectToDatabase(); - const { id, ...props } = req.body as UpdatePluginParams; + const body = req.body as UpdatePluginParams; - await authPluginCrud({ req, authToken: true, id, per: 'owner' }); + const { id, ...props } = body; - jsonRes(res, { - data: await MongoPlugin.findByIdAndUpdate(id, props) - }); + const { teamId, tmbId } = await authPluginCrud({ req, authToken: true, id, per: 'owner' }); + + if (props.metadata?.apiSchemaStr) { + await mongoSessionRun(async (session) => { + // update children + await updateHttpChildrenPlugin({ + teamId, + tmbId, + parent: body, + session + }); + await MongoPlugin.findByIdAndUpdate(id, props, { session }); + }); + + jsonRes(res, {}); + } else { + jsonRes(res, { + data: await MongoPlugin.findByIdAndUpdate(id, props) + }); + } } catch (err) { jsonRes(res, { code: 500, @@ -22,3 +42,64 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< }); } } + +const updateHttpChildrenPlugin = async ({ + teamId, + tmbId, + parent, + session +}: { + teamId: string; + tmbId: string; + parent: UpdatePluginParams; + session: ClientSession; +}) => { + if (!parent.metadata?.apiSchemaStr) return; + const dbPlugins = await MongoPlugin.find( + { + parentId: parent.id, + teamId + }, + '_id metadata' + ); + + const schemaPlugins = httpApiSchema2Plugins({ + parentId: parent.id, + apiSchemaStr: parent.metadata?.apiSchemaStr, + customHeader: parent.metadata?.customHeaders + }); + + // 数据库中存在,schema不存在,删除 + for await (const plugin of dbPlugins) { + if (!schemaPlugins.find((p) => p.name === plugin.metadata?.pluginUid)) { + await MongoPlugin.deleteOne({ _id: plugin._id }, { session }); + } + } + // 数据库中不存在,schema存在,新增 + for await (const plugin of schemaPlugins) { + if (!dbPlugins.find((p) => p.metadata?.pluginUid === plugin.name)) { + await MongoPlugin.create( + [ + { + ...plugin, + metadata: { + pluginUid: plugin.name + }, + teamId, + tmbId + } + ], + { + session + } + ); + } + } + // 数据库中存在,schema存在,更新 + for await (const plugin of schemaPlugins) { + const dbPlugin = dbPlugins.find((p) => plugin.name === p.metadata?.pluginUid); + if (dbPlugin) { + await MongoPlugin.findByIdAndUpdate(dbPlugin._id, plugin, { session }); + } + } +}; diff --git a/projects/app/src/pages/api/v1/chat/completions.ts b/projects/app/src/pages/api/v1/chat/completions.ts index 26d432f2ec3..5dc438e90e0 100644 --- a/projects/app/src/pages/api/v1/chat/completions.ts +++ b/projects/app/src/pages/api/v1/chat/completions.ts @@ -6,7 +6,7 @@ import { addLog } from '@fastgpt/service/common/system/log'; import { withNextCors } from '@fastgpt/service/common/middle/cors'; import { ChatRoleEnum, ChatSourceEnum } from '@fastgpt/global/core/chat/constants'; import { SseResponseEventEnum } from '@fastgpt/global/core/module/runtime/constants'; -import { dispatchWorkFlow } from '@/service/moduleDispatch'; +import { dispatchWorkFlow } from '@fastgpt/service/core/workflow/dispatch'; import type { ChatCompletionCreateParams } from '@fastgpt/global/core/ai/type.d'; import type { ChatCompletionMessageParam } from '@fastgpt/global/core/ai/type.d'; import { textAdaptGptResponse } from '@fastgpt/global/core/module/runtime/utils'; @@ -32,7 +32,7 @@ import { AuthOutLinkChatProps } from '@fastgpt/global/support/outLink/api'; import { MongoChat } from '@fastgpt/service/core/chat/chatSchema'; import { ChatErrEnum } from '@fastgpt/global/common/error/code/chat'; import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; -import { setEntryEntries } from '@/service/moduleDispatch/utils'; +import { setEntryEntries } from '@fastgpt/service/core/workflow/dispatch/utils'; import { UserChatItemType } from '@fastgpt/global/core/chat/type'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/module/runtime/constants'; diff --git a/projects/app/src/pages/app/detail/components/FlowEdit/Header.tsx b/projects/app/src/pages/app/detail/components/FlowEdit/Header.tsx index 62494a689f0..d07ec28b9af 100644 --- a/projects/app/src/pages/app/detail/components/FlowEdit/Header.tsx +++ b/projects/app/src/pages/app/detail/components/FlowEdit/Header.tsx @@ -17,6 +17,7 @@ import { flowNode2Modules, filterExportModules } from '@/components/core/module/ import { useAppStore } from '@/web/core/app/store/useAppStore'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useConfirm } from '@/web/common/hooks/useConfirm'; +import { getErrText } from '@fastgpt/global/common/error/utils'; const ImportSettings = dynamic(() => import('@/components/core/module/Flow/ImportSettings')); @@ -43,6 +44,7 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({ const { isOpen: isOpenImport, onOpen: onOpenImport, onClose: onCloseImport } = useDisclosure(); const { updateAppDetail } = useAppStore(); const { nodes, edges, splitToolInputs } = useFlowProviderStore(); + const [isSaving, setIsSaving] = useState(false); const flow2ModulesAndCheck = useCallback(async () => { const modules = flowNode2Modules({ nodes, edges }); @@ -75,20 +77,45 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({ return modules; }, [edges, nodes, splitToolInputs, t, toast]); - const { mutate: onclickSave, isLoading } = useRequest({ - mutationFn: async (modules: ModuleItemType[]) => { - return updateAppDetail(app._id, { - modules: modules, - type: AppTypeEnum.advanced, - permission: undefined - }); + const onclickSave = useCallback( + async (modules: ModuleItemType[]) => { + setIsSaving(true); + try { + await updateAppDetail(app._id, { + modules: modules, + type: AppTypeEnum.advanced, + permission: undefined + }); + toast({ + status: 'success', + title: t('common.Save Success') + }); + ChatTestRef.current?.resetChatTest(); + } catch (error) { + toast({ + status: 'warning', + title: getErrText(error, t('common.Save Failed')) + }); + } + setIsSaving(false); }, - successToast: t('common.Save Success'), - errorToast: t('common.Save Failed'), - onSuccess() { - ChatTestRef.current?.resetChatTest(); + [ChatTestRef, app._id, t, toast, updateAppDetail] + ); + + const saveAndBack = useCallback(async () => { + try { + const modules = await flow2ModulesAndCheck(); + if (modules) { + await onclickSave(modules); + } + onClose(); + } catch (error) { + toast({ + status: 'warning', + title: getErrText(error) + }); } - }); + }, [flow2ModulesAndCheck, onClose, onclickSave, toast]); return ( <> @@ -109,13 +136,8 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({ borderColor={'myGray.300'} variant={'whiteBase'} aria-label={''} - onClick={openConfirmOut(async () => { - const modules = await flow2ModulesAndCheck(); - if (modules) { - await onclickSave(modules); - } - onClose(); - }, onClose)} + isLoading={isSaving} + onClick={openConfirmOut(saveAndBack, onClose)} /> {app.name} @@ -178,7 +200,7 @@ const RenderHeaderContainer = React.memo(function RenderHeaderContainer({ } size={'smSquare'} - isLoading={isLoading} + isLoading={isSaving} aria-label={'save'} onClick={async () => { const modules = await flow2ModulesAndCheck(); diff --git a/projects/app/src/pages/app/detail/components/FlowEdit/index.tsx b/projects/app/src/pages/app/detail/components/FlowEdit/index.tsx index 6f9d2d37f03..768360667f0 100644 --- a/projects/app/src/pages/app/detail/components/FlowEdit/index.tsx +++ b/projects/app/src/pages/app/detail/components/FlowEdit/index.tsx @@ -3,22 +3,25 @@ import { AppSchema } from '@fastgpt/global/core/app/type.d'; import Header from './Header'; import Flow from '@/components/core/module/Flow'; import FlowProvider, { useFlowProviderStore } from '@/components/core/module/Flow/FlowProvider'; -import type { FlowModuleTemplateType } from '@fastgpt/global/core/module/type.d'; +import type { FlowNodeTemplateType } from '@fastgpt/global/core/module/type.d'; import { appSystemModuleTemplates } from '@fastgpt/global/core/module/template/constants'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; -import { usePluginStore } from '@/web/core/plugin/store/plugin'; -import { useQuery } from '@tanstack/react-query'; +import { useWorkflowStore } from '@/web/core/workflow/store/workflow'; type Props = { app: AppSchema; onClose: () => void }; const Render = ({ app, onClose }: Props) => { const { nodes, initData } = useFlowProviderStore(); - const { pluginModuleTemplates, loadPluginTemplates } = usePluginStore(); + const { setBasicNodeTemplates } = useWorkflowStore(); - const moduleTemplates = useMemo(() => { - const concatTemplates = [...appSystemModuleTemplates, ...pluginModuleTemplates]; + useEffect(() => { + initData(JSON.parse(JSON.stringify(app.modules))); + }, [app.modules]); + + useEffect(() => { + const concatTemplates = [...appSystemModuleTemplates]; - const copyTemplates: FlowModuleTemplateType[] = JSON.parse(JSON.stringify(concatTemplates)); + const copyTemplates: FlowNodeTemplateType[] = JSON.parse(JSON.stringify(concatTemplates)); const filterType: Record = { [FlowNodeTypeEnum.userGuide]: 1 @@ -35,18 +38,12 @@ const Render = ({ app, onClose }: Props) => { } }); - return copyTemplates; - }, [nodes, pluginModuleTemplates]); - - useQuery(['getPlugTemplates'], () => loadPluginTemplates()); - - useEffect(() => { - initData(JSON.parse(JSON.stringify(app.modules))); - }, [app.modules]); + setBasicNodeTemplates(copyTemplates); + }, [nodes, setBasicNodeTemplates]); const memoRender = useMemo(() => { - return } />; - }, [app, moduleTemplates.length, onClose]); + return } />; + }, [app, onClose]); return memoRender; }; diff --git a/projects/app/src/pages/app/detail/components/InfoModal.tsx b/projects/app/src/pages/app/detail/components/InfoModal.tsx index b9e44a4e21b..8f2dca1f6f8 100644 --- a/projects/app/src/pages/app/detail/components/InfoModal.tsx +++ b/projects/app/src/pages/app/detail/components/InfoModal.tsx @@ -18,7 +18,7 @@ import { compressImgFileAndUpload } from '@/web/common/file/controller'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useRequest } from '@/web/common/hooks/useRequest'; import Avatar from '@/components/Avatar'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useAppStore } from '@/web/core/app/store/useAppStore'; import PermissionRadio from '@/components/support/permission/Radio'; import { useTranslation } from 'next-i18next'; diff --git a/projects/app/src/pages/app/detail/components/Logs.tsx b/projects/app/src/pages/app/detail/components/Logs.tsx index 1cfd4e534ac..0d00ea81da5 100644 --- a/projects/app/src/pages/app/detail/components/Logs.tsx +++ b/projects/app/src/pages/app/detail/components/Logs.tsx @@ -26,7 +26,7 @@ import type { ComponentRef } from '@/components/ChatBox/type.d'; import { useQuery } from '@tanstack/react-query'; import { getInitChatInfo } from '@/web/core/chat/api'; import Tag from '@/components/Tag'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { addDays } from 'date-fns'; import MyBox from '@/components/common/MyBox'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; diff --git a/projects/app/src/pages/app/detail/components/OutLink/SelectUsingWayModal.tsx b/projects/app/src/pages/app/detail/components/OutLink/SelectUsingWayModal.tsx index fb0b345232e..578a6cb14fc 100644 --- a/projects/app/src/pages/app/detail/components/OutLink/SelectUsingWayModal.tsx +++ b/projects/app/src/pages/app/detail/components/OutLink/SelectUsingWayModal.tsx @@ -1,6 +1,6 @@ import { OutLinkSchema } from '@fastgpt/global/support/outLink/type'; import React, { useCallback, useState } from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { Box, Flex, FlexProps, Grid, Image, ModalBody, Switch, useTheme } from '@chakra-ui/react'; import MyRadio from '@/components/common/MyRadio'; diff --git a/projects/app/src/pages/app/detail/components/OutLink/Share.tsx b/projects/app/src/pages/app/detail/components/OutLink/Share.tsx index e32264ab96e..d5f6b08558d 100644 --- a/projects/app/src/pages/app/detail/components/OutLink/Share.tsx +++ b/projects/app/src/pages/app/detail/components/OutLink/Share.tsx @@ -37,7 +37,7 @@ import { useTranslation } from 'next-i18next'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import MyTooltip from '@/components/MyTooltip'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import dayjs from 'dayjs'; import { getDocPath } from '@/web/common/system/doc'; import dynamic from 'next/dynamic'; diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/AppCard.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/AppCard.tsx index fa5e43740bb..e4ec517015c 100644 --- a/projects/app/src/pages/app/detail/components/SimpleEdit/AppCard.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/AppCard.tsx @@ -27,7 +27,8 @@ const AppCard = ({ appId }: { appId: string }) => { const [TeamTagsSet, setTeamTagsSet] = useState(); const { openConfirm: openConfirmDel, ConfirmModal: ConfirmDelModal } = useConfirm({ - content: t('app.Confirm Del App Tip') + content: t('app.Confirm Del App Tip'), + type: 'delete' }); /* 点击删除 */ diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx index 7b753bf8d80..6d7536036f7 100644 --- a/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/EditForm.tsx @@ -1,16 +1,7 @@ import React, { useMemo, useState, useTransition } from 'react'; -import { - Box, - Flex, - Grid, - BoxProps, - useTheme, - useDisclosure, - Button, - Image -} from '@chakra-ui/react'; +import { Box, Flex, Grid, BoxProps, useTheme, useDisclosure, Button } from '@chakra-ui/react'; import { useQuery } from '@tanstack/react-query'; -import { QuestionOutlineIcon, SmallAddIcon } from '@chakra-ui/icons'; +import { AddIcon, QuestionOutlineIcon, SmallAddIcon } from '@chakra-ui/icons'; import { useForm, useFieldArray } from 'react-hook-form'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { appModules2Form, getDefaultAppForm } from '@fastgpt/global/core/app/utils'; @@ -34,11 +25,13 @@ import MyTextarea from '@/components/common/Textarea/MyTextarea/index'; import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor'; import { formatEditorVariablePickerIcon } from '@fastgpt/global/core/module/utils'; import SearchParamsTip from '@/components/core/dataset/SearchParamsTip'; -import SelectAiModel from '@/components/Select/SelectAiModel'; +import SettingLLMModel from '@/components/core/ai/SettingLLMModel'; +import { SettingAIDataType } from '@fastgpt/global/core/module/node/type'; +import DeleteIcon, { hoverDeleteStyles } from '@fastgpt/web/components/common/Icon/delete'; const DatasetSelectModal = dynamic(() => import('@/components/core/module/DatasetSelectModal')); const DatasetParamsModal = dynamic(() => import('@/components/core/module/DatasetParamsModal')); -const AIChatSettingsModal = dynamic(() => import('@/components/core/module/AIChatSettingsModal')); +const ToolSelectModal = dynamic(() => import('./ToolSelectModal')); const TTSSelect = dynamic( () => import('@/components/core/module/Flow/components/modules/TTSSelect') ); @@ -56,7 +49,7 @@ const EditForm = ({ const { t } = useTranslation(); const { appDetail, updateAppDetail } = useAppStore(); const { loadAllDatasets, allDatasets } = useDatasetStore(); - const { isPc, llmModelList, reRankModelList } = useSystemStore(); + const { isPc, llmModelList } = useSystemStore(); const [refresh, setRefresh] = useState(false); const [, startTst] = useTransition(); @@ -69,12 +62,8 @@ const EditForm = ({ control, name: 'dataset.datasets' }); + const selectedTools = watch('selectedTools'); - const { - isOpen: isOpenAIChatSetting, - onOpen: onOpenAIChatSetting, - onClose: onCloseAIChatSetting - } = useDisclosure(); const { isOpen: isOpenDatasetSelect, onOpen: onOpenKbSelect, @@ -85,6 +74,11 @@ const EditForm = ({ onOpen: onOpenDatasetParams, onClose: onCloseDatasetParams } = useDisclosure(); + const { + isOpen: isOpenToolsSelect, + onOpen: onOpenToolsSelect, + onClose: onCloseToolsSelect + } = useDisclosure(); const { openConfirm: openConfirmSave, ConfirmModal: ConfirmSaveModal } = useConfirm({ content: t('core.app.edit.Confirm Save App Tip') @@ -97,12 +91,6 @@ const EditForm = ({ const formatVariables = useMemo(() => formatEditorVariablePickerIcon(variables), [variables]); const searchMode = watch('dataset.searchMode'); - const chatModelSelectList = (() => - llmModelList.map((item) => ({ - value: item.model, - label: item.name - })))(); - const selectDatasets = useMemo( () => allDatasets.filter((item) => datasets.find((dataset) => dataset.datasetId === item._id)), [allDatasets, datasets] @@ -112,6 +100,7 @@ const EditForm = ({ return llmModelList.find((item) => item.model === selectLLMModel)?.quoteMaxToken || 3000; }, [selectLLMModel, llmModelList]); + /* on save app */ const { mutate: onSubmitSave, isLoading: isSaving } = useRequest({ mutationFn: async (data: AppSimpleEditFormType) => { const modules = await postForm2Modules(data); @@ -126,7 +115,7 @@ const EditForm = ({ errorToast: t('common.Save Failed') }); - const { isSuccess: isInitd } = useQuery( + useQuery( ['init', appDetail], () => { const formatVal = appModules2Form({ @@ -148,15 +137,6 @@ const EditForm = ({ borderBottomWidth: '1px', borderBottomColor: 'borderColor.low' }; - const BoxBtnStyles: BoxProps = { - cursor: 'pointer', - px: 3, - py: 1, - borderRadius: 'md', - _hover: { - bg: 'myGray.150' - } - }; const LabelStyles: BoxProps = { w: ['60px', '100px'], flexShrink: 0, @@ -207,29 +187,6 @@ const EditForm = ({ - {/* simple mode select */} - {/* - - - {t('core.app.simple.mode template select')} - - ({ - alias: t(item.name), - label: t(item.desc), - value: item.id - })) || [] - } - value={getValues('templateId')} - onchange={(val) => { - setValue('templateId', val); - setRefresh(!refresh); - }} - /> - */} - {/* ai */} @@ -237,39 +194,36 @@ const EditForm = ({ {t('app.AI Settings')} - - - {t('common.More settings')} - {t('core.ai.Model')} - { - setValue('aiSettings.model', val); - const maxToken = - llmModelList.find((item) => item.model === getValues('aiSettings.model')) - ?.maxResponse || 4000; - const token = maxToken / 2; - setValue('aiSettings.maxToken', token); - setRefresh(!refresh); + { + setValue('aiSettings.model', model); + setValue('aiSettings.maxToken', maxToken); + setValue('aiSettings.temperature', temperature); + setValue('aiSettings.maxHistories', maxHistories ?? 6); }} /> - + {t('core.ai.Prompt')} - + - {isInitd && ( + { @@ -281,8 +235,8 @@ const EditForm = ({ placeholder={t('core.app.tip.chatNodeSystemPromptTip')} title={t('core.ai.Prompt')} /> - )} - + + {/* dataset */} @@ -292,14 +246,26 @@ const EditForm = ({ {t('core.dataset.Choose Dataset')} - - + + {getValues('dataset.datasets').length > 0 && ( @@ -309,7 +275,6 @@ const EditForm = ({ limit={getValues('dataset.limit')} usingReRank={getValues('dataset.usingReRank')} usingQueryExtension={getValues('dataset.datasetSearchUsingExtensionQuery')} - responseEmptyText={getValues('dataset.searchEmptyText')} /> )} @@ -347,6 +312,65 @@ const EditForm = ({ + {/* tool choice */} + + + + + {t('core.app.Tool call')}(实验功能) + + + + + + + 0 ? 2 : 0} + gridTemplateColumns={'repeat(2, minmax(0, 1fr))'} + gridGap={[2, 4]} + > + {selectedTools.map((item) => ( + + + + {item.name} + + { + setValue( + 'selectedTools', + selectedTools.filter((tool) => tool.id !== item.id) + ); + }} + /> + + ))} + + + {/* variable */} - {isOpenAIChatSetting && ( - { - setValue('aiSettings', e); - onCloseAIChatSetting(); - }} - defaultData={getValues('aiSettings')} - pickerMenu={formatVariables} - /> - )} {isOpenDatasetSelect && ( )} + {isOpenToolsSelect && ( + setValue('selectedTools', [...selectedTools, e])} + onRemoveTool={(e) => { + setValue( + 'selectedTools', + selectedTools.filter((item) => item.id !== e.id) + ); + }} + onClose={onCloseToolsSelect} + /> + )} ); }; diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/TagsEditModal.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/TagsEditModal.tsx index 445551eed1b..6b88b84bcc8 100644 --- a/projects/app/src/pages/app/detail/components/SimpleEdit/TagsEditModal.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/TagsEditModal.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { Button, diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/ToolSelectModal.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/ToolSelectModal.tsx new file mode 100644 index 00000000000..6fe11adcde6 --- /dev/null +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/ToolSelectModal.tsx @@ -0,0 +1,270 @@ +import React, { useMemo, useState } from 'react'; + +import MyModal from '@fastgpt/web/components/common/MyModal'; +import { useTranslation } from 'next-i18next'; +import { + Box, + Button, + Flex, + Input, + InputGroup, + InputLeftElement, + ModalBody +} from '@chakra-ui/react'; +import RowTabs from '@fastgpt/web/components/common/Tabs/RowTabs'; +import { useWorkflowStore } from '@/web/core/workflow/store/workflow'; +import { useRequest } from '@/web/common/hooks/useRequest'; +import { useQuery } from '@tanstack/react-query'; +import EmptyTip from '@/components/EmptyTip'; +import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type'; +import { useToast } from '@fastgpt/web/hooks/useToast'; +import Avatar from '@/components/Avatar'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import { AddIcon } from '@chakra-ui/icons'; +import { getPreviewPluginModule } from '@/web/core/plugin/api'; +import MyBox from '@/components/common/MyBox'; +import { FlowNodeInputTypeEnum } from '@fastgpt/global/core/module/node/constant'; +import { ModuleInputKeyEnum } from '@fastgpt/global/core/module/constants'; +import ParentPaths from '@/components/common/ParentPaths'; +import { PluginTypeEnum } from '@fastgpt/global/core/plugin/constants'; +import { debounce } from 'lodash'; + +type Props = { + selectedTools: FlowNodeTemplateType[]; + onAddTool: (tool: FlowNodeTemplateType) => void; + onRemoveTool: (tool: FlowNodeTemplateType) => void; +}; + +enum TemplateTypeEnum { + 'systemPlugin' = 'systemPlugin', + 'teamPlugin' = 'teamPlugin' +} + +const ToolSelectModal = ({ onClose, ...props }: Props & { onClose: () => void }) => { + const { t } = useTranslation(); + const { + systemNodeTemplates, + loadSystemNodeTemplates, + teamPluginNodeTemplates, + loadTeamPluginNodeTemplates + } = useWorkflowStore(); + + const [templateType, setTemplateType] = useState(TemplateTypeEnum.teamPlugin); + const [currentParent, setCurrentParent] = useState<{ + parentId: string; + parentName: string; + }>(); + const [searchKey, setSearchKey] = useState(''); + + const templates = useMemo(() => { + const map = { + [TemplateTypeEnum.systemPlugin]: systemNodeTemplates.filter( + (item) => item.isTool && item.name.toLowerCase().includes(searchKey.toLowerCase()) + ), + [TemplateTypeEnum.teamPlugin]: teamPluginNodeTemplates.filter((item) => + searchKey ? item.pluginType !== PluginTypeEnum.folder : true + ) + }; + return map[templateType]; + }, [searchKey, systemNodeTemplates, teamPluginNodeTemplates, templateType]); + + const { mutate: onChangeTab } = useRequest({ + mutationFn: async (e: any) => { + const val = e as TemplateTypeEnum; + if (val === TemplateTypeEnum.systemPlugin) { + await loadSystemNodeTemplates(); + } else if (val === TemplateTypeEnum.teamPlugin) { + await loadTeamPluginNodeTemplates({ + parentId: currentParent?.parentId + }); + } + setTemplateType(val); + }, + errorToast: t('core.module.templates.Load plugin error') + }); + + const { isLoading } = useQuery(['teamNodeTemplate', currentParent?.parentId, searchKey], () => + loadTeamPluginNodeTemplates({ + parentId: currentParent?.parentId, + searchKey, + init: true + }) + ); + + return ( + + + + + + + + setSearchKey(e.target.value), 200)} + /> + + + {templateType === TemplateTypeEnum.teamPlugin && !searchKey && currentParent && ( + + { + setCurrentParent(undefined); + }} + fontSize="md" + /> + + )} + + + + + ); +}; + +export default React.memo(ToolSelectModal); + +const RenderList = React.memo(function RenderList({ + templates, + selectedTools, + isLoadingData, + onAddTool, + onRemoveTool, + setCurrentParent +}: Props & { + templates: FlowNodeTemplateType[]; + isLoadingData: boolean; + setCurrentParent: (e: { parentId: string; parentName: string }) => void; +}) { + const { t } = useTranslation(); + const { toast } = useToast(); + + const { mutate: onClickAdd, isLoading } = useRequest({ + mutationFn: async (template: FlowNodeTemplateType) => { + const res = await getPreviewPluginModule(template.id); + + // check inputs valid + for (const input of res.inputs) { + if ( + [ + ModuleInputKeyEnum.switch, + ModuleInputKeyEnum.pluginStart, + ModuleInputKeyEnum.pluginId + ].includes(input.key as any) + ) { + continue; + } + + if (!input.toolDescription) { + return toast({ + status: 'warning', + title: t('core.app.ToolCall.This plugin cannot be called as a tool') + }); + } + } + return res; + }, + onSuccess(res: FlowNodeTemplateType) { + res && onAddTool(res); + }, + errorToast: t('core.module.templates.Load plugin error') + }); + + return templates.length === 0 && !isLoadingData ? ( + + ) : ( + + {templates.map((item, i) => { + const selected = !!selectedTools.find((tool) => tool.id === item.id); + return ( + + + + {t(item.name)} + + {t(item.intro)} + + + {selected ? ( + + ) : item.pluginType === PluginTypeEnum.folder ? ( + + ) : ( + + )} + + ); + })} + + ); +}); diff --git a/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx b/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx index 3ae2bdc319f..00a5f5d67be 100644 --- a/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleEdit/index.tsx @@ -12,7 +12,7 @@ const SimpleEdit = ({ appId }: { appId: string }) => { const { parentRef, divRef, isSticky } = useSticky(); return ( - + { const setCurrentTab = useCallback( (tab: `${TabEnum}`) => { - router.replace({ + router.push({ query: { - appId, + ...router.query, currentTab: tab } }); }, - [appId, router] + [router] ); const tabList = useMemo( diff --git a/projects/app/src/pages/app/list/component/CreateModal.tsx b/projects/app/src/pages/app/list/component/CreateModal.tsx index fa3039bd6b5..a2b236ddac3 100644 --- a/projects/app/src/pages/app/list/component/CreateModal.tsx +++ b/projects/app/src/pages/app/list/component/CreateModal.tsx @@ -26,7 +26,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest } from '@/web/common/hooks/useRequest'; import Avatar from '@/components/Avatar'; import MyTooltip from '@/components/MyTooltip'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; diff --git a/projects/app/src/pages/chat/team.tsx b/projects/app/src/pages/chat/team.tsx index 290f5f4b4d0..3cd9a741050 100644 --- a/projects/app/src/pages/chat/team.tsx +++ b/projects/app/src/pages/chat/team.tsx @@ -36,19 +36,23 @@ import MyBox from '@/components/common/MyBox'; import SliderApps from './components/SliderApps'; import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt'; -const OutLink = ({ - teamId, - appId, - chatId, - teamToken -}: { - teamId: string; - appId: string; - chatId: string; - teamToken: string; -}) => { +const OutLink = () => { const { t } = useTranslation(); const router = useRouter(); + const { + teamId = '', + appId = '', + chatId = '', + teamToken, + ...customVariables + } = router.query as { + teamId: string; + appId: string; + chatId: string; + teamToken: string; + [key: string]: string; + }; + const { toast } = useToast(); const theme = useTheme(); const { isPc } = useSystemStore(); @@ -78,7 +82,10 @@ const OutLink = ({ const { responseText, responseData } = await streamFetch({ data: { messages: prompts, - variables, + variables: { + ...customVariables, + ...variables + }, appId, teamId, teamToken, @@ -372,17 +379,8 @@ const OutLink = ({ }; export async function getServerSideProps(context: any) { - const teamId = context?.query?.teamId || ''; - const appId = context?.query?.appId || ''; - const chatId = context?.query?.chatId || ''; - const teamToken: string = context?.query?.teamToken || ''; - return { props: { - teamId, - appId, - chatId, - teamToken, ...(await serviceSideProps(context)) } }; diff --git a/projects/app/src/pages/dataset/component/EditFolderModal.tsx b/projects/app/src/pages/dataset/component/EditFolderModal.tsx index 6264d6a25e9..d3bbf04ff3e 100644 --- a/projects/app/src/pages/dataset/component/EditFolderModal.tsx +++ b/projects/app/src/pages/dataset/component/EditFolderModal.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useRef, useState } from 'react'; import { ModalFooter, ModalBody, Input, Button } from '@chakra-ui/react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useRequest } from '@/web/common/hooks/useRequest'; diff --git a/projects/app/src/pages/dataset/detail/components/Import/Provider.tsx b/projects/app/src/pages/dataset/detail/components/Import/Provider.tsx index 2d9b62f2c9a..05534263d3e 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/Provider.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/Provider.tsx @@ -4,7 +4,7 @@ import { splitText2Chunks } from '@fastgpt/global/common/string/textSplitter'; import { TrainingModeEnum } from '@fastgpt/global/core/dataset/constants'; import { useTranslation } from 'next-i18next'; import { DatasetItemType } from '@fastgpt/global/core/dataset/type'; -import { Prompt_AgentQA } from '@/global/core/prompt/agent'; +import { Prompt_AgentQA } from '@fastgpt/global/core/ai/prompt/agent'; import { UseFormReturn, useForm } from 'react-hook-form'; import { ImportProcessWayEnum } from '@/web/core/dataset/constants'; import { ImportSourceItemType } from '@/web/core/dataset/type'; diff --git a/projects/app/src/pages/dataset/detail/components/Import/WebsiteConfig.tsx b/projects/app/src/pages/dataset/detail/components/Import/WebsiteConfig.tsx index 217c9275bc8..777fb5eca69 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/WebsiteConfig.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/WebsiteConfig.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { Box, Button, Input, Link, ModalBody, ModalFooter } from '@chakra-ui/react'; import { strIsLink } from '@fastgpt/global/common/string/tools'; diff --git a/projects/app/src/pages/dataset/detail/components/Import/commonProgress/DataProcess.tsx b/projects/app/src/pages/dataset/detail/components/Import/commonProgress/DataProcess.tsx index 74448e7fa8c..1dc7700044b 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/commonProgress/DataProcess.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/commonProgress/DataProcess.tsx @@ -23,8 +23,8 @@ import MyTooltip from '@/components/MyTooltip'; import { useImportStore } from '../Provider'; import Tag from '@/components/Tag'; import { useSystemStore } from '@/web/common/system/useSystemStore'; -import MyModal from '@/components/MyModal'; -import { Prompt_AgentQA } from '@/global/core/prompt/agent'; +import MyModal from '@fastgpt/web/components/common/MyModal'; +import { Prompt_AgentQA } from '@fastgpt/global/core/ai/prompt/agent'; import Preview from '../components/Preview'; function DataProcess({ diff --git a/projects/app/src/pages/dataset/detail/components/Import/commonProgress/PreviewData.tsx b/projects/app/src/pages/dataset/detail/components/Import/commonProgress/PreviewData.tsx index 52f9e7df004..4f6dccfda56 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/commonProgress/PreviewData.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/commonProgress/PreviewData.tsx @@ -13,7 +13,6 @@ const PreviewData = ({ }) => { const { t } = useTranslation(); const { sources, setSources } = useImportStore(); - console.log(sources); return ( diff --git a/projects/app/src/pages/dataset/detail/components/Import/components/PreviewRawText.tsx b/projects/app/src/pages/dataset/detail/components/Import/components/PreviewRawText.tsx index 68aa4d6de80..d98c386e112 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/components/PreviewRawText.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/components/PreviewRawText.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { ModalBody } from '@chakra-ui/react'; export type PreviewRawTextProps = { diff --git a/projects/app/src/pages/dataset/detail/components/Import/sourceSelector/FileSourceSelector.tsx b/projects/app/src/pages/dataset/detail/components/Import/sourceSelector/FileSourceSelector.tsx index 4fc875902b0..e30bab2407e 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/sourceSelector/FileSourceSelector.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/sourceSelector/FileSourceSelector.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { ModalBody, ModalFooter, Button } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import LeftRadio from '@fastgpt/web/components/common/Radio/LeftRadio'; diff --git a/projects/app/src/pages/dataset/detail/components/Info.tsx b/projects/app/src/pages/dataset/detail/components/Info.tsx index 3182d2423e0..3bf1ce9bf42 100644 --- a/projects/app/src/pages/dataset/detail/components/Info.tsx +++ b/projects/app/src/pages/dataset/detail/components/Info.tsx @@ -17,6 +17,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest } from '@/web/common/hooks/useRequest'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; import MySelect from '@fastgpt/web/components/common/MySelect'; +import AIModelSelector from '@/components/Select/AIModelSelector'; const Info = ({ datasetId }: { datasetId: string }) => { const { t } = useTranslation(); @@ -137,7 +138,7 @@ const Info = ({ datasetId }: { datasetId: string }) => { {t('core.ai.model.Dataset Agent Model')} - ({ diff --git a/projects/app/src/pages/dataset/detail/components/InputDataModal.tsx b/projects/app/src/pages/dataset/detail/components/InputDataModal.tsx index d857cd80d9b..756440c92ae 100644 --- a/projects/app/src/pages/dataset/detail/components/InputDataModal.tsx +++ b/projects/app/src/pages/dataset/detail/components/InputDataModal.tsx @@ -10,7 +10,7 @@ import { } from '@/web/core/dataset/api'; import { useToast } from '@fastgpt/web/hooks/useToast'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import MyTooltip from '@/components/MyTooltip'; import { QuestionOutlineIcon } from '@chakra-ui/icons'; import { useQuery } from '@tanstack/react-query'; @@ -250,7 +250,7 @@ const InputDataModal = ({ return openConfirm(onDeleteData)(); } if (e === TabEnum.doc) { - return window.open(getDocPath('/docs/use-cases/datasetengine'), '_blank'); + return window.open(getDocPath('/docs/course/datasetengine'), '_blank'); } setCurrentTab(e); }} diff --git a/projects/app/src/pages/dataset/detail/components/Test.tsx b/projects/app/src/pages/dataset/detail/components/Test.tsx index 223dc27cb22..bb72da3697a 100644 --- a/projects/app/src/pages/dataset/detail/components/Test.tsx +++ b/projects/app/src/pages/dataset/detail/components/Test.tsx @@ -54,7 +54,6 @@ type FormType = { similarity?: number; limit?: number; usingReRank?: boolean; - searchEmptyText?: string; datasetSearchUsingExtensionQuery?: boolean; datasetSearchExtensionModel?: string; datasetSearchExtensionBg?: string; diff --git a/projects/app/src/pages/dataset/list/component/CreateModal.tsx b/projects/app/src/pages/dataset/list/component/CreateModal.tsx index f391c88a516..b7cb21a355a 100644 --- a/projects/app/src/pages/dataset/list/component/CreateModal.tsx +++ b/projects/app/src/pages/dataset/list/component/CreateModal.tsx @@ -10,7 +10,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest } from '@/web/common/hooks/useRequest'; import Avatar from '@/components/Avatar'; import MyTooltip from '@/components/MyTooltip'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { postCreateDataset } from '@/web/core/dataset/api'; import type { CreateDatasetParams } from '@/global/core/dataset/api.d'; import { useTranslation } from 'next-i18next'; @@ -19,6 +19,7 @@ import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; import { QuestionOutlineIcon } from '@chakra-ui/icons'; import MySelect from '@fastgpt/web/components/common/MySelect'; +import AIModelSelector from '@/components/Select/AIModelSelector'; const CreateModal = ({ onClose, parentId }: { onClose: () => void; parentId?: string }) => { const { t } = useTranslation(); @@ -162,7 +163,7 @@ const CreateModal = ({ onClose, parentId }: { onClose: () => void; parentId?: st - ({ @@ -181,7 +182,7 @@ const CreateModal = ({ onClose, parentId }: { onClose: () => void; parentId?: st {t('core.ai.model.Dataset Agent Model')} - ({ diff --git a/projects/app/src/pages/dataset/list/component/MoveModal.tsx b/projects/app/src/pages/dataset/list/component/MoveModal.tsx index 95f5cf47085..c81245688ee 100644 --- a/projects/app/src/pages/dataset/list/component/MoveModal.tsx +++ b/projects/app/src/pages/dataset/list/component/MoveModal.tsx @@ -12,7 +12,7 @@ import { } from '@chakra-ui/react'; import Avatar from '@/components/Avatar'; import MyTooltip from '@/components/MyTooltip'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { useTranslation } from 'next-i18next'; diff --git a/projects/app/src/pages/dataset/list/index.tsx b/projects/app/src/pages/dataset/list/index.tsx index ecae81d012c..5e269e3af61 100644 --- a/projects/app/src/pages/dataset/list/index.tsx +++ b/projects/app/src/pages/dataset/list/index.tsx @@ -28,12 +28,8 @@ import Avatar from '@/components/Avatar'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { serviceSideProps } from '@/web/common/utils/i18n'; import dynamic from 'next/dynamic'; -import { - DatasetTypeEnum, - DatasetTypeMap, - FolderIcon, - FolderImgUrl -} from '@fastgpt/global/core/dataset/constants'; +import { DatasetTypeEnum, DatasetTypeMap } from '@fastgpt/global/core/dataset/constants'; +import { FolderImgUrl, FolderIcon } from '@fastgpt/global/common/file/image/constants'; import MyMenu from '@/components/MyMenu'; import { useRequest } from '@/web/common/hooks/useRequest'; import { useSystemStore } from '@/web/common/system/useSystemStore'; diff --git a/projects/app/src/pages/plugin/edit/Header.tsx b/projects/app/src/pages/plugin/edit/Header.tsx index d0cc4f8d70f..310fa179cca 100644 --- a/projects/app/src/pages/plugin/edit/Header.tsx +++ b/projects/app/src/pages/plugin/edit/Header.tsx @@ -13,6 +13,7 @@ import { putUpdatePlugin } from '@/web/core/plugin/api'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import { ModuleItemType } from '@fastgpt/global/core/module/type'; import { useToast } from '@fastgpt/web/hooks/useToast'; +import { ModuleOutputKeyEnum } from '@fastgpt/global/core/module/constants'; const ImportSettings = dynamic(() => import('@/components/core/module/Flow/ImportSettings')); const PreviewPlugin = dynamic(() => import('./Preview')); @@ -41,7 +42,12 @@ const Header = ({ plugin, onClose }: Props) => { item.inputs.forEach((item) => { item.connected = true; }); - if (item.outputs.find((output) => output.targets.length === 0)) { + if ( + item.outputs.find( + (output) => + output.key !== ModuleOutputKeyEnum.pluginStart && output.targets.length === 0 + ) + ) { toast({ status: 'warning', title: t('module.Plugin input must connect') diff --git a/projects/app/src/pages/plugin/edit/Preview.tsx b/projects/app/src/pages/plugin/edit/Preview.tsx index f9e43d1b621..672b5bd1b61 100644 --- a/projects/app/src/pages/plugin/edit/Preview.tsx +++ b/projects/app/src/pages/plugin/edit/Preview.tsx @@ -4,7 +4,7 @@ import { FlowModuleItemType, ModuleItemType } from '@fastgpt/global/core/module/ import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import dynamic from 'next/dynamic'; import { plugin2ModuleIO } from '@fastgpt/global/core/module/utils'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { Box } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { PluginItemSchema } from '@fastgpt/global/core/plugin/type'; diff --git a/projects/app/src/pages/plugin/edit/index.tsx b/projects/app/src/pages/plugin/edit/index.tsx index c5470c3d873..af1f3f05305 100644 --- a/projects/app/src/pages/plugin/edit/index.tsx +++ b/projects/app/src/pages/plugin/edit/index.tsx @@ -3,7 +3,7 @@ import { useRouter } from 'next/router'; import Header from './Header'; import Flow from '@/components/core/module/Flow'; import FlowProvider, { useFlowProviderStore } from '@/components/core/module/Flow/FlowProvider'; -import { FlowModuleTemplateType } from '@fastgpt/global/core/module/type.d'; +import { FlowNodeTemplateType } from '@fastgpt/global/core/module/type.d'; import { pluginSystemModuleTemplates } from '@fastgpt/global/core/module/template/constants'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/module/node/constant'; import { serviceSideProps } from '@/web/common/utils/i18n'; @@ -13,7 +13,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast'; import Loading from '@fastgpt/web/components/common/MyLoading'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useTranslation } from 'next-i18next'; -import { usePluginStore } from '@/web/core/plugin/store/plugin'; +import { useWorkflowStore } from '@/web/core/workflow/store/workflow'; type Props = { pluginId: string }; @@ -22,13 +22,30 @@ const Render = ({ pluginId }: Props) => { const router = useRouter(); const { toast } = useToast(); const { nodes, initData } = useFlowProviderStore(); - const { pluginModuleTemplates, loadPluginTemplates } = usePluginStore(); + const { setBasicNodeTemplates } = useWorkflowStore(); - const moduleTemplates = useMemo(() => { - const pluginTemplates = pluginModuleTemplates.filter((item) => item.id !== pluginId); - const concatTemplates = [...pluginSystemModuleTemplates, ...pluginTemplates]; + const { data: pluginDetail } = useQuery( + ['getOnePlugin', pluginId], + () => getOnePlugin(pluginId), + { + onError: (error) => { + toast({ + status: 'warning', + title: getErrText(error, t('plugin.Load Plugin Failed')) + }); + router.replace('/plugin/list'); + } + } + ); + + useEffect(() => { + initData(JSON.parse(JSON.stringify(pluginDetail?.modules || []))); + }, [pluginDetail?.modules]); + + useEffect(() => { + const concatTemplates = [...pluginSystemModuleTemplates]; - const copyTemplates: FlowModuleTemplateType[] = JSON.parse(JSON.stringify(concatTemplates)); + const copyTemplates: FlowNodeTemplateType[] = JSON.parse(JSON.stringify(concatTemplates)); const filterType: Record = { [FlowNodeTypeEnum.userGuide]: 1, @@ -52,34 +69,11 @@ const Render = ({ pluginId }: Props) => { template.inputs = template.inputs.filter((input) => !input.hideInPlugin); }); - return copyTemplates; - }, [nodes, pluginId, pluginModuleTemplates]); - - const { data: pluginDetail } = useQuery( - ['getOnePlugin', pluginId], - () => getOnePlugin(pluginId), - { - onError: (error) => { - toast({ - status: 'warning', - title: getErrText(error, t('plugin.Load Plugin Failed')) - }); - router.replace('/plugin/list'); - } - } - ); - - useQuery(['getPlugTemplates'], () => loadPluginTemplates()); - - useEffect(() => { - initData(JSON.parse(JSON.stringify(pluginDetail?.modules || []))); - }, [pluginDetail?.modules]); + setBasicNodeTemplates(copyTemplates); + }, [nodes, setBasicNodeTemplates]); return pluginDetail ? ( - router.back()} />} - /> + router.back()} />} /> ) : ( ); diff --git a/projects/app/src/pages/plugin/list/component/EditModal.tsx b/projects/app/src/pages/plugin/list/component/EditModal.tsx index f30ea0f8a6d..8767e4d267c 100644 --- a/projects/app/src/pages/plugin/list/component/EditModal.tsx +++ b/projects/app/src/pages/plugin/list/component/EditModal.tsx @@ -11,22 +11,23 @@ import { useRequest } from '@/web/common/hooks/useRequest'; import { delOnePlugin, postCreatePlugin, putUpdatePlugin } from '@/web/core/plugin/api'; import Avatar from '@/components/Avatar'; import MyTooltip from '@/components/MyTooltip'; -import MyModal from '@/components/MyModal'; +import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { useConfirm } from '@/web/common/hooks/useConfirm'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import { CreateOnePluginParams } from '@fastgpt/global/core/plugin/controller'; import { customAlphabet } from 'nanoid'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; +import { PluginTypeEnum } from '@fastgpt/global/core/plugin/constants'; +import { useWorkflowStore } from '@/web/core/workflow/store/workflow'; +import { EditFormType } from './type'; const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12); -export type FormType = CreateOnePluginParams & { - id?: string; -}; -export const defaultForm: FormType = { +export const defaultForm: EditFormType = { avatar: '/icon/logo.svg', name: '', intro: '', + parentId: null, + type: PluginTypeEnum.custom, modules: [ { moduleId: nanoid(), @@ -63,7 +64,7 @@ const CreateModal = ({ onSuccess, onDelete }: { - defaultValue?: FormType; + defaultValue?: EditFormType; onClose: () => void; onSuccess: () => void; onDelete: () => void; @@ -72,14 +73,17 @@ const CreateModal = ({ const [refresh, setRefresh] = useState(false); const { toast } = useToast(); const router = useRouter(); + const { parentId } = router.query as { parentId: string }; + const { isPc } = useSystemStore(); + const { loadTeamPluginNodeTemplates } = useWorkflowStore(); const { openConfirm, ConfirmModal } = useConfirm({ title: t('common.Delete Tip'), content: t('plugin.Confirm Delete') }); - const { register, setValue, getValues, handleSubmit } = useForm({ - defaultValues: defaultValue + const { register, setValue, getValues, handleSubmit } = useForm({ + defaultValues: { ...defaultValue, parentId: parentId || null } }); const { File, onOpen: onOpenSelectFile } = useSelectFile({ @@ -111,19 +115,20 @@ const CreateModal = ({ ); const { mutate: onclickCreate, isLoading: creating } = useRequest({ - mutationFn: async (data: FormType) => { + mutationFn: async (data: EditFormType) => { return postCreatePlugin(data); }, onSuccess(id: string) { router.push(`/plugin/edit?pluginId=${id}`); onSuccess(); onClose(); + loadTeamPluginNodeTemplates(); }, successToast: t('common.Create Success'), errorToast: t('common.Create Failed') }); const { mutate: onclickUpdate, isLoading: updating } = useRequest({ - mutationFn: async (data: FormType) => { + mutationFn: async (data: EditFormType) => { if (!data.id) return Promise.resolve(''); // @ts-ignore return putUpdatePlugin(data); @@ -163,34 +168,41 @@ const CreateModal = ({ isCentered={!isPc} > - - {t('plugin.Set Name')} - - - - + + {t('plugin.Set Name')} + + + + + + - - - + + {t('plugin.Intro')} -