diff --git a/README.md b/README.md index 227cfc56c..09a7b84e8 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 587b8a539..29bdf0b9a 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 000000000..d9986a6d6 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 000000000..4b3f97e06 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 000000000..bcc8c633c 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 000000000..a2be0bea1 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 000000000..1109cfc5e 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 000000000..ce8d27817 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 000000000..4e9717643 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 000000000..0ff1d38c0 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 000000000..f57c988f2 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 000000000..4aed354c7 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 000000000..54b16374f 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 000000000..a6f00cfbe 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 000000000..635371b1a 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 000000000..bcccfc366 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 000000000..7c3720186 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 000000000..c97f208c4 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 000000000..cae83ba62 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 000000000..a898f5832 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 cf9733d48..c1da9dd25 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 378de2eb2..ae3d8c1d7 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 26f672381..9b867041e 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 d76e3c312..dbbb16c21 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 62088eb5f..847261d9f 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 f1c6be3ed..12b22c2ba 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没有权限; -## 本地开发问题 +### 首次部署,root用户提示未注册 -### 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` +没有启动 Mongo 副本集模式。 diff --git a/docSite/content/docs/development/intro.md b/docSite/content/docs/development/intro.md index 1fafe864f..635181c8d 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 4b1a14218..30e15d967 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 512b669d8..420eac63e 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 dc494d84d..d98acfeee 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 000000000..a3c8f3c22 --- /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 a79c32bd7..165421f2e 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 3ba187c82..80674304a 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 4c0a32767..e306e54c6 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 540404822..74e0549a0 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 643d6c21b..3e5b30cdf 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 0e6291ea9..04ff3ea1d 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 3d9efaa28..16210cef4 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 ea2a18f80..7fb9e937c 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 5e8efa9ca..2f7894fa4 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 e7917f37f..d508d6062 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 6bba1ad28..8c75c3ad2 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 f8b24f219..8a3c3de02 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 31320e9d4..4e9709fb2 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 453303f43..ee3d1ef34 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 211daef3e..8ab87b390 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 c744c0fc8..bd89bc825 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 7ed7eee79..bc48dfddc 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 2bf5c9ed1..8dcabaacf 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 9f8760979..e2e4507f0 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 a643e0b50..2a684bead 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 b01454672..288e87fd9 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 2e4c673a0..5126fb24d 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', + type: FlowNodeTemplateTypeEnum.userGuide, + label: '', list: [] }, { - type: ModuleTemplateTypeEnum.systemInput, - label: 'core.module.template.System input module', - 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 32e278798..16e5bb8d3 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 ad3d44bf6..3b991a59d 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 d652a89f7..d5b9ab3a6 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 a902a70dc..6fbf04643 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 af0d26a35..0f733c895 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 003e2fa8b..fa444ad7a 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 0d64bc6e9..ec929b522 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 d61306d58..b831de62d 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 d86e5e13f..3d556583f 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 273c1f29c..4e8384ee9 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 8017bb879..b2f46e99c 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 e33e3ecb2..c5180b711 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 3c6976e4f..eca1420fb 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 988901675..77a9802dc 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 000000000..c14f610df --- /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 73175b7b4..fc1bc3ca3 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 b0ab56517..b3b6507fc 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 bab65955f..abbbeae50 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 349938169..3d8122aab 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 107abd714..012fdb0a6 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 35d07e46d..1011e18cf 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 4e1d7c7d2..155aa6148 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 000000000..857947dad --- /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 000000000..c71878722 --- /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 bec98a799..e35722315 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 bfc0b52f4..79d286b0a 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 6ca361c01..b9d6b7d9c 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 000000000..fbe6338e1 --- /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 89c3089f6..d3e5e0cc7 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 daa022677..ad551ef56 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 6b16fca39..5564b7c04 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 680ff639e..da36515c4 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 5ced9f110..b7f56a6ae 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 0dba217b7..93c5f96b7 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 67db3f8ec..baaa13210 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 52badd16a..1c7c55eee 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 000000000..4d42bbe0c --- /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 2ed81b435..612202454 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 66662da88..96610bb7a 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 18e59fa8c..b7fa546a7 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 48f94a65e..0de5c481e 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 97b5e5e3f..9fa242615 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 a76fe551b..ba08e7e88 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: `我正在执行一个函数,需要你提供一些参数,请以 JSON 字符串格式返回这些参数,要求: +""" +${description ? `- ${description}` : ''} +- 不是每个参数都是必须生成的,如果没有合适的参数值,不要生成该参数,或返回空字符串。 +- 需要结合前面的对话内容,一起生成合适的参数。 +""" - 当前问题: "${content}"` +本次输入内容: ${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 000000000..1a91b5f84 --- /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 50dbbd538..e6532cd82 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 ea8ab49d1..18862e5dc 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 000000000..9c9f5942a --- /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 000000000..4edb7c7ac --- /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 49323e15c..c2b4e0192 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 e6b9e3cab..6eb4375a6 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 61f12b1e1..ae043a155 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 5a4682457..11eecdc1d 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 54e41c006..c4cd78bbe 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 c766c6c38..e74b08e2c 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 03138bcb2..e70045aac 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 08bd33a1f..cf41ad8e4 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 6600df543..011f63596 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 000000000..6c1ee754f --- /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 000000000..85c18d1dd --- /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 000000000..5da1c6dc6 --- /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 000000000..237177f62 --- /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 000000000..3023552ad --- /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 b6f06e702..dfa28e8cd 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 2e42b1b12..cc00ca9ef 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 f9b3c1dc2..4cf2f42b2 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 000000000..c2a7b81e4 --- /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 339e534d2..9246836d7 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 f7142e58f..7b2d1ce66 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 e8ef45529..2c87bcfd1 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 4e9df22ba..7cf6541b0 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==} + /@mongodb-js/saslprep@1.1.5: + resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} + requiresBuild: true dependencies: - '@motionone/easing': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - tslib: 2.6.2 + sparse-bitfield: 3.0.3 dev: false + optional: true - /@motionone/dom@10.17.0: - resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} + /@napi-rs/wasm-runtime@0.1.1: + resolution: {integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==} + requiresBuild: true 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==} - 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==} - dev: false - - /@motionone/utils@10.17.0: - resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} - 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 + + /@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 - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.24.0): + /@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: - type-fest: 0.21.3 + 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: 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,21 +6758,69 @@ 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==} + /es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + 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 + 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 + 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-define-property@1.0.0: @@ -6418,14 +6833,13 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - /es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} dependencies: - asynciterator.prototype: 1.0.0 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-set-tostringtag: 2.0.3 function-bind: 1.1.2 @@ -6436,7 +6850,14 @@ packages: has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 + dev: 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 /es-set-tostringtag@2.0.3: @@ -6445,13 +6866,13 @@ packages: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 dev: true /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /es-to-primitive@1.2.1: @@ -6463,216 +6884,6 @@ packages: 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 - 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 - dev: true - optional: true - - /esbuild-windows-64@0.15.18: - resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-arm64@0.15.18: - resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - 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 - dev: true - /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -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,28 +7772,38 @@ packages: dev: false optional: true - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: true - - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: true - - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + /hast-util-from-dom@4.2.0: + resolution: {integrity: sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==} + dependencies: + hastscript: 7.2.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-html-isomorphic@1.0.0: + resolution: {integrity: sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==} + dependencies: + '@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==} dependencies: @@ -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,6 +9723,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -9457,19 +9737,13 @@ packages: p-limit: 3.1.0 dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - /packet-reader@1.0.0: resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} dev: false /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@8.10.0: - resolution: {integrity: sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==} + /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.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 e8003eadd..a91fdb55c 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 b1b1567e1..dc288f365 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 f71ebadd4..cac505685 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 2658e75c6..3a8f0e2a8 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 2b807eca3..7f805f282 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 cc18023bb..000000000 --- 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 51c53bb5d..1be8f9f5c 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 7bd770887..6c2f304e6 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 f721d5fdb..000000000 --- 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 000000000..f16848e0a --- /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 000000000..eee824cb8 --- /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 000000000..95e714e81 --- /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 000000000..ca91863f6 --- /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 000000000..d36954208 --- /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 000000000..aa4e41e20 --- /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 000000000..eeca4abc2 --- /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 000000000..dc90972d9 --- /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 000000000..3d9a934f1 --- /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 000000000..06372ab65 --- /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 000000000..814dcf078 --- /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 c40bcdb6e..1f146cc65 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 8b4b9ee5c..dcd232e38 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 42a2ebcc5..45767d3d3 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 91cfe92c9..721cbd96f 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 b05f11581..3915e14bf 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 b6a6dd7f6..4ad5ded0d 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 7ff0ee333..633353472 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 c5224c505..baefb2f89 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 31f9792eb..024f2714a 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 8fac62843..ad2741178 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 25e197c84..e53780206 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 d02e6029e..1262318b9 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 46daffb7a..ef0f733f9 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 108903776..46e38b14f 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 000000000..5b3d58703 --- /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 222e9a506..000000000 --- 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 6f296b30a..fd46ea788 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 561ce270a..b18d24ee4 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 000000000..e206752ca --- /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 991031dd1..04c7eb225 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 ceb936767..65e829567 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 09183e9f2..000000000 --- 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 a06122a31..75edb45fc 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 271788081..b8e1b2e87 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 ee13108e1..58bae427e 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 42a406533..540acf2cd 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 1a4868f79..9733c23dc 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 ec83f551d..0f62ac795 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 c5e03e796..3893d7a55 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 c85c0f581..d9707f410 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 e0bda0989..41460d707 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 6018b59af..ef2595fd1 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 c6652a044..b2856ad34 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, - forbidMenu, - inputs, - intro, - moduleId, - moduleIsTool, - name, - onOpenIntroModal, - onOpenModal, - openConfirm, - setLoading, - showToolHandle, t, - toast + onOpenConfirmDeleteNode, + showToolHandle, + moduleId, + avatar, + name, + forbidMenu, + intro, + moduleIsTool, + inputs, + onOpenConfirmSync, + setLoading, + 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 17aa406c6..000000000 --- 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 2d52f3475..000000000 --- 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 000000000..3b08fea0a --- /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 000000000..c77d5410b --- /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 000000000..8ee1c11a4 --- /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 a8fdbc09c..4042e2ae0 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 89cee29dc..af0f96e5a 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 7985cd0a3..70da91a14 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 087723e93..1119889d1 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 5a8862c2c..66ccc2871 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 b8820d820..7632b24df 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 7dfde2572..8659aeab3 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 1df7db1a9..40ef454f5 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 536fcc2ef..d2de22266 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 d4b542044..1e468eff0 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 521479154..8aaa777ff 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 6a5eda487..1614dd9ac 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 de53fbab3..0d4c5963f 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 1262e3dad..8ddf33697 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 a397ff992..000000000 --- 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 53a422440..314a4fe77 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 ad394837a..a8bfd5ec5 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 646977b52..659b9e50d 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 81d22f85d..10b8e1dea 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 b61e3211c..fe4e754d9 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 1c6a915c7..5decc22ea 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 3482f5df7..2acb11720 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 657099fb3..ae6070619 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 7678e778c..000000000 --- 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 ae9d33788..000000000 --- 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 3142b98d0..000000000 --- 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 000000000..2892c5714 --- /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 0003d1b45..0efaeb737 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 aa3f9a838..6dcb130bf 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 668b9c0de..000000000 --- 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 0aedf254d..000000000 --- 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 df90ee75d..dbe410754 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 0647c6eb3..5c0871f4c 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 63b6ea17a..7c178f524 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 6cdd98675..b02274a0d 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 634604894..7a434d7ac 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 af700c101..686c748d1 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 fa8e2de1b..35d114ca9 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 186d58fc6..de5efc81f 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 7b0eb8358..db65d8df5 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 9e6efeb71..0ce217156 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 71232711d..7b58b789a 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 c843dad39..50906ab75 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 09d1c11fb..2dae0d164 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 000000000..1fb178000 --- /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 ec965e825..94f676b4a 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 000000000..d25c75af4 --- /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 000000000..2eaf63313 --- /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 000000000..c6deff26d --- /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 99d640e61..000000000 --- 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 20279c3b6..216bb9a24 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 26d432f2e..5dc438e90 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 62494a689..d07ec28b9 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 6f9d2d37f..768360667 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]); - const copyTemplates: FlowModuleTemplateType[] = JSON.parse(JSON.stringify(concatTemplates)); + useEffect(() => { + const concatTemplates = [...appSystemModuleTemplates]; + + 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 b9e44a4e2..8f2dca1f6 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 1cfd4e534..0d00ea81d 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 fb0b34523..578a6cb14 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 e32264ab9..d5f6b0855 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 fa5e43740..e4ec51701 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 7b753bf8d..6d7536036 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 445551eed..6b88b84bc 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 000000000..6fe11adcd --- /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 3ae2bdc31..00a5f5d67 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 fa3039bd6..a2b236dda 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 290f5f4b4..3cd9a7410 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 6264d6a25..d3bbf04ff 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 2d9b62f2c..05534263d 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 217c9275b..777fb5eca 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 74448e7fa..1dc770004 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 52f9e7df0..4f6dccfda 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 68aa4d6de..d98c386e1 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 4fc875902..e30bab240 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 3182d2423..3bf1ce9bf 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 d857cd80d..756440c92 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 223dc27cb..bb72da369 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 f391c88a5..b7cb21a35 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 95f5cf470..c81245688 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 ecae81d01..5e269e3af 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 d0cc4f8d7..310fa179c 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 f9e43d1b6..672b5bd1b 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 c5470c3d8..af1f3f053 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'); + } + } + ); - const copyTemplates: FlowModuleTemplateType[] = JSON.parse(JSON.stringify(concatTemplates)); + useEffect(() => { + initData(JSON.parse(JSON.stringify(pluginDetail?.modules || []))); + }, [pluginDetail?.modules]); + + useEffect(() => { + const concatTemplates = [...pluginSystemModuleTemplates]; + + 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 f30ea0f8a..8767e4d26 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')} -