diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000000..b82e07751d5b --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +public-hoist-pattern[]=*tiktoken* diff --git a/.vscode/i18n-ally-custom-framework.yml b/.vscode/i18n-ally-custom-framework.yml index 5582ce8dc19e..be5e4e7df927 100644 --- a/.vscode/i18n-ally-custom-framework.yml +++ b/.vscode/i18n-ally-custom-framework.yml @@ -23,6 +23,9 @@ usageMatchRegex: - "[^\\w\\d]datasetT\\(['\"`]({key})['\"`]" - "[^\\w\\d]fileT\\(['\"`]({key})['\"`]" - "[^\\w\\d]publishT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]workflowT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]userT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]chatT\\(['\"`]({key})['\"`]" # A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys # and works like how the i18next framework identifies the namespace scope from the diff --git a/.vscode/nextapi.code-snippets b/.vscode/nextapi.code-snippets new file mode 100644 index 000000000000..088ed3b3f8e3 --- /dev/null +++ b/.vscode/nextapi.code-snippets @@ -0,0 +1,52 @@ +{ + // Place your FastGPT 工作区 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + "Next api template": { + "scope": "javascript,typescript", + "prefix": "nextapi", + "body": [ + "import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';", + "import { NextAPI } from '@/service/middleware/entry';", + "", + "export type ${TM_FILENAME_BASE}Query = {};", + "", + "export type ${TM_FILENAME_BASE}Body = {};", + "", + "export type ${TM_FILENAME_BASE}Response = {};", + "", + "async function handler(", + " req: ApiRequestProps<${TM_FILENAME_BASE}Body, ${TM_FILENAME_BASE}Query>,", + " res: ApiResponseType", + "): Promise<${TM_FILENAME_BASE}Response> {", + " $1", + " return {}", + "}", + "", + "export default NextAPI(handler);" + ], + "description": "FastGPT Next API template" + }, + "use context template": { + "scope": "typescriptreact", + "prefix": "context", + "body": [ + "import { ReactNode } from 'react';", + "import { createContext } from 'use-context-selector';", + "", + "type ContextType = {$1};", + "", + "export const Context = createContext({});", + "", + "export const ContextProvider = ({ children }: { children: ReactNode }) => {", + " const contextValue: ContextType = {};", + " return {children};", + "};", + ], + "description": "FastGPT usecontext template" + } +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 12791f154fa0..2ce17fd2ef62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,7 @@ ENV PYTHON /usr/bin/python3 RUN [ -z "$proxy" ] || pnpm config set registry https://registry.npmmirror.com # copy packages and one project -COPY pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./ COPY ./packages ./packages COPY ./projects/$name/package.json ./projects/$name/package.json @@ -35,7 +35,7 @@ ARG name ARG proxy # copy common node_modules and one project node_modules -COPY package.json pnpm-workspace.yaml ./ +COPY package.json pnpm-workspace.yaml .npmrc ./ COPY --from=mainDeps /app/node_modules ./node_modules COPY --from=mainDeps /app/packages ./packages COPY ./projects/$name ./projects/$name @@ -44,6 +44,8 @@ COPY --from=mainDeps /app/projects/$name/node_modules ./projects/$name/node_modu RUN [ -z "$proxy" ] || sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories RUN apk add --no-cache libc6-compat && npm install -g pnpm@8.6.0 + +ENV NODE_OPTIONS="--max-old-space-size=4096" RUN pnpm --filter=$name build # --------- runner ----------- @@ -70,6 +72,11 @@ COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/static /app/ COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/server/chunks /app/projects/$name/.next/server/chunks # copy worker COPY --from=builder --chown=nextjs:nodejs /app/projects/$name/.next/server/worker /app/projects/$name/.next/server/worker + +# copy tiktoken but not copy ./node_modules/tiktoken/encoders +COPY --from=mainDeps /app/node_modules/tiktoken ./node_modules/tiktoken +RUN rm -rf ./node_modules/tiktoken/encoders + # copy package.json to version file COPY --from=builder /app/projects/$name/package.json ./package.json # copy config @@ -87,4 +94,4 @@ USER nextjs ENV serverPath=./projects/$name/server.js -ENTRYPOINT ["sh","-c","node ${serverPath}"] \ No newline at end of file +ENTRYPOINT ["sh","-c","node --max-old-space-size=4096 ${serverPath}"] \ No newline at end of file diff --git a/README_en.md b/README_en.md index a389bd1d3672..7572f17ad64f 100644 --- a/README_en.md +++ b/README_en.md @@ -10,28 +10,31 @@ 日语

-FastGPT is a knowledge-based Q&A system built on the LLM, offers out-of-the-box data processing and model invocation capabilities, allows for workflow orchestration through Flow visualization! +FastGPT is a knowledge-based platform built on the LLMs, offers a comprehensive suite of out-of-the-box capabilities such as data processing, RAG retrieval, and visual AI workflow orchestration, letting you easily develop and deploy complex question-answering systems without the need for extensive setup or configuration.

- cloud + cloud - document + document - development - - - project + development license

+
+ + [![discord](https://theme.zdassets.com/theme_assets/678183/cc59daa07820943e943c2fc283b9079d7003ff76.svg)](https://discord.gg/mp68xkZn2Q) + +
+ https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4 ## 🛸 Use Cloud Services @@ -117,11 +120,11 @@ Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin) - [Version Updates & Upgrades](https://doc.fastgpt.in/docs/installation/upgrading) -## 🏘️ Community +## 🏘️ Community & support -| Community Group | -| ------------------------------------------------- | -| ![](https://oss.laf.run/htr4n1-images/fastgpt-qr-code.jpg) | ++ 🌐 Visit the [FastGPT website](https://fastgpt.in/) for full documentation and useful links. ++ 💬 Join our [Discord server](https://discord.gg/mp68xkZn2Q) is to chat with FastGPT developers and other FastGPT users. This is a good place to learn about FastGPT, ask questions, and share your experiences. ++ 🐞 Create [GitHub Issues](https://github.com/labring/FastGPT/issues/new/choose) for bug reports and feature requests. # diff --git a/docSite/assets/imgs/external_file0.png b/docSite/assets/imgs/external_file0.png new file mode 100644 index 000000000000..4b365f339ba2 Binary files /dev/null and b/docSite/assets/imgs/external_file0.png differ diff --git a/docSite/assets/imgs/external_file1.png b/docSite/assets/imgs/external_file1.png new file mode 100644 index 000000000000..bbbb86ad97cc Binary files /dev/null and b/docSite/assets/imgs/external_file1.png differ diff --git a/docSite/assets/imgs/external_file2.png b/docSite/assets/imgs/external_file2.png new file mode 100644 index 000000000000..f7697b42c6b7 Binary files /dev/null and b/docSite/assets/imgs/external_file2.png differ diff --git a/docSite/assets/imgs/questionGuide.png b/docSite/assets/imgs/questionGuide.png new file mode 100644 index 000000000000..63130ecc7fa1 Binary files /dev/null and b/docSite/assets/imgs/questionGuide.png differ diff --git a/docSite/content/docs/course/chat_input_guide.md b/docSite/content/docs/course/chat_input_guide.md new file mode 100644 index 000000000000..0e99b2c3eb68 --- /dev/null +++ b/docSite/content/docs/course/chat_input_guide.md @@ -0,0 +1,54 @@ +--- +title: "对话问题引导" +description: "FastGPT 对话问题引导" +icon: "code" +draft: false +toc: true +weight: 350 +--- + +![](/imgs/questionGuide.png) + +## 什么是自定义问题引导 + +你可以为你的应用提前预设一些问题,用户在输入时,会根据输入的内容,动态搜索这些问题作为提示,从而引导用户更快的进行提问。 + +你可以直接在 FastGPT 中配置词库,或者提供自定义词库接口。 + +## 自定义词库接口 + +需要保证这个接口可以被用户浏览器访问。 + +**请求:** + +```bash +curl --location --request GET 'http://localhost:3000/api/core/chat/inputGuide/query?appId=663c75302caf8315b1c00194&searchKey=你' +``` + +其中 `appId` 为应用ID,`searchKey` 为搜索关键字,最多是50个字符。 + +**响应** + +```json +{ + "code": 200, + "statusText": "", + "message": "", + "data": [ + "是你", + "你是谁呀", + "你好好呀", + "你好呀", + "你是谁!", + "你好" + ] +} +``` + +data是一个数组,包含了搜索到的问题,最多只需要返回5个问题。 + + +**参数说明:** + +- appId - 应用ID +- searchKey - 搜索关键字 \ No newline at end of file diff --git a/docSite/content/docs/course/externalFile.md b/docSite/content/docs/course/externalFile.md new file mode 100644 index 000000000000..b1c056526616 --- /dev/null +++ b/docSite/content/docs/course/externalFile.md @@ -0,0 +1,26 @@ +--- +title: '外部文件知识库' +description: 'FastGPT 外部文件知识库功能介绍和使用方式' +icon: 'language' +draft: false +toc: true +weight: 107 +--- + +外部文件库是 FastGPT 商业版特有功能。它允许接入你现在的文件系统,无需将文件再导入一份到 FastGPT 中。 + +并且,阅读权限可以通过你的文件系统进行控制。 + +| | | | +| --------------------- | --------------------- | --------------------- | +| ![](/imgs/external_file0.png) | ![](/imgs/external_file1.png) | ![](/imgs/external_file2.png) | + + +## 导入参数说明 + +- 外部预览地址:用于跳转你的文件阅读地址,会携带“文件阅读ID”进行访问。 +- 文件访问URL:文件可访问的地址。 +- 文件阅读ID:通常情况下,文件访问URL是临时的。如果希望永久可以访问,你需要使用该文件阅读ID,并配合上“外部预览地址”,跳转至新的阅读地址进行原文件访问。 +- 文件名:默认会自动解析文件访问URL上的文件名。如果你手动填写,将会以手动填写的值为准。 + +[点击查看API导入文档](/docs/development/openapi/dataset/#创建一个外部文件库集合商业版) \ No newline at end of file diff --git a/docSite/content/docs/development/faq.md b/docSite/content/docs/development/faq.md index 8733145db18c..e1bada463e71 100644 --- a/docSite/content/docs/development/faq.md +++ b/docSite/content/docs/development/faq.md @@ -118,4 +118,5 @@ OneAPI 的 API Key 配置错误,需要修改`OPENAI_API_KEY`环境变量,并 ### bad_response_status_code bad response status code 503 1. 模型服务不可用 -2. .... \ No newline at end of file +2. 模型接口参数异常(温度、max token等可能不适配) +3. .... \ No newline at end of file diff --git a/docSite/content/docs/development/intro.md b/docSite/content/docs/development/intro.md index 8859d23c3b8c..e44c8aa58f04 100644 --- a/docSite/content/docs/development/intro.md +++ b/docSite/content/docs/development/intro.md @@ -133,3 +133,57 @@ FastGPT 在`pnpm i`后会执行`postinstall`脚本,用于自动生成`ChakraUI 遇到困难了吗?有任何问题吗? 加入微信群与开发者和用户保持沟通。 + +## 代码结构说明 + +### nextjs + +FastGPT 使用了 nextjs 的 page route 作为框架。为了区分好前后端代码,在目录分配上会分成 global, service, web 3个自目录,分别对应着 `前后端共用`、`后端专用`、`前端专用`的代码。 + +### monorepo +FastGPT 采用 pnpm workspace 方式构建 monorepo 项目,主要分为两个部分: + +- projects/app - FastGPT 主项目 +- packages/ - 子模块 + - global - 共用代码,通常是放一些前后端都能执行的函数、类型声明、常量。 + - service - 服务端代码 + - web - 前端代码 + - plugin - 工作流自定义插件的代码 + +### 领域驱动模式(DDD) + +FastGPT 在代码模块划分时,按DDD的思想进行划分,主要分为以下几个领域: + +core - 核心功能(知识库,工作流,应用,对话) +support - 支撑功能(用户体系,计费,鉴权等) +common - 基础功能(日志管理,文件读写等) + +{{% details title="代码结构说明" closed="true" %}} +``` +. +├── .github // github 相关配置 +├── .husky // 格式化配置 +├── docSite // 文档 +├── files // 一些外部文件,例如 docker-compose, helm +├── packages // 子包 +│ ├── global // 前后端通用子包 +│ ├── plugins // 工作流插件(需要自定义包时候使用到) +│ ├── service // 后端子包 +│ └── web // 前端子包 +├── projects +│ └── app // FastGPT 主项目 +├── python // 存放一些模型代码,和 FastGPT 本身无关 +└── scripts // 一些自动化脚本 + ├── icon // icon预览脚本,可以在顶层 pnpm initIcon(把svg写入到代码中), pnpm previewIcon(预览icon) + └── postinstall.sh // chakraUI自定义theme初始化 ts 类型 +├── package.json // 顶层monorepo +├── pnpm-lock.yaml +├── pnpm-workspace.yaml // monorepo 声明 +├── Dockerfile +├── LICENSE +├── README.md +├── README_en.md +├── README_ja.md +├── dev.md +``` +{{% /details %}} diff --git a/docSite/content/docs/development/migration/ docker_mongo.md b/docSite/content/docs/development/migration/ docker_mongo.md index 2354b6315304..50cc6d24d899 100644 --- a/docSite/content/docs/development/migration/ docker_mongo.md +++ b/docSite/content/docs/development/migration/ docker_mongo.md @@ -1,10 +1,9 @@ --- -weight: 762 title: "Docker Mongo迁移(dump模式)" description: "FastGPT Docker Mongo迁移" icon: database draft: false -images: [] +weight: 762 --- ## 作者 diff --git a/docSite/content/docs/development/openapi/chat.md b/docSite/content/docs/development/openapi/chat.md index d232f294e121..c44071045192 100644 --- a/docSite/content/docs/development/openapi/chat.md +++ b/docSite/content/docs/development/openapi/chat.md @@ -69,7 +69,7 @@ curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions' ## 响应 -{{< tabs tabTotal="4" >}} +{{< tabs tabTotal="5" >}} {{< tab tabName="detail=false,stream=false 响应" >}} {{< markdownify >}} @@ -242,6 +242,24 @@ event: appStreamResponse data: [{"moduleName":"知识库搜索","moduleType":"datasetSearchNode","runningTime":1.78},{"question":"导演是谁","quoteList":[{"id":"654f2e49b64caef1d9431e8b","q":"电影《铃芽之旅》的导演是谁?","a":"电影《铃芽之旅》的导演是新海诚!","indexes":[{"type":"qa","dataId":"3515487","text":"电影《铃芽之旅》的导演是谁?","_id":"654f2e49b64caef1d9431e8c","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8935586214065552},{"id":"6552e14c50f4a2a8e632af11","q":"导演是谁?","a":"电影《铃芽之旅》的导演是新海诚。","indexes":[{"defaultIndex":true,"type":"qa","dataId":"3644565","text":"导演是谁?\n电影《铃芽之旅》的导演是新海诚。","_id":"6552e14dde5cc7ba3954e417"}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8890955448150635},{"id":"654f34a0b64caef1d946337e","q":"本作的主人公是谁?","a":"本作的主人公是名叫铃芽的少女。","indexes":[{"type":"qa","dataId":"3515541","text":"本作的主人公是谁?","_id":"654f34a0b64caef1d946337f","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8738770484924316},{"id":"654f3002b64caef1d944207a","q":"电影《铃芽之旅》男主角是谁?","a":"电影《铃芽之旅》男主角是宗像草太,由松村北斗配音。","indexes":[{"type":"qa","dataId":"3515538","text":"电影《铃芽之旅》男主角是谁?","_id":"654f3002b64caef1d944207b","defaultIndex":true}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8607980012893677},{"id":"654f2fc8b64caef1d943fd46","q":"电影《铃芽之旅》的编剧是谁?","a":"新海诚是本片的编剧。","indexes":[{"defaultIndex":true,"type":"qa","dataId":"3515550","text":"电影《铃芽之旅》的编剧是谁?22","_id":"654f2fc8b64caef1d943fd47"}],"datasetId":"646627f4f7b896cfd8910e38","collectionId":"653279b16cd42ab509e766e8","sourceName":"data (81).csv","sourceId":"64fd3b6423aa1307b65896f6","score":0.8468944430351257}],"moduleName":"AI 对话","moduleType":"chatNode","runningTime":1.86}] ``` +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="detail=true,stream=true 时,event值" >}} +{{< markdownify >}} + +event取值: + +- answer: 返回给客户端的文本(最终会算作回答) +- fastAnswer: 指定回复返回给客户端的文本(最终会算作回答) +- toolCall: 执行工具 +- toolParams: 工具参数 +- toolResponse: 工具返回 +- flowNodeStatus: 运行到的节点状态 +- flowResponses: 节点完整响应 +- updateVariables: 更新变量 +- error: 报错 + {{< /markdownify >}} {{< /tab >}} {{< /tabs >}} diff --git a/docSite/content/docs/development/openapi/dataset.md b/docSite/content/docs/development/openapi/dataset.md index 17844816d263..7d0570ee7527 100644 --- a/docSite/content/docs/development/openapi/dataset.md +++ b/docSite/content/docs/development/openapi/dataset.md @@ -295,6 +295,24 @@ curl --location --request DELETE 'http://localhost:3000/api/core/dataset/delete? ## 集合 +### 通用创建参数说明 + +**入参** + +| 参数 | 说明 | 必填 | +| --- | --- | --- | +| datasetId | 知识库ID | ✅ | +| parentId: | 父级ID,不填则默认为根目录 | | +| trainingType | 训练模式。chunk: 按文本长度进行分割;qa: QA拆分;auto: 增强训练 | ✅ | +| chunkSize | 预估块大小 | | +| chunkSplitter | 自定义最高优先分割符号 | | +| qaPrompt | qa拆分提示词 | | + +**出参** + +- collectionId - 新建的集合ID +- insertLen:插入的块数量 + ### 创建一个空的集合 {{< tabs tabTotal="3" >}} @@ -500,7 +518,7 @@ data 为集合的 ID。 {{< /tab >}} {{< /tabs >}} -### 创建一个文件集合(商业版) +### 创建一个文件集合 传入一个文件,创建一个集合,会读取文件内容进行分割。目前支持:pdf, docx, md, txt, html, csv。 @@ -509,7 +527,7 @@ data 为集合的 ID。 {{< markdownify >}} ```bash -curl --location --request POST 'http://localhost:3000/api/proApi/core/dataset/collection/create/file' \ +curl --location --request POST 'http://localhost:3000/api/core/dataset/collection/create/localFile' \ --header 'Authorization: Bearer {{authorization}}' \ --form 'file=@"C:\\Users\\user\\Desktop\\fastgpt测试文件\\index.html"' \ --form 'data="{\"datasetId\":\"6593e137231a2be9c5603ba7\",\"parentId\":null,\"trainingType\":\"chunk\",\"chunkSize\":512,\"chunkSplitter\":\"\",\"qaPrompt\":\"\",\"metadata\":{}}"' @@ -565,6 +583,68 @@ data 为集合的 ID。 {{< /tab >}} {{< /tabs >}} +### 创建一个外部文件库集合(商业版) + +{{< tabs tabTotal="3" >}} +{{< tab tabName="请求示例" >}} +{{< markdownify >}} + +```bash +curl --location --request POST 'http://localhost:3000/api/proApi/core/dataset/collection/create/externalFileUrl' \ +--header 'Authorization: Bearer {{authorization}}' \ +--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "externalFileUrl":"https://image.xxxxx.com/fastgpt-dev/%E6%91%82.pdf", + "externalFileId":"1111", + "filename":"自定义文件名", + "datasetId":"6642d105a5e9d2b00255b27b", + "parentId": null, + + "trainingType": "chunk", + "chunkSize":512, + "chunkSplitter":"", + "qaPrompt":"" +}' +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="参数说明" >}} +{{< markdownify >}} + +| 参数 | 说明 | 必填 | +| --- | --- | --- | +| externalFileUrl | 文件访问链接(可以是临时链接) | ✅ | +| externalFileId | 外部文件ID | | +| filename | 自定义文件名 | | + + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="响应示例" >}} +{{< markdownify >}} + +data 为集合的 ID。 + +```json +{ + "code": 200, + "statusText": "", + "message": "", + "data": { + "collectionId": "6646fcedfabd823cdc6de746", + "insertLen": 3 + } +} +``` + +{{< /markdownify >}} +{{< /tab >}} +{{< /tabs >}} + ### 获取集合列表 {{< tabs tabTotal="3" >}} diff --git a/docSite/content/docs/development/openapi/share.md b/docSite/content/docs/development/openapi/share.md index cc865b616b2e..f65ddcd0d8d9 100644 --- a/docSite/content/docs/development/openapi/share.md +++ b/docSite/content/docs/development/openapi/share.md @@ -247,7 +247,7 @@ curl --location --request POST '{{host}}/shareAuth/finish' \ ```ts type ResponseType = { - moduleType: `${FlowNodeTypeEnum}`; // 模块类型 + moduleType: FlowNodeTypeEnum; // 模块类型 moduleName: string; // 模块名 moduleLogo?: string; // logo runningTime?: number; // 运行时间 diff --git a/docSite/content/docs/development/upgrading/481.md b/docSite/content/docs/development/upgrading/481.md index 26dfea4d6b70..24f2e249f454 100644 --- a/docSite/content/docs/development/upgrading/481.md +++ b/docSite/content/docs/development/upgrading/481.md @@ -1,10 +1,10 @@ --- -title: 'V4.8.1(进行中)' +title: 'V4.8.1(需要初始化)' description: 'FastGPT V4.8.1 更新说明' icon: 'upgrade' draft: false toc: true -weight: 825 +weight: 823 --- ## 初始化脚本 @@ -34,5 +34,6 @@ curl --location --request POST 'https://{{host}}/api/admin/clearInvalidData' \ ## V4.8.1 更新说明 -1. 新增 - 知识库重新选择向量模型重建 -2. 修复 - 定时器清理脏数据任务 \ No newline at end of file +使用 Chat api 接口需要注意,增加了 event: updateVariables 事件,用于更新变量。 + +[点击查看升级说明](https://github.com/labring/FastGPT/releases/tag/v4.8.1) diff --git a/files/deploy/fastgpt/docker-compose.yml b/files/deploy/fastgpt/docker-compose.yml index 624e4205971c..d4ff5719e44f 100644 --- a/files/deploy/fastgpt/docker-compose.yml +++ b/files/deploy/fastgpt/docker-compose.yml @@ -69,8 +69,8 @@ services: wait $$! fastgpt: container_name: fastgpt - image: ghcr.io/labring/fastgpt:v4.8 # git - # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8 # 阿里云 + image: ghcr.io/labring/fastgpt:v4.8.1 # git + # image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.8.1 # 阿里云 ports: - 3000:3000 networks: diff --git a/packages/global/common/string/textSplitter.ts b/packages/global/common/string/textSplitter.ts index 1a6d02360c80..7ef609a74a82 100644 --- a/packages/global/common/string/textSplitter.ts +++ b/packages/global/common/string/textSplitter.ts @@ -9,6 +9,9 @@ type SplitProps = { overlapRatio?: number; customReg?: string[]; }; +export type TextSplitProps = Omit & { + chunkLen?: number; +}; type SplitResponse = { chunks: string[]; @@ -49,6 +52,7 @@ const strIsMdTable = (str: string) => { return false; } } + return true; }; const markdownTableSplit = (props: SplitProps): SplitResponse => { @@ -77,6 +81,10 @@ ${mdSplitString} chunk += `${splitText2Lines[i]}\n`; } + if (chunk) { + chunks.push(chunk); + } + return { chunks, chars: chunks.reduce((sum, chunk) => sum + chunk.length, 0) diff --git a/packages/global/common/string/time.ts b/packages/global/common/string/time.ts index 4b3211102f46..e61aac7e3244 100644 --- a/packages/global/common/string/time.ts +++ b/packages/global/common/string/time.ts @@ -6,6 +6,42 @@ export const formatTime2YMDHM = (time?: Date) => export const formatTime2YMD = (time?: Date) => (time ? dayjs(time).format('YYYY-MM-DD') : ''); export const formatTime2HM = (time: Date = new Date()) => dayjs(time).format('HH:mm'); +/** + * 格式化时间成聊天格式 + */ +export const formatTimeToChatTime = (time: Date) => { + const now = dayjs(); + const target = dayjs(time); + + // 如果传入时间小于60秒,返回刚刚 + if (now.diff(target, 'second') < 60) { + return '刚刚'; + } + + // 如果时间是今天,展示几时:几分 + if (now.isSame(target, 'day')) { + return target.format('HH:mm'); + } + + // 如果是昨天,展示昨天 + if (now.subtract(1, 'day').isSame(target, 'day')) { + return '昨天'; + } + + // 如果是前天,展示前天 + if (now.subtract(2, 'day').isSame(target, 'day')) { + return '前天'; + } + + // 如果是今年,展示某月某日 + if (now.isSame(target, 'year')) { + return target.format('MM/DD'); + } + + // 如果是更久之前,展示某年某月某日 + return target.format('YYYY/M/D'); +}; + /* cron time parse */ export const cronParser2Fields = (cronString: string) => { try { diff --git a/packages/global/common/string/tools.ts b/packages/global/common/string/tools.ts index 26147f5d347c..12cdd652ebcb 100644 --- a/packages/global/common/string/tools.ts +++ b/packages/global/common/string/tools.ts @@ -64,4 +64,22 @@ export const getNanoid = (size = 12) => { return `${firstChar}${randomsStr}`; }; +/* Custom text to reg, need to replace special chats */ export const replaceRegChars = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + +/* slice json str */ +export const sliceJsonStr = (str: string) => { + str = str.replace(/(\\n|\\)/g, '').replace(/ /g, ''); + + const jsonRegex = /{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*}/g; + const matches = str.match(jsonRegex); + + if (!matches) { + return ''; + } + + // 找到第一个完整的 JSON 字符串 + const jsonStr = matches[0]; + + return jsonStr; +}; diff --git a/packages/global/common/system/types/index.d.ts b/packages/global/common/system/types/index.d.ts index 69563b108d29..2e95fd68767d 100644 --- a/packages/global/common/system/types/index.d.ts +++ b/packages/global/common/system/types/index.d.ts @@ -67,6 +67,8 @@ export type SystemEnvType = { vectorMaxProcess: number; qaMaxProcess: number; pgHNSWEfSearch: number; + tokenWorkers: number; // token count max worker + oneapiUrl?: string; chatApiKey?: string; }; diff --git a/packages/global/core/app/constants.ts b/packages/global/core/app/constants.ts index 18bbff28ffe0..136d0439dac9 100644 --- a/packages/global/core/app/constants.ts +++ b/packages/global/core/app/constants.ts @@ -1,4 +1,4 @@ -import { AppWhisperConfigType } from './type'; +import { AppTTSConfigType, AppWhisperConfigType } from './type'; export enum AppTypeEnum { simple = 'simple', @@ -13,8 +13,16 @@ export const AppTypeMap = { } }; +export const defaultTTSConfig: AppTTSConfigType = { type: 'web' }; + export const defaultWhisperConfig: AppWhisperConfigType = { open: false, autoSend: false, autoTTSResponse: false }; + +export const defaultChatInputGuideConfig = { + open: false, + textList: [], + customUrl: '' +}; diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index 0da1d8b6aca5..5c8487b839e5 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -8,7 +8,7 @@ import { DatasetSearchModeEnum } from '../dataset/constants'; import { TeamTagSchema as TeamTagsSchemaType } from '@fastgpt/global/support/user/team/type.d'; import { StoreEdgeItemType } from '../workflow/type/edge'; -export interface AppSchema { +export type AppSchema = { _id: string; teamId: string; tmbId: string; @@ -23,13 +23,14 @@ export interface AppSchema { edges: StoreEdgeItemType[]; // App system config + chatConfig: AppChatConfigType; scheduledTriggerConfig?: AppScheduledTriggerConfigType | null; scheduledTriggerNextTime?: Date; permission: `${PermissionTypeEnum}`; inited?: boolean; teamTags: string[]; -} +}; export type AppListItemType = { _id: string; @@ -66,32 +67,19 @@ export type AppSimpleEditFormType = { datasetSearchExtensionBg?: string; }; selectedTools: FlowNodeTemplateType[]; - userGuide: { - welcomeText: string; - variables: { - id: string; - key: string; - label: string; - type: `${VariableInputEnum}`; - required: boolean; - maxLen: number; - enums: { - value: string; - }[]; - }[]; - questionGuide: boolean; - tts: { - type: 'none' | 'web' | 'model'; - model?: string | undefined; - voice?: string | undefined; - speed?: number | undefined; - }; - whisper: AppWhisperConfigType; - scheduleTrigger: AppScheduledTriggerConfigType | null; - }; + chatConfig: AppChatConfigType; }; -/* app function config */ +/* app chat config type */ +export type AppChatConfigType = { + welcomeText?: string; + variables?: VariableItemType[]; + questionGuide?: boolean; + ttsConfig?: AppTTSConfigType; + whisperConfig?: AppWhisperConfigType; + scheduledTriggerConfig?: AppScheduledTriggerConfigType; + chatInputGuide?: ChatInputGuideConfigType; +}; export type SettingAIDataType = { model: string; temperature: number; @@ -123,6 +111,11 @@ export type AppWhisperConfigType = { autoSend: boolean; autoTTSResponse: boolean; }; +// question guide text +export type ChatInputGuideConfigType = { + open: boolean; + customUrl: string; +}; // interval timer export type AppScheduledTriggerConfigType = { cronString: string; diff --git a/packages/global/core/app/utils.ts b/packages/global/core/app/utils.ts index 679282528e07..fc4dcbc1da4d 100644 --- a/packages/global/core/app/utils.ts +++ b/packages/global/core/app/utils.ts @@ -1,49 +1,42 @@ -import type { AppSimpleEditFormType } from '../app/type'; +import type { AppChatConfigType, AppSimpleEditFormType } from '../app/type'; import { FlowNodeTypeEnum } from '../workflow/node/constant'; import { NodeInputKeyEnum, FlowNodeTemplateTypeEnum } from '../workflow/constants'; import type { FlowNodeInputItemType } from '../workflow/type/io.d'; -import { getGuideModule, splitGuideModule } from '../workflow/utils'; +import { getAppChatConfig } from '../workflow/utils'; import { StoreNodeItemType } from '../workflow/type'; import { DatasetSearchModeEnum } from '../dataset/constants'; -import { defaultWhisperConfig } from './constants'; -export const getDefaultAppForm = (): AppSimpleEditFormType => { - return { - aiSettings: { - model: 'gpt-3.5-turbo', - systemPrompt: '', - temperature: 0, - isResponseAnswerText: true, - maxHistories: 6, - maxToken: 4000 - }, - dataset: { - datasets: [], - similarity: 0.4, - limit: 1500, - searchMode: DatasetSearchModeEnum.embedding, - usingReRank: false, - datasetSearchUsingExtensionQuery: true, - datasetSearchExtensionBg: '' - }, - selectedTools: [], - userGuide: { - welcomeText: '', - variables: [], - questionGuide: false, - tts: { - type: 'web' - }, - whisper: defaultWhisperConfig, - scheduleTrigger: null - } - }; -}; +export const getDefaultAppForm = (): AppSimpleEditFormType => ({ + aiSettings: { + model: 'gpt-3.5-turbo', + systemPrompt: '', + temperature: 0, + isResponseAnswerText: true, + maxHistories: 6, + maxToken: 4000 + }, + dataset: { + datasets: [], + similarity: 0.4, + limit: 1500, + searchMode: DatasetSearchModeEnum.embedding, + usingReRank: false, + datasetSearchUsingExtensionQuery: true, + datasetSearchExtensionBg: '' + }, + selectedTools: [], + chatConfig: {} +}); /* format app nodes to edit form */ -export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => { +export const appWorkflow2Form = ({ + nodes, + chatConfig +}: { + nodes: StoreNodeItemType[]; + chatConfig: AppChatConfigType; +}) => { const defaultAppForm = getDefaultAppForm(); - const findInputValueByKey = (inputs: FlowNodeInputItemType[], key: string) => { return inputs.find((item) => item.key === key)?.value; }; @@ -102,24 +95,6 @@ export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => { node.inputs, NodeInputKeyEnum.datasetSearchExtensionBg ); - } else if (node.flowNodeType === FlowNodeTypeEnum.systemConfig) { - const { - welcomeText, - variableNodes, - questionGuide, - ttsConfig, - whisperConfig, - scheduledTriggerConfig - } = splitGuideModule(getGuideModule(nodes)); - - defaultAppForm.userGuide = { - welcomeText: welcomeText, - variables: variableNodes, - questionGuide: questionGuide, - tts: ttsConfig, - whisper: whisperConfig, - scheduleTrigger: scheduledTriggerConfig - }; } else if (node.flowNodeType === FlowNodeTypeEnum.pluginModule) { if (!node.pluginId) return; @@ -131,10 +106,17 @@ export const appWorkflow2Form = ({ nodes }: { nodes: StoreNodeItemType[] }) => { intro: node.intro || '', flowNodeType: node.flowNodeType, showStatus: node.showStatus, + version: '481', inputs: node.inputs, outputs: node.outputs, templateType: FlowNodeTemplateTypeEnum.other }); + } else if (node.flowNodeType === FlowNodeTypeEnum.systemConfig) { + defaultAppForm.chatConfig = getAppChatConfig({ + chatConfig, + systemConfigNode: node, + isPublicFetch: true + }); } }); diff --git a/packages/global/core/app/version.d.ts b/packages/global/core/app/version.d.ts index 152014e7a8b8..4b3c9920bb67 100644 --- a/packages/global/core/app/version.d.ts +++ b/packages/global/core/app/version.d.ts @@ -1,5 +1,6 @@ import { StoreNodeItemType } from '../workflow/type'; import { StoreEdgeItemType } from '../workflow/type/edge'; +import { AppChatConfigType } from './type'; export type AppVersionSchemaType = { _id: string; @@ -7,4 +8,5 @@ export type AppVersionSchemaType = { time: Date; nodes: StoreNodeItemType[]; edges: StoreEdgeItemType[]; + chatConfig: AppChatConfigType; }; diff --git a/packages/global/core/chat/inputGuide/type.d.ts b/packages/global/core/chat/inputGuide/type.d.ts new file mode 100644 index 000000000000..c67b3c5f0171 --- /dev/null +++ b/packages/global/core/chat/inputGuide/type.d.ts @@ -0,0 +1,5 @@ +export type ChatInputGuideSchemaType = { + _id: string; + appId: string; + text: string; +}; diff --git a/packages/global/core/chat/type.d.ts b/packages/global/core/chat/type.d.ts index 59b70683fbc2..2566bcc6f112 100644 --- a/packages/global/core/chat/type.d.ts +++ b/packages/global/core/chat/type.d.ts @@ -10,7 +10,7 @@ import { import { FlowNodeTypeEnum } from '../workflow/node/constant'; import { NodeOutputKeyEnum } from '../workflow/constants'; import { DispatchNodeResponseKeyEnum } from '../workflow/runtime/constants'; -import { AppSchema, VariableItemType } from '../app/type'; +import { AppChatConfigType, AppSchema, VariableItemType } from '../app/type'; import type { AppSchema as AppType } from '@fastgpt/global/core/app/type.d'; import { DatasetSearchModeEnum } from '../dataset/constants'; import { ChatBoxInputType } from '../../../../projects/app/src/components/ChatBox/type'; @@ -139,7 +139,7 @@ export type ChatHistoryItemType = HistoryItemType & { /* ------- response data ------------ */ export type ChatHistoryItemResType = DispatchNodeResponseType & { nodeId: string; - moduleType: `${FlowNodeTypeEnum}`; + moduleType: FlowNodeTypeEnum; moduleName: string; }; diff --git a/packages/global/core/dataset/api.d.ts b/packages/global/core/dataset/api.d.ts index 7a34b6c8c7d1..7e67dc5646a9 100644 --- a/packages/global/core/dataset/api.d.ts +++ b/packages/global/core/dataset/api.d.ts @@ -11,31 +11,42 @@ export type DatasetUpdateBody = { intro?: string; permission?: DatasetSchemaType['permission']; agentModel?: LLMModelItemType; - websiteConfig?: DatasetSchemaType['websiteConfig']; status?: DatasetSchemaType['status']; + + websiteConfig?: DatasetSchemaType['websiteConfig']; + externalReadUrl?: DatasetSchemaType['externalReadUrl']; }; /* ================= collection ===================== */ export type DatasetCollectionChunkMetadataType = { parentId?: string; - trainingType?: `${TrainingModeEnum}`; + trainingType?: TrainingModeEnum; chunkSize?: number; chunkSplitter?: string; qaPrompt?: string; metadata?: Record; }; + +// create collection params export type CreateDatasetCollectionParams = DatasetCollectionChunkMetadataType & { datasetId: string; name: string; - type: `${DatasetCollectionTypeEnum}`; + type: DatasetCollectionTypeEnum; + + tags?: string[]; + fileId?: string; rawLink?: string; + externalFileId?: string; + + externalFileUrl?: string; rawTextLength?: number; hashRawText?: string; }; export type ApiCreateDatasetCollectionParams = DatasetCollectionChunkMetadataType & { datasetId: string; + tags?: string[]; }; export type TextCreateDatasetCollectionParams = ApiCreateDatasetCollectionParams & { name: string; @@ -56,6 +67,11 @@ export type CsvTableCreateDatasetCollectionParams = { parentId?: string; fileId: string; }; +export type ExternalFileCreateDatasetCollectionParams = ApiCreateDatasetCollectionParams & { + externalFileId?: string; + externalFileUrl: string; + filename?: string; +}; /* ================= data ===================== */ export type PgSearchRawType = { @@ -78,7 +94,7 @@ export type PostWebsiteSyncParams = { export type PushDatasetDataProps = { collectionId: string; data: PushDatasetDataChunkProps[]; - trainingMode: `${TrainingModeEnum}`; + trainingMode: TrainingModeEnum; prompt?: string; billId?: string; }; diff --git a/packages/global/core/dataset/collection/constants.ts b/packages/global/core/dataset/collection/constants.ts new file mode 100644 index 000000000000..b26e3ea7345b --- /dev/null +++ b/packages/global/core/dataset/collection/constants.ts @@ -0,0 +1,6 @@ +/* sourceId = prefix-id; id=fileId;link url;externalFileId */ +export enum CollectionSourcePrefixEnum { + local = 'local', + link = 'link', + external = 'external' +} diff --git a/packages/global/core/dataset/collection/utils.ts b/packages/global/core/dataset/collection/utils.ts new file mode 100644 index 000000000000..e3521f810aa8 --- /dev/null +++ b/packages/global/core/dataset/collection/utils.ts @@ -0,0 +1,14 @@ +import { CollectionWithDatasetType, DatasetCollectionSchemaType } from '../type'; + +export const getCollectionSourceData = ( + collection?: CollectionWithDatasetType | DatasetCollectionSchemaType +) => { + return { + sourceId: + collection?.fileId || + collection?.rawLink || + collection?.externalFileId || + collection?.externalFileUrl, + sourceName: collection?.name || '' + }; +}; diff --git a/packages/global/core/dataset/constants.ts b/packages/global/core/dataset/constants.ts index 0e8be0f5d766..478875b0aae6 100644 --- a/packages/global/core/dataset/constants.ts +++ b/packages/global/core/dataset/constants.ts @@ -2,23 +2,29 @@ export enum DatasetTypeEnum { folder = 'folder', dataset = 'dataset', - websiteDataset = 'websiteDataset' // depp link + websiteDataset = 'websiteDataset', // depp link + externalFile = 'externalFile' } export const DatasetTypeMap = { [DatasetTypeEnum.folder]: { icon: 'common/folderFill', - label: 'core.dataset.Folder Dataset', + label: 'Folder Dataset', collectionLabel: 'common.Folder' }, [DatasetTypeEnum.dataset]: { icon: 'core/dataset/commonDataset', - label: 'core.dataset.Common Dataset', + label: 'Common Dataset', collectionLabel: 'common.File' }, [DatasetTypeEnum.websiteDataset]: { icon: 'core/dataset/websiteDataset', - label: 'core.dataset.Website Dataset', + label: 'Website Dataset', collectionLabel: 'common.Website' + }, + [DatasetTypeEnum.externalFile]: { + icon: 'core/dataset/externalDataset', + label: 'External File', + collectionLabel: 'common.File' } }; @@ -38,9 +44,11 @@ export const DatasetStatusMap = { /* ------------ collection -------------- */ export enum DatasetCollectionTypeEnum { folder = 'folder', + virtual = 'virtual', + file = 'file', link = 'link', // one link - virtual = 'virtual' + externalFile = 'externalFile' } export const DatasetCollectionTypeMap = { [DatasetCollectionTypeEnum.folder]: { @@ -49,6 +57,9 @@ export const DatasetCollectionTypeMap = { [DatasetCollectionTypeEnum.file]: { name: 'core.dataset.file' }, + [DatasetCollectionTypeEnum.externalFile]: { + name: 'core.dataset.externalFile' + }, [DatasetCollectionTypeEnum.link]: { name: 'core.dataset.link' }, @@ -77,7 +88,8 @@ export enum ImportDataSourceEnum { fileLocal = 'fileLocal', fileLink = 'fileLink', fileCustom = 'fileCustom', - csvTable = 'csvTable' + csvTable = 'csvTable', + externalFile = 'externalFile' } export enum TrainingModeEnum { @@ -163,3 +175,10 @@ export const SearchScoreTypeMap = { export const CustomCollectionIcon = 'common/linkBlue'; export const LinkCollectionIcon = 'common/linkBlue'; + +/* source prefix */ +export enum DatasetSourceReadTypeEnum { + fileLocal = 'fileLocal', + link = 'link', + externalFile = 'externalFile' +} diff --git a/packages/global/core/dataset/read.ts b/packages/global/core/dataset/read.ts new file mode 100644 index 000000000000..0a4b3e3954f8 --- /dev/null +++ b/packages/global/core/dataset/read.ts @@ -0,0 +1,14 @@ +import { DatasetSourceReadTypeEnum, ImportDataSourceEnum } from './constants'; + +export const importType2ReadType = (type: ImportDataSourceEnum) => { + if (type === ImportDataSourceEnum.csvTable || type === ImportDataSourceEnum.fileLocal) { + return DatasetSourceReadTypeEnum.fileLocal; + } + if (type === ImportDataSourceEnum.fileLink) { + return DatasetSourceReadTypeEnum.link; + } + if (type === ImportDataSourceEnum.externalFile) { + return DatasetSourceReadTypeEnum.externalFile; + } + return DatasetSourceReadTypeEnum.link; +}; diff --git a/packages/global/core/dataset/type.d.ts b/packages/global/core/dataset/type.d.ts index 7d89b322c2f2..4f3e4fa591d8 100644 --- a/packages/global/core/dataset/type.d.ts +++ b/packages/global/core/dataset/type.d.ts @@ -22,13 +22,16 @@ export type DatasetSchemaType = { vectorModel: string; agentModel: string; intro: string; - type: `${DatasetTypeEnum}`; + type: DatasetTypeEnum; status: `${DatasetStatusEnum}`; permission: `${PermissionTypeEnum}`; + + // metadata websiteConfig?: { url: string; selector: string; }; + externalReadUrl?: string; }; export type DatasetCollectionSchemaType = { @@ -38,20 +41,24 @@ export type DatasetCollectionSchemaType = { datasetId: string; parentId?: string; name: string; - type: `${DatasetCollectionTypeEnum}`; + type: DatasetCollectionTypeEnum; createTime: Date; updateTime: Date; - trainingType: `${TrainingModeEnum}`; + trainingType: TrainingModeEnum; chunkSize: number; chunkSplitter?: string; qaPrompt?: string; - fileId?: string; - rawLink?: string; + tags?: string[]; + + fileId?: string; // local file id + rawLink?: string; // link url + externalFileId?: string; //external file id rawTextLength?: number; hashRawText?: string; + externalFileUrl?: string; // external import url metadata?: { webPageSelector?: string; relatedImgId?: string; // The id of the associated image collections @@ -93,7 +100,7 @@ export type DatasetTrainingSchemaType = { billId: string; expireAt: Date; lockTime: Date; - mode: `${TrainingModeEnum}`; + mode: TrainingModeEnum; model: string; prompt: string; dataId?: string; @@ -112,13 +119,19 @@ export type DatasetDataWithCollectionType = Omit { +export const predictDataLimitLength = (mode: TrainingModeEnum, data: any[]) => { if (mode === TrainingModeEnum.qa) return data.length * 20; if (mode === TrainingModeEnum.auto) return data.length * 5; return data.length; diff --git a/packages/global/core/plugin/httpPlugin/utils.ts b/packages/global/core/plugin/httpPlugin/utils.ts index 5eb9ea05a3f0..c2121ea3e4b2 100644 --- a/packages/global/core/plugin/httpPlugin/utils.ts +++ b/packages/global/core/plugin/httpPlugin/utils.ts @@ -282,6 +282,7 @@ export const httpApiSchema2Plugins = async ({ x: 616.4226348688949, y: -165.05298493910115 }, + version: PluginInputModule.version, inputs: pluginInputs, outputs: pluginOutputs }, @@ -296,6 +297,7 @@ export const httpApiSchema2Plugins = async ({ x: 1607.7142331269126, y: -151.8669210746189 }, + version: PluginOutputModule.version, inputs: [ { key: pluginOutputKey, @@ -334,6 +336,7 @@ export const httpApiSchema2Plugins = async ({ x: 1042.549746602742, y: -447.77496332641647 }, + version: HttpModule468.version, inputs: [ { key: NodeInputKeyEnum.addInputParam, diff --git a/packages/global/core/plugin/type.d.ts b/packages/global/core/plugin/type.d.ts index 3de9ff110ecd..7d293862b794 100644 --- a/packages/global/core/plugin/type.d.ts +++ b/packages/global/core/plugin/type.d.ts @@ -23,6 +23,7 @@ export type PluginItemSchema = { customHeaders?: string; }; version?: 'v1' | 'v2'; + nodeVersion?: string; }; /* plugin template */ @@ -32,6 +33,7 @@ export type PluginTemplateType = PluginRuntimeType & { source: `${PluginSourceEnum}`; templateType: FlowNodeTemplateType['templateType']; intro: string; + nodeVersion: string; }; export type PluginRuntimeType = { diff --git a/packages/global/core/workflow/api.d.ts b/packages/global/core/workflow/api.d.ts index be573e22caa4..30524fd5f89f 100644 --- a/packages/global/core/workflow/api.d.ts +++ b/packages/global/core/workflow/api.d.ts @@ -1,7 +1,7 @@ import { VectorModelItemType } from '../ai/model.d'; import { NodeInputKeyEnum } from './constants'; -export type SelectedDatasetType = { datasetId: string; vectorModel: VectorModelItemType }[]; +export type SelectedDatasetType = { datasetId: string }[]; export type HttpBodyType> = { [NodeInputKeyEnum.addInputParam]: Record; diff --git a/packages/global/core/workflow/constants.ts b/packages/global/core/workflow/constants.ts index c12741b082e9..9740dfc54234 100644 --- a/packages/global/core/workflow/constants.ts +++ b/packages/global/core/workflow/constants.ts @@ -45,6 +45,7 @@ export enum NodeInputKeyEnum { whisper = 'whisper', variables = 'variables', scheduleTrigger = 'scheduleTrigger', + chatInputGuide = 'chatInputGuide', // entry userChatInput = 'userChatInput', @@ -117,6 +118,7 @@ export enum NodeOutputKeyEnum { answerText = 'answerText', // module answer. the value will be show and save to history success = 'success', failed = 'failed', + error = 'error', text = 'system_text', addOutputParam = 'system_addOutputParam', diff --git a/packages/global/core/workflow/runtime/utils.ts b/packages/global/core/workflow/runtime/utils.ts index e4e238ee19e6..956435a373da 100644 --- a/packages/global/core/workflow/runtime/utils.ts +++ b/packages/global/core/workflow/runtime/utils.ts @@ -1,5 +1,5 @@ import { ChatCompletionRequestMessageRoleEnum } from '../../ai/constants'; -import { NodeOutputKeyEnum } from '../constants'; +import { NodeInputKeyEnum, NodeOutputKeyEnum } from '../constants'; import { FlowNodeTypeEnum } from '../node/constant'; import { StoreNodeItemType } from '../type'; import { StoreEdgeItemType } from '../type/edge'; @@ -8,6 +8,23 @@ import { VARIABLE_NODE_ID } from '../constants'; import { isReferenceValue } from '../utils'; import { ReferenceValueProps } from '../type/io'; +export const getMaxHistoryLimitFromNodes = (nodes: StoreNodeItemType[]): number => { + let limit = 10; + nodes.forEach((node) => { + node.inputs.forEach((input) => { + if ( + (input.key === NodeInputKeyEnum.history || + input.key === NodeInputKeyEnum.historyMaxAmount) && + typeof input.value === 'number' + ) { + limit = Math.max(limit, input.value); + } + }); + }); + + return limit * 2; +}; + export const initWorkflowEdgeStatus = (edges: StoreEdgeItemType[]): RuntimeEdgeItemType[] => { return ( edges?.map((edge) => ({ diff --git a/packages/global/core/workflow/template/system/aiChat.ts b/packages/global/core/workflow/template/system/aiChat.ts index f00c97b90564..e88c8c6a11b6 100644 --- a/packages/global/core/workflow/template/system/aiChat.ts +++ b/packages/global/core/workflow/template/system/aiChat.ts @@ -31,6 +31,7 @@ export const AiChatModule: FlowNodeTemplateType = { intro: 'AI 大模型对话', showStatus: true, isTool: true, + version: '481', inputs: [ Input_Template_SettingAiModel, // --- settings modal @@ -88,6 +89,7 @@ export const AiChatModule: FlowNodeTemplateType = { { id: NodeOutputKeyEnum.history, key: NodeOutputKeyEnum.history, + required: true, label: 'core.module.output.label.New context', description: 'core.module.output.description.New context', valueType: WorkflowIOValueTypeEnum.chatHistory, @@ -96,6 +98,7 @@ export const AiChatModule: FlowNodeTemplateType = { { id: NodeOutputKeyEnum.answerText, key: NodeOutputKeyEnum.answerText, + required: true, label: 'core.module.output.label.Ai response content', description: 'core.module.output.description.Ai response content', valueType: WorkflowIOValueTypeEnum.string, diff --git a/packages/global/core/workflow/template/system/assignedAnswer.ts b/packages/global/core/workflow/template/system/assignedAnswer.ts index 5ccb38ab3ec5..96d5dae30fa5 100644 --- a/packages/global/core/workflow/template/system/assignedAnswer.ts +++ b/packages/global/core/workflow/template/system/assignedAnswer.ts @@ -17,11 +17,14 @@ export const AssignedAnswerModule: FlowNodeTemplateType = { name: '指定回复', intro: '该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。', + version: '481', + isTool: true, inputs: [ { key: NodeInputKeyEnum.answerText, renderTypeList: [FlowNodeInputTypeEnum.textarea, FlowNodeInputTypeEnum.reference], valueType: WorkflowIOValueTypeEnum.any, + required: true, label: 'core.module.input.label.Response content', description: 'core.module.input.description.Response content', placeholder: 'core.module.input.description.Response content' diff --git a/packages/global/core/workflow/template/system/classifyQuestion.ts b/packages/global/core/workflow/template/system/classifyQuestion.ts index c2afe4a4653b..99de2c7eeae7 100644 --- a/packages/global/core/workflow/template/system/classifyQuestion.ts +++ b/packages/global/core/workflow/template/system/classifyQuestion.ts @@ -29,6 +29,7 @@ export const ClassifyQuestionModule: FlowNodeTemplateType = { name: '问题分类', intro: `根据用户的历史记录和当前问题判断该次提问的类型。可以添加多组问题类型,下面是一个模板例子:\n类型1: 打招呼\n类型2: 关于商品“使用”问题\n类型3: 关于商品“购买”问题\n类型4: 其他问题`, showStatus: true, + version: '481', inputs: [ { ...Input_Template_SelectAIModel, @@ -67,6 +68,7 @@ export const ClassifyQuestionModule: FlowNodeTemplateType = { { id: NodeOutputKeyEnum.cqResult, key: NodeOutputKeyEnum.cqResult, + required: true, label: '分类结果', valueType: WorkflowIOValueTypeEnum.string, type: FlowNodeOutputTypeEnum.static diff --git a/packages/global/core/workflow/template/system/contextExtract.ts b/packages/global/core/workflow/template/system/contextExtract.ts index c34697ba7131..2223d35f97a7 100644 --- a/packages/global/core/workflow/template/system/contextExtract.ts +++ b/packages/global/core/workflow/template/system/contextExtract.ts @@ -25,6 +25,7 @@ export const ContextExtractModule: FlowNodeTemplateType = { intro: '可从文本中提取指定的数据,例如:sql语句、搜索关键词、代码等', showStatus: true, isTool: true, + version: '481', inputs: [ { ...Input_Template_SelectAIModel, @@ -59,25 +60,20 @@ export const ContextExtractModule: FlowNodeTemplateType = { } ], outputs: [ - // { - // id: NodeOutputKeyEnum.success, - // key: NodeOutputKeyEnum.success, - // label: '字段完全提取', - // valueType: WorkflowIOValueTypeEnum.boolean, - // type: FlowNodeOutputTypeEnum.source - // }, - // { - // id: NodeOutputKeyEnum.failed, - // key: NodeOutputKeyEnum.failed, - // label: '提取字段缺失', - // description: '存在一个或多个字段未提取成功。尽管使用了默认值也算缺失。', - // valueType: WorkflowIOValueTypeEnum.boolean, - // type: FlowNodeOutputTypeEnum.source - // }, + { + id: NodeOutputKeyEnum.success, + key: NodeOutputKeyEnum.success, + label: '字段完全提取', + required: true, + description: '提取字段全部填充时返回 true (模型提取或使用默认值均属于成功)', + valueType: WorkflowIOValueTypeEnum.boolean, + type: FlowNodeOutputTypeEnum.static + }, { id: NodeOutputKeyEnum.contextExtractFields, key: NodeOutputKeyEnum.contextExtractFields, label: '完整提取结果', + required: true, description: '一个 JSON 字符串,例如:{"name:":"YY","Time":"2023/7/2 18:00"}', valueType: WorkflowIOValueTypeEnum.string, type: FlowNodeOutputTypeEnum.static diff --git a/packages/global/core/workflow/template/system/datasetConcat.ts b/packages/global/core/workflow/template/system/datasetConcat.ts index 60b4d1779968..ee2576e6f1ac 100644 --- a/packages/global/core/workflow/template/system/datasetConcat.ts +++ b/packages/global/core/workflow/template/system/datasetConcat.ts @@ -42,6 +42,7 @@ export const DatasetConcatModule: FlowNodeTemplateType = { name: '知识库搜索引用合并', intro: '可以将多个知识库搜索结果进行合并输出。使用 RRF 的合并方式进行最终排序输出。', showStatus: false, + version: '481', inputs: [ { key: NodeInputKeyEnum.datasetMaxTokens, diff --git a/packages/global/core/workflow/template/system/datasetSearch.ts b/packages/global/core/workflow/template/system/datasetSearch.ts index 2808ca6f9319..07cfd5682e59 100644 --- a/packages/global/core/workflow/template/system/datasetSearch.ts +++ b/packages/global/core/workflow/template/system/datasetSearch.ts @@ -28,6 +28,7 @@ export const DatasetSearchModule: FlowNodeTemplateType = { intro: Dataset_SEARCH_DESC, showStatus: true, isTool: true, + version: '481', inputs: [ { key: NodeInputKeyEnum.datasetSelectList, @@ -35,7 +36,6 @@ export const DatasetSearchModule: FlowNodeTemplateType = { label: 'core.module.input.label.Select dataset', value: [], valueType: WorkflowIOValueTypeEnum.selectDataset, - list: [], required: true }, { diff --git a/packages/global/core/workflow/template/system/emptyNode.ts b/packages/global/core/workflow/template/system/emptyNode.ts index c26d1b1d2a24..0b58eb305a0e 100644 --- a/packages/global/core/workflow/template/system/emptyNode.ts +++ b/packages/global/core/workflow/template/system/emptyNode.ts @@ -12,6 +12,7 @@ export const EmptyNode: FlowNodeTemplateType = { avatar: '', name: '', intro: '', + version: '481', inputs: [], outputs: [] }; diff --git a/packages/global/core/workflow/template/system/globalVariable.ts b/packages/global/core/workflow/template/system/globalVariable.ts deleted file mode 100644 index 27f7de779cc0..000000000000 --- a/packages/global/core/workflow/template/system/globalVariable.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { FlowNodeTemplateTypeEnum, WorkflowIOValueTypeEnum } from '../../constants'; -import { getHandleConfig } from '../utils'; -import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; -import { VariableItemType } from '../../../app/type'; -import { FlowNodeTemplateType } from '../../type'; - -export const getGlobalVariableNode = ({ - id, - variables -}: { - id: string; - variables: VariableItemType[]; -}): FlowNodeTemplateType => { - return { - id, - templateType: FlowNodeTemplateTypeEnum.other, - flowNodeType: FlowNodeTypeEnum.systemConfig, - sourceHandle: getHandleConfig(true, true, true, true), - targetHandle: getHandleConfig(true, true, true, true), - avatar: '/imgs/workflow/variable.png', - name: '全局变量', - intro: '', - inputs: [], - outputs: variables.map((item) => ({ - id: item.key, - key: item.key, - valueType: WorkflowIOValueTypeEnum.string, - type: FlowNodeOutputTypeEnum.static, - label: item.label - })) - }; -}; diff --git a/packages/global/core/workflow/template/system/http468.ts b/packages/global/core/workflow/template/system/http468.ts index 515c15da2b39..3b46b779d77d 100644 --- a/packages/global/core/workflow/template/system/http468.ts +++ b/packages/global/core/workflow/template/system/http468.ts @@ -25,6 +25,7 @@ export const HttpModule468: FlowNodeTemplateType = { intro: '可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)', showStatus: true, isTool: true, + version: '481', inputs: [ { ...Input_Template_DynamicInput, @@ -80,10 +81,19 @@ export const HttpModule468: FlowNodeTemplateType = { ], outputs: [ Output_Template_AddOutput, + { + id: NodeOutputKeyEnum.error, + key: NodeOutputKeyEnum.error, + label: '请求错误', + description: 'HTTP请求错误信息,成功时返回空', + valueType: WorkflowIOValueTypeEnum.object, + type: FlowNodeOutputTypeEnum.static + }, { id: NodeOutputKeyEnum.httpRawResponse, key: NodeOutputKeyEnum.httpRawResponse, label: '原始响应', + required: true, description: 'HTTP请求的原始响应。只能接受字符串或JSON类型响应数据。', valueType: WorkflowIOValueTypeEnum.any, type: FlowNodeOutputTypeEnum.static diff --git a/packages/global/core/workflow/template/system/ifElse/index.ts b/packages/global/core/workflow/template/system/ifElse/index.ts index 0a244d6622ec..314e925b4166 100644 --- a/packages/global/core/workflow/template/system/ifElse/index.ts +++ b/packages/global/core/workflow/template/system/ifElse/index.ts @@ -22,6 +22,7 @@ export const IfElseNode: FlowNodeTemplateType = { name: '判断器', intro: '根据一定的条件,执行不同的分支。', showStatus: true, + version: '481', inputs: [ { key: NodeInputKeyEnum.ifElseList, diff --git a/packages/global/core/workflow/template/system/laf.ts b/packages/global/core/workflow/template/system/laf.ts index 2140432bb7fb..154533ef7b0f 100644 --- a/packages/global/core/workflow/template/system/laf.ts +++ b/packages/global/core/workflow/template/system/laf.ts @@ -25,6 +25,7 @@ export const LafModule: FlowNodeTemplateType = { intro: '可以调用Laf账号下的云函数。', showStatus: true, isTool: true, + version: '481', inputs: [ { ...Input_Template_DynamicInput, diff --git a/packages/global/core/workflow/template/system/pluginInput.ts b/packages/global/core/workflow/template/system/pluginInput.ts index 8e0d83f6b9d1..ab3b42ad0e20 100644 --- a/packages/global/core/workflow/template/system/pluginInput.ts +++ b/packages/global/core/workflow/template/system/pluginInput.ts @@ -15,6 +15,7 @@ export const PluginInputModule: FlowNodeTemplateType = { name: '自定义插件输入', intro: '自定义配置外部输入,使用插件时,仅暴露自定义配置的输入', showStatus: false, + version: '481', inputs: [], outputs: [] }; diff --git a/packages/global/core/workflow/template/system/pluginOutput.ts b/packages/global/core/workflow/template/system/pluginOutput.ts index 9b709a3b0156..2521e582d91d 100644 --- a/packages/global/core/workflow/template/system/pluginOutput.ts +++ b/packages/global/core/workflow/template/system/pluginOutput.ts @@ -15,6 +15,7 @@ export const PluginOutputModule: FlowNodeTemplateType = { name: '自定义插件输出', intro: '自定义配置外部输出,使用插件时,仅暴露自定义配置的输出', showStatus: false, + version: '481', inputs: [], outputs: [] }; diff --git a/packages/global/core/workflow/template/system/queryExtension.ts b/packages/global/core/workflow/template/system/queryExtension.ts index 6ee6689da2d5..fa23d5a2282f 100644 --- a/packages/global/core/workflow/template/system/queryExtension.ts +++ b/packages/global/core/workflow/template/system/queryExtension.ts @@ -29,6 +29,7 @@ export const AiQueryExtension: FlowNodeTemplateType = { intro: '使用问题优化功能,可以提高知识库连续对话时搜索的精度。使用该功能后,会先利用 AI 根据上下文构建一个或多个新的检索词,这些检索词更利于进行知识库搜索。该模块已内置在知识库搜索模块中,如果您仅进行一次知识库搜索,可直接使用知识库内置的补全功能。', showStatus: true, + version: '481', inputs: [ { ...Input_Template_SelectAIModel, diff --git a/packages/global/core/workflow/template/system/runApp.ts b/packages/global/core/workflow/template/system/runApp.ts index 504ca3f0e274..425b609b2cd0 100644 --- a/packages/global/core/workflow/template/system/runApp.ts +++ b/packages/global/core/workflow/template/system/runApp.ts @@ -23,6 +23,8 @@ export const RunAppModule: FlowNodeTemplateType = { name: '应用调用', intro: '可以选择一个其他应用进行调用', showStatus: true, + version: '481', + isTool: true, inputs: [ { key: NodeInputKeyEnum.runAppSelectApp, @@ -42,6 +44,7 @@ export const RunAppModule: FlowNodeTemplateType = { label: '新的上下文', description: '将该应用回复内容拼接到历史记录中,作为新的上下文返回', valueType: WorkflowIOValueTypeEnum.chatHistory, + required: true, type: FlowNodeOutputTypeEnum.static }, { diff --git a/packages/global/core/workflow/template/system/runPlugin.ts b/packages/global/core/workflow/template/system/runPlugin.ts index 419d6e06164b..43b9045719d7 100644 --- a/packages/global/core/workflow/template/system/runPlugin.ts +++ b/packages/global/core/workflow/template/system/runPlugin.ts @@ -13,6 +13,7 @@ export const RunPluginModule: FlowNodeTemplateType = { name: '', showStatus: false, isTool: true, + version: '481', inputs: [], // [{key:'pluginId'},...] outputs: [] }; diff --git a/packages/global/core/workflow/template/system/stopTool.ts b/packages/global/core/workflow/template/system/stopTool.ts index 713c653fc4cd..6881bd53b5e6 100644 --- a/packages/global/core/workflow/template/system/stopTool.ts +++ b/packages/global/core/workflow/template/system/stopTool.ts @@ -13,6 +13,7 @@ export const StopToolNode: FlowNodeTemplateType = { name: '工具调用终止', intro: '该模块需配置工具调用使用。当该模块被执行时,本次工具调用将会强制结束,并且不再调用AI针对工具调用结果回答问题。', + version: '481', inputs: [], outputs: [] }; diff --git a/packages/global/core/workflow/template/system/systemConfig.ts b/packages/global/core/workflow/template/system/systemConfig.ts index 69a8044bfee9..fbaffe118dd6 100644 --- a/packages/global/core/workflow/template/system/systemConfig.ts +++ b/packages/global/core/workflow/template/system/systemConfig.ts @@ -1,10 +1,6 @@ -import { FlowNodeInputTypeEnum, FlowNodeTypeEnum } from '../../node/constant'; +import { FlowNodeTypeEnum } from '../../node/constant'; import { FlowNodeTemplateType } from '../../type/index.d'; -import { - WorkflowIOValueTypeEnum, - NodeInputKeyEnum, - FlowNodeTemplateTypeEnum -} from '../../constants'; +import { FlowNodeTemplateTypeEnum, WorkflowIOValueTypeEnum } from '../../constants'; import { getHandleConfig } from '../utils'; export const SystemConfigNode: FlowNodeTemplateType = { @@ -18,44 +14,7 @@ export const SystemConfigNode: FlowNodeTemplateType = { intro: '可以配置应用的系统参数。', unique: true, forbidDelete: true, - inputs: [ - { - key: NodeInputKeyEnum.welcomeText, - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.string, - label: 'core.app.Welcome Text' - }, - { - key: NodeInputKeyEnum.variables, - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.any, - label: 'core.module.Variable', - value: [] - }, - { - key: NodeInputKeyEnum.questionGuide, - valueType: WorkflowIOValueTypeEnum.boolean, - renderTypeList: [FlowNodeInputTypeEnum.hidden], - label: '' - }, - { - key: NodeInputKeyEnum.tts, - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.any, - label: '' - }, - { - key: NodeInputKeyEnum.whisper, - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.any, - label: '' - }, - { - key: NodeInputKeyEnum.scheduleTrigger, - renderTypeList: [FlowNodeInputTypeEnum.hidden], - valueType: WorkflowIOValueTypeEnum.any, - label: '' - } - ], + version: '481', + inputs: [], outputs: [] }; diff --git a/packages/global/core/workflow/template/system/tools.ts b/packages/global/core/workflow/template/system/tools.ts index 8c0050df3304..4c9e15b50688 100644 --- a/packages/global/core/workflow/template/system/tools.ts +++ b/packages/global/core/workflow/template/system/tools.ts @@ -30,6 +30,7 @@ export const ToolModule: FlowNodeTemplateType = { name: '工具调用(实验)', intro: '通过AI模型自动选择一个或多个功能块进行调用,也可以对插件进行调用。', showStatus: true, + version: '481', inputs: [ { ...Input_Template_SettingAiModel, diff --git a/packages/global/core/workflow/template/system/variableUpdate/index.tsx b/packages/global/core/workflow/template/system/variableUpdate/index.tsx index 6867d98bba3b..419e8cee0394 100644 --- a/packages/global/core/workflow/template/system/variableUpdate/index.tsx +++ b/packages/global/core/workflow/template/system/variableUpdate/index.tsx @@ -16,8 +16,9 @@ export const VariableUpdateNode: FlowNodeTemplateType = { avatar: '/imgs/workflow/variable.png', name: '变量更新', intro: '可以更新指定节点的输出值或更新全局变量', - showStatus: true, + showStatus: false, isTool: false, + version: '481', inputs: [ { key: NodeInputKeyEnum.updateList, diff --git a/packages/global/core/workflow/template/system/workflowStart.ts b/packages/global/core/workflow/template/system/workflowStart.ts index f43b7839c4cb..ceb654b4907a 100644 --- a/packages/global/core/workflow/template/system/workflowStart.ts +++ b/packages/global/core/workflow/template/system/workflowStart.ts @@ -19,6 +19,7 @@ export const WorkflowStart: FlowNodeTemplateType = { intro: '', forbidDelete: true, unique: true, + version: '481', inputs: [{ ...Input_Template_UserChatInput, toolDescription: '用户问题' }], outputs: [ { diff --git a/packages/global/core/workflow/template/tip.ts b/packages/global/core/workflow/template/tip.ts index add805c721ac..cec778c42c84 100644 --- a/packages/global/core/workflow/template/tip.ts +++ b/packages/global/core/workflow/template/tip.ts @@ -1,3 +1 @@ export const chatNodeSystemPromptTip = 'core.app.tip.chatNodeSystemPromptTip'; -export const welcomeTextTip = 'core.app.tip.welcomeTextTip'; -export const variableTip = 'core.app.tip.variableTip'; diff --git a/packages/global/core/workflow/type/index.d.ts b/packages/global/core/workflow/type/index.d.ts index 5491454651f8..9e50458fae4a 100644 --- a/packages/global/core/workflow/type/index.d.ts +++ b/packages/global/core/workflow/type/index.d.ts @@ -22,12 +22,13 @@ import { RuntimeEdgeItemType, StoreEdgeItemType } from './edge'; import { NextApiResponse } from 'next'; export type FlowNodeCommonType = { - flowNodeType: `${FlowNodeTypeEnum}`; // render node card + flowNodeType: FlowNodeTypeEnum; // render node card avatar?: string; name: string; intro?: string; // template list intro showStatus?: boolean; // chatting response step status + version: string; // data inputs: FlowNodeInputItemType[]; @@ -63,6 +64,7 @@ export type FlowNodeTemplateType = FlowNodeCommonType & { // action forbidDelete?: boolean; // forbid delete unique?: boolean; + nodeVersion?: string; }; export type FlowNodeItemType = FlowNodeTemplateType & { nodeId: string; diff --git a/packages/global/core/workflow/utils.ts b/packages/global/core/workflow/utils.ts index 7a672d41f824..2d64bef411be 100644 --- a/packages/global/core/workflow/utils.ts +++ b/packages/global/core/workflow/utils.ts @@ -1,4 +1,4 @@ -import { FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from './node/constant'; +import { FlowNodeInputTypeEnum, FlowNodeOutputTypeEnum, FlowNodeTypeEnum } from './node/constant'; import { WorkflowIOValueTypeEnum, NodeInputKeyEnum, @@ -11,10 +11,16 @@ import type { VariableItemType, AppTTSConfigType, AppWhisperConfigType, - AppScheduledTriggerConfigType + AppScheduledTriggerConfigType, + ChatInputGuideConfigType, + AppChatConfigType } from '../app/type'; import { EditorVariablePickerType } from '../../../web/components/common/Textarea/PromptEditor/type'; -import { defaultWhisperConfig } from '../app/constants'; +import { + defaultChatInputGuideConfig, + defaultTTSConfig, + defaultWhisperConfig +} from '../app/constants'; import { IfElseResultEnum } from './template/system/ifElse/constant'; export const getHandleId = (nodeId: string, type: 'source' | 'target', key: string) => { @@ -22,15 +28,9 @@ export const getHandleId = (nodeId: string, type: 'source' | 'target', key: stri }; export const checkInputIsReference = (input: FlowNodeInputItemType) => { - const value = input.value; - if ( - Array.isArray(value) && - value.length === 2 && - typeof value[0] === 'string' && - typeof value[1] === 'string' - ) { + if (input.renderTypeList?.[input?.selectedTypeIndex || 0] === FlowNodeInputTypeEnum.reference) return true; - } + return false; }; @@ -46,63 +46,78 @@ export const splitGuideModule = (guideModules?: StoreNodeItemType) => { const welcomeText: string = guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.welcomeText)?.value || ''; - const variableNodes: VariableItemType[] = + const variables: VariableItemType[] = guideModules?.inputs.find((item) => item.key === NodeInputKeyEnum.variables)?.value || []; const questionGuide: boolean = !!guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.questionGuide)?.value || false; - const ttsConfig: AppTTSConfigType = guideModules?.inputs?.find( - (item) => item.key === NodeInputKeyEnum.tts - )?.value || { type: 'web' }; + const ttsConfig: AppTTSConfigType = + guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.tts)?.value || + defaultTTSConfig; const whisperConfig: AppWhisperConfigType = guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.whisper)?.value || defaultWhisperConfig; - const scheduledTriggerConfig: AppScheduledTriggerConfigType | null = - guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.scheduleTrigger)?.value ?? - null; + const scheduledTriggerConfig: AppScheduledTriggerConfigType = guideModules?.inputs?.find( + (item) => item.key === NodeInputKeyEnum.scheduleTrigger + )?.value; + + const chatInputGuide: ChatInputGuideConfigType = + guideModules?.inputs?.find((item) => item.key === NodeInputKeyEnum.chatInputGuide)?.value || + defaultChatInputGuideConfig; return { welcomeText, - variableNodes, + variables, questionGuide, ttsConfig, whisperConfig, - scheduledTriggerConfig + scheduledTriggerConfig, + chatInputGuide }; }; -export const replaceAppChatConfig = ({ - node, - variableList, - welcomeText +export const getAppChatConfig = ({ + chatConfig, + systemConfigNode, + storeVariables, + storeWelcomeText, + isPublicFetch = false }: { - node?: StoreNodeItemType; - variableList?: VariableItemType[]; - welcomeText?: string; -}): StoreNodeItemType | undefined => { - if (!node) return; - return { - ...node, - inputs: node.inputs.map((input) => { - if (input.key === NodeInputKeyEnum.variables && variableList) { - return { - ...input, - value: variableList - }; - } - if (input.key === NodeInputKeyEnum.welcomeText && welcomeText) { - return { - ...input, - value: welcomeText - }; - } - - return input; - }) + chatConfig?: AppChatConfigType; + systemConfigNode?: StoreNodeItemType; + storeVariables?: VariableItemType[]; + storeWelcomeText?: string; + isPublicFetch: boolean; +}): AppChatConfigType => { + const { + welcomeText, + variables, + questionGuide, + ttsConfig, + whisperConfig, + scheduledTriggerConfig, + chatInputGuide + } = splitGuideModule(systemConfigNode); + + const config: AppChatConfigType = { + questionGuide, + ttsConfig, + whisperConfig, + scheduledTriggerConfig, + chatInputGuide, + ...chatConfig, + variables: storeVariables ?? chatConfig?.variables ?? variables, + welcomeText: storeWelcomeText ?? chatConfig?.welcomeText ?? welcomeText }; + + if (!isPublicFetch) { + config.scheduledTriggerConfig = undefined; + } + + return config; }; export const getOrInitModuleInputValue = (input: FlowNodeInputItemType) => { @@ -160,7 +175,7 @@ export const pluginData2FlowNodeIO = ( }; export const formatEditorVariablePickerIcon = ( - variables: { key: string; label: string; type?: `${VariableInputEnum}` }[] + variables: { key: string; label: string; type?: `${VariableInputEnum}`; required?: boolean }[] ): EditorVariablePickerType[] => { return variables.map((item) => ({ ...item, diff --git a/packages/global/package.json b/packages/global/package.json index a21cc6eaae59..8a015802cd06 100644 --- a/packages/global/package.json +++ b/packages/global/package.json @@ -10,7 +10,7 @@ "js-yaml": "^4.1.0", "jschardet": "3.1.1", "nanoid": "^4.0.1", - "next": "13.5.2", + "next": "14.2.3", "openai": "4.28.0", "openapi-types": "^12.1.3", "timezones-list": "^3.0.2" diff --git a/packages/global/support/permission/constant.ts b/packages/global/support/permission/constant.ts index 5a9851fb59c8..000fa89916f7 100644 --- a/packages/global/support/permission/constant.ts +++ b/packages/global/support/permission/constant.ts @@ -20,3 +20,9 @@ export const PermissionTypeMap = { label: 'permission.Public' } }; + +export enum ResourceTypeEnum { + team = 'team', + app = 'app', + dataset = 'dataset' +} diff --git a/packages/global/support/permission/type.d.ts b/packages/global/support/permission/type.d.ts index f0ad8f48ec09..3e182acd7c10 100644 --- a/packages/global/support/permission/type.d.ts +++ b/packages/global/support/permission/type.d.ts @@ -1,5 +1,7 @@ import { AuthUserTypeEnum } from './constant'; +export type PermissionValueType = number; + export type AuthResponseType = { teamId: string; tmbId: string; @@ -9,3 +11,10 @@ export type AuthResponseType = { appId?: string; apikey?: string; }; + +export type ResourcePermissionType = { + teamId: string; + tmbId: string; + resourceType: ResourceType; + permission: PermissionValueType; +}; diff --git a/packages/global/support/user/team/controller.d.ts b/packages/global/support/user/team/controller.d.ts index d0396030d51c..316bacd58750 100644 --- a/packages/global/support/user/team/controller.d.ts +++ b/packages/global/support/user/team/controller.d.ts @@ -1,3 +1,4 @@ +import { PermissionValueType } from 'support/permission/type'; import { TeamMemberRoleEnum } from './constant'; import { LafAccountType, TeamMemberSchema } from './type'; @@ -44,3 +45,9 @@ export type InviteMemberResponse = Record< 'invite' | 'inValid' | 'inTeam', { username: string; userId: string }[] >; + +export type UpdateTeamMemberPermissionProps = { + teamId: string; + memberIds: string[]; + permission: PermissionValueType; +}; diff --git a/packages/global/support/user/team/type.d.ts b/packages/global/support/user/team/type.d.ts index d043b6be2f74..93f0c653d74f 100644 --- a/packages/global/support/user/team/type.d.ts +++ b/packages/global/support/user/team/type.d.ts @@ -1,6 +1,7 @@ import type { UserModelSchema } from '../type'; import type { TeamMemberRoleEnum, TeamMemberStatusEnum } from './constant'; import { LafAccountType } from './type'; +import { PermissionValueType, ResourcePermissionType } from '../../permission/type'; export type TeamSchema = { _id: string; @@ -15,6 +16,7 @@ export type TeamSchema = { lastWebsiteSyncTime: Date; }; lafAccount: LafAccountType; + defaultPermission: PermissionValueType; }; export type tagsType = { label: string; @@ -61,6 +63,7 @@ export type TeamItemType = { status: `${TeamMemberStatusEnum}`; canWrite: boolean; lafAccount?: LafAccountType; + defaultPermission: PermissionValueType; }; export type TeamMemberItemType = { @@ -69,8 +72,10 @@ export type TeamMemberItemType = { teamId: string; memberName: string; avatar: string; + // TODO: this should be deprecated. role: `${TeamMemberRoleEnum}`; status: `${TeamMemberStatusEnum}`; + permission: PermissionValueType; }; export type TeamTagItemType = { diff --git a/packages/service/common/file/gridfs/controller.ts b/packages/service/common/file/gridfs/controller.ts index e77aa03c7995..0e295cdf955e 100644 --- a/packages/service/common/file/gridfs/controller.ts +++ b/packages/service/common/file/gridfs/controller.ts @@ -7,7 +7,7 @@ import { MongoFileSchema } from './schema'; import { detectFileEncoding } from '@fastgpt/global/common/file/tools'; import { CommonErrEnum } from '@fastgpt/global/common/error/code/common'; import { MongoRawTextBuffer } from '../../buffer/rawText/schema'; -import { readFileRawContent } from '../read/utils'; +import { readRawContentByFileBuffer } from '../read/utils'; import { PassThrough } from 'stream'; export function getGFSCollection(bucket: `${BucketNameEnum}`) { @@ -154,6 +154,7 @@ export const readFileContentFromMongo = async ({ csvFormat = false, dataset = undefined, preview = false, + isQAImport = false }: { teamId: string; bucketName: `${BucketNameEnum}`; @@ -161,6 +162,7 @@ export const readFileContentFromMongo = async ({ csvFormat?: boolean; dataset?: DatasetSchemaType; preview?: boolean; + isQAImport?: boolean; }): Promise<{ rawText: string; filename: string; @@ -200,9 +202,9 @@ export const readFileContentFromMongo = async ({ }); })(); - const { rawText } = await readFileRawContent({ + const { rawText } = await readRawContentByFileBuffer({ extension, - csvFormat, + isQAImport, teamId, buffer: fileBuffers, encoding, diff --git a/packages/service/common/file/multer.ts b/packages/service/common/file/multer.ts index 344bb5c8988e..21289abb51c5 100644 --- a/packages/service/common/file/multer.ts +++ b/packages/service/common/file/multer.ts @@ -5,7 +5,7 @@ import { BucketNameEnum, bucketNameMap } from '@fastgpt/global/common/file/const import { getNanoid } from '@fastgpt/global/common/string/tools'; import { tmpFileDirPath } from './constants'; -type FileType = { +export type FileType = { fieldname: string; originalname: string; encoding: string; diff --git a/packages/service/common/file/read/utils.ts b/packages/service/common/file/read/utils.ts index a1a336d0d00b..d8d517bcbc52 100644 --- a/packages/service/common/file/read/utils.ts +++ b/packages/service/common/file/read/utils.ts @@ -1,9 +1,11 @@ -import { markdownProcess, simpleMarkdownText } from '@fastgpt/global/common/string/markdown'; +import { markdownProcess } from '@fastgpt/global/common/string/markdown'; import { uploadMongoImg } from '../image/controller'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; import { addHours } from 'date-fns'; import { WorkerNameEnum, runWorker } from '../../../worker/utils'; +import fs from 'fs'; +import { detectFileEncoding } from '@fastgpt/global/common/file/tools'; import { ReadFileResponse } from '../../../worker/file/type'; import {DatasetSchemaType} from "@fastgpt/global/core/dataset/type"; import {initPdfText} from "../../../worker/file/extension/unstructured"; @@ -29,16 +31,43 @@ export const initMarkdownText = ({ }) }); -export const readFileRawContent = async ({ +export type readRawTextByLocalFileParams = { + teamId: string; + path: string; + metadata?: Record; +}; +export const readRawTextByLocalFile = async (params: readRawTextByLocalFileParams) => { + const { path } = params; + + const extension = path?.split('.')?.pop()?.toLowerCase() || ''; + + const buffer = fs.readFileSync(path); + const encoding = detectFileEncoding(buffer); + + const { rawText } = await readRawContentByFileBuffer({ + extension, + isQAImport: false, + teamId: params.teamId, + encoding, + buffer, + metadata: params.metadata + }); + + return { + rawText + }; +}; + +export const readRawContentByFileBuffer = async ({ extension, - csvFormat, + isQAImport, teamId, buffer, encoding, metadata, dataset }: { - csvFormat?: boolean; + isQAImport?: boolean; extension: string; teamId: string; buffer: Buffer; @@ -46,9 +75,8 @@ export const readFileRawContent = async ({ metadata?: Record; dataset?: DatasetSchemaType; }) => { - const result = await runWorker(WorkerNameEnum.readFile, { + let result = await runWorker(WorkerNameEnum.readFile, { extension, - csvFormat, encoding, buffer, metadata, @@ -62,7 +90,7 @@ export const readFileRawContent = async ({ teamId: teamId, metadata: metadata, dataset: dataset, - pageElements: result?.metadata? result?.metadata["elements"] : [] + pageElements: result.metadata? result.metadata["elements"] : [] }); } @@ -75,11 +103,15 @@ export const readFileRawContent = async ({ }); } - return result; -}; - -export const htmlToMarkdown = async (html?: string | null) => { - const md = await runWorker(WorkerNameEnum.htmlStr2Md, { html: html || '' }); + if (['csv', 'xlsx'].includes(extension)) { + // qa data + if (isQAImport) { + result.rawText = result.rawText || ''; + } else { + result.rawText = result.formatText || ''; + } + } - return simpleMarkdownText(md); + const {rawText} = result; + return { rawText }; }; diff --git a/packages/service/common/middle/entry.ts b/packages/service/common/middle/entry.ts new file mode 100644 index 000000000000..8bdd09f2f867 --- /dev/null +++ b/packages/service/common/middle/entry.ts @@ -0,0 +1,44 @@ +import { jsonRes } from '../response'; +import type { NextApiResponse } from 'next'; +import { withNextCors } from './cors'; +import { ApiRequestProps } from '../../type/next'; +import { addLog } from '../system/log'; + +export type NextApiHandler = ( + req: ApiRequestProps, + res: NextApiResponse +) => unknown | Promise; + +export const NextEntry = ({ beforeCallback = [] }: { beforeCallback?: Promise[] }) => { + return (...args: NextApiHandler[]): NextApiHandler => { + return async function api(req: ApiRequestProps, res: NextApiResponse) { + const start = Date.now(); + addLog.info(`Request start ${req.url}`); + try { + await Promise.all([withNextCors(req, res), ...beforeCallback]); + + let response = null; + for (const handler of args) { + response = await handler(req, res); + } + + const contentType = res.getHeader('Content-Type'); + + addLog.info(`Request finish ${req.url}, time: ${Date.now() - start}ms`); + + if ((!contentType || contentType === 'application/json') && !res.writableFinished) { + return jsonRes(res, { + code: 200, + data: response + }); + } + } catch (error) { + return jsonRes(res, { + code: 500, + error, + url: req.url + }); + } + }; + }; +}; diff --git a/packages/service/common/mongo/init.ts b/packages/service/common/mongo/init.ts index db1de6c1ce59..c93a4b60e6f4 100644 --- a/packages/service/common/mongo/init.ts +++ b/packages/service/common/mongo/init.ts @@ -39,6 +39,10 @@ export async function connectMongo({ global.mongodb?.disconnect(); global.mongodb = undefined; }); + mongoose.connection.on('disconnected', () => { + console.log('mongo disconnected'); + global.mongodb = undefined; + }); console.log('mongo connected'); diff --git a/packages/service/common/string/cheerio.ts b/packages/service/common/string/cheerio.ts index d7056fdb4968..495486e20f59 100644 --- a/packages/service/common/string/cheerio.ts +++ b/packages/service/common/string/cheerio.ts @@ -1,7 +1,7 @@ import { UrlFetchParams, UrlFetchResponse } from '@fastgpt/global/common/file/api'; import * as cheerio from 'cheerio'; import axios from 'axios'; -import { htmlToMarkdown } from '../file/read/utils'; +import { htmlToMarkdown } from './utils'; export const cheerioToHtml = ({ fetchUrl, @@ -77,9 +77,8 @@ export const urlsFetch = async ({ $, selector }); - console.log('html====', html); + const md = await htmlToMarkdown(html); - console.log('html====', md); return { url, diff --git a/packages/service/common/string/tiktoken/index.ts b/packages/service/common/string/tiktoken/index.ts index cf3e81307f3f..49a3cd85f38e 100644 --- a/packages/service/common/string/tiktoken/index.ts +++ b/packages/service/common/string/tiktoken/index.ts @@ -12,27 +12,34 @@ import { getNanoid } from '@fastgpt/global/common/string/tools'; import { addLog } from '../../system/log'; export const getTiktokenWorker = () => { - if (global.tiktokenWorker) { - return global.tiktokenWorker; + const maxWorkers = global.systemEnv?.tokenWorkers || 20; + + if (!global.tiktokenWorkers) { + global.tiktokenWorkers = []; + } + + if (global.tiktokenWorkers.length >= maxWorkers) { + return global.tiktokenWorkers[Math.floor(Math.random() * global.tiktokenWorkers.length)]; } const worker = getWorker(WorkerNameEnum.countGptMessagesTokens); + const i = global.tiktokenWorkers.push({ + index: global.tiktokenWorkers.length, + worker, + callbackMap: {} + }); + worker.on('message', ({ id, data }: { id: string; data: number }) => { - const callback = global.tiktokenWorker?.callbackMap?.[id]; + const callback = global.tiktokenWorkers[i - 1]?.callbackMap?.[id]; if (callback) { callback?.(data); - delete global.tiktokenWorker.callbackMap[id]; + delete global.tiktokenWorkers[i - 1].callbackMap[id]; } }); - global.tiktokenWorker = { - worker, - callbackMap: {} - }; - - return global.tiktokenWorker; + return global.tiktokenWorkers[i - 1]; }; export const countGptMessagesTokens = ( @@ -40,32 +47,46 @@ export const countGptMessagesTokens = ( tools?: ChatCompletionTool[], functionCall?: ChatCompletionCreateParams.Function[] ) => { - return new Promise((resolve) => { - const start = Date.now(); - - const { worker, callbackMap } = getTiktokenWorker(); - const id = getNanoid(); - - const timer = setTimeout(() => { + return new Promise(async (resolve) => { + try { + const start = Date.now(); + + const { worker, callbackMap } = getTiktokenWorker(); + + const id = getNanoid(); + + const timer = setTimeout(() => { + console.log('Count token Time out'); + resolve( + messages.reduce((sum, item) => { + if (item.content) { + return sum + item.content.length * 0.5; + } + return sum; + }, 0) + ); + delete callbackMap[id]; + }, 60000); + + callbackMap[id] = (data) => { + // 检测是否有内存泄漏 + addLog.info(`Count token time: ${Date.now() - start}, token: ${data}`); + // console.log(process.memoryUsage()); + + resolve(data); + clearTimeout(timer); + }; + + // 可以进一步优化(传递100w token数据,实际需要300ms,较慢) + worker.postMessage({ + id, + messages, + tools, + functionCall + }); + } catch (error) { resolve(0); - delete callbackMap[id]; - }, 300); - - callbackMap[id] = (data) => { - resolve(data); - clearTimeout(timer); - - // 检测是否有内存泄漏 - // addLog.info(`Count token time: ${Date.now() - start}, token: ${data}`); - // console.log(process.memoryUsage()); - }; - - worker.postMessage({ - id, - messages, - tools, - functionCall - }); + } }); }; diff --git a/packages/service/common/string/utils.ts b/packages/service/common/string/utils.ts new file mode 100644 index 000000000000..cd83e2e5659a --- /dev/null +++ b/packages/service/common/string/utils.ts @@ -0,0 +1,8 @@ +import { simpleMarkdownText } from '@fastgpt/global/common/string/markdown'; +import { WorkerNameEnum, runWorker } from '../../worker/utils'; + +export const htmlToMarkdown = async (html?: string | null) => { + const md = await runWorker(WorkerNameEnum.htmlStr2Md, { html: html || '' }); + + return simpleMarkdownText(md); +}; diff --git a/packages/service/common/system/tools.ts b/packages/service/common/system/tools.ts index fe78a4541f7a..dba6e09401ce 100644 --- a/packages/service/common/system/tools.ts +++ b/packages/service/common/system/tools.ts @@ -21,3 +21,17 @@ export const initFastGPTConfig = (config?: FastGPTConfigFileType) => { global.whisperModel = config.whisperModel; global.reRankModels = config.reRankModels; }; + +export const systemStartCb = () => { + process.on('uncaughtException', (err) => { + console.error('Uncaught Exception:', err); + // process.exit(1); // 退出进程 + }); + + process.on('unhandledRejection', (reason, promise) => { + console.error('Unhandled Rejection at:', promise, 'reason:', reason); + // process.exit(1); // 退出进程 + }); +}; + +export const surrenderProcess = () => new Promise((resolve) => setImmediate(resolve)); diff --git a/packages/service/common/vectorStore/pg/controller.ts b/packages/service/common/vectorStore/pg/controller.ts index 3aad5b411ef0..0ce6203a9694 100644 --- a/packages/service/common/vectorStore/pg/controller.ts +++ b/packages/service/common/vectorStore/pg/controller.ts @@ -132,17 +132,19 @@ export const embeddingRecall = async ( ): Promise<{ results: EmbeddingRecallItemType[]; }> => { - const { datasetIds, vectors, limit, retry = 2 } = props; + const { teamId, datasetIds, vectors, limit, retry = 2 } = props; try { const results: any = await PgClient.query( - `BEGIN; + ` + BEGIN; SET LOCAL hnsw.ef_search = ${global.systemEnv?.pgHNSWEfSearch || 100}; select id, collection_id, vector <#> '[${vectors[0]}]' AS score from ${PgDatasetTableName} - where dataset_id IN (${datasetIds.map((id) => `'${String(id)}'`).join(',')}) + where team_id='${teamId}' + AND dataset_id IN (${datasetIds.map((id) => `'${String(id)}'`).join(',')}) order by score limit ${limit}; - COMMIT;` + COMMIT;` ); const rows = results?.[2]?.rows as PgSearchRawType[]; diff --git a/packages/service/core/ai/functions/queryExtension.ts b/packages/service/core/ai/functions/queryExtension.ts index ff8713bfc8a1..4acffc115246 100644 --- a/packages/service/core/ai/functions/queryExtension.ts +++ b/packages/service/core/ai/functions/queryExtension.ts @@ -15,7 +15,7 @@ const defaultPrompt = `作为一个向量检索助手,你的任务是结合历 """ """ 原问题: 介绍下剧情。 -检索词: ["介绍下故事的背景和主要人物。","故事的主题是什么?","剧情是是如何发展的?"] +检索词: ["介绍下故事的背景。","故事的主题是什么?","介绍下故事的主要人物。"] ---------------- 历史记录: """ @@ -41,7 +41,7 @@ Q: 护产假多少天? A: 护产假的天数根据员工所在的城市而定。请提供您所在的城市,以便我回答您的问题。 """ 原问题: 沈阳 -检索词: ["沈阳的护产假多少天?"] +检索词: ["沈阳的护产假多少天?","沈阳的护产假政策。","沈阳的护产假标准。"] ---------------- 历史记录: """ @@ -65,7 +65,7 @@ Q: FastGPT 如何收费? A: FastGPT 收费可以参考…… """ 原问题: 你知道 laf 么? -检索词: ["laf是什么?","如何使用laf?","laf的介绍。"] +检索词: ["laf 的官网地址是多少?","laf 的使用教程。","laf 有什么特点和优势。"] ---------------- 历史记录: """ @@ -75,7 +75,7 @@ A: 1. 开源 3. 扩展性强 """ 原问题: 介绍下第2点。 -检索词: ["介绍下 FastGPT 简便的优势", "FastGPT 为什么使用起来简便?","FastGPT的有哪些简便的功能?"]。 +检索词: ["介绍下 FastGPT 简便的优势", "从哪些方面,可以体现出 FastGPT 的简便"]。 ---------------- 历史记录: """ @@ -85,7 +85,7 @@ Q: 什么是 Laf? A: Laf 是一个云函数开发平台。 """ 原问题: 它们有什么关系? -检索词: ["FastGPT和Laf有什么关系?","FastGPT的RAG是用Laf实现的么?"] +检索词: ["FastGPT和Laf有什么关系?","介绍下FastGPT","介绍下Laf"] ---------------- 历史记录: """ diff --git a/packages/service/core/app/controller.ts b/packages/service/core/app/controller.ts index cc5927d90b65..dd45fad32c0d 100644 --- a/packages/service/core/app/controller.ts +++ b/packages/service/core/app/controller.ts @@ -2,7 +2,7 @@ import { AppSchema } from '@fastgpt/global/core/app/type'; import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import { getLLMModel } from '../ai/model'; -import { MongoAppVersion } from './versionSchema'; +import { MongoAppVersion } from './version/schema'; export const beforeUpdateAppFormat = ({ nodes @@ -55,11 +55,13 @@ export const getAppLatestVersion = async (appId: string, app?: AppSchema) => { if (version) { return { nodes: version.nodes, - edges: version.edges + edges: version.edges, + chatConfig: version.chatConfig || app?.chatConfig || {} }; } return { nodes: app?.modules || [], - edges: app?.edges || [] + edges: app?.edges || [], + chatConfig: app?.chatConfig || {} }; }; diff --git a/packages/service/core/app/schema.ts b/packages/service/core/app/schema.ts index 0990f4f7bada..cb8c1f1d6768 100644 --- a/packages/service/core/app/schema.ts +++ b/packages/service/core/app/schema.ts @@ -10,6 +10,16 @@ import { export const AppCollectionName = 'apps'; +export const chatConfigType = { + welcomeText: String, + variables: Array, + questionGuide: Boolean, + ttsConfig: Object, + whisperConfig: Object, + scheduledTriggerConfig: Object, + chatInputGuide: Object +}; + const AppSchema = new Schema({ teamId: { type: Schema.Types.ObjectId, @@ -47,6 +57,16 @@ const AppSchema = new Schema({ default: () => new Date() }, + // role and auth + permission: { + type: String, + enum: Object.keys(PermissionTypeMap), + default: PermissionTypeEnum.private + }, + teamTags: { + type: [String] + }, + // tmp store modules: { type: Array, @@ -56,6 +76,10 @@ const AppSchema = new Schema({ type: Array, default: [] }, + chatConfig: { + type: chatConfigType, + default: {} + }, scheduledTriggerConfig: { cronString: { @@ -74,14 +98,6 @@ const AppSchema = new Schema({ inited: { type: Boolean - }, - permission: { - type: String, - enum: Object.keys(PermissionTypeMap), - default: PermissionTypeEnum.private - }, - teamTags: { - type: [String] } }); diff --git a/packages/service/core/app/versionSchema.ts b/packages/service/core/app/version/schema.ts similarity index 81% rename from packages/service/core/app/versionSchema.ts rename to packages/service/core/app/version/schema.ts index c573078266eb..983ffbba0eab 100644 --- a/packages/service/core/app/versionSchema.ts +++ b/packages/service/core/app/version/schema.ts @@ -1,6 +1,7 @@ -import { connectionMongo, type Model } from '../../common/mongo'; +import { connectionMongo, type Model } from '../../../common/mongo'; const { Schema, model, models } = connectionMongo; import { AppVersionSchemaType } from '@fastgpt/global/core/app/version'; +import { chatConfigType } from '../schema'; export const AppVersionCollectionName = 'app_versions'; @@ -21,6 +22,10 @@ const AppVersionSchema = new Schema({ edges: { type: Array, default: [] + }, + chatConfig: { + type: chatConfigType, + default: {} } }); diff --git a/packages/service/core/chat/controller.ts b/packages/service/core/chat/controller.ts index c382964d6971..b5de13f77266 100644 --- a/packages/service/core/chat/controller.ts +++ b/packages/service/core/chat/controller.ts @@ -32,7 +32,7 @@ export async function getChatItems({ return { history }; } -/* 临时适配旧的对话记录,清洗完数据后可删除(4.30刪除) */ +/* 临时适配旧的对话记录 */ export const adaptStringValue = (value: any): ChatItemValueItemType[] => { if (typeof value === 'string') { return [ diff --git a/packages/service/core/chat/inputGuide/schema.ts b/packages/service/core/chat/inputGuide/schema.ts new file mode 100644 index 000000000000..a8f14343e0c0 --- /dev/null +++ b/packages/service/core/chat/inputGuide/schema.ts @@ -0,0 +1,29 @@ +import { AppCollectionName } from '../../app/schema'; +import { connectionMongo, type Model } from '../../../common/mongo'; +const { Schema, model, models } = connectionMongo; +import type { ChatInputGuideSchemaType } from '@fastgpt/global/core/chat/inputGuide/type.d'; + +export const ChatInputGuideCollectionName = 'chat_input_guides'; + +const ChatInputGuideSchema = new Schema({ + appId: { + type: Schema.Types.ObjectId, + ref: AppCollectionName, + required: true + }, + text: { + type: String, + default: '' + } +}); + +try { + ChatInputGuideSchema.index({ appId: 1, text: 1 }, { unique: true }); +} catch (error) { + console.log(error); +} + +export const MongoChatInputGuide: Model = + models[ChatInputGuideCollectionName] || model(ChatInputGuideCollectionName, ChatInputGuideSchema); + +MongoChatInputGuide.syncIndexes(); diff --git a/packages/service/core/dataset/collection/controller.ts b/packages/service/core/dataset/collection/controller.ts index b70d4a852bfb..6b69ed379e4c 100644 --- a/packages/service/core/dataset/collection/controller.ts +++ b/packages/service/core/dataset/collection/controller.ts @@ -32,6 +32,9 @@ export async function createOneCollection({ fileId, rawLink, + externalFileId, + externalFileUrl, + hashRawText, rawTextLength, metadata = {}, @@ -61,6 +64,8 @@ export async function createOneCollection({ fileId, rawLink, + externalFileId, + externalFileUrl, rawTextLength, hashRawText, diff --git a/packages/service/core/dataset/collection/schema.ts b/packages/service/core/dataset/collection/schema.ts index e8cb6e53acc6..8e941696284e 100644 --- a/packages/service/core/dataset/collection/schema.ts +++ b/packages/service/core/dataset/collection/schema.ts @@ -16,11 +16,6 @@ const DatasetCollectionSchema = new Schema({ ref: DatasetColCollectionName, default: null }, - userId: { - // abandoned - type: Schema.Types.ObjectId, - ref: 'user' - }, teamId: { type: Schema.Types.ObjectId, ref: TeamCollectionName, @@ -54,6 +49,7 @@ const DatasetCollectionSchema = new Schema({ default: () => new Date() }, + // chunk filed trainingType: { type: String, enum: Object.keys(TrainingTypeMap), @@ -70,20 +66,25 @@ const DatasetCollectionSchema = new Schema({ type: String }, + tags: { + type: [String], + default: [] + }, + + // local file collection fileId: { type: Schema.Types.ObjectId, ref: 'dataset.files' }, - rawLink: { - type: String - }, + // web link collection + rawLink: String, + // external collection + externalFileId: String, - rawTextLength: { - type: Number - }, - hashRawText: { - type: String - }, + // metadata + rawTextLength: Number, + hashRawText: String, + externalFileUrl: String, // external import url metadata: { type: Object, default: {} diff --git a/packages/service/core/dataset/read.ts b/packages/service/core/dataset/read.ts new file mode 100644 index 000000000000..2ab98a165ff3 --- /dev/null +++ b/packages/service/core/dataset/read.ts @@ -0,0 +1,112 @@ +import { BucketNameEnum } from '@fastgpt/global/common/file/constants'; +import { DatasetSourceReadTypeEnum } from '@fastgpt/global/core/dataset/constants'; +import { readFileContentFromMongo } from '../../common/file/gridfs/controller'; +import { urlsFetch } from '../../common/string/cheerio'; +import { parseCsvTable2Chunks } from './training/utils'; +import { TextSplitProps, splitText2Chunks } from '@fastgpt/global/common/string/textSplitter'; +import axios from 'axios'; +import { readRawContentByFileBuffer } from '../../common/file/read/utils'; + +export const readFileRawTextByUrl = async ({ + teamId, + url, + relatedId +}: { + teamId: string; + url: string; + relatedId?: string; +}) => { + const response = await axios({ + method: 'get', + url: url, + responseType: 'arraybuffer' + }); + const extension = url.split('.')?.pop()?.toLowerCase() || ''; + + const buffer = Buffer.from(response.data, 'binary'); + + const { rawText } = await readRawContentByFileBuffer({ + extension, + teamId, + buffer, + encoding: 'utf-8', + metadata: { + relatedId + } + }); + + return rawText; +}; + +/* + fileId - local file, read from mongo + link - request + externalFile = request read +*/ +export const readDatasetSourceRawText = async ({ + teamId, + type, + sourceId, + isQAImport, + selector, + relatedId +}: { + teamId: string; + type: DatasetSourceReadTypeEnum; + sourceId: string; + isQAImport?: boolean; + selector?: string; + relatedId?: string; +}): Promise => { + if (type === DatasetSourceReadTypeEnum.fileLocal) { + const { rawText } = await readFileContentFromMongo({ + teamId, + bucketName: BucketNameEnum.dataset, + fileId: sourceId, + isQAImport + }); + return rawText; + } else if (type === DatasetSourceReadTypeEnum.link) { + const result = await urlsFetch({ + urlList: [sourceId], + selector + }); + + return result[0]?.content || ''; + } else if (type === DatasetSourceReadTypeEnum.externalFile) { + const rawText = await readFileRawTextByUrl({ + teamId, + url: sourceId, + relatedId + }); + return rawText; + } + + return ''; +}; + +export const rawText2Chunks = ({ + rawText, + isQAImport, + chunkLen = 512, + ...splitProps +}: { + rawText: string; + isQAImport?: boolean; +} & TextSplitProps) => { + if (isQAImport) { + const { chunks } = parseCsvTable2Chunks(rawText); + return chunks; + } + + const { chunks } = splitText2Chunks({ + text: rawText, + chunkLen, + ...splitProps + }); + + return chunks.map((item) => ({ + q: item, + a: '' + })); +}; diff --git a/packages/service/core/dataset/schema.ts b/packages/service/core/dataset/schema.ts index 4139e042b57a..95f81daf6a20 100644 --- a/packages/service/core/dataset/schema.ts +++ b/packages/service/core/dataset/schema.ts @@ -89,7 +89,8 @@ const DatasetSchema = new Schema({ default: 'body' } } - } + }, + externalReadUrl: String }); try { diff --git a/packages/service/core/dataset/search/controller.ts b/packages/service/core/dataset/search/controller.ts index f5f83c3acb73..60ade42f48ef 100644 --- a/packages/service/core/dataset/search/controller.ts +++ b/packages/service/core/dataset/search/controller.ts @@ -18,6 +18,7 @@ import { countPromptTokens } from '../../../common/string/tiktoken/index'; import { datasetSearchResultConcat } from '@fastgpt/global/core/dataset/search/utils'; import { hashStr } from '@fastgpt/global/common/string/tools'; import { jiebaSplit } from '../../../common/string/jieba'; +import { getCollectionSourceData } from '@fastgpt/global/core/dataset/collection/utils'; type SearchDatasetDataProps = { teamId: string; @@ -98,7 +99,7 @@ export async function searchDatasetData(props: SearchDatasetDataProps) { }, 'datasetId collectionId q a chunkIndex indexes' ) - .populate('collectionId', 'name fileId rawLink') + .populate('collectionId', 'name fileId rawLink externalFileId externalFileUrl') .lean()) as DatasetDataWithCollectionType[]; // add score to data(It's already sorted. The first one is the one with the most points) @@ -130,8 +131,7 @@ export async function searchDatasetData(props: SearchDatasetDataProps) { chunkIndex: data.chunkIndex, datasetId: String(data.datasetId), collectionId: String(data.collectionId?._id), - sourceName: data.collectionId?.name || '', - sourceId: data.collectionId?.fileId || data.collectionId?.rawLink, + ...getCollectionSourceData(data.collectionId), score: [{ type: SearchScoreTypeEnum.embedding, value: data.score, index }] }; @@ -205,8 +205,7 @@ export async function searchDatasetData(props: SearchDatasetDataProps) { id: String(item._id), datasetId: String(item.datasetId), collectionId: String(item.collectionId), - sourceName: collection?.name || '', - sourceId: collection?.fileId || collection?.rawLink, + ...getCollectionSourceData(collection), q: item.q, a: item.a, chunkIndex: item.chunkIndex, diff --git a/packages/service/core/dataset/search/utils.ts b/packages/service/core/dataset/search/utils.ts index 4332423cfb96..e0c1abcab521 100644 --- a/packages/service/core/dataset/search/utils.ts +++ b/packages/service/core/dataset/search/utils.ts @@ -2,6 +2,7 @@ import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; import { queryExtension } from '../../ai/functions/queryExtension'; import { ChatItemType } from '@fastgpt/global/core/chat/type'; import { hashStr } from '@fastgpt/global/common/string/tools'; +import { chatValue2RuntimePrompt } from '@fastgpt/global/core/chat/adapt'; export const datasetSearchQueryExtension = async ({ query, @@ -33,11 +34,11 @@ export const datasetSearchQueryExtension = async ({ histories.length > 0 ? `${histories .map((item) => { - return `${item.obj}: ${item.value}`; + return `${item.obj}: ${chatValue2RuntimePrompt(item.value).text}`; }) .join('\n')} - Human: ${query} - ` +Human: ${query} +` : query; /* if query already extension, direct parse */ diff --git a/packages/service/core/dataset/training/controller.ts b/packages/service/core/dataset/training/controller.ts index 47ebdd11bb4d..984e4a3c05cd 100644 --- a/packages/service/core/dataset/training/controller.ts +++ b/packages/service/core/dataset/training/controller.ts @@ -168,13 +168,14 @@ export async function pushDataListToTrainingQueue({ indexes: item.indexes })), { - session + session, + ordered: false } ); } catch (error: any) { addLog.error(`Insert error`, error); // 如果有错误,将失败的文档添加到失败列表中 - error.writeErrors.forEach((writeError: any) => { + error.writeErrors?.forEach((writeError: any) => { failedDocuments.push(data[writeError.index]); }); console.log('failed', failedDocuments); diff --git a/packages/service/core/dataset/training/schema.ts b/packages/service/core/dataset/training/schema.ts index db1602eae8c4..1bc80da7072c 100644 --- a/packages/service/core/dataset/training/schema.ts +++ b/packages/service/core/dataset/training/schema.ts @@ -35,7 +35,7 @@ const TrainingDataSchema = new Schema({ }, billId: { // concat bill - type: Schema.Types.ObjectId + type: String }, mode: { type: String, diff --git a/packages/service/core/plugin/controller.ts b/packages/service/core/plugin/controller.ts index 535d8eaef478..fb31b3916f1c 100644 --- a/packages/service/core/plugin/controller.ts +++ b/packages/service/core/plugin/controller.ts @@ -52,7 +52,8 @@ const getPluginTemplateById = async (id: string): Promise => nodes: item.modules, edges: item.edges, templateType: FlowNodeTemplateTypeEnum.personalPlugin, - isTool: true + isTool: true, + nodeVersion: item?.nodeVersion || '' }; } return Promise.reject('plugin not found'); @@ -72,6 +73,8 @@ export async function getPluginPreviewNode({ id }: { id: string }): Promise; type Response = DispatchNodeResultType<{ - [NodeOutputKeyEnum.success]?: boolean; - [NodeOutputKeyEnum.failed]?: boolean; + [NodeOutputKeyEnum.success]: boolean; [NodeOutputKeyEnum.contextExtractFields]: string; }>; @@ -119,9 +118,7 @@ export async function dispatchContentExtract(props: Props): Promise { }); return { - // [DispatchNodeResponseKeyEnum.skipHandleId]: success - // ? [getHandleId(nodeId, 'source', NodeOutputKeyEnum.failed)] - // : [getHandleId(nodeId, 'source', NodeOutputKeyEnum.success)], + [NodeOutputKeyEnum.success]: success, [NodeOutputKeyEnum.contextExtractFields]: JSON.stringify(arg), ...arg, [DispatchNodeResponseKeyEnum.nodeResponse]: { @@ -351,10 +348,9 @@ Human: ${content}` const answer = data.choices?.[0].message?.content || ''; // parse response - const start = answer.indexOf('{'); - const end = answer.lastIndexOf('}'); + const jsonStr = sliceJsonStr(answer); - if (start === -1 || end === -1) { + if (!jsonStr) { return { rawResponse: answer, tokens: await countMessagesTokens(messages), @@ -362,11 +358,6 @@ Human: ${content}` }; } - const jsonStr = answer - .substring(start, end + 1) - .replace(/(\\n|\\)/g, '') - .replace(/ /g, ''); - try { return { rawResponse: answer, diff --git a/packages/service/core/workflow/dispatch/agent/runTool/constants.ts b/packages/service/core/workflow/dispatch/agent/runTool/constants.ts index 8c2fd40959d2..95be4ad51d87 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/constants.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/constants.ts @@ -1,9 +1,9 @@ export const Prompt_Tool_Call = ` 你是一个智能机器人,除了可以回答用户问题外,你还掌握工具的使用能力。有时候,你可以依赖工具的运行结果,来更准确的回答用户。 -工具使用了 JSON Schema 的格式声明,其中 toolId 是工具的 description 是工具的描述,parameters 是工具的参数,包括参数的类型和描述,required 是必填参数的列表。 +工具使用了 JSON Schema 的格式声明,其中 toolId 是工具的唯一标识, description 是工具的描述,parameters 是工具的参数及参数表述,required 是必填参数的列表。 -请你根据工具描述,决定回答问题或是使用工具。在完成任务过程中,USER代表用户的输入,TOOL_RESPONSE代表工具运行结果。ASSISTANT 代表你的输出。 +请你根据工具描述,决定回答问题或是使用工具。在完成任务过程中,USER代表用户的输入,TOOL_RESPONSE代表工具运行结果,ANSWER 代表你的输出。 你的每次输出都必须以0,1开头,代表是否需要调用工具: 0: 不使用工具,直接回答内容。 1: 使用工具,返回工具调用的参数。 @@ -12,14 +12,20 @@ export const Prompt_Tool_Call = ` USER: 你好呀 ANSWER: 0: 你好,有什么可以帮助你的么? -USER: 今天杭州的天气如何 -ANSWER: 1: {"toolId":"testToolId",arguments:{"city": "杭州"}} +USER: 现在几点了? +ANSWER: 1: {"toolId":"searchToolId1"} +TOOL_RESPONSE: """ +2022/5/5 12:00 Thursday +""" +ANSWER: 0: 现在是2022年5月5日,星期四,中午12点。 +USER: 今天杭州的天气如何? +ANSWER: 1: {"toolId":"searchToolId2","arguments":{"city": "杭州"}} TOOL_RESPONSE: """ 晴天...... """ ANSWER: 0: 今天杭州是晴天。 USER: 今天杭州的天气适合去哪里玩? -ANSWER: 1: {"toolId":"testToolId2",arguments:{"query": "杭州 天气 去哪里玩"}} +ANSWER: 1: {"toolId":"searchToolId3","arguments":{"query": "杭州 天气 去哪里玩"}} TOOL_RESPONSE: """ 晴天. 西湖、灵隐寺、千岛湖…… """ @@ -35,5 +41,4 @@ ANSWER: 0: 今天杭州是晴天,适合去西湖、灵隐寺、千岛湖等地 下面是正式的对话内容: USER: {{question}} -ANSWER: -`; +ANSWER: `; diff --git a/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts index 3e4ab34f900d..cae1153aa602 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/functionCall.ts @@ -385,7 +385,10 @@ async function streamResponse({ }); } } + + continue; } + /* arg 插入最后一个工具的参数里 */ const arg: string = functionCall?.arguments || ''; const currentTool = functionCalls[functionCalls.length - 1]; diff --git a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts index 783f272cff48..ec8ba0de3cd6 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/promptCall.ts @@ -20,7 +20,7 @@ import { dispatchWorkFlow } from '../../index'; import { DispatchToolModuleProps, RunToolResponse, ToolNodeItemType } from './type.d'; import json5 from 'json5'; import { countGptMessagesTokens } from '../../../../../common/string/tiktoken/index'; -import { getNanoid, replaceVariable } from '@fastgpt/global/common/string/tools'; +import { getNanoid, replaceVariable, sliceJsonStr } from '@fastgpt/global/common/string/tools'; import { AIChatItemType } from '@fastgpt/global/core/chat/type'; import { GPTMessages2Chats } from '@fastgpt/global/core/chat/adapt'; import { updateToolInputValue } from './utils'; @@ -33,6 +33,8 @@ type FunctionCallCompletion = { toolAvatar?: string; }; +const ERROR_TEXT = 'Tool run error'; + export const runToolWithPromptCall = async ( props: DispatchToolModuleProps & { messages: ChatCompletionMessageParam[]; @@ -122,14 +124,22 @@ export const runToolWithPromptCall = async ( } })(); - const parseAnswerResult = parseAnswer(answer); - // console.log(parseAnswer, '==11=='); + const { answer: replaceAnswer, toolJson } = parseAnswer(answer); // No tools - if (typeof parseAnswerResult === 'string') { + if (!toolJson) { + if (replaceAnswer === ERROR_TEXT && stream && detail) { + responseWrite({ + res, + event: SseResponseEventEnum.answer, + data: textAdaptGptResponse({ + text: replaceAnswer + }) + }); + } // No tool is invoked, indicating that the process is over const gptAssistantResponse: ChatCompletionAssistantMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, - content: parseAnswerResult + content: replaceAnswer }; const completeMessages = filterMessages.concat(gptAssistantResponse); const tokens = await countGptMessagesTokens(completeMessages, undefined); @@ -148,18 +158,16 @@ export const runToolWithPromptCall = async ( // Run the selected tool. const toolsRunResponse = await (async () => { - if (!parseAnswerResult) return Promise.reject('tool run error'); - - const toolNode = toolNodes.find((item) => item.nodeId === parseAnswerResult.name); + const toolNode = toolNodes.find((item) => item.nodeId === toolJson.name); if (!toolNode) return Promise.reject('tool not found'); - parseAnswerResult.toolName = toolNode.name; - parseAnswerResult.toolAvatar = toolNode.avatar; + toolJson.toolName = toolNode.name; + toolJson.toolAvatar = toolNode.avatar; // run tool flow const startParams = (() => { try { - return json5.parse(parseAnswerResult.arguments); + return json5.parse(toolJson.arguments); } catch (error) { return {}; } @@ -172,11 +180,11 @@ export const runToolWithPromptCall = async ( event: SseResponseEventEnum.toolCall, data: JSON.stringify({ tool: { - id: parseAnswerResult.id, + id: toolJson.id, toolName: toolNode.name, toolAvatar: toolNode.avatar, - functionName: parseAnswerResult.name, - params: parseAnswerResult.arguments, + functionName: toolJson.name, + params: toolJson.arguments, response: '' } }) @@ -211,7 +219,7 @@ export const runToolWithPromptCall = async ( event: SseResponseEventEnum.toolResponse, data: JSON.stringify({ tool: { - id: parseAnswerResult.id, + id: toolJson.id, toolName: '', toolAvatar: '', params: '', @@ -237,7 +245,7 @@ export const runToolWithPromptCall = async ( // 合并工具调用的结果,使用 functionCall 格式存储。 const assistantToolMsgParams: ChatCompletionAssistantMessageParam = { role: ChatCompletionRequestMessageRoleEnum.Assistant, - function_call: parseAnswerResult + function_call: toolJson }; const concatToolMessages = [ ...filterMessages, @@ -248,7 +256,7 @@ export const runToolWithPromptCall = async ( ...concatToolMessages, { role: ChatCompletionRequestMessageRoleEnum.Function, - name: parseAnswerResult.name, + name: toolJson.name, content: toolsRunResponse.toolResponsePrompt } ]; @@ -266,7 +274,7 @@ export const runToolWithPromptCall = async ( : [toolsRunResponse.moduleRunResponse]; // get the next user prompt - lastMessage.content += `${answer} + lastMessage.content += `${replaceAnswer} TOOL_RESPONSE: """ ${toolsRunResponse.toolResponsePrompt} """ @@ -362,24 +370,37 @@ async function streamResponse({ return { answer: textAnswer.trim() }; } -const parseAnswer = (str: string): FunctionCallCompletion | string => { - // 首先,使用正则表达式提取TOOL_ID和TOOL_ARGUMENTS - const prefix = '1:'; +const parseAnswer = ( + str: string +): { + answer: string; + toolJson?: FunctionCallCompletion; +} => { str = str.trim(); - if (str.startsWith(prefix)) { - const toolString = str.substring(prefix.length).trim(); + // 首先,使用正则表达式提取TOOL_ID和TOOL_ARGUMENTS + const prefixReg = /^1(:|:)/; + + if (prefixReg.test(str)) { + const toolString = sliceJsonStr(str); try { const toolCall = json5.parse(toolString); return { - id: getNanoid(), - name: toolCall.toolId, - arguments: JSON.stringify(toolCall.arguments || toolCall.parameters) + answer: `1: ${toolString}`, + toolJson: { + id: getNanoid(), + name: toolCall.toolId, + arguments: JSON.stringify(toolCall.arguments || toolCall.parameters) + } }; } catch (error) { - return str; + return { + answer: ERROR_TEXT + }; } } else { - return str; + return { + answer: str + }; } }; diff --git a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts index 3b5747f70543..7bcbe0fcab37 100644 --- a/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts +++ b/packages/service/core/workflow/dispatch/agent/runTool/toolChoice.ts @@ -354,7 +354,7 @@ async function streamResponse({ } const responseChoice = part.choices?.[0]?.delta; - // console.log(JSON.stringify(responseChoice, null, 2)); + if (responseChoice?.content) { const content = responseChoice.content || ''; textAnswer += content; @@ -369,7 +369,7 @@ async function streamResponse({ } else if (responseChoice?.tool_calls?.[0]) { const toolCall: ChatCompletionMessageToolCall = responseChoice.tool_calls[0]; - // 流响应中,每次只会返回一个工具. 如果带了 id,说明是执行一个工具 + // In a stream response, only one tool is returned at a time. If have id, description is executing a tool if (toolCall.id) { const toolNode = toolNodes.find((item) => item.nodeId === toolCall.function?.name); @@ -400,10 +400,14 @@ async function streamResponse({ }); } } + + continue; } + /* arg 插入最后一个工具的参数里 */ - const arg: string = responseChoice.tool_calls?.[0]?.function?.arguments; + const arg: string = toolCall?.function?.arguments; const currentTool = toolCalls[toolCalls.length - 1]; + if (currentTool) { currentTool.function.arguments += arg; diff --git a/packages/service/core/workflow/dispatch/dataset/search.ts b/packages/service/core/workflow/dispatch/dataset/search.ts index bd8368d58fa7..0db4dd147f6b 100644 --- a/packages/service/core/workflow/dispatch/dataset/search.ts +++ b/packages/service/core/workflow/dispatch/dataset/search.ts @@ -15,6 +15,7 @@ import { getHistories } from '../utils'; import { datasetSearchQueryExtension } from '../../../dataset/search/utils'; import { ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type'; import { checkTeamReRankPermission } from '../../../../support/permission/teamLimit'; +import { MongoDataset } from '../../../dataset/schema'; type DatasetSearchProps = ModuleDispatchProps<{ [NodeInputKeyEnum.datasetSelectList]: SelectedDatasetType; @@ -79,7 +80,9 @@ export async function dispatchDatasetSearch( // console.log(concatQueries, rewriteQuery, aiExtensionResult); // get vector - const vectorModel = getVectorModel(datasets[0]?.vectorModel?.model); + const vectorModel = getVectorModel( + (await MongoDataset.findById(datasets[0].datasetId, 'vectorModel').lean())?.vectorModel + ); // start search const { diff --git a/packages/service/core/workflow/dispatch/index.ts b/packages/service/core/workflow/dispatch/index.ts index bb4a78385cec..952d5e886d7b 100644 --- a/packages/service/core/workflow/dispatch/index.ts +++ b/packages/service/core/workflow/dispatch/index.ts @@ -1,5 +1,5 @@ import { NextApiResponse } from 'next'; -import { NodeInputKeyEnum, WorkflowIOValueTypeEnum } from '@fastgpt/global/core/workflow/constants'; +import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; import { NodeOutputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import type { ChatDispatchProps } from '@fastgpt/global/core/workflow/type/index.d'; @@ -28,7 +28,7 @@ import { dispatchQueryExtension } from './tools/queryExternsion'; import { dispatchRunPlugin } from './plugin/run'; import { dispatchPluginInput } from './plugin/runInput'; import { dispatchPluginOutput } from './plugin/runOutput'; -import { valueTypeFormat } from './utils'; +import { removeSystemVariable, valueTypeFormat } from './utils'; import { filterWorkflowEdges, checkNodeRunStatus @@ -44,8 +44,10 @@ import { RuntimeEdgeItemType } from '@fastgpt/global/core/workflow/type/edge'; import { getReferenceVariableValue } from '@fastgpt/global/core/workflow/runtime/utils'; import { dispatchSystemConfig } from './init/systemConfig'; import { dispatchUpdateVariable } from './tools/runUpdateVar'; +import { addLog } from '../../../common/system/log'; +import { surrenderProcess } from '../../../common/system/tools'; -const callbackMap: Record<`${FlowNodeTypeEnum}`, Function> = { +const callbackMap: Record = { [FlowNodeTypeEnum.workflowStart]: dispatchWorkflowStart, [FlowNodeTypeEnum.answerNode]: dispatchAnswer, [FlowNodeTypeEnum.chatNode]: dispatchChatCompletion, @@ -137,7 +139,6 @@ export async function dispatchWorkFlow(data: Props): Promise { return Promise.all( - nodes.map((node) => { + nodes.map(async (node) => { const status = checkNodeRunStatus({ node, runtimeEdges }); + if (res?.closed || props.maxRunTimes <= 0) return; + props.maxRunTimes--; + console.log(props.maxRunTimes, user._id); + + await surrenderProcess(); + if (status === 'run') { + addLog.info(`[dispatchWorkFlow] nodeRunWithActive: ${node.name}`); return nodeRunWithActive(node); } if (status === 'skip') { + addLog.info(`[dispatchWorkFlow] nodeRunWithSkip: ${node.name}`); return nodeRunWithSkip(node); } - return []; + return; }) ).then((result) => { - const flat = result.flat(); + const flat = result.flat().filter(Boolean) as unknown as { + node: RuntimeNodeItemType; + result: Record; + }[]; if (flat.length === 0) return; // Update the node output at the end of the run and get the next nodes @@ -265,7 +277,6 @@ export async function dispatchWorkFlow(data: Props): Promise) => { - const copyVariables = { ...variables }; - delete copyVariables.appId; - delete copyVariables.chatId; - delete copyVariables.responseChatItemId; - delete copyVariables.histories; - delete copyVariables.cTime; - - return copyVariables; -}; - /* Merge consecutive text messages into one */ export const mergeAssistantResponseAnswerText = (response: AIChatItemValueItemType[]) => { const result: AIChatItemValueItemType[] = []; diff --git a/packages/service/core/workflow/dispatch/tools/http468.ts b/packages/service/core/workflow/dispatch/tools/http468.ts index 289cc053cee3..f8a74e333314 100644 --- a/packages/service/core/workflow/dispatch/tools/http468.ts +++ b/packages/service/core/workflow/dispatch/tools/http468.ts @@ -33,7 +33,7 @@ type HttpRequestProps = ModuleDispatchProps<{ [key: string]: any; }>; type HttpResponse = DispatchNodeResultType<{ - [NodeOutputKeyEnum.failed]?: boolean; + [NodeOutputKeyEnum.error]?: object; [key: string]: any; }>; @@ -71,7 +71,7 @@ export const dispatchHttp468Request = async (props: HttpRequestProps): Promise 0 ? params : undefined, - body: Object.keys(requestBody).length > 0 ? requestBody : undefined, - headers: Object.keys(headers).length > 0 ? headers : undefined, - httpResult: { error: formatHttpError(error) } - }, - [NodeOutputKeyEnum.httpRawResponse]: getErrText(error) - }; - } - return Promise.reject(error); + return { + [NodeOutputKeyEnum.error]: formatHttpError(error), + [DispatchNodeResponseKeyEnum.nodeResponse]: { + params: Object.keys(params).length > 0 ? params : undefined, + body: Object.keys(requestBody).length > 0 ? requestBody : undefined, + headers: Object.keys(headers).length > 0 ? headers : undefined, + httpResult: { error: formatHttpError(error) } + }, + [NodeOutputKeyEnum.httpRawResponse]: getErrText(error) + }; } }; diff --git a/packages/service/core/workflow/dispatch/tools/runLaf.ts b/packages/service/core/workflow/dispatch/tools/runLaf.ts index dadd82fe2705..6ba2625d578c 100644 --- a/packages/service/core/workflow/dispatch/tools/runLaf.ts +++ b/packages/service/core/workflow/dispatch/tools/runLaf.ts @@ -53,7 +53,7 @@ export const dispatchLafRequest = async (props: LafRequestProps): Promise; +type Response = DispatchNodeResultType<{}>; -export const dispatchUpdateVariable = async ( - props: Props -): Promise> => { - const { params, variables, runtimeNodes } = props; +export const dispatchUpdateVariable = async (props: Props): Promise => { + const { res, detail, params, variables, runtimeNodes } = props; const { updateList } = params; updateList.forEach((item) => { @@ -51,6 +54,14 @@ export const dispatchUpdateVariable = async ( } }); + if (detail) { + responseWrite({ + res, + event: SseResponseEventEnum.updateVariables, + data: JSON.stringify(removeSystemVariable(variables)) + }); + } + return { [DispatchNodeResponseKeyEnum.nodeResponse]: { totalPoints: 0 diff --git a/packages/service/core/workflow/dispatch/utils.ts b/packages/service/core/workflow/dispatch/utils.ts index 9bcc9ffd6689..b3310a0ae83a 100644 --- a/packages/service/core/workflow/dispatch/utils.ts +++ b/packages/service/core/workflow/dispatch/utils.ts @@ -62,7 +62,10 @@ export const valueTypeFormat = (value: any, type?: WorkflowIOValueTypeEnum) => { return JSON.stringify(value); } if (type === 'number') return Number(value); - if (type === 'boolean') return Boolean(value); + if (type === 'boolean') { + if (typeof value === 'string') return value === 'true'; + return Boolean(value); + } try { if (type === WorkflowIOValueTypeEnum.datasetQuote && !Array.isArray(value)) { return JSON.parse(value); @@ -76,3 +79,15 @@ export const valueTypeFormat = (value: any, type?: WorkflowIOValueTypeEnum) => { return value; }; + +/* remove system variable */ +export const removeSystemVariable = (variables: Record) => { + const copyVariables = { ...variables }; + delete copyVariables.appId; + delete copyVariables.chatId; + delete copyVariables.responseChatItemId; + delete copyVariables.histories; + delete copyVariables.cTime; + + return copyVariables; +}; diff --git a/packages/service/package.json b/packages/service/package.json index 2d44208a5034..509c488673fa 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -16,7 +16,6 @@ "file-type": "^19.0.0", "iconv-lite": "^0.6.3", "joplin-turndown-plugin-gfm": "^1.0.12", - "js-tiktoken": "^1.0.7", "json5": "^2.2.3", "jsonwebtoken": "^9.0.2", "mammoth": "^1.6.0", @@ -25,13 +24,14 @@ "p-limit": "^4.0.0", "p-queue": "^8.0.1", "multer": "1.4.5-lts.1", - "next": "13.5.2", + "next": "14.2.3", "nextjs-cors": "^2.1.2", "node-cron": "^3.0.3", "node-xlsx": "^0.23.0", "papaparse": "5.4.1", "pdfjs-dist": "4.0.269", "pg": "^8.10.0", + "tiktoken": "^1.0.15", "tunnel": "^0.0.6", "turndown": "^7.1.2" }, diff --git a/packages/service/support/permission/auth/app.ts b/packages/service/support/permission/auth/app.ts index c8d4525f4835..81ebf090ab55 100644 --- a/packages/service/support/permission/auth/app.ts +++ b/packages/service/support/permission/auth/app.ts @@ -33,7 +33,7 @@ export async function authApp({ return Promise.reject(AppErrEnum.unExist); } - const isOwner = String(app.tmbId) === tmbId; + const isOwner = String(app.tmbId) === tmbId || role === TeamMemberRoleEnum.owner; const canWrite = isOwner || (app.permission === PermissionTypeEnum.public && role !== TeamMemberRoleEnum.visitor); diff --git a/packages/service/support/permission/controller.ts b/packages/service/support/permission/controller.ts index f7dde6faca8f..82d65aad9a90 100644 --- a/packages/service/support/permission/controller.ts +++ b/packages/service/support/permission/controller.ts @@ -170,10 +170,7 @@ export async function parseHeaderCert({ /* set cookie */ export const setCookie = (res: NextApiResponse, token: string) => { - res.setHeader( - 'Set-Cookie', - `token=${token}; Path=/; HttpOnly; Max-Age=604800; Samesite=Strict; Secure;` - ); + res.setHeader('Set-Cookie', `token=${token}; Path=/; HttpOnly; Max-Age=604800; Samesite=Strict;`); }; /* clear cookie */ export const clearCookie = (res: NextApiResponse) => { diff --git a/packages/service/support/permission/resourcePermission/controller.ts b/packages/service/support/permission/resourcePermission/controller.ts new file mode 100644 index 000000000000..3b482354a1b7 --- /dev/null +++ b/packages/service/support/permission/resourcePermission/controller.ts @@ -0,0 +1,16 @@ +import { ResourcePermissionType } from '@fastgpt/global/support/permission/type'; +import { MongoResourcePermission } from './schema'; +import { ResourceTypeEnum } from '@fastgpt/global/support/permission/constant'; + +export async function getResourcePermission({ + tmbId, + resourceType +}: { + tmbId: string; + resourceType: ResourceTypeEnum; +}) { + return (await MongoResourcePermission.findOne({ + tmbId, + resourceType + })) as ResourcePermissionType; +} diff --git a/packages/service/support/permission/resourcePermission/permisson.ts b/packages/service/support/permission/resourcePermission/permisson.ts new file mode 100644 index 000000000000..fb87a3e8b1f5 --- /dev/null +++ b/packages/service/support/permission/resourcePermission/permisson.ts @@ -0,0 +1,127 @@ +// PermissionValueType, the type of permission's value is a number, which is a bit field actually. +// It is spired by the permission system in Linux. +// The lowest 3 bits present the permission of reading, writing and managing. +// The higher bits are advanced permissions or extended permissions, which could be customized. +export type PermissionValueType = number; +export type PermissionListType = { [key: string]: PermissionValueType }; +export const NullPermission: PermissionValueType = 0; + +// the Permission helper class +export class Permission { + value: PermissionValueType; + constructor(value: PermissionValueType) { + this.value = value; + } + + // add permission(s) + // it can be chaining called. + // @example + // const perm = new Permission(permission) + // perm.add(PermissionList['read']) + // perm.add(PermissionList['read'], PermissionList['write']) + // perm.add(PermissionList['read']).add(PermissionList['write']) + add(...perm: PermissionValueType[]): Permission { + for (let p of perm) { + this.value = addPermission(this.value, p); + } + return this; + } + + remove(...perm: PermissionValueType[]): Permission { + for (let p of perm) { + this.value = removePermission(this.value, p); + } + return this; + } + + check(perm: PermissionValueType): Permission | boolean { + if (checkPermission(this.value, perm)) { + return this; + } else { + return false; + } + } +} + +export function constructPermission(permList: PermissionValueType[]) { + return new Permission(NullPermission).add(...permList); +} + +// The base Permissions List +// It can be extended, for example: +// export const UserPermissionList: PermissionListType = { +// ...PermissionList, +// 'Invite': 0b1000 +// } +export const PermissionList: PermissionListType = { + Read: 0b100, + Write: 0b010, + Manage: 0b001 +}; + +// list of permissions. could be customized. +// ! removal of the basic permissions is not recommended. +// const PermList: Array = [ReadPerm, WritePerm, ManagePerm]; + +// return the list of permissions +// @param Perm(optional): the list of permissions to be added +// export function getPermList(Perm?: PermissionType[]): Array { +// if (Perm === undefined) { +// return PermList; +// } else { +// return PermList.concat(Perm); +// } +// } + +// check the permission +// @param [val]: The permission value to be checked +// @parma [perm]: Which Permission value will be checked +// @returns [booean]: if the [val] has the [perm] +// example: +// const perm = user.permission // get this permisiion from db or somewhere else +// const ok = checkPermission(perm, PermissionList['Read']) +export function checkPermission(val: PermissionValueType, perm: PermissionValueType): boolean { + return (val & perm) === perm; +} + +// add the permission +// it can be chaining called. +// return the new permission value based on [val] added with [perm] +// @param val: PermissionValueType +// @param perm: PermissionValueType +// example: +// const basePerm = 0b001; // Manage only +export function addPermission( + val: PermissionValueType, + perm: PermissionValueType +): PermissionValueType { + return val | perm; +} + +// remove the permission +export function removePermission( + val: PermissionValueType, + perm: PermissionValueType +): PermissionValueType { + return val & ~perm; +} + +// export function parsePermission(val: PermissionValueType, list: PermissionValueType[]) { +// const result: [[string, boolean]] = [] as any; +// list.forEach((perm) => { +// result.push([perm[0], checkPermission(val, perm)]); +// }); +// return result; +// } + +export function hasManage(val: PermissionValueType) { + return checkPermission(val, PermissionList['Manage']); +} + +export function hasWrite(val: PermissionValueType) { + return checkPermission(val, PermissionList['Write']); +} + +export function hasRead(val: PermissionValueType) { + return checkPermission(val, PermissionList['Read']); +} diff --git a/packages/service/support/permission/resourcePermission/schema.ts b/packages/service/support/permission/resourcePermission/schema.ts new file mode 100644 index 000000000000..98be1fcdae89 --- /dev/null +++ b/packages/service/support/permission/resourcePermission/schema.ts @@ -0,0 +1,48 @@ +import { + TeamCollectionName, + TeamMemberCollectionName +} from '@fastgpt/global/support/user/team/constant'; +import { Model, connectionMongo } from '../../../common/mongo'; +import type { ResourcePermissionType } from '@fastgpt/global/support/permission/type'; +import { ResourceTypeEnum } from '@fastgpt/global/support/permission/constant'; +const { Schema, model, models } = connectionMongo; + +export const ResourcePermissionSchema = new Schema({ + teamId: { + type: Schema.Types.ObjectId, + ref: TeamCollectionName + }, + tmbId: { + type: Schema.Types.ObjectId, + ref: TeamMemberCollectionName + }, + resourceType: { + type: Object.values(ResourceTypeEnum), + required: true + }, + permission: { + type: Number, + required: true + } +}); + +try { + ResourcePermissionSchema.index({ + teamId: 1, + resourceType: 1 + }); + ResourcePermissionSchema.index({ + tmbId: 1, + resourceType: 1 + }); +} catch (error) { + console.log(error); +} + +export const ResourcePermissionCollectionName = 'resource_permission'; + +export const MongoResourcePermission: Model = + models[ResourcePermissionCollectionName] || + model(ResourcePermissionCollectionName, ResourcePermissionSchema); + +MongoResourcePermission.syncIndexes(); diff --git a/packages/service/support/permission/teamLimit.ts b/packages/service/support/permission/teamLimit.ts index 6224b56dff61..fd948021d078 100644 --- a/packages/service/support/permission/teamLimit.ts +++ b/packages/service/support/permission/teamLimit.ts @@ -19,7 +19,9 @@ export const checkDatasetLimit = async ({ if (!standardConstants) return; if (usedSize + insertLen >= datasetMaxSize) { - return Promise.reject(TeamErrEnum.datasetSizeNotEnough); + return Promise.reject( + `您的知识库容量为: ${datasetMaxSize}组,已使用: ${usedSize}组,导入当前文件需要: ${insertLen}组,请增加知识库容量后导入。` + ); } if (usedPoints >= totalPoints) { diff --git a/packages/service/support/permission/type.d.ts b/packages/service/support/permission/type.d.ts index 8118041225d4..cb4ce3d54693 100644 --- a/packages/service/support/permission/type.d.ts +++ b/packages/service/support/permission/type.d.ts @@ -1,4 +1,4 @@ -import { NextApiRequest } from 'next'; +import { ApiRequestProps } from '../../type/next'; export type ReqHeaderAuthType = { cookie?: string; @@ -9,7 +9,7 @@ export type ReqHeaderAuthType = { authorization?: string; }; export type AuthModeType = { - req: NextApiRequest; + req: ApiRequestProps; authToken?: boolean; authRoot?: boolean; authApiKey?: boolean; diff --git a/packages/service/support/user/schema.ts b/packages/service/support/user/schema.ts index 39935971a787..fff6f8d428ac 100644 --- a/packages/service/support/user/schema.ts +++ b/packages/service/support/user/schema.ts @@ -45,7 +45,7 @@ const UserSchema = new Schema({ inviterId: { // 谁邀请注册的 type: Schema.Types.ObjectId, - ref: 'user' + ref: userCollectionName }, promotionRate: { type: Number, diff --git a/packages/service/support/user/team/controller.ts b/packages/service/support/user/team/controller.ts index 4145b3dd4b11..73592e8060dc 100644 --- a/packages/service/support/user/team/controller.ts +++ b/packages/service/support/user/team/controller.ts @@ -27,7 +27,8 @@ async function getTeamMember(match: Record): Promise status: tmb.status, defaultTeam: tmb.defaultTeam, canWrite: tmb.role !== TeamMemberRoleEnum.visitor, - lafAccount: tmb.teamId.lafAccount + lafAccount: tmb.teamId.lafAccount, + defaultPermission: tmb.teamId.defaultPermission }; } diff --git a/packages/service/support/user/team/teamSchema.ts b/packages/service/support/user/team/teamSchema.ts index 8f0f472eb28b..870a67ef4dc5 100644 --- a/packages/service/support/user/team/teamSchema.ts +++ b/packages/service/support/user/team/teamSchema.ts @@ -3,6 +3,7 @@ const { Schema, model, models } = connectionMongo; import { TeamSchema as TeamType } from '@fastgpt/global/support/user/team/type.d'; import { userCollectionName } from '../../user/schema'; import { TeamCollectionName } from '@fastgpt/global/support/user/team/constant'; +import { NullPermission } from '../../permission/resourcePermission/permisson'; const TeamSchema = new Schema({ name: { @@ -13,6 +14,10 @@ const TeamSchema = new Schema({ type: Schema.Types.ObjectId, ref: userCollectionName }, + defaultPermission: { + type: Number, + default: NullPermission + }, avatar: { type: String, default: '/icon/logo.svg' diff --git a/packages/service/support/wallet/sub/schema.ts b/packages/service/support/wallet/sub/schema.ts index b90cd9b4baf4..42709e8024a3 100644 --- a/packages/service/support/wallet/sub/schema.ts +++ b/packages/service/support/wallet/sub/schema.ts @@ -14,7 +14,7 @@ import { } from '@fastgpt/global/support/wallet/sub/constants'; import type { TeamSubSchema } from '@fastgpt/global/support/wallet/sub/type'; -export const subCollectionName = 'team.subscriptions'; +export const subCollectionName = 'team_subscriptions'; const SubSchema = new Schema({ teamId: { diff --git a/packages/service/type.d.ts b/packages/service/type.d.ts index 255892c69007..20a878ddf284 100644 --- a/packages/service/type.d.ts +++ b/packages/service/type.d.ts @@ -22,8 +22,9 @@ declare global { var whisperModel: WhisperModelType; var reRankModels: ReRankModelItemType[]; - var tiktokenWorker: { + var tiktokenWorkers: { + index: number; worker: Worker; callbackMap: Record void>; - }; + }[]; } diff --git a/packages/service/worker/file/extension/pdf.ts b/packages/service/worker/file/extension/pdf.ts index b6e43baf2c93..f68dfadeb2e4 100644 --- a/packages/service/worker/file/extension/pdf.ts +++ b/packages/service/worker/file/extension/pdf.ts @@ -15,40 +15,45 @@ type TokenType = { export const readPdfFile = async ({ buffer }: ReadRawTextByBuffer): Promise => { const readPDFPage = async (doc: any, pageNo: number) => { - const page = await doc.getPage(pageNo); - const tokenizedText = await page.getTextContent(); + try { + const page = await doc.getPage(pageNo); + const tokenizedText = await page.getTextContent(); - const viewport = page.getViewport({ scale: 1 }); - const pageHeight = viewport.height; - const headerThreshold = pageHeight * 0.95; - const footerThreshold = pageHeight * 0.05; + const viewport = page.getViewport({ scale: 1 }); + const pageHeight = viewport.height; + const headerThreshold = pageHeight * 0.95; + const footerThreshold = pageHeight * 0.05; - const pageTexts: TokenType[] = tokenizedText.items.filter((token: TokenType) => { - return ( - !token.transform || - (token.transform[5] < headerThreshold && token.transform[5] > footerThreshold) - ); - }); + const pageTexts: TokenType[] = tokenizedText.items.filter((token: TokenType) => { + return ( + !token.transform || + (token.transform[5] < headerThreshold && token.transform[5] > footerThreshold) + ); + }); - // concat empty string 'hasEOL' - for (let i = 0; i < pageTexts.length; i++) { - const item = pageTexts[i]; - if (item.str === '' && pageTexts[i - 1]) { - pageTexts[i - 1].hasEOL = item.hasEOL; - pageTexts.splice(i, 1); - i--; + // concat empty string 'hasEOL' + for (let i = 0; i < pageTexts.length; i++) { + const item = pageTexts[i]; + if (item.str === '' && pageTexts[i - 1]) { + pageTexts[i - 1].hasEOL = item.hasEOL; + pageTexts.splice(i, 1); + i--; + } } - } - page.cleanup(); + page.cleanup(); - return pageTexts - .map((token) => { - const paragraphEnd = token.hasEOL && /([。?!.?!\n\r]|(\r\n))$/.test(token.str); + return pageTexts + .map((token) => { + const paragraphEnd = token.hasEOL && /([。?!.?!\n\r]|(\r\n))$/.test(token.str); - return paragraphEnd ? `${token.str}\n` : token.str; - }) - .join(''); + return paragraphEnd ? `${token.str}\n` : token.str; + }) + .join(''); + } catch (error) { + console.log('pdf read error', error); + return ''; + } }; const loadingTask = pdfjs.getDocument(buffer.buffer); @@ -58,6 +63,7 @@ export const readPdfFile = async ({ buffer }: ReadRawTextByBuffer): Promise) => { - const readFileRawContent = async (params: ReadRawTextByBuffer) => { + const readRawContentByFileBuffer = async (params: ReadRawTextByBuffer) => { switch (params.extension) { case 'txt': case 'md': @@ -25,25 +25,9 @@ parentPort?.on('message', async (props: ReadRawTextProps) => { case 'pptx': return readPptxRawText(params); case 'xlsx': - const xlsxResult = await readXlsxRawText(params); - if (params.csvFormat) { - return { - rawText: xlsxResult.formatText || '' - }; - } - return { - rawText: xlsxResult.rawText - }; + return readXlsxRawText(params); case 'csv': - const csvResult = await readCsvRawText(params); - if (params.csvFormat) { - return { - rawText: csvResult.formatText || '' - }; - } - return { - rawText: csvResult.rawText - }; + return readCsvRawText(params); default: return Promise.reject('Only support .txt, .md, .html, .pdf, .docx, pptx, .csv, .xlsx'); } @@ -59,7 +43,7 @@ parentPort?.on('message', async (props: ReadRawTextProps) => { try { parentPort?.postMessage({ type: 'success', - data: await readFileRawContent(newProps) + data: await readRawContentByFileBuffer(newProps) }); } catch (error) { console.log(error); diff --git a/packages/service/worker/file/type.d.ts b/packages/service/worker/file/type.d.ts index 2b0563de862a..74948932d85f 100644 --- a/packages/service/worker/file/type.d.ts +++ b/packages/service/worker/file/type.d.ts @@ -2,7 +2,6 @@ import { ReadFileByBufferParams } from '../../common/file/read/type'; import {DatasetSchemaType} from "@fastgpt/global/core/dataset/type"; export type ReadRawTextProps = { - csvFormat?: boolean; extension: string; buffer: T; encoding: string; diff --git a/packages/service/worker/tiktoken/countGptMessagesTokens.ts b/packages/service/worker/tiktoken/countGptMessagesTokens.ts index 80b13c318346..7cd836a361d2 100644 --- a/packages/service/worker/tiktoken/countGptMessagesTokens.ts +++ b/packages/service/worker/tiktoken/countGptMessagesTokens.ts @@ -1,6 +1,6 @@ /* Only the token of gpt-3.5-turbo is used */ -import { Tiktoken } from 'js-tiktoken/lite'; -import encodingJson from './cl100k_base.json'; +import { Tiktoken } from 'tiktoken/lite'; +import cl100k_base from './cl100k_base.json'; import { ChatCompletionMessageParam, ChatCompletionContentPart, @@ -10,7 +10,7 @@ import { import { ChatCompletionRequestMessageRoleEnum } from '@fastgpt/global/core/ai/constants'; import { parentPort } from 'worker_threads'; -const enc = new Tiktoken(encodingJson); +const enc = new Tiktoken(cl100k_base.bpe_ranks, cl100k_base.special_tokens, cl100k_base.pat_str); /* count messages tokens */ parentPort?.on( @@ -111,6 +111,7 @@ parentPort?.on( data: total }); } catch (error) { + console.log(error); parentPort?.postMessage({ id, type: 'success', diff --git a/packages/web/common/file/utils.ts b/packages/web/common/file/utils.ts index 74d16a226737..38c1ae5edf6b 100644 --- a/packages/web/common/file/utils.ts +++ b/packages/web/common/file/utils.ts @@ -1,4 +1,5 @@ import { getErrText } from '@fastgpt/global/common/error/utils'; +import Papa from 'papaparse'; export const loadFile2Buffer = ({ file, onError }: { file: File; onError?: (err: any) => void }) => new Promise((resolve, reject) => { @@ -29,3 +30,47 @@ export const loadFile2Buffer = ({ file, onError }: { file: File; onError?: (err: reject('The browser does not support file content reading'); } }); + +export const readFileRawText = ({ + file, + onError +}: { + file: File; + onError?: (err: any) => void; +}) => { + return new Promise((resolve, reject) => { + try { + let reader = new FileReader(); + reader.onload = async ({ target }) => { + if (!target?.result) { + onError?.('Load file error'); + return reject('Load file error'); + } + try { + resolve(target.result as string); + } catch (err) { + console.log(err, 'Load file error'); + onError?.(err); + + reject(getErrText(err, 'Load file error')); + } + }; + reader.onerror = (err) => { + console.log(err, 'Load file error'); + onError?.(err); + + reject(getErrText(err, 'Load file error')); + }; + reader.readAsText(file); + } catch (error) { + reject('The browser does not support file content reading'); + } + }); +}; + +export const readCsvRawText = async ({ file }: { file: File }) => { + const rawText = await readFileRawText({ file }); + const csvArr = Papa.parse(rawText).data as string[][]; + + return csvArr; +}; diff --git a/packages/web/components/common/DndDrag/DragIcon.tsx b/packages/web/components/common/DndDrag/DragIcon.tsx index 493a409d2d3a..36eedd13ce05 100644 --- a/packages/web/components/common/DndDrag/DragIcon.tsx +++ b/packages/web/components/common/DndDrag/DragIcon.tsx @@ -1,11 +1,11 @@ import { DragHandleIcon } from '@chakra-ui/icons'; -import { Box } from '@chakra-ui/react'; +import { Box, BoxProps } from '@chakra-ui/react'; import React from 'react'; import { DraggableProvided } from 'react-beautiful-dnd'; -const DragIcon = ({ provided }: { provided: DraggableProvided }) => { +const DragIcon = ({ provided, ...props }: { provided: DraggableProvided } & BoxProps) => { return ( - + ); diff --git a/packages/web/components/common/EmptyTip/index.tsx b/packages/web/components/common/EmptyTip/index.tsx index d36a66e8b406..e91294353d65 100644 --- a/packages/web/components/common/EmptyTip/index.tsx +++ b/packages/web/components/common/EmptyTip/index.tsx @@ -10,7 +10,7 @@ type Props = FlexProps & { const EmptyTip = ({ text, ...props }: Props) => { const { t } = useTranslation(); return ( - + {text || t('common.empty.Common Tip')} diff --git a/packages/web/components/common/Icon/constants.ts b/packages/web/components/common/Icon/constants.ts index eec77bb575a6..daa13392eaf8 100644 --- a/packages/web/components/common/Icon/constants.ts +++ b/packages/web/components/common/Icon/constants.ts @@ -1,6 +1,7 @@ // @ts-nocheck export const iconPaths = { + book: () => import('./icons/book.svg'), change: () => import('./icons/change.svg'), chatSend: () => import('./icons/chatSend.svg'), closeSolid: () => import('./icons/closeSolid.svg'), @@ -53,6 +54,7 @@ export const iconPaths = { 'common/settingLight': () => import('./icons/common/settingLight.svg'), 'common/text/t': () => import('./icons/common/text/t.svg'), 'common/tickFill': () => import('./icons/common/tickFill.svg'), + 'common/trash': () => import('./icons/common/trash.svg'), 'common/uploadFileFill': () => import('./icons/common/uploadFileFill.svg'), 'common/viewLight': () => import('./icons/common/viewLight.svg'), 'common/voiceLight': () => import('./icons/common/voiceLight.svg'), @@ -63,6 +65,7 @@ export const iconPaths = { 'core/app/appApiLight': () => import('./icons/core/app/appApiLight.svg'), 'core/app/customFeedback': () => import('./icons/core/app/customFeedback.svg'), 'core/app/headphones': () => import('./icons/core/app/headphones.svg'), + 'core/app/inputGuides': () => import('./icons/core/app/inputGuides.svg'), 'core/app/logsLight': () => import('./icons/core/app/logsLight.svg'), 'core/app/markLight': () => import('./icons/core/app/markLight.svg'), 'core/app/publish/lark': () => import('./icons/core/app/publish/lark.svg'), @@ -101,6 +104,7 @@ export const iconPaths = { 'core/dataset/commonDataset': () => import('./icons/core/dataset/commonDataset.svg'), 'core/dataset/datasetFill': () => import('./icons/core/dataset/datasetFill.svg'), 'core/dataset/datasetLight': () => import('./icons/core/dataset/datasetLight.svg'), + 'core/dataset/externalDataset': () => import('./icons/core/dataset/externalDataset.svg'), 'core/dataset/fileCollection': () => import('./icons/core/dataset/fileCollection.svg'), 'core/dataset/fullTextRecall': () => import('./icons/core/dataset/fullTextRecall.svg'), 'core/dataset/manualCollection': () => import('./icons/core/dataset/manualCollection.svg'), @@ -206,8 +210,10 @@ export const iconPaths = { 'support/outlink/iframeLight': () => import('./icons/support/outlink/iframeLight.svg'), 'support/outlink/share': () => import('./icons/support/outlink/share.svg'), 'support/outlink/shareLight': () => import('./icons/support/outlink/shareLight.svg'), + 'support/permission/collaborator': () => import('./icons/support/permission/collaborator.svg'), 'support/permission/privateLight': () => import('./icons/support/permission/privateLight.svg'), 'support/permission/publicLight': () => import('./icons/support/permission/publicLight.svg'), + 'support/team/key': () => import('./icons/support/team/key.svg'), 'support/team/memberLight': () => import('./icons/support/team/memberLight.svg'), 'support/usage/usageRecordLight': () => import('./icons/support/usage/usageRecordLight.svg'), 'support/user/individuation': () => import('./icons/support/user/individuation.svg'), @@ -215,6 +221,7 @@ export const iconPaths = { 'support/user/userFill': () => import('./icons/support/user/userFill.svg'), 'support/user/userLight': () => import('./icons/support/user/userLight.svg'), text: () => import('./icons/text.svg'), + union: () => import('./icons/union.svg'), user: () => import('./icons/user.svg'), wx: () => import('./icons/wx.svg') }; diff --git a/packages/web/components/common/Icon/icons/book.svg b/packages/web/components/common/Icon/icons/book.svg new file mode 100644 index 000000000000..9e45d5e20561 --- /dev/null +++ b/packages/web/components/common/Icon/icons/book.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/web/components/common/Icon/icons/common/trash.svg b/packages/web/components/common/Icon/icons/common/trash.svg new file mode 100644 index 000000000000..e3e22df66561 --- /dev/null +++ b/packages/web/components/common/Icon/icons/common/trash.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/web/components/common/Icon/icons/core/app/inputGuides.svg b/packages/web/components/common/Icon/icons/core/app/inputGuides.svg new file mode 100644 index 000000000000..844279379be9 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/app/inputGuides.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/web/components/common/Icon/icons/core/dataset/externalDataset.svg b/packages/web/components/common/Icon/icons/core/dataset/externalDataset.svg new file mode 100644 index 000000000000..53673d984424 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/dataset/externalDataset.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/support/permission/collaborator.svg b/packages/web/components/common/Icon/icons/support/permission/collaborator.svg new file mode 100644 index 000000000000..ed0ad1f810df --- /dev/null +++ b/packages/web/components/common/Icon/icons/support/permission/collaborator.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/support/team/key.svg b/packages/web/components/common/Icon/icons/support/team/key.svg new file mode 100644 index 000000000000..8beb9eec6855 --- /dev/null +++ b/packages/web/components/common/Icon/icons/support/team/key.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/web/components/common/Icon/icons/support/team/memberLight.svg b/packages/web/components/common/Icon/icons/support/team/memberLight.svg index 5b81b3474873..46af62ef427d 100644 --- a/packages/web/components/common/Icon/icons/support/team/memberLight.svg +++ b/packages/web/components/common/Icon/icons/support/team/memberLight.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/web/components/common/Icon/icons/union.svg b/packages/web/components/common/Icon/icons/union.svg new file mode 100644 index 000000000000..80c6c5b67a53 --- /dev/null +++ b/packages/web/components/common/Icon/icons/union.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/web/components/common/Icon/index.tsx b/packages/web/components/common/Icon/index.tsx index 091a87321938..aec245e7ed19 100644 --- a/packages/web/components/common/Icon/index.tsx +++ b/packages/web/components/common/Icon/index.tsx @@ -15,7 +15,7 @@ const MyIcon = ({ name, w = 'auto', h = 'auto', ...props }: { name: IconNameType .catch((error) => console.log(error)); }, [name]); - return !!name && !!iconPaths[name] ? ( + return !!IconComponent ? ( & { + onChange: (e: number | '') => any; + placeholder?: string; +}; + +const MyNumberInput = (props: Props) => { + return ( + { + if (isNaN(Number(e))) { + props?.onChange(''); + } else { + props?.onChange(Number(e)); + } + }} + > + + + + + + + ); +}; + +export default MyNumberInput; diff --git a/packages/web/components/common/MyBox/index.tsx b/packages/web/components/common/MyBox/index.tsx index 1cdd5be2d936..24745186ba51 100644 --- a/packages/web/components/common/MyBox/index.tsx +++ b/packages/web/components/common/MyBox/index.tsx @@ -9,7 +9,7 @@ type Props = BoxProps & { const MyBox = ({ text, isLoading, children, ...props }: Props, ref: any) => { return ( - + {isLoading && } {children} diff --git a/packages/web/components/common/MyDrawer/MyRightDrawer.tsx b/packages/web/components/common/MyDrawer/MyRightDrawer.tsx index 6b8ab4de445c..fe6e22793925 100644 --- a/packages/web/components/common/MyDrawer/MyRightDrawer.tsx +++ b/packages/web/components/common/MyDrawer/MyRightDrawer.tsx @@ -67,7 +67,12 @@ const MyRightDrawer = ({ - + {children} diff --git a/packages/web/components/common/MyModal/index.tsx b/packages/web/components/common/MyModal/index.tsx index cc00ca9ef3b1..2cfd10b6a324 100644 --- a/packages/web/components/common/MyModal/index.tsx +++ b/packages/web/components/common/MyModal/index.tsx @@ -11,11 +11,13 @@ import { useMediaQuery } from '@chakra-ui/react'; import MyIcon from '../Icon'; +import MyBox from '../MyBox'; export interface MyModalProps extends ModalContentProps { iconSrc?: string; title?: any; isCentered?: boolean; + isLoading?: boolean; isOpen: boolean; onClose?: () => void; } @@ -27,6 +29,7 @@ const MyModal = ({ title, children, isCentered, + isLoading, w = 'auto', maxW = ['90vw', '600px'], ...props @@ -39,6 +42,7 @@ const MyModal = ({ onClose={() => onClose && onClose()} autoFocus={false} isCentered={isPc ? isCentered : true} + blockScrollOnMount={false} > )} - {children} - + ); diff --git a/packages/web/components/common/MySelect/index.tsx b/packages/web/components/common/MySelect/index.tsx index d1e7de023fc3..2bafc7319adb 100644 --- a/packages/web/components/common/MySelect/index.tsx +++ b/packages/web/components/common/MySelect/index.tsx @@ -98,6 +98,7 @@ const MySelect = ( { const w = ref.current?.clientWidth; if (w) { diff --git a/packages/web/components/common/MyTooltip/QuestionTip.tsx b/packages/web/components/common/MyTooltip/QuestionTip.tsx index c2a7b81e4525..205245c8ad4c 100644 --- a/packages/web/components/common/MyTooltip/QuestionTip.tsx +++ b/packages/web/components/common/MyTooltip/QuestionTip.tsx @@ -3,12 +3,12 @@ import MyTooltip from '.'; import { IconProps, QuestionOutlineIcon } from '@chakra-ui/icons'; type Props = IconProps & { - label?: string; + label?: string | React.ReactNode; }; -const QuestionTip = ({ label, ...props }: Props) => { +const QuestionTip = ({ label, maxW, ...props }: Props) => { return ( - + ); diff --git a/packages/web/components/common/String/HighlightText.tsx b/packages/web/components/common/String/HighlightText.tsx new file mode 100644 index 000000000000..85f09148c76e --- /dev/null +++ b/packages/web/components/common/String/HighlightText.tsx @@ -0,0 +1,40 @@ +import { Box } from '@chakra-ui/react'; +import React from 'react'; + +const HighlightText = ({ + rawText, + matchText, + color = 'primary.600' +}: { + rawText: string; + matchText: string; + color?: string; +}) => { + const regex = new RegExp(`(${matchText})`, 'gi'); + const parts = rawText.split(regex); + + return ( + + {parts.map((part, index) => { + let highLight = part.toLowerCase() === matchText.toLowerCase(); + + if (highLight) { + parts.find((item, i) => { + if (i >= index) return; + if (item.toLowerCase() === matchText.toLowerCase()) { + highLight = false; + } + }); + } + + return ( + + {part} + + ); + })} + + ); +}; + +export default HighlightText; diff --git a/packages/web/components/common/Textarea/JsonEditor/index.tsx b/packages/web/components/common/Textarea/JsonEditor/index.tsx index 3598d8a64f2c..dcf81f333acc 100644 --- a/packages/web/components/common/Textarea/JsonEditor/index.tsx +++ b/packages/web/components/common/Textarea/JsonEditor/index.tsx @@ -22,6 +22,7 @@ type Props = Omit & { onChange?: (e: string) => void; variables?: EditorVariablePickerType[]; defaultHeight?: number; + placeholder?: string; }; const options = { diff --git a/packages/web/components/common/Textarea/PromptEditor/type.d.ts b/packages/web/components/common/Textarea/PromptEditor/type.d.ts index c1f0b82e322c..cbf35e6d6b30 100644 --- a/packages/web/components/common/Textarea/PromptEditor/type.d.ts +++ b/packages/web/components/common/Textarea/PromptEditor/type.d.ts @@ -3,6 +3,7 @@ import { WorkflowIOValueTypeEnum } from '@fastgpt/global/core/workflow/constants export type EditorVariablePickerType = { key: string; label: string; + required?: boolean; icon?: string; valueType?: WorkflowIOValueTypeEnum; }; diff --git a/packages/web/hooks/useConfirm.tsx b/packages/web/hooks/useConfirm.tsx index 3bcc2d6236cf..84ca43636048 100644 --- a/packages/web/hooks/useConfirm.tsx +++ b/packages/web/hooks/useConfirm.tsx @@ -41,87 +41,92 @@ export const useConfirm = (props?: { const { isOpen, onOpen, onClose } = useDisclosure(); - const confirmCb = useRef(); + const confirmCb = useRef(); const cancelCb = useRef(); - return { - openConfirm: useCallback( - (confirm?: any, cancel?: any, customContent?: string | React.ReactNode) => { - confirmCb.current = confirm; - cancelCb.current = cancel; + const openConfirm = ( + confirm?: Function, + cancel?: any, + customContent?: string | React.ReactNode + ) => { + confirmCb.current = confirm; + cancelCb.current = cancel; - customContent && setCustomContent(customContent); + customContent && setCustomContent(customContent); - return onOpen; - }, - [onOpen] - ), - onClose, - ConfirmModal: useCallback( - ({ - closeText = t('common.Cancel'), - confirmText = t('common.Confirm'), - isLoading, - bg, - countDown = 0 - }: { - closeText?: string; - confirmText?: string; - isLoading?: boolean; - bg?: string; - countDown?: number; - }) => { - const timer = useRef(); - const [countDownAmount, setCountDownAmount] = useState(countDown); + return onOpen; + }; - useEffect(() => { - timer.current = setInterval(() => { - setCountDownAmount((val) => { - if (val <= 0) { - clearInterval(timer.current); - } - return val - 1; - }); - }, 1000); - }, []); + const ConfirmModal = useCallback( + ({ + closeText = t('common.Cancel'), + confirmText = t('common.Confirm'), + isLoading, + bg, + countDown = 0 + }: { + closeText?: string; + confirmText?: string; + isLoading?: boolean; + bg?: string; + countDown?: number; + }) => { + const timer = useRef(); + const [countDownAmount, setCountDownAmount] = useState(countDown); - return ( - - - {customContent} - - {!hideFooter && ( - - {showCancel && ( - - )} + useEffect(() => { + timer.current = setInterval(() => { + setCountDownAmount((val) => { + if (val <= 0) { + clearInterval(timer.current); + } + return val - 1; + }); + }, 1000); + }, []); + return ( + + + {customContent} + + {!hideFooter && ( + + {showCancel && ( - - )} - - ); - }, - [customContent, hideFooter, iconSrc, isOpen, map.bg, onClose, showCancel, t, title] - ) + )} + + + + )} + + ); + }, + [customContent, hideFooter, iconSrc, isOpen, map.bg, onClose, showCancel, t, title] + ); + + return { + openConfirm, + onClose, + ConfirmModal }; }; diff --git a/packages/web/hooks/useRefresh.ts b/packages/web/hooks/useRefresh.ts new file mode 100644 index 000000000000..a72e45774e59 --- /dev/null +++ b/packages/web/hooks/useRefresh.ts @@ -0,0 +1,9 @@ +import { useBoolean } from 'ahooks'; + +export const useRefresh = () => { + const [_, { toggle }] = useBoolean(); + + return { + refresh: toggle + }; +}; diff --git a/packages/web/hooks/useRequest.tsx b/packages/web/hooks/useRequest.tsx index 15795d8f40d0..38e0de15f02d 100644 --- a/packages/web/hooks/useRequest.tsx +++ b/packages/web/hooks/useRequest.tsx @@ -3,6 +3,7 @@ import { useMutation } from '@tanstack/react-query'; import type { UseMutationOptions } from '@tanstack/react-query'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { useTranslation } from 'next-i18next'; +import { useRequest as ahooksUseRequest } from 'ahooks'; interface Props extends UseMutationOptions { successToast?: string | null; @@ -39,3 +40,50 @@ export const useRequest = ({ successToast, errorToast, onSuccess, onError, ...pr return mutation; }; + +type UseRequestFunProps = Parameters< + typeof ahooksUseRequest +>; +export const useRequest2 = ( + server: UseRequestFunProps[0], + options: UseRequestFunProps[1] & { + errorToast?: string; + successToast?: string; + } = {}, + plugin?: UseRequestFunProps[2] +) => { + const { t } = useTranslation(); + const { errorToast, successToast, ...rest } = options || {}; + const { toast } = useToast(); + + const res = ahooksUseRequest( + server, + { + ...rest, + onError: (err, params) => { + rest?.onError?.(err, params); + if (errorToast !== undefined) { + const errText = t(getErrText(err, errorToast || '')); + if (errText) { + toast({ + title: errText, + status: 'error' + }); + } + } + }, + onSuccess: (res, params) => { + rest?.onSuccess?.(res, params); + if (successToast) { + toast({ + title: successToast, + status: 'success' + }); + } + } + }, + plugin + ); + + return res; +}; diff --git a/packages/web/hooks/useScrollPagination.tsx b/packages/web/hooks/useScrollPagination.tsx index e2222a065fba..40de950ef4da 100644 --- a/packages/web/hooks/useScrollPagination.tsx +++ b/packages/web/hooks/useScrollPagination.tsx @@ -1,9 +1,17 @@ -import { useRef, useState, useEffect } from 'react'; +import React, { useRef, useState, useEffect } from 'react'; import { Box, BoxProps } from '@chakra-ui/react'; import { useToast } from './useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; import { PaginationProps, PaginationResponse } from '../common/fetch/type'; -import { useBoolean, useLockFn, useMemoizedFn, useMount, useScroll, useVirtualList } from 'ahooks'; +import { + useBoolean, + useLockFn, + useMemoizedFn, + useMount, + useScroll, + useVirtualList, + useRequest +} from 'ahooks'; import MyBox from '../components/common/MyBox'; import { useTranslation } from 'next-i18next'; @@ -13,12 +21,19 @@ export function useScrollPagination< >( api: (data: TParams) => Promise, { + debounceWait, + throttleWait, + refreshDeps, itemHeight = 50, overscan = 10, pageSize = 10, defaultParams = {} }: { + debounceWait?: number; + throttleWait?: number; + refreshDeps?: any[]; + itemHeight: number; overscan?: number; @@ -45,7 +60,7 @@ export function useScrollPagination< }); const loadData = useLockFn(async (num: number = current) => { - if (noMore.current) return; + if (noMore.current && num !== 1) return; setTrue(); @@ -59,7 +74,7 @@ export function useScrollPagination< setCurrent(num); if (num === 1) { - // reload + // init or reload setData(res.list); noMore.current = res.list.length >= res.total; } else { @@ -78,32 +93,48 @@ export function useScrollPagination< setFalse(); }); + const scroll2Top = () => { + if (containerRef.current) { + containerRef.current.scrollTop = 0; + } + }; + const ScrollList = useMemoizedFn( ({ children, + EmptyChildren, isLoading, ...props - }: { children: React.ReactNode; isLoading?: boolean } & BoxProps) => { + }: { + children: React.ReactNode; + EmptyChildren?: React.ReactNode; + isLoading?: boolean; + } & BoxProps) => { return ( - - {children} - {noMore.current && ( - - {t('common.No more data')} - - )} - + <> + + {children} + {noMore.current && list.length > 0 && ( + + {t('common.No more data')} + + )} + {list.length === 0 && !isLoading && EmptyChildren && <>{EmptyChildren}} + + ); } ); - useMount(() => { - loadData(1); + useRequest(() => loadData(1), { + refreshDeps, + debounceWait: data.length === 0 ? 0 : debounceWait, + throttleWait }); const scroll = useScroll(containerRef); useEffect(() => { - if (!containerRef.current) return; + if (!containerRef.current || list.length === 0) return; const { scrollTop, scrollHeight, clientHeight } = containerRef.current; @@ -115,8 +146,11 @@ export function useScrollPagination< return { containerRef, list, + data, + setData, isLoading, ScrollList, - fetchData: loadData + fetchData: loadData, + scroll2Top }; } diff --git a/packages/web/package.json b/packages/web/package.json index 03b56bbcb174..e64a52800b60 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -26,19 +26,18 @@ "lodash": "^4.17.21", "next-i18next": "15.2.0", "papaparse": "^5.4.1", - "pdfjs-dist": "4.0.269", - "react": "18.2.0", + "react": "18.3.1", "use-context-selector": "^1.4.4", "react-day-picker": "^8.7.1", - "react-dom": "18.2.0", + "react-dom": "18.3.1", "react-i18next": "13.5.0", "react-beautiful-dnd": "^13.1.1" }, "devDependencies": { "@types/lodash": "^4.14.191", "@types/papaparse": "^5.3.7", - "@types/react": "18.2.0", - "@types/react-dom": "18.2.0", + "@types/react": "18.3.0", + "@types/react-dom": "18.3.0", "@types/react-beautiful-dnd": "^13.1.8" } } diff --git a/packages/web/styles/theme.ts b/packages/web/styles/theme.ts index b069f4c74f30..fd53bd1ef899 100644 --- a/packages/web/styles/theme.ts +++ b/packages/web/styles/theme.ts @@ -521,6 +521,19 @@ export const theme = extendTheme({ 800: '#05603A', 900: '#054F31' }, + yellow: { + 25: '#FFFDFA', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#F5C149', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E' + }, borderColor: { low: '#E8EBF0', base: '#DFE2EA', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d3e1f20707d..ba0bff8da6d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,13 +22,13 @@ importers: version: 13.3.0 next-i18next: specifier: 15.2.0 - version: 15.2.0(i18next@23.10.0)(next@13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 15.2.0(i18next@23.10.0)(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) prettier: specifier: 3.2.4 version: 3.2.4 react-i18next: specifier: 13.5.0 - version: 13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zhlint: specifier: ^0.7.1 version: 0.7.4(@types/node@20.8.5)(sass@1.58.3)(terser@5.30.4)(typescript@4.9.5) @@ -60,8 +60,8 @@ importers: specifier: ^4.0.1 version: 4.0.1 next: - specifier: 13.5.2 - version: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3) + specifier: 14.2.3 + version: 14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3) openai: specifier: 4.28.0 version: 4.28.0(encoding@0.1.13) @@ -135,9 +135,6 @@ importers: joplin-turndown-plugin-gfm: specifier: ^1.0.12 version: 1.0.12 - js-tiktoken: - specifier: ^1.0.7 - version: 1.0.7 json5: specifier: ^2.2.3 version: 2.2.3 @@ -154,11 +151,11 @@ importers: 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.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3) + specifier: 14.2.3 + version: 14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3) nextjs-cors: specifier: ^2.1.2 - version: 2.1.2(next@13.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3)) + version: 2.1.2(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3)) node-cron: specifier: ^3.0.3 version: 3.0.3 @@ -183,6 +180,9 @@ importers: pg: specifier: ^8.10.0 version: 8.10.0 + tiktoken: + specifier: ^1.0.15 + version: 1.0.15 tunnel: specifier: ^0.0.6 version: 0.0.6 @@ -268,25 +268,25 @@ importers: version: 2.2.1 '@chakra-ui/icons': specifier: 2.1.1 - version: 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/next-js': specifier: 2.1.5 - version: 2.1.5(@chakra-ui/react@2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@emotion/react@11.11.1(@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))(react@18.2.0)(sass@1.58.3))(react@18.2.0) + version: 2.1.5(@chakra-ui/react@2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react@18.3.1) '@chakra-ui/react': specifier: 2.8.1 - version: 2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@chakra-ui/styled-system': specifier: 2.9.1 version: 2.9.1 '@chakra-ui/system': specifier: 2.6.1 - version: 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) + version: 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) '@emotion/react': specifier: 11.11.1 - version: 11.11.1(@types/react@18.2.0)(react@18.2.0) + version: 11.11.1(@types/react@18.3.0)(react@18.3.1) '@emotion/styled': specifier: 11.11.0 - version: 11.11.0(@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1) '@fastgpt/global': specifier: workspace:* version: link:../global @@ -295,7 +295,7 @@ importers: version: 4.3.0 '@lexical/react': specifier: 0.12.6 - version: 0.12.6(lexical@0.12.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(yjs@13.6.14) + version: 0.12.6(lexical@0.12.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.14) '@lexical/selection': specifier: ^0.14.5 version: 0.14.5 @@ -307,13 +307,13 @@ importers: version: 0.12.6(lexical@0.12.6) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^4.24.10 - version: 4.24.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.24.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ahooks: specifier: ^3.7.11 - version: 3.7.11(react@18.2.0) + version: 3.7.11(react@18.3.1) date-fns: specifier: 2.30.0 version: 2.30.0 @@ -331,31 +331,28 @@ importers: version: 4.17.21 next-i18next: specifier: 15.2.0 - version: 15.2.0(i18next@23.10.0)(next@13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 15.2.0(i18next@23.10.0)(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) papaparse: specifier: ^5.4.1 version: 5.4.1 - pdfjs-dist: - specifier: 4.0.269 - version: 4.0.269(encoding@0.1.13) react: - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.1 + version: 18.3.1 react-beautiful-dnd: specifier: ^13.1.1 - version: 13.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-day-picker: specifier: ^8.7.1 - version: 8.7.1(date-fns@2.30.0)(react@18.2.0) + version: 8.7.1(date-fns@2.30.0)(react@18.3.1) react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) react-i18next: specifier: 13.5.0 - version: 13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) use-context-selector: specifier: ^1.4.4 - version: 1.4.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(scheduler@0.23.0) + version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) devDependencies: '@types/lodash': specifier: ^4.14.191 @@ -364,14 +361,14 @@ importers: specifier: ^5.3.7 version: 5.3.7 '@types/react': - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.0 + version: 18.3.0 '@types/react-beautiful-dnd': specifier: ^13.1.8 version: 13.1.8 '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.0 + version: 18.3.0 projects/app: dependencies: @@ -383,25 +380,25 @@ importers: version: 2.2.1 '@chakra-ui/icons': specifier: 2.1.1 - version: 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/next-js': specifier: 2.1.5 - version: 2.1.5(@chakra-ui/react@2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@emotion/react@11.11.1(@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))(react@18.2.0)(sass@1.58.3))(react@18.2.0) + version: 2.1.5(@chakra-ui/react@2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react@18.3.1) '@chakra-ui/react': specifier: 2.8.1 - version: 2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@chakra-ui/styled-system': specifier: 2.9.1 version: 2.9.1 '@chakra-ui/system': specifier: 2.6.1 - version: 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) + version: 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) '@emotion/react': specifier: 11.11.1 - version: 11.11.1(@types/react@18.2.0)(react@18.2.0) + version: 11.11.1(@types/react@18.3.0)(react@18.3.1) '@emotion/styled': specifier: 11.11.0 - version: 11.11.0(@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) + version: 11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1) '@fastgpt/global': specifier: workspace:* version: link:../../packages/global @@ -422,13 +419,13 @@ importers: version: 1.10.0 '@tanstack/react-query': specifier: ^4.24.10 - version: 4.24.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.24.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/nprogress': specifier: ^0.2.0 version: 0.2.0 ahooks: specifier: ^3.7.11 - version: 3.7.11(react@18.2.0) + version: 3.7.11(react@18.3.1) axios: specifier: ^1.5.1 version: 1.5.1 @@ -449,7 +446,7 @@ importers: version: 2.1.1 framer-motion: specifier: ^9.0.6 - version: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) hyperdown: specifier: ^2.4.29 version: 2.4.29 @@ -475,11 +472,11 @@ importers: specifier: ^4.0.1 version: 4.0.1 next: - specifier: 13.5.2 - version: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3) + specifier: 14.2.3 + version: 14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3) next-i18next: specifier: 15.2.0 - version: 15.2.0(i18next@23.10.0)(next@13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 15.2.0(i18next@23.10.0)(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) nextjs-node-loader: specifier: ^1.1.5 version: 1.1.5(webpack@5.91.0) @@ -487,29 +484,29 @@ importers: specifier: ^0.2.0 version: 0.2.0 react: - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.1 + version: 18.3.1 react-day-picker: specifier: ^8.7.1 - version: 8.7.1(date-fns@2.30.0)(react@18.2.0) + version: 8.7.1(date-fns@2.30.0)(react@18.3.1) react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) react-hook-form: specifier: 7.43.1 - version: 7.43.1(react@18.2.0) + version: 7.43.1(react@18.3.1) react-i18next: specifier: 13.5.0 - version: 13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-markdown: specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.0)(react@18.2.0) + version: 8.0.7(@types/react@18.3.0)(react@18.3.1) react-syntax-highlighter: specifier: ^15.5.0 - version: 15.5.0(react@18.2.0) + version: 15.5.0(react@18.3.1) reactflow: specifier: ^11.7.4 - version: 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rehype-katex: specifier: ^6.0.2 version: 6.0.2 @@ -530,10 +527,10 @@ importers: version: 1.58.3 use-context-selector: specifier: ^1.4.4 - version: 1.4.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(scheduler@0.23.0) + version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2) zustand: specifier: ^4.3.5 - version: 4.3.5(immer@9.0.19)(react@18.2.0) + version: 4.3.5(immer@9.0.19)(react@18.3.1) devDependencies: '@svgr/webpack': specifier: ^6.5.1 @@ -557,11 +554,11 @@ importers: specifier: ^20.8.5 version: 20.8.5 '@types/react': - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.0 + version: 18.3.0 '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.0 + version: 18.3.0 '@types/react-syntax-highlighter': specifier: ^15.5.6 version: 15.5.6 @@ -572,8 +569,8 @@ importers: specifier: 8.34.0 version: 8.34.0 eslint-config-next: - specifier: 13.1.6 - version: 13.1.6(eslint@8.34.0)(typescript@4.9.5) + specifier: 14.2.3 + version: 14.2.3(eslint@8.34.0)(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -2392,66 +2389,62 @@ packages: '@napi-rs/wasm-runtime@0.1.2': resolution: {integrity: sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==} - '@next/env@13.5.2': - resolution: {integrity: sha512-dUseBIQVax+XtdJPzhwww4GetTjlkRSsXeQnisIJWBaHsnxYcN2RGzsPHi58D6qnkATjnhuAtQTJmR1hKYQQPg==} + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - '@next/eslint-plugin-next@13.1.6': - resolution: {integrity: sha512-o7cauUYsXjzSJkay8wKjpKJf2uLzlggCsGUkPu3lP09Pv97jYlekTC20KJrjQKmSv5DXV0R/uks2ZXhqjNkqAw==} + '@next/eslint-plugin-next@14.2.3': + resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} - '@next/swc-darwin-arm64@13.5.2': - resolution: {integrity: sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==} + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@13.5.2': - resolution: {integrity: sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==} + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@13.5.2': - resolution: {integrity: sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==} + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] - '@next/swc-linux-arm64-musl@13.5.2': - resolution: {integrity: sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==} + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] - '@next/swc-linux-x64-gnu@13.5.2': - resolution: {integrity: sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==} + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] - '@next/swc-linux-x64-musl@13.5.2': - resolution: {integrity: sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==} + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] - '@next/swc-win32-arm64-msvc@13.5.2': - resolution: {integrity: sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==} + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@13.5.2': - resolution: {integrity: sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==} + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@13.5.2': - resolution: {integrity: sha512-LfTHt+hTL8w7F9hnB3H4nRasCzLD/fP+h4/GUVBTxrkMJOnh/7OZ0XbYDKO/uuWwryJS9kZjhxcruBiYwc5UDw==} + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2778,8 +2771,11 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} - '@swc/helpers@0.5.2': - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} '@tanstack/query-core@4.24.10': resolution: {integrity: sha512-2QywqXEAGBIUoTdgn1lAB4/C8QEqwXHj2jrCLeYTk2xVGtLiPEUD8jcMoeB2noclbiW2mMt4+Fq7fZStuz3wAQ==} @@ -3053,8 +3049,8 @@ packages: '@types/react-beautiful-dnd@13.1.8': resolution: {integrity: sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==} - '@types/react-dom@18.2.0': - resolution: {integrity: sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==} + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} '@types/react-redux@7.1.33': resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} @@ -3062,15 +3058,12 @@ packages: '@types/react-syntax-highlighter@15.5.6': resolution: {integrity: sha512-i7wFuLbIAFlabTeD2I1cLjEOrG/xdMa/rpx2zwzAoGHuXJDhSqp9BSfDlMHSh9JSuNfxHk9eEmMX6D55GiyjGg==} - '@types/react@18.2.0': - resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==} + '@types/react@18.3.0': + resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} '@types/request-ip@0.0.37': resolution: {integrity: sha512-uw6/i3rQnpznxD7LtLaeuZytLhKZK6bRoTS6XVJlwxIOoOpEBU7bgKoVXDNtOg4Xl6riUKHa9bjMVrL6ESqYlQ==} - '@types/scheduler@0.23.0': - resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -4380,8 +4373,8 @@ packages: engines: {node: '>=4.0'} hasBin: true - eslint-config-next@13.1.6: - resolution: {integrity: sha512-0cg7h5wztg/SoLAlxljZ0ZPUQ7i6QKqRiP4M2+MgTZtxWwNKb2JSwNc18nJ6/kXBI6xYvPraTbQSIhAuVw6czw==} + eslint-config-next@14.2.3: + resolution: {integrity: sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -4770,14 +4763,16 @@ 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 + glob@10.3.12: resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -5348,9 +5343,6 @@ packages: js-sdsl@4.4.2: resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - js-tiktoken@1.0.7: - resolution: {integrity: sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5963,18 +5955,21 @@ packages: react: '>= 17.0.2' react-i18next: '>= 13.5.0' - next@13.5.2: - resolution: {integrity: sha512-vog4UhUaMYAzeqfiAAmgB/QWLW7p01/sg+2vn6bqc/CxHFYizMzLv6gjxKzl31EVFkfl/F+GbxlKizlkTE9RdA==} - engines: {node: '>=16.14.0'} + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true + '@playwright/test': + optional: true sass: optional: true @@ -6314,8 +6309,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} postcss@8.4.38: @@ -6440,10 +6435,10 @@ packages: date-fns: ^2.28.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^18.2.0 + react: ^18.3.1 react-error-boundary@3.1.4: resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} @@ -6544,8 +6539,8 @@ packages: peerDependencies: react: '>= 0.14.0' - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} reactflow@11.7.4: @@ -6742,8 +6737,8 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -7076,6 +7071,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiktoken@1.0.15: + resolution: {integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw==} + timezones-list@3.0.2: resolution: {integrity: sha512-I698hm6Jp/xxkwyTSOr39pZkYKETL8LDJeSIhjxXBfPUAHM5oZNuQ4o9UK3PSkDBOkjATecSOBb3pR1IkIBUsg==} @@ -7506,10 +7504,6 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - watchpack@2.4.1: resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} @@ -7662,9 +7656,6 @@ packages: resolution: {integrity: sha512-E1rA6TyQJ1cWWfMoM8KE1hMdDDi5B8Gv+8OYPXe733Lf0C3EwJ+jh1cpoK/KTrYeITumRZQ0KSPkBRMNZuC8oA==} hasBin: true - zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - zrender@5.4.1: resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==} @@ -8615,81 +8606,81 @@ snapshots: '@braintree/sanitize-url@6.0.4': {} - '@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/descendant': 3.1.0(react@18.2.0) - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@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/descendant': 3.1.0(react@18.3.1) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/alert@2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/alert@2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/anatomy@2.2.1': {} - '@chakra-ui/avatar@2.3.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/avatar@2.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@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/image': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/breadcrumb@2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/breadcrumb@2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@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/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/breakpoint-utils@2.0.8': dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/button@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/button@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/card@2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/card@2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 - - '@chakra-ui/checkbox@2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': - dependencies: - '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@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/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/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 + + '@chakra-ui/checkbox@2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@zag-js/focus-visible': 0.16.0 - react: 18.2.0 + react: 18.3.1 '@chakra-ui/cli@2.4.1': dependencies: @@ -8701,512 +8692,512 @@ snapshots: esbuild: 0.17.19 prettier: 2.8.8 - '@chakra-ui/clickable@2.1.0(react@18.2.0)': + '@chakra-ui/clickable@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/close-button@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/close-button@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/color-mode@2.2.0(react@18.2.0)': + '@chakra-ui/color-mode@2.2.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/control-box@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/control-box@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/counter@2.1.0(react@18.2.0)': + '@chakra-ui/counter@2.1.0(react@18.3.1)': dependencies: '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/css-reset@2.3.0(@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0))(react@18.2.0)': + '@chakra-ui/css-reset@2.3.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(react@18.3.1)': dependencies: - '@emotion/react': 11.11.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 + '@emotion/react': 11.11.1(@types/react@18.3.0)(react@18.3.1) + react: 18.3.1 - '@chakra-ui/descendant@3.1.0(react@18.2.0)': + '@chakra-ui/descendant@3.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + react: 18.3.1 '@chakra-ui/dom-utils@2.1.0': {} - '@chakra-ui/editable@3.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/editable@3.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@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/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/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/event-utils@2.0.8': {} - '@chakra-ui/focus-lock@2.1.0(@types/react@18.2.0)(react@18.2.0)': + '@chakra-ui/focus-lock@2.1.0(@types/react@18.3.0)(react@18.3.1)': dependencies: '@chakra-ui/dom-utils': 2.1.0 - react: 18.2.0 - react-focus-lock: 2.11.2(@types/react@18.2.0)(react@18.2.0) + react: 18.3.1 + react-focus-lock: 2.11.2(@types/react@18.3.0)(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@chakra-ui/form-control@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/form-control@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@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/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/hooks@2.2.1(react@18.2.0)': + '@chakra-ui/hooks@2.2.1(react@18.3.1)': dependencies: - '@chakra-ui/react-utils': 2.0.12(react@18.2.0) + '@chakra-ui/react-utils': 2.0.12(react@18.3.1) '@chakra-ui/utils': 2.0.15 compute-scroll-into-view: 3.0.3 copy-to-clipboard: 3.3.3 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/icon@3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/icon@3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/icons@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/icons@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/image@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/image@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/input@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/input@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/object-utils': 2.1.0 - '@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/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/layout@2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/layout@2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/object-utils': 2.1.0 - '@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/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/lazy-utils@2.0.5': {} - '@chakra-ui/live-region@2.1.0(react@18.2.0)': + '@chakra-ui/live-region@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/breakpoint-utils': 2.0.8 - '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/clickable': 2.1.0(react@18.2.0) - '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/clickable': 2.1.0(react@18.3.1) + '@chakra-ui/descendant': 3.1.0(react@18.3.1) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.1.0(react@18.2.0) - '@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/react-use-animation-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@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/popper': 3.1.0(react@18.3.1) + '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-outside-click': 2.2.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - - '@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.0)(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@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/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + + '@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.0)(react@18.3.1) + '@chakra-ui/portal': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.9(@types/react@18.2.0)(react@18.2.0) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.9(@types/react@18.3.0)(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@chakra-ui/next-js@2.1.5(@chakra-ui/react@2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@emotion/react@11.11.1(@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))(react@18.2.0)(sass@1.58.3))(react@18.2.0)': + '@chakra-ui/next-js@2.1.5(@chakra-ui/react@2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react@18.3.1)': dependencies: - '@chakra-ui/react': 2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@chakra-ui/react': 2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@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.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3) - react: 18.2.0 - - '@chakra-ui/number-input@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': - dependencies: - '@chakra-ui/counter': 2.1.0(react@18.2.0) - '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-interval': 2.1.0(react@18.2.0) - '@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/react-use-update-effect': 2.1.0(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.3.0)(react@18.3.1) + next: 14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3) + react: 18.3.1 + + '@chakra-ui/number-input@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@chakra-ui/counter': 2.1.0(react@18.3.1) + '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-interval': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/number-utils@2.0.7': {} '@chakra-ui/object-utils@2.1.0': {} - '@chakra-ui/pin-input@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/pin-input@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/descendant': 3.1.0(react@18.2.0) - '@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/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/descendant': 3.1.0(react@18.3.1) + '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/popover@2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/popover@2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/lazy-utils': 2.0.5 - '@chakra-ui/popper': 3.1.0(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) - '@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/popper': 3.1.0(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/popper@3.1.0(react@18.2.0)': + '@chakra-ui/popper@3.1.0(react@18.3.1)': dependencies: - '@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/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@popperjs/core': 2.11.8 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/portal@2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@chakra-ui/portal@2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@chakra-ui/progress@2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/progress@2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/provider@2.4.1(@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))(@types/react@18.2.0)(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@chakra-ui/provider@2.4.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0(react@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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/portal': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-env': 3.1.0(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) '@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))(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@emotion/react': 11.11.1(@types/react@18.3.0)(react@18.3.1) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@chakra-ui/radio@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/radio@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@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/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) '@zag-js/focus-visible': 0.16.0 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-children-utils@2.0.6(react@18.2.0)': + '@chakra-ui/react-children-utils@2.0.6(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-context@2.1.0(react@18.2.0)': + '@chakra-ui/react-context@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-env@3.1.0(react@18.2.0)': + '@chakra-ui/react-env@3.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-types@2.0.7(react@18.2.0)': + '@chakra-ui/react-types@2.0.7(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-animation-state@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-animation-state@2.1.0(react@18.3.1)': dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-callback-ref@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-callback-ref@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-controllable-state@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-controllable-state@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-disclosure@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-disclosure@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-event-listener@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-event-listener@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-focus-effect@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-focus-effect@2.1.0(react@18.3.1)': dependencies: '@chakra-ui/dom-utils': 2.1.0 - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - '@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) - react: 18.2.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-focus-on-pointer-down@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-focus-on-pointer-down@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-interval@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-interval@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-latest-ref@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-latest-ref@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-merge-refs@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-merge-refs@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-outside-click@2.2.0(react@18.2.0)': + '@chakra-ui/react-use-outside-click@2.2.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-pan-event@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-pan-event@2.1.0(react@18.3.1)': dependencies: '@chakra-ui/event-utils': 2.0.8 - '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.3.1) framesync: 6.1.2 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-previous@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-previous@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-size@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-size@2.1.0(react@18.3.1)': dependencies: '@zag-js/element-size': 0.10.5 - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-use-timeout@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-timeout@2.1.0(react@18.3.1)': dependencies: - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - react: 18.2.0 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + react: 18.3.1 - '@chakra-ui/react-use-update-effect@2.1.0(react@18.2.0)': + '@chakra-ui/react-use-update-effect@2.1.0(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 - '@chakra-ui/react-utils@2.0.12(react@18.2.0)': + '@chakra-ui/react-utils@2.0.12(react@18.3.1)': dependencies: '@chakra-ui/utils': 2.0.15 - react: 18.2.0 - - '@chakra-ui/react@2.8.1(@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))(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@chakra-ui/accordion': 2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/alert': 2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/checkbox': 2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(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(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/hooks': 2.2.1(react@18.2.0) - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/input': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(@types/react@18.2.0)(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@chakra-ui/number-input': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(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))(react@18.2.0) - '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/provider': 2.4.1(@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))(@types/react@18.2.0)(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@chakra-ui/radio': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/stat': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/stepper': 2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + react: 18.3.1 + + '@chakra-ui/react@2.8.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@chakra-ui/accordion': 2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/alert': 2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/checkbox': 2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/counter': 2.1.0(react@18.3.1) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.3.0)(react@18.3.1) + '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/hooks': 2.2.1(react@18.3.1) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/input': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/live-region': 2.1.0(react@18.3.1) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(@types/react@18.3.0)(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/number-input': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/popper': 3.1.0(react@18.3.1) + '@chakra-ui/portal': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/provider': 2.4.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/radio': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-env': 3.1.0(react@18.3.1) + '@chakra-ui/select': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/stat': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/stepper': 2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/styled-system': 2.9.1 - '@chakra-ui/switch': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/tabs': 3.0.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/tag': 3.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/textarea': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/switch': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/tabs': 3.0.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/tag': 3.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/textarea': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/toast': 7.0.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/transition': 2.1.0(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/utils': 2.0.15 - '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(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))(@types/react@18.2.0)(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@emotion/react': 11.11.1(@types/react@18.3.0)(react@18.3.1) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@chakra-ui/select@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/select@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/shared-utils@2.0.5': {} - '@chakra-ui/skeleton@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/skeleton@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-use-previous': 2.1.0(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-use-previous': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/skip-nav@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/skip-nav@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/slider@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/slider@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/number-utils': 2.0.7 - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) - '@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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 - - '@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-pan-event': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-size': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 + + '@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/stat@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/stat@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/stepper@2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/stepper@2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/styled-system@2.9.1': dependencies: @@ -9214,61 +9205,61 @@ snapshots: csstype: 3.1.3 lodash.mergewith: 4.6.2 - '@chakra-ui/switch@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/switch@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/checkbox': 2.3.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/checkbox': 2.3.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0)': + '@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/color-mode': 2.2.0(react@18.2.0) + '@chakra-ui/color-mode': 2.2.0(react@18.3.1) '@chakra-ui/object-utils': 2.1.0 - '@chakra-ui/react-utils': 2.0.12(react@18.2.0) + '@chakra-ui/react-utils': 2.0.12(react@18.3.1) '@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))(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 + '@emotion/react': 11.11.1(@types/react@18.3.0)(react@18.3.1) + '@emotion/styled': 11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1) + react: 18.3.1 react-fast-compare: 3.2.2 - '@chakra-ui/table@2.1.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/table@2.1.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/tabs@3.0.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/tabs@3.0.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/clickable': 2.1.0(react@18.2.0) - '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/clickable': 2.1.0(react@18.3.1) + '@chakra-ui/descendant': 3.1.0(react@18.3.1) '@chakra-ui/lazy-utils': 2.0.5 - '@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/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/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/tag@3.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/tag@3.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 - '@chakra-ui/textarea@2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/textarea@2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@chakra-ui/form-control': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/theme-tools@2.1.1(@chakra-ui/styled-system@2.9.1)': dependencies: @@ -9291,42 +9282,42 @@ snapshots: '@chakra-ui/styled-system': 2.9.1 '@chakra-ui/theme-tools': 2.1.1(@chakra-ui/styled-system@2.9.1) - '@chakra-ui/toast@7.0.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@chakra-ui/toast@7.0.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/alert': 2.2.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0) - '@chakra-ui/portal': 2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@chakra-ui/react-context': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-timeout': 2.1.0(react@18.2.0) - '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/alert': 2.2.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@chakra-ui/portal': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-context': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-timeout': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.3.1) '@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(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) '@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))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@chakra-ui/tooltip@2.3.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@chakra-ui/tooltip@2.3.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/dom-utils': 2.1.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))(react@18.2.0) - '@chakra-ui/react-types': 2.0.7(react@18.2.0) - '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) - '@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/popper': 3.1.0(react@18.3.1) + '@chakra-ui/portal': 2.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@chakra-ui/react-types': 2.0.7(react@18.3.1) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.3.1) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.3.1) '@chakra-ui/shared-utils': 2.0.5 - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - '@chakra-ui/transition@2.1.0(framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/transition@2.1.0(framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@chakra-ui/shared-utils': 2.0.5 - framer-motion: 9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 + framer-motion: 9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@chakra-ui/utils@2.0.15': dependencies: @@ -9335,10 +9326,10 @@ snapshots: framesync: 6.1.2 lodash.mergewith: 4.6.2 - '@chakra-ui/visually-hidden@2.2.0(@chakra-ui/system@2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@chakra-ui/visually-hidden@2.2.0(@chakra-ui/system@2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@chakra-ui/system': 2.6.1(@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))(@types/react@18.2.0)(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@chakra-ui/system': 2.6.1(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1))(react@18.3.1) + react: 18.3.1 '@emnapi/core@1.1.1': dependencies: @@ -9353,7 +9344,7 @@ snapshots: '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.4 @@ -9388,19 +9379,19 @@ snapshots: '@emotion/memoize@0.8.1': {} - '@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0)': + '@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 hoist-non-react-statics: 3.3.2 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 '@emotion/serialize@1.1.4': dependencies: @@ -9412,24 +9403,24 @@ snapshots: '@emotion/sheet@1.2.2': {} - '@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': + '@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.3.0)(react@18.3.1))(@types/react@18.3.0)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.4 '@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.1(@types/react@18.3.0)(react@18.3.1) '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) '@emotion/utils': 1.2.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 '@emotion/unitless@0.8.1': {} - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)': dependencies: - react: 18.2.0 + react: 18.3.1 '@emotion/utils@1.2.1': {} @@ -9907,7 +9898,7 @@ snapshots: '@lexical/utils': 0.12.6(lexical@0.12.6) lexical: 0.12.6 - '@lexical/react@0.12.6(lexical@0.12.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(yjs@13.6.14)': + '@lexical/react@0.12.6(lexical@0.12.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(yjs@13.6.14)': dependencies: '@lexical/clipboard': 0.12.6(lexical@0.12.6) '@lexical/code': 0.12.6(lexical@0.12.6) @@ -9927,9 +9918,9 @@ snapshots: '@lexical/utils': 0.12.6(lexical@0.12.6) '@lexical/yjs': 0.12.6(lexical@0.12.6)(yjs@13.6.14) lexical: 0.12.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-error-boundary: 3.1.4(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-error-boundary: 3.1.4(react@18.3.1) transitivePeerDependencies: - yjs @@ -9991,12 +9982,12 @@ snapshots: monaco-editor: 0.47.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) '@motionone/animation@10.17.0': dependencies: @@ -10040,37 +10031,37 @@ snapshots: '@tybys/wasm-util': 0.8.3 optional: true - '@next/env@13.5.2': {} + '@next/env@14.2.3': {} - '@next/eslint-plugin-next@13.1.6': + '@next/eslint-plugin-next@14.2.3': dependencies: - glob: 7.1.7 + glob: 10.3.10 - '@next/swc-darwin-arm64@13.5.2': + '@next/swc-darwin-arm64@14.2.3': optional: true - '@next/swc-darwin-x64@13.5.2': + '@next/swc-darwin-x64@14.2.3': optional: true - '@next/swc-linux-arm64-gnu@13.5.2': + '@next/swc-linux-arm64-gnu@14.2.3': optional: true - '@next/swc-linux-arm64-musl@13.5.2': + '@next/swc-linux-arm64-musl@14.2.3': optional: true - '@next/swc-linux-x64-gnu@13.5.2': + '@next/swc-linux-x64-gnu@14.2.3': optional: true - '@next/swc-linux-x64-musl@13.5.2': + '@next/swc-linux-x64-musl@14.2.3': optional: true - '@next/swc-win32-arm64-msvc@13.5.2': + '@next/swc-win32-arm64-msvc@14.2.3': optional: true - '@next/swc-win32-ia32-msvc@13.5.2': + '@next/swc-win32-ia32-msvc@14.2.3': optional: true - '@next/swc-win32-x64-msvc@13.5.2': + '@next/swc-win32-x64-msvc@14.2.3': optional: true '@node-rs/jieba-android-arm-eabi@1.10.0': @@ -10159,27 +10150,27 @@ snapshots: '@popperjs/core@2.11.8': {} - '@reactflow/background@11.2.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@reactflow/background@11.2.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.3.5(immer@9.0.19)(react@18.3.1) transitivePeerDependencies: - immer - '@reactflow/controls@11.1.15(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@reactflow/controls@11.1.15(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.3.5(immer@9.0.19)(react@18.3.1) transitivePeerDependencies: - immer - '@reactflow/core@11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@reactflow/core@11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@types/d3': 7.4.3 '@types/d3-drag': 3.0.7 @@ -10189,45 +10180,45 @@ snapshots: d3-drag: 3.0.0 d3-selection: 3.0.0 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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.3.5(immer@9.0.19)(react@18.3.1) transitivePeerDependencies: - immer - '@reactflow/minimap@11.5.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@reactflow/minimap@11.5.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/d3-selection': 3.0.10 '@types/d3-zoom': 3.0.8 classcat: 5.0.4 d3-selection: 3.0.0 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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.3.5(immer@9.0.19)(react@18.3.1) transitivePeerDependencies: - immer - '@reactflow/node-resizer@2.1.1(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@reactflow/node-resizer@2.1.1(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.3.5(immer@9.0.19)(react@18.3.1) transitivePeerDependencies: - immer - '@reactflow/node-toolbar@1.2.3(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@reactflow/node-toolbar@1.2.3(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 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) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zustand: 4.3.5(immer@9.0.19)(react@18.3.1) transitivePeerDependencies: - immer @@ -10380,19 +10371,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@swc/helpers@0.5.2': + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': dependencies: + '@swc/counter': 0.1.3 tslib: 2.6.2 '@tanstack/query-core@4.24.10': {} - '@tanstack/react-query@4.24.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query@4.24.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-core': 4.24.10 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) + react: 18.3.1 + use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) '@tokenizer/token@0.3.0': {} @@ -10602,7 +10596,7 @@ snapshots: '@types/hoist-non-react-statics@3.3.5': dependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 hoist-non-react-statics: 3.3.2 '@types/http-errors@2.0.4': {} @@ -10699,35 +10693,32 @@ snapshots: '@types/react-beautiful-dnd@13.1.8': dependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - '@types/react-dom@18.2.0': + '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 '@types/react-redux@7.1.33': dependencies: '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 18.2.0 + '@types/react': 18.3.0 hoist-non-react-statics: 3.3.2 redux: 4.2.1 '@types/react-syntax-highlighter@15.5.6': dependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - '@types/react@18.2.0': + '@types/react@18.3.0': dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.23.0 csstype: 3.1.3 '@types/request-ip@0.0.37': dependencies: '@types/node': 20.8.5 - '@types/scheduler@0.23.0': {} - '@types/semver@7.5.8': {} '@types/send@0.17.4': @@ -11069,14 +11060,14 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ahooks@3.7.11(react@18.2.0): + ahooks@3.7.11(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 dayjs: 1.11.7 intersection-observer: 0.12.2 js-cookie: 2.2.1 lodash: 4.17.21 - react: 18.2.0 + react: 18.3.1 react-fast-compare: 3.2.2 resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 @@ -12362,9 +12353,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@13.1.6(eslint@8.34.0)(typescript@4.9.5): + eslint-config-next@14.2.3(eslint@8.34.0)(typescript@4.9.5): dependencies: - '@next/eslint-plugin-next': 13.1.6 + '@next/eslint-plugin-next': 14.2.3 '@rushstack/eslint-patch': 1.10.1 '@typescript-eslint/parser': 5.62.0(eslint@8.34.0)(typescript@4.9.5) eslint: 8.34.0 @@ -12445,7 +12436,7 @@ snapshots: eslint-plugin-jsx-a11y@6.8.0(eslint@8.34.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 aria-query: 5.3.0 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 @@ -12838,12 +12829,12 @@ snapshots: forwarded@0.2.0: {} - framer-motion@9.0.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + framer-motion@9.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@motionone/dom': 10.17.0 hey-listen: 1.0.8 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 @@ -12937,7 +12928,7 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.12: + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 @@ -12945,14 +12936,13 @@ snapshots: minipass: 7.0.4 path-scurry: 1.10.2 - glob@7.1.7: + glob@10.3.12: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 glob@7.2.3: dependencies: @@ -13732,10 +13722,6 @@ snapshots: js-sdsl@4.4.2: {} - js-tiktoken@1.0.7: - dependencies: - base64-js: 1.5.1 - js-tokens@4.0.0: {} js-tokens@9.0.0: {} @@ -14527,7 +14513,7 @@ snapshots: neo-async@2.6.2: {} - next-i18next@15.2.0(i18next@23.10.0)(next@13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + next-i18next@15.2.0(i18next@23.10.0)(next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3))(react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 '@types/hoist-non-react-statics': 3.3.5 @@ -14535,41 +14521,40 @@ snapshots: 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.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3) - react: 18.2.0 - react-i18next: 13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3) + react: 18.3.1 + react-i18next: 13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next@13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3): + next@14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3): dependencies: - '@next/env': 13.5.2 - '@swc/helpers': 0.5.2 + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001603 - postcss: 8.4.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.3)(react@18.2.0) - watchpack: 2.4.0 - zod: 3.21.4 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.3)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 13.5.2 - '@next/swc-darwin-x64': 13.5.2 - '@next/swc-linux-arm64-gnu': 13.5.2 - '@next/swc-linux-arm64-musl': 13.5.2 - '@next/swc-linux-x64-gnu': 13.5.2 - '@next/swc-linux-x64-musl': 13.5.2 - '@next/swc-win32-arm64-msvc': 13.5.2 - '@next/swc-win32-ia32-msvc': 13.5.2 - '@next/swc-win32-x64-msvc': 13.5.2 + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 sass: 1.58.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextjs-cors@2.1.2(next@13.5.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3)): + nextjs-cors@2.1.2(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3)): dependencies: cors: 2.8.5 - next: 13.5.2(@babel/core@7.24.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.58.3) + next: 14.2.3(@babel/core@7.24.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.58.3) nextjs-node-loader@1.1.5(webpack@5.91.0): dependencies: @@ -14911,7 +14896,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss@8.4.14: + postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 @@ -15006,67 +14991,67 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-beautiful-dnd@13.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-beautiful-dnd@13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 css-box-model: 1.2.1 memoize-one: 5.2.1 raf-schd: 4.0.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-redux: 7.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) redux: 4.2.1 - use-memo-one: 1.1.3(react@18.2.0) + use-memo-one: 1.1.3(react@18.3.1) transitivePeerDependencies: - react-native - react-clientside-effect@1.2.6(react@18.2.0): + react-clientside-effect@1.2.6(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 - react: 18.2.0 + react: 18.3.1 - react-day-picker@8.7.1(date-fns@2.30.0)(react@18.2.0): + react-day-picker@8.7.1(date-fns@2.30.0)(react@18.3.1): dependencies: date-fns: 2.30.0 - react: 18.2.0 + react: 18.3.1 - react-dom@18.2.0(react@18.2.0): + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 - react-error-boundary@3.1.4(react@18.2.0): + react-error-boundary@3.1.4(react@18.3.1): dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 + '@babel/runtime': 7.24.4 + react: 18.3.1 react-fast-compare@3.2.2: {} - react-focus-lock@2.11.2(@types/react@18.2.0)(react@18.2.0): + react-focus-lock@2.11.2(@types/react@18.3.0)(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 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.2(@types/react@18.2.0)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.0)(react@18.2.0) + react: 18.3.1 + react-clientside-effect: 1.2.6(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.0)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.0)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - react-hook-form@7.43.1(react@18.2.0): + react-hook-form@7.43.1(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 - react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-i18next@13.5.0(i18next@23.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 html-parse-stringify: 3.0.1 i18next: 23.10.0 - react: 18.2.0 + react: 18.3.1 optionalDependencies: - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) react-is@16.13.1: {} @@ -15074,17 +15059,17 @@ snapshots: react-is@18.2.0: {} - react-markdown@8.0.7(@types/react@18.2.0)(react@18.2.0): + react-markdown@8.0.7(@types/react@18.3.0)(react@18.3.1): dependencies: '@types/hast': 2.3.10 '@types/prop-types': 15.7.12 - '@types/react': 18.2.0 + '@types/react': 18.3.0 '@types/unist': 2.0.10 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 prop-types: 15.8.1 property-information: 6.4.1 - react: 18.2.0 + react: 18.3.1 react-is: 18.2.0 remark-parse: 10.0.2 remark-rehype: 10.1.0 @@ -15096,69 +15081,69 @@ snapshots: transitivePeerDependencies: - supports-color - react-redux@7.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.24.4 '@types/react-redux': 7.1.33 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.2.0 + react: 18.3.1 react-is: 17.0.2 optionalDependencies: - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) - react-remove-scroll-bar@2.3.6(@types/react@18.2.0)(react@18.2.0): + react-remove-scroll-bar@2.3.6(@types/react@18.3.0)(react@18.3.1): dependencies: - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.0)(react@18.2.0) + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.0)(react@18.3.1) tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - react-remove-scroll@2.5.9(@types/react@18.2.0)(react@18.2.0): + react-remove-scroll@2.5.9(@types/react@18.3.0)(react@18.3.1): dependencies: - 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) + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.0)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.0)(react@18.3.1) tslib: 2.6.2 - 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) + use-callback-ref: 1.3.2(@types/react@18.3.0)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.0)(react@18.3.1) optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - react-style-singleton@2.2.1(@types/react@18.2.0)(react@18.2.0): + react-style-singleton@2.2.1(@types/react@18.3.0)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - react-syntax-highlighter@15.5.0(react@18.2.0): + react-syntax-highlighter@15.5.0(react@18.3.1): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.29.0 - react: 18.2.0 + react: 18.3.1 refractor: 3.6.0 - react@18.2.0: + react@18.3.1: dependencies: loose-envify: 1.4.0 - reactflow@11.7.4(immer@9.0.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + reactflow@11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@reactflow/background': 11.2.4(immer@9.0.19)(react-dom@18.2.0(react@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))(react@18.2.0) - '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.2.0(react@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))(react@18.2.0) - '@reactflow/node-resizer': 2.1.1(immer@9.0.19)(react-dom@18.2.0(react@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))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@reactflow/background': 11.2.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@reactflow/controls': 11.1.15(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@reactflow/core': 11.7.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@reactflow/minimap': 11.5.4(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@reactflow/node-resizer': 2.1.1(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@reactflow/node-toolbar': 1.2.3(immer@9.0.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - immer @@ -15431,7 +15416,7 @@ snapshots: immutable: 4.3.5 source-map-js: 1.2.0 - scheduler@0.23.0: + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -15703,10 +15688,10 @@ snapshots: dependencies: inline-style-parser: 0.1.1 - styled-jsx@5.1.1(@babel/core@7.24.3)(react@18.2.0): + styled-jsx@5.1.1(@babel/core@7.24.3)(react@18.3.1): dependencies: client-only: 0.0.1 - react: 18.2.0 + react: 18.3.1 optionalDependencies: '@babel/core': 7.24.3 @@ -15788,6 +15773,8 @@ snapshots: through@2.3.8: {} + tiktoken@1.0.15: {} + timezones-list@3.0.2: {} tiny-invariant@1.3.3: {} @@ -16057,35 +16044,35 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.2(@types/react@18.2.0)(react@18.2.0): + use-callback-ref@1.3.2(@types/react@18.3.0)(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - use-context-selector@1.4.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(scheduler@0.23.0): + use-context-selector@1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(scheduler@0.23.2): dependencies: - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 optionalDependencies: - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) - use-memo-one@1.1.3(react@18.2.0): + use-memo-one@1.1.3(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 - use-sidecar@1.1.2(@types/react@18.2.0)(react@18.2.0): + use-sidecar@1.1.2(@types/react@18.3.0)(react@18.3.1): dependencies: detect-node-es: 1.1.0 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 optionalDependencies: - '@types/react': 18.2.0 + '@types/react': 18.3.0 - use-sync-external-store@1.2.0(react@18.2.0): + use-sync-external-store@1.2.0(react@18.3.1): dependencies: - react: 18.2.0 + react: 18.3.1 util-deprecate@1.0.2: {} @@ -16218,11 +16205,6 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.0: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 @@ -16424,8 +16406,6 @@ snapshots: - terser - typescript - zod@3.21.4: {} - zrender@5.4.1: dependencies: tslib: 2.3.0 @@ -16434,11 +16414,11 @@ snapshots: dependencies: tslib: 2.3.0 - zustand@4.3.5(immer@9.0.19)(react@18.2.0): + zustand@4.3.5(immer@9.0.19)(react@18.3.1): dependencies: - use-sync-external-store: 1.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: immer: 9.0.19 - react: 18.2.0 + react: 18.3.1 zwitch@2.0.4: {} diff --git a/project.inlang/project_id b/project.inlang/project_id deleted file mode 100644 index e7a4d2b389f9..000000000000 --- a/project.inlang/project_id +++ /dev/null @@ -1 +0,0 @@ -82dc3f099ca89165c3415d2ba96d195d3a1805b98373e8eb3d814b6994e62489 \ No newline at end of file diff --git a/project.inlang/settings.json b/project.inlang/settings.json deleted file mode 100644 index aff02ae447fe..000000000000 --- a/project.inlang/settings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://inlang.com/schema/project-settings", - "sourceLanguageTag": "en", - "languageTags": [ - "en", - "zh" - ], - "modules": [ - "https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@4/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@1/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-identical-pattern@1/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source@1/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation@1/dist/index.js" - ], - "plugin.inlang.i18next": { - "pathPattern": { - "common": "./projects/app/i18n/{languageTag}/common.json" - }, - "variableReferencePattern": [ - "{{", "}}" - ] - } -} \ No newline at end of file diff --git a/projects/app/.eslintrc.json b/projects/app/.eslintrc.json index 3a5d07f926c9..be661eb5c4df 100644 --- a/projects/app/.eslintrc.json +++ b/projects/app/.eslintrc.json @@ -1,12 +1,6 @@ - { - "parser": "@typescript-eslint/parser", // 确保使用了 TypeScript 解析器 - "plugins": ["@typescript-eslint"], // 引入 TypeScript 插件 - "extends": "next/core-web-vitals", "rules": { - "react-hooks/rules-of-hooks": 0, - "@typescript-eslint/consistent-type-imports": "warn" // 或者 "error" 来强制执行 - + "react-hooks/rules-of-hooks": 0 } } diff --git a/projects/app/data/config.json b/projects/app/data/config.json index 30ceebdb5b70..ecd8f51d165f 100644 --- a/projects/app/data/config.json +++ b/projects/app/data/config.json @@ -6,7 +6,8 @@ "openapiPrefix": "fastgpt", "vectorMaxProcess": 15, "qaMaxProcess": 15, - "pgHNSWEfSearch": 100 + "pgHNSWEfSearch": 100, + "tokenWorkers": 20 }, "llmModels": [ { @@ -82,7 +83,7 @@ "vectorModels": [ { "model": "text-embedding-3-large", - "name": "Embedding-2", + "name": "Embedding-3-large", "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 512, @@ -96,7 +97,7 @@ }, { "model": "text-embedding-3-small", - "name": "Embedding-2", + "name": "Embedding-3-small", "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 512, @@ -107,7 +108,7 @@ }, { "model": "text-embedding-ada-002", - "name": "Embedding-2", + "name": "text-embedding-ada-002", "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 512, diff --git a/projects/app/i18n/en/app.json b/projects/app/i18n/en/app.json index 7afdd666511b..22b8ab29208e 100644 --- a/projects/app/i18n/en/app.json +++ b/projects/app/i18n/en/app.json @@ -31,8 +31,15 @@ "To Chat": "Go to Chat", "To Settings": "View Details", "Variable Key Repeat Tip": "Variable key is duplicate", + "app": { + "modules": { + "click to update": "click to update", + "has new version": "has new version" + } + }, "module": { "Combine Modules": "Combine Modules", + "Confirm Sync": "Using the latest template will overwrite the existing one and may result in the loss of some previous configuration information. Please confirm.", "Custom Title Tip": "This title will be displayed during the conversation", "My Modules": "My Modules", "No Modules": "No modules yet~", diff --git a/projects/app/i18n/en/chat.json b/projects/app/i18n/en/chat.json new file mode 100644 index 000000000000..6f5f39b9d7b6 --- /dev/null +++ b/projects/app/i18n/en/chat.json @@ -0,0 +1,18 @@ +{ + "Chat input guide lexicon is empty": "The lexicon has not been configured", + "Config Texts": "Config thesaurus ", + "Config input guide lexicon": "Config", + "Config input guide lexicon title": "Config lexicon", + "Config question guide": "Configuration input Prompt ", + "Csv input lexicon tip": "Only CSV can be imported in batches. Click to download the template", + "Custom input guide url": "Custom lexicon url", + "Custom question guide URL": "Custom lexicon address ", + "Input Guide": "Intelligent Recommendation ", + "Input guide": "Input guide", + "Input guide lexicon": "Lexicon", + "Input guide tip": "You can configure some preset questions. When the user enters a question, the relevant question is retrieved from these preset questions for prompt.", + "Insert input guide, Some data already exists": "Duplicate data, automatically filtered, insert: {{len}} data", + "New input guide lexicon": "New lexicon", + "Only support CSV": "Only support CSV import, click download template ", + "Question Guide Texts": "Lexicon" +} diff --git a/projects/app/i18n/en/common.json b/projects/app/i18n/en/common.json index d64957be2ba1..83d525adbb90 100644 --- a/projects/app/i18n/en/common.json +++ b/projects/app/i18n/en/common.json @@ -1,11 +1,14 @@ { + "Add new": "Add new", "App": "App", "Export": "Export", "Folder": "Folder", + "Is open": "Opened", "Login": "Login", "Move": "Move", "Name": "Name", "New Create": "Create New", + "No data": "No data", "Rename": "Rename", "Running": "Running", "UnKnow": "Unknown", @@ -14,6 +17,7 @@ "Action": "Action", "Add": "Add", "Add New": "Add New", + "Add Success": "Add successfully", "All": "All", "Back": "Back", "Beta": "Beta", @@ -44,6 +48,7 @@ "Delete Tip": "Delete Tip", "Delete Warning": "Delete Warning", "Detail": "Detail", + "Documents": "Documents", "Done": "Done", "Edit": "Edit", "Exit": "Exit", @@ -92,6 +97,7 @@ "Rename Success": "Rename Success", "Request Error": "Request Error", "Require Input": "Required Input", + "Role": "Role", "Root folder": "Root folder", "Save": "Save", "Save Failed": "Save Failed", @@ -99,6 +105,7 @@ "Search": "Search", "Select File Failed": "Select File Failed", "Select One Folder": "Select a folder", + "Select all": "Select all", "Select template": "Select template", "Set Avatar": "Click to set avatar", "Set Name": "Set a name", @@ -509,18 +516,14 @@ "Choose Dataset": "Associate dataset", "Chunk amount": "Number of chunks", "Collection": "Dataset", - "Common Dataset": "Common dataset", - "Common Dataset Desc": "Can be built by importing files, web links, or manual entry", "Create dataset": "Create a dataset", "Dataset": "Dataset", "Dataset ID": "Dataset ID", "Dataset Type": "Dataset type", "Delete Confirm": "Confirm to delete this dataset? Data cannot be recovered after deletion, please confirm!", "Delete Website Tips": "Confirm to delete this site?", - "Empty Dataset": "", "Empty Dataset Tips": "No datasets yet, go create one!", "File collection": "File dataset", - "Folder Dataset": "Folder", "Folder placeholder": "This is a directory", "Go Dataset": "Go to dataset", "Intro Placeholder": "This dataset has no introduction~", @@ -540,8 +543,6 @@ "Table collection": "Table dataset", "Text collection": "Text dataset", "Total chunks": "Total chunks: {{total}}", - "Website Dataset": "Web site synchronization", - "Website Dataset Desc": "Web site synchronization allows you to use a web page link to build a dataset", "collection": { "Click top config website": "Click to configure website", "Collection name": "Dataset name", @@ -1178,6 +1179,7 @@ } }, "error": { + "Create failed": "Create failed", "fileNotFound": "File not found~", "team": { "overSize": "Team members exceed the limit" @@ -1568,7 +1570,7 @@ "Remove Member Failed": "Failed to remove team member", "Remove Member Success": "Successfully removed team member", "Remove Member Tip": "Remove from Team", - "Role": "Role", + "Role": "Role(Old)", "Select Team": "Select Team", "Set Name": "Name Your Team", "Switch Team Failed": "Failed to switch team", diff --git a/projects/app/i18n/en/dataset.json b/projects/app/i18n/en/dataset.json index 0c2bc01d815e..f1d74c263069 100644 --- a/projects/app/i18n/en/dataset.json +++ b/projects/app/i18n/en/dataset.json @@ -1,6 +1,19 @@ { - "Confirm to rebuild embedding tip": "Are you sure to switch the knowledge base index? Switching index is a very heavy operation that requires re-indexing all the data in your knowledge base, which may take a long time. Please ensure that the remaining points in your account are sufficient.", + "Collection tags": "Tags", + "Common Dataset": "Common dataset", + "Common Dataset Desc": "Can be built by importing files, web links, or manual entry", + "Confirm to rebuild embedding tip": "Are you sure to switch the knowledge base index?\nSwitching index is a very heavy operation that requires re-indexing all the data in your knowledge base, which may take a long time. Please ensure that the remaining points in your account are sufficient.\n\nIn addition, you need to be careful to modify the applications that select this knowledge base to avoid mixing them with other index model knowledge bases.", + "External file": "External file", + "External file Dataset Desc": "You can import files from an external file library to build a knowledge base. Files are not stored twice", + "External id": "File id", + "External read url": "External read url", + "External read url tip": "You can configure the reading address of your file library. This allows users to read and authenticate. You can currently use the {{fileId}} variable to refer to the external file ID.", + "External url": "File read url", + "Folder Dataset": "Folder", "Rebuild embedding start tip": "The task of switching index models has begun", "Rebuilding index count": "Rebuilding count: {{count}}", - "The knowledge base has indexes that are being trained or being rebuilt": "The knowledge base has indexes that are being trained or being rebuilt" + "The knowledge base has indexes that are being trained or being rebuilt": "The knowledge base has indexes that are being trained or being rebuilt", + "Website Dataset": "Web site", + "Website Dataset Desc": "Web site synchronization allows you to use a web page link to build a dataset", + "filename": "filename" } diff --git a/projects/app/i18n/en/file.json b/projects/app/i18n/en/file.json index 66f1fb2db78c..68b3d59ba822 100644 --- a/projects/app/i18n/en/file.json +++ b/projects/app/i18n/en/file.json @@ -1,4 +1,5 @@ { + "Click to view raw source": "View source", "Click to view file": "Click to view the original file", "Release the mouse to upload the file": "Release the mouse to upload the file", "upload error description": "Only supports uploading multiple files or one folder at a time", diff --git a/projects/app/i18n/en/user.json b/projects/app/i18n/en/user.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/projects/app/i18n/en/user.json @@ -0,0 +1 @@ +{} diff --git a/projects/app/i18n/en/workflow.json b/projects/app/i18n/en/workflow.json new file mode 100644 index 000000000000..41187fc5be99 --- /dev/null +++ b/projects/app/i18n/en/workflow.json @@ -0,0 +1,3 @@ +{ + "Field required": "Required" +} diff --git a/projects/app/i18n/zh/app.json b/projects/app/i18n/zh/app.json index 3c11a35e0d83..83c85cec359e 100644 --- a/projects/app/i18n/zh/app.json +++ b/projects/app/i18n/zh/app.json @@ -30,8 +30,15 @@ "To Chat": "前去对话", "To Settings": "查看详情", "Variable Key Repeat Tip": "变量 key 重复", + "app": { + "modules": { + "click to update": "点击更新", + "has new version": "有新版本" + } + }, "module": { "Combine Modules": "组合模块", + "Confirm Sync": "将会使用最新模板进行覆盖,可能会丢失一些旧的配置信息,请确认", "Custom Title Tip": "该标题名字会展示在对话过程中", "My Modules": "", "No Modules": "还没有模块~", diff --git a/projects/app/i18n/zh/chat.json b/projects/app/i18n/zh/chat.json new file mode 100644 index 000000000000..a49b7e501e7f --- /dev/null +++ b/projects/app/i18n/zh/chat.json @@ -0,0 +1,13 @@ +{ + "Chat input guide lexicon is empty": "还没有配置词库", + "Config input guide": "配置输入引导", + "Config input guide lexicon": "配置词库", + "Config input guide lexicon title": "配置词库", + "Csv input lexicon tip": "仅支持 CSV 批量导入,点击下载模板", + "Custom input guide url": "自定义词库地址", + "Input guide": "输入引导", + "Input guide lexicon": "词库", + "Input guide tip": "可以配置一些预设的问题。在用户输入问题时,会从这些预设问题中获取相关问题进行提示。", + "Insert input guide, Some data already exists": "有重复数据,已自动过滤,共插入: {{len}} 条数据", + "New input guide lexicon": "新词库" +} diff --git a/projects/app/i18n/zh/common.json b/projects/app/i18n/zh/common.json index c9da48a40f7c..477b621bd40b 100644 --- a/projects/app/i18n/zh/common.json +++ b/projects/app/i18n/zh/common.json @@ -1,11 +1,14 @@ { + "Add new": "新增", "App": "应用", "Export": "导出", "Folder": "文件夹", + "Is open": "是否开启", "Login": "登录", "Move": "移动", "Name": "名称", "New Create": "新建", + "No data": "暂无数据", "Rename": "重命名", "Running": "运行中", "UnKnow": "未知", @@ -14,6 +17,7 @@ "Action": "操作", "Add": "添加", "Add New": "新增", + "Add Success": "添加成功", "All": "全部", "Back": "返回", "Beta": "实验版", @@ -44,6 +48,7 @@ "Delete Tip": "删除提示", "Delete Warning": "删除警告", "Detail": "详情", + "Documents": "文档", "Done": "完成", "Edit": "编辑", "Exit": "退出", @@ -81,6 +86,7 @@ "Output": "输出", "Params": "参数", "Password inconsistency": "两次密码不一致", + "Permission": "权限", "Please Input Name": "请输入名称", "Price used": "金额消耗", "Read document": "查看文档", @@ -92,6 +98,7 @@ "Rename Success": "重命名成功", "Request Error": "请求异常", "Require Input": "必填", + "Role": "权限", "Root folder": "根目录", "Save": "保存", "Save Failed": "保存失败", @@ -99,6 +106,7 @@ "Search": "搜索", "Select File Failed": "选择文件异常", "Select One Folder": "选择一个目录", + "Select all": "全选", "Select template": "选择模板", "Set Avatar": "点击设置头像", "Set Name": "取个名字", @@ -509,8 +517,6 @@ "Choose Dataset": "关联知识库", "Chunk amount": "分段数", "Collection": "数据集", - "Common Dataset": "通用知识库", - "Common Dataset Desc": "可通过导入文件、网页链接或手动录入形式构建知识库", "Create dataset": "创建一个知识库", "Dataset": "知识库", "Dataset ID": "知识库 ID", @@ -520,7 +526,6 @@ "Empty Dataset": "", "Empty Dataset Tips": "还没有知识库,快去创建一个吧!", "File collection": "文件数据集", - "Folder Dataset": "文件夹", "Folder placeholder": "这是一个目录", "Go Dataset": "前往知识库", "Intro Placeholder": "这个知识库还没有介绍~", @@ -540,8 +545,6 @@ "Table collection": "表格数据集", "Text collection": "文本数据集", "Total chunks": "总分段: {{total}}", - "Website Dataset": "Web 站点同步", - "Website Dataset Desc": "Web 站点同步允许你直接使用一个网页链接构建知识库", "collection": { "Click top config website": "点击配置网站", "Collection name": "数据集名称", @@ -1184,6 +1187,7 @@ } }, "error": { + "Create failed": "创建失败", "fileNotFound": "文件找不到了~", "team": { "overSize": "团队成员超出上限" @@ -1574,7 +1578,7 @@ "Remove Member Failed": "移除团队成员异常", "Remove Member Success": "移除团队成员成功", "Remove Member Tip": "移出团队", - "Role": "身份", + "Role": "身份(旧版)", "Select Team": "团队选择", "Set Name": "给团队取个名字", "Switch Team Failed": "切换团队异常", diff --git a/projects/app/i18n/zh/dataset.json b/projects/app/i18n/zh/dataset.json index 4289048f7cba..1310648fce3a 100644 --- a/projects/app/i18n/zh/dataset.json +++ b/projects/app/i18n/zh/dataset.json @@ -1,6 +1,19 @@ { - "Confirm to rebuild embedding tip": "确认为知识库切换索引?\n切换索引是一个非常重量的操作,需要对您知识库内所有数据进行重新索引,时间可能较长,请确保账号内剩余积分充足。", + "Collection tags": "集合标签", + "Common Dataset": "通用知识库", + "Common Dataset Desc": "可通过导入文件、网页链接或手动录入形式构建知识库", + "Confirm to rebuild embedding tip": "确认为知识库切换索引?\n切换索引是一个非常重量的操作,需要对您知识库内所有数据进行重新索引,时间可能较长,请确保账号内剩余积分充足。\n\n此外,你还需要注意修改选择该知识库的应用,避免它们与其他索引模型知识库混用。", + "External File": "外部文件库", + "External file Dataset Desc": "可以从外部文件库导入文件构建知识库,文件不会进行二次存储", + "External id": "文件阅读ID", + "External read url": "外部预览地址", + "External read url tip": "可以配置你文件库的阅读地址。便于对用户进行阅读鉴权操作。目前可以使用 {{fileId}} 变量来指代外部文件ID。", + "External url": "文件访问URL", + "Folder Dataset": "文件夹", "Rebuild embedding start tip": "切换索引模型任务已开始", "Rebuilding index count": "重建中索引数量: {{count}}", - "The knowledge base has indexes that are being trained or being rebuilt": "知识库有训练中或正在重建的索引" + "The knowledge base has indexes that are being trained or being rebuilt": "知识库有训练中或正在重建的索引", + "Website Dataset": "Web 站点同步", + "Website Dataset Desc": "Web 站点同步允许你直接使用一个网页链接构建知识库", + "filename": "文件名" } diff --git a/projects/app/i18n/zh/file.json b/projects/app/i18n/zh/file.json index eb9aabcfd496..44b17e890bfa 100644 --- a/projects/app/i18n/zh/file.json +++ b/projects/app/i18n/zh/file.json @@ -1,4 +1,5 @@ { + "Click to view raw source": "点击查看来源", "Click to view file": "点击查看原始文件", "Release the mouse to upload the file": "松开鼠标上传文件", "upload error description": "单次只支持上传多个文件或者一个文件夹", diff --git a/projects/app/i18n/zh/user.json b/projects/app/i18n/zh/user.json new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/projects/app/i18n/zh/user.json @@ -0,0 +1 @@ +{} diff --git a/projects/app/i18n/zh/workflow.json b/projects/app/i18n/zh/workflow.json new file mode 100644 index 000000000000..ef72acbe2226 --- /dev/null +++ b/projects/app/i18n/zh/workflow.json @@ -0,0 +1,3 @@ +{ + "Field required": "必填" +} diff --git a/projects/app/next.config.js b/projects/app/next.config.js index 225d21ef9fce..a87dabb91051 100644 --- a/projects/app/next.config.js +++ b/projects/app/next.config.js @@ -36,6 +36,10 @@ const nextConfig = { unknownContextCritical: false }; + if (!config.externals) { + config.externals = []; + } + if (isServer) { config.externals.push('worker_threads'); @@ -73,19 +77,19 @@ const nextConfig = { fs: false } }; - if (!config.externals) { - config.externals = []; - } } + config.experiments = { + asyncWebAssembly: true, + layers: true + }; + return config; }, - transpilePackages: ['@fastgpt/*', 'ahooks', '@chakra-ui/*', 'react'], + transpilePackages: ['@fastgpt/*', 'ahooks'], experimental: { - // 外部包独立打包 + // 优化 Server Components 的构建和运行,避免不必要的客户端打包。 serverComponentsExternalPackages: ['mongoose', 'pg'], - // 指定导出包优化,按需引入包模块 - optimizePackageImports: ['mongoose', 'pg'], outputFileTracingRoot: path.join(__dirname, '../../') } }; diff --git a/projects/app/package.json b/projects/app/package.json index b9505dbbf363..6f0dc7f885b5 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "4.8", + "version": "4.8.1", "private": false, "scripts": { "dev": "next dev", @@ -42,13 +42,13 @@ "lodash": "^4.17.21", "mermaid": "^10.2.3", "nanoid": "^4.0.1", - "next": "13.5.2", + "next": "14.2.3", "next-i18next": "15.2.0", "nextjs-node-loader": "^1.1.5", "nprogress": "^0.2.0", - "react": "18.2.0", + "react": "18.3.1", "react-day-picker": "^8.7.1", - "react-dom": "18.2.0", + "react-dom": "18.3.1", "react-hook-form": "7.43.1", "react-i18next": "13.5.0", "react-markdown": "^8.0.7", @@ -71,12 +71,12 @@ "@types/jsonwebtoken": "^9.0.3", "@types/lodash": "^4.14.191", "@types/node": "^20.8.5", - "@types/react": "18.2.0", - "@types/react-dom": "18.2.0", + "@types/react": "18.3.0", + "@types/react-dom": "18.3.0", "@types/react-syntax-highlighter": "^15.5.6", "@types/request-ip": "^0.0.37", "eslint": "8.34.0", - "eslint-config-next": "13.1.6", + "eslint-config-next": "14.2.3", "nextjs-node-loader": "^1.1.5", "typescript": "4.9.5" } diff --git a/projects/app/public/imgs/app/inputGuide-icon.svg b/projects/app/public/imgs/app/inputGuide-icon.svg new file mode 100644 index 000000000000..beeb37276990 --- /dev/null +++ b/projects/app/public/imgs/app/inputGuide-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/projects/app/public/imgs/app/inputGuide.svg b/projects/app/public/imgs/app/inputGuide.svg new file mode 100644 index 000000000000..a3ff98069888 --- /dev/null +++ b/projects/app/public/imgs/app/inputGuide.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/app/public/imgs/app/nextQuestion-icon.svg b/projects/app/public/imgs/app/nextQuestion-icon.svg new file mode 100644 index 000000000000..846196f9fe71 --- /dev/null +++ b/projects/app/public/imgs/app/nextQuestion-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/projects/app/public/imgs/app/nextQuestion.svg b/projects/app/public/imgs/app/nextQuestion.svg new file mode 100644 index 000000000000..105e9ffe696c --- /dev/null +++ b/projects/app/public/imgs/app/nextQuestion.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/app/public/imgs/app/tts-icon.svg b/projects/app/public/imgs/app/tts-icon.svg new file mode 100644 index 000000000000..051eb673cf5d --- /dev/null +++ b/projects/app/public/imgs/app/tts-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/projects/app/public/imgs/app/tts.svg b/projects/app/public/imgs/app/tts.svg new file mode 100644 index 000000000000..b7c542f4edbc --- /dev/null +++ b/projects/app/public/imgs/app/tts.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/projects/app/public/imgs/app/variable-icon.svg b/projects/app/public/imgs/app/variable-icon.svg new file mode 100644 index 000000000000..d50a5bdc69a0 --- /dev/null +++ b/projects/app/public/imgs/app/variable-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/projects/app/public/imgs/app/variable.svg b/projects/app/public/imgs/app/variable.svg new file mode 100644 index 000000000000..c8a3551bb304 --- /dev/null +++ b/projects/app/public/imgs/app/variable.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/app/public/imgs/app/welcome-icon.svg b/projects/app/public/imgs/app/welcome-icon.svg new file mode 100644 index 000000000000..b8fbf3f031dd --- /dev/null +++ b/projects/app/public/imgs/app/welcome-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/projects/app/public/imgs/app/welcome.svg b/projects/app/public/imgs/app/welcome.svg new file mode 100644 index 000000000000..8a9ddad7c78c --- /dev/null +++ b/projects/app/public/imgs/app/welcome.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/app/src/components/ChatBox/MessageInput.tsx b/projects/app/src/components/ChatBox/Input/ChatInput.tsx similarity index 94% rename from projects/app/src/components/ChatBox/MessageInput.tsx rename to projects/app/src/components/ChatBox/Input/ChatInput.tsx index 6a4195271a61..afcbbdef43a9 100644 --- a/projects/app/src/components/ChatBox/MessageInput.tsx +++ b/projects/app/src/components/ChatBox/Input/ChatInput.tsx @@ -1,9 +1,9 @@ import { useSpeech } from '@/web/common/hooks/useSpeech'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { Box, Flex, Image, Spinner, Textarea } from '@chakra-ui/react'; -import React, { useRef, useEffect, useCallback, useTransition } from 'react'; +import React, { useRef, useEffect, useCallback } from 'react'; import { useTranslation } from 'next-i18next'; -import MyTooltip from '../MyTooltip'; +import MyTooltip from '../../MyTooltip'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { compressImgFileAndUpload } from '@/web/common/file/controller'; @@ -12,13 +12,16 @@ import { ChatFileTypeEnum } from '@fastgpt/global/core/chat/constants'; import { addDays } from 'date-fns'; import { useRequest } from '@fastgpt/web/hooks/useRequest'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; -import { ChatBoxInputFormType, ChatBoxInputType, UserInputFileItemType } from './type'; -import { textareaMinH } from './constants'; +import { ChatBoxInputFormType, ChatBoxInputType, UserInputFileItemType } from '../type'; +import { textareaMinH } from '../constants'; import { UseFormReturn, useFieldArray } from 'react-hook-form'; -import { useChatProviderStore } from './Provider'; +import { useChatProviderStore } from '../Provider'; +import dynamic from 'next/dynamic'; const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 6); -const MessageInput = ({ +const InputGuideBox = dynamic(() => import('./InputGuideBox')); + +const ChatInput = ({ onSendMessage, onStop, TextareaDom, @@ -33,7 +36,7 @@ const MessageInput = ({ TextareaDom: React.MutableRefObject; resetInputVal: (val: ChatBoxInputType) => void; chatForm: UseFormReturn; - appId?: string; + appId: string; }) => { const { setValue, watch, control } = chatForm; const inputValue = watch('input'); @@ -48,8 +51,16 @@ const MessageInput = ({ name: 'files' }); - const { shareId, outLinkUid, teamId, teamToken, isChatting, whisperConfig, autoTTSResponse } = - useChatProviderStore(); + const { + shareId, + outLinkUid, + teamId, + teamToken, + isChatting, + whisperConfig, + autoTTSResponse, + chatInputGuide + } = useChatProviderStore(); const { isPc, whisperModel } = useSystemStore(); const canvasRef = useRef(null); const { t } = useTranslation(); @@ -144,9 +155,9 @@ const MessageInput = ({ ); /* on send */ - const handleSend = async () => { + const handleSend = async (val?: string) => { if (!canSendMessage) return; - const textareaValue = TextareaDom.current?.value || ''; + const textareaValue = val || TextareaDom.current?.value || ''; onSendMessage({ text: textareaValue.trim(), @@ -214,7 +225,7 @@ const MessageInput = ({ boxShadow={isSpeaking ? `0 0 10px rgba(54,111,255,0.4)` : `0 0 10px rgba(0,0,0,0.2)`} borderRadius={['none', 'md']} bg={'white'} - overflow={'hidden'} + overflow={'display'} {...(isPc ? { border: '1px solid', @@ -225,6 +236,20 @@ const MessageInput = ({ borderTopColor: 'rgba(0,0,0,0.15)' })} > + {/* Chat input guide box */} + {chatInputGuide.open && ( + { + setValue('input', e); + }} + onSend={(e) => { + handleSend(e); + }} + /> + )} + {/* translate loading */} void; + onSend: (text: string) => void; +}) { + const { t } = useTranslation(); + const { chatT } = useI18n(); + const { chatInputGuide } = useChatProviderStore(); + + const { data = [] } = useRequest2( + async () => { + if (!text) return []; + return await queryChatInputGuideList( + { + appId, + searchKey: text.slice(0, 50) + }, + chatInputGuide.customUrl ? chatInputGuide.customUrl : undefined + ); + }, + { + refreshDeps: [text], + throttleWait: 300 + } + ); + + const filterData = data.filter((item) => item !== text).slice(0, 5); + + return filterData.length ? ( + + + + {chatT('Input guide')} + + {data.map((item, index) => ( + onSelect(item)} + > + + + + + { + e.stopPropagation(); + onSend(item); + }} + /> + + + ))} + + ) : null; +} diff --git a/projects/app/src/components/ChatBox/Provider.tsx b/projects/app/src/components/ChatBox/Provider.tsx index fd9a8499d759..b6d9149003bf 100644 --- a/projects/app/src/components/ChatBox/Provider.tsx +++ b/projects/app/src/components/ChatBox/Provider.tsx @@ -2,17 +2,23 @@ import React, { useContext, createContext, useState, useMemo, useEffect, useCall import { useAudioPlay } from '@/web/common/utils/voice'; import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/index.d'; -import { splitGuideModule } from '@fastgpt/global/core/workflow/utils'; import { + AppChatConfigType, AppTTSConfigType, AppWhisperConfigType, + ChatInputGuideConfigType, VariableItemType } from '@fastgpt/global/core/app/type'; import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; +import { + defaultChatInputGuideConfig, + defaultTTSConfig, + defaultWhisperConfig +} from '@fastgpt/global/core/app/constants'; type useChatStoreType = OutLinkChatAuthProps & { welcomeText: string; - variableNodes: VariableItemType[]; + variableList: VariableItemType[]; questionGuide: boolean; ttsConfig: AppTTSConfigType; whisperConfig: AppWhisperConfigType; @@ -38,10 +44,11 @@ type useChatStoreType = OutLinkChatAuthProps & { chatHistories: ChatSiteItemType[]; setChatHistories: React.Dispatch>; isChatting: boolean; + chatInputGuide: ChatInputGuideConfigType; }; const StateContext = createContext({ welcomeText: '', - variableNodes: [], + variableList: [], questionGuide: false, ttsConfig: { type: 'none', @@ -87,11 +94,15 @@ const StateContext = createContext({ }, finishSegmentedAudio: function (): void { throw new Error('Function not implemented.'); + }, + chatInputGuide: { + open: false, + customUrl: '' } }); export type ChatProviderProps = OutLinkChatAuthProps & { - userGuideModule?: StoreNodeItemType; + chatConfig?: AppChatConfigType; // not chat test params chatId?: string; @@ -105,15 +116,19 @@ const Provider = ({ outLinkUid, teamId, teamToken, - userGuideModule, + chatConfig = {}, children }: ChatProviderProps) => { const [chatHistories, setChatHistories] = useState([]); - const { welcomeText, variableNodes, questionGuide, ttsConfig, whisperConfig } = useMemo( - () => splitGuideModule(userGuideModule), - [userGuideModule] - ); + const { + welcomeText = '', + variables = [], + questionGuide = false, + ttsConfig = defaultTTSConfig, + whisperConfig = defaultWhisperConfig, + chatInputGuide = defaultChatInputGuideConfig + } = useMemo(() => chatConfig, [chatConfig]); // segment audio const [audioPlayingChatId, setAudioPlayingChatId] = useState(); @@ -150,7 +165,7 @@ const Provider = ({ teamId, teamToken, welcomeText, - variableNodes, + variableList: variables, questionGuide, ttsConfig, whisperConfig, @@ -167,7 +182,8 @@ const Provider = ({ setAudioPlayingChatId, chatHistories, setChatHistories, - isChatting + isChatting, + chatInputGuide }; return {children}; diff --git a/projects/app/src/components/ChatBox/QuoteModal.tsx b/projects/app/src/components/ChatBox/QuoteModal.tsx index 4ad5ded0d39e..ed65203278fc 100644 --- a/projects/app/src/components/ChatBox/QuoteModal.tsx +++ b/projects/app/src/components/ChatBox/QuoteModal.tsx @@ -46,7 +46,7 @@ const QuoteModal = ({ title={ {metadata ? ( - + ) : ( <>{t('core.chat.Quote Amount', { amount: rawSearch.length })} )} diff --git a/projects/app/src/components/ChatBox/components/VariableInput.tsx b/projects/app/src/components/ChatBox/components/VariableInput.tsx index bb258709e102..e8477fbfdcc1 100644 --- a/projects/app/src/components/ChatBox/components/VariableInput.tsx +++ b/projects/app/src/components/ChatBox/components/VariableInput.tsx @@ -9,15 +9,16 @@ import { VariableInputEnum } from '@fastgpt/global/core/workflow/constants'; import MySelect from '@fastgpt/web/components/common/MySelect'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { ChatBoxInputFormType } from '../type.d'; +import { useRefresh } from '@fastgpt/web/hooks/useRefresh'; const VariableInput = ({ appAvatar, - variableNodes, + variableList, chatForm, onSubmitVariables }: { appAvatar?: string; - variableNodes: VariableItemType[]; + variableList: VariableItemType[]; onSubmitVariables: (e: Record) => void; chatForm: UseFormReturn; }) => { @@ -25,6 +26,7 @@ const VariableInput = ({ const { register, setValue, handleSubmit: handleSubmitChat, watch } = chatForm; const variables = watch('variables'); const chatStarted = watch('chatStarted'); + const { refresh } = useRefresh(); return ( @@ -40,7 +42,7 @@ const VariableInput = ({ bg={'white'} boxShadow={'0 0 8px rgba(0,0,0,0.15)'} > - {variableNodes.map((item) => ( + {variableList.map((item) => ( {item.label} @@ -86,6 +88,7 @@ const VariableInput = ({ })} value={variables[item.key]} onchange={(e) => { + refresh(); setValue(`variables.${item.key}`, e); }} /> diff --git a/projects/app/src/components/ChatBox/hooks/useChatBox.tsx b/projects/app/src/components/ChatBox/hooks/useChatBox.tsx index 31adb6a60cc3..10da0510534b 100644 --- a/projects/app/src/components/ChatBox/hooks/useChatBox.tsx +++ b/projects/app/src/components/ChatBox/hooks/useChatBox.tsx @@ -1,7 +1,7 @@ import { ExportChatType } from '@/types/chat'; import { ChatItemType } from '@fastgpt/global/core/chat/type'; import { useCallback } from 'react'; -import { htmlTemplate } from '@/constants/common'; +import { htmlTemplate } from '@/web/core/chat/constants'; import { fileDownload } from '@/web/common/file/utils'; export const useChatBox = () => { diff --git a/projects/app/src/components/ChatBox/index.tsx b/projects/app/src/components/ChatBox/index.tsx index 311e1a0012c7..c7bb456cba32 100644 --- a/projects/app/src/components/ChatBox/index.tsx +++ b/projects/app/src/components/ChatBox/index.tsx @@ -21,7 +21,6 @@ import { getErrText } from '@fastgpt/global/common/error/utils'; import { Box, Flex, Checkbox } from '@chakra-ui/react'; import { EventNameEnum, eventBus } from '@/web/common/utils/eventbus'; import { chats2GPTMessages } from '@fastgpt/global/core/chat/adapt'; -import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/index.d'; import { VariableInputEnum } from '@fastgpt/global/core/workflow/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; import { useForm } from 'react-hook-form'; @@ -45,7 +44,7 @@ import type { ChatBoxInputType, ChatBoxInputFormType } from './type.d'; -import MessageInput from './MessageInput'; +import ChatInput from './Input/ChatInput'; import ChatBoxDivider from '../core/chat/Divider'; import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat'; import { getNanoid } from '@fastgpt/global/common/string/tools'; @@ -58,7 +57,9 @@ import ChatProvider, { useChatProviderStore } from './Provider'; import ChatItem from './components/ChatItem'; import dynamic from 'next/dynamic'; -import { useCreation, useUpdateEffect } from 'ahooks'; +import { useCreation } from 'ahooks'; +import { AppChatConfigType } from '@fastgpt/global/core/app/type'; +import type { StreamResponseType } from '@/web/common/api/fetch'; const ResponseTags = dynamic(() => import('./ResponseTags')); const FeedbackModal = dynamic(() => import('./FeedbackModal')); @@ -81,7 +82,7 @@ type Props = OutLinkChatAuthProps & { showEmptyIntro?: boolean; appAvatar?: string; userAvatar?: string; - userGuideModule?: StoreNodeItemType; + chatConfig?: AppChatConfigType; showFileSelector?: boolean; active?: boolean; // can use appId: string; @@ -90,12 +91,11 @@ type Props = OutLinkChatAuthProps & { chatId?: string; onUpdateVariable?: (e: Record) => void; - onStartChat?: (e: StartChatFnProps) => Promise<{ - responseText: string; - [DispatchNodeResponseKeyEnum.nodeResponse]: ChatHistoryItemResType[]; - newVariables?: Record; - isNewChat?: boolean; - }>; + onStartChat?: (e: StartChatFnProps) => Promise< + StreamResponseType & { + isNewChat?: boolean; + } + >; onDelMessage?: (e: { contentId: string }) => void; }; @@ -149,7 +149,7 @@ const ChatBox = ( const { welcomeText, - variableNodes, + variableList, questionGuide, startSegmentedAudio, finishSegmentedAudio, @@ -174,8 +174,8 @@ const ChatBox = ( /* variable */ const filterVariableNodes = useCreation( - () => variableNodes.filter((item) => item.type !== VariableInputEnum.custom), - [variableNodes] + () => variableList.filter((item) => item.type !== VariableInputEnum.custom), + [variableList] ); // 滚动到底部 @@ -207,7 +207,8 @@ const ChatBox = ( status, name, tool, - autoTTSResponse + autoTTSResponse, + variables }: generatingMessageProps & { autoTTSResponse?: boolean }) => { setChatHistories((state) => state.map((item, index) => { @@ -290,6 +291,8 @@ const ChatBox = ( return val; }) }; + } else if (event === SseResponseEventEnum.updateVariables && variables) { + setValue('variables', variables); } return item; @@ -297,7 +300,7 @@ const ChatBox = ( ); generatingScroll(); }, - [generatingScroll, setChatHistories, splitText2Audio] + [generatingScroll, setChatHistories, setValue, splitText2Audio] ); // 重置输入内容 @@ -390,9 +393,9 @@ const ChatBox = ( return; } - // delete invalid variables, 只保留在 variableNodes 中的变量 + // delete invalid variables, 只保留在 variableList 中的变量 const requestVariables: Record = {}; - variableNodes?.forEach((item) => { + variableList?.forEach((item) => { requestVariables[item.key] = variables[item.key] || ''; }); @@ -466,7 +469,6 @@ const ChatBox = ( const { responseData, responseText, - newVariables, isNewChat = false } = await onStartChat({ chatList: newChatList, @@ -476,8 +478,6 @@ const ChatBox = ( variables: requestVariables }); - newVariables && setValue('variables', newVariables); - isNewChatReplace.current = isNewChat; // set finish status @@ -561,12 +561,11 @@ const ChatBox = ( resetInputVal, setAudioPlayingChatId, setChatHistories, - setValue, splitText2Audio, startSegmentedAudio, t, toast, - variableNodes + variableList ] ); @@ -696,7 +695,7 @@ const ChatBox = ( } catch (error) {} }; }, - [appId, chatId, feedbackType, outLinkUid, shareId, teamId, teamToken] + [appId, chatId, feedbackType, outLinkUid, setChatHistories, shareId, teamId, teamToken] ); const onCloseUserLike = useCallback( (chat: ChatSiteItemType) => { @@ -907,7 +906,7 @@ const ChatBox = ( {!!filterVariableNodes?.length && ( { setValue('chatStarted', true); @@ -1000,7 +999,7 @@ const ChatBox = ( {/* message input */} {onStartChat && (chatStarted || filterVariableNodes.length === 0) && active && ( - chatController.current?.abort('stop')} TextareaDom={TextareaDom} diff --git a/projects/app/src/components/ChatBox/type.d.ts b/projects/app/src/components/ChatBox/type.d.ts index 1422569821b8..61fcf2b90387 100644 --- a/projects/app/src/components/ChatBox/type.d.ts +++ b/projects/app/src/components/ChatBox/type.d.ts @@ -8,11 +8,12 @@ import { import { SseResponseEventEnum } from '@fastgpt/global/core/workflow/runtime/constants'; export type generatingMessageProps = { - event: `${SseResponseEventEnum}`; + event: SseResponseEventEnum; text?: string; name?: string; status?: 'running' | 'finish'; tool?: ToolModuleResponseItemType; + variables?: Record; }; export type UserInputFileItemType = { diff --git a/projects/app/src/components/Layout/index.tsx b/projects/app/src/components/Layout/index.tsx index 75b81a438622..3959fd596be3 100644 --- a/projects/app/src/components/Layout/index.tsx +++ b/projects/app/src/components/Layout/index.tsx @@ -13,10 +13,19 @@ import Auth from './auth'; const Navbar = dynamic(() => import('./navbar')); const NavbarPhone = dynamic(() => import('./navbarPhone')); -const UpdateInviteModal = dynamic(() => import('@/components/support/user/team/UpdateInviteModal')); -const NotSufficientModal = dynamic(() => import('@/components/support/wallet/NotSufficientModal')); -const SystemMsgModal = dynamic(() => import('@/components/support/user/inform/SystemMsgModal')); -const ImportantInform = dynamic(() => import('@/components/support/user/inform/ImportantInform')); +const UpdateInviteModal = dynamic( + () => import('@/components/support/user/team/UpdateInviteModal'), + { ssr: false } +); +const NotSufficientModal = dynamic(() => import('@/components/support/wallet/NotSufficientModal'), { + ssr: false +}); +const SystemMsgModal = dynamic(() => import('@/components/support/user/inform/SystemMsgModal'), { + ssr: false +}); +const ImportantInform = dynamic(() => import('@/components/support/user/inform/ImportantInform'), { + ssr: false +}); const pcUnShowLayoutRoute: Record = { '/': true, @@ -114,12 +123,17 @@ const Layout = ({ children }: { children: JSX.Element }) => { )} - {!!userInfo && } - {isNotSufficientModal && !isHideNavbar && } - {!!userInfo && } - {!!userInfo && importantInforms.length > 0 && ( - + {feConfigs?.isPlus && ( + <> + {!!userInfo && } + {isNotSufficientModal && !isHideNavbar && } + {!!userInfo && } + {!!userInfo && importantInforms.length > 0 && ( + + )} + )} + ); diff --git a/projects/app/src/components/Markdown/index.tsx b/projects/app/src/components/Markdown/index.tsx index 71516fbc5d24..7f809755bd0b 100644 --- a/projects/app/src/components/Markdown/index.tsx +++ b/projects/app/src/components/Markdown/index.tsx @@ -14,7 +14,6 @@ import MyTooltip from '../MyTooltip'; import { useTranslation } from 'next-i18next'; import { EventNameEnum, eventBus } from '@/web/common/utils/eventbus'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import { getFileAndOpen } from '@/web/core/dataset/utils'; import { MARKDOWN_QUOTE_SIGN } from '@fastgpt/global/core/chat/constants'; const CodeLight = dynamic(() => import('./CodeLight'), { ssr: false }); @@ -132,7 +131,7 @@ const A = React.memo(function A({ children, ...props }: any) { ); } - // quote link + // quote link(未使用) if (children?.length === 1 && typeof children?.[0] === 'string') { const text = String(children); if (text === MARKDOWN_QUOTE_SIGN && props.href) { @@ -147,7 +146,7 @@ const A = React.memo(function A({ children, ...props }: any) { _hover={{ color: 'primary.700' }} - onClick={() => getFileAndOpen(props.href)} + // onClick={() => getCollectionSourceAndOpen(props.href)} /> ); diff --git a/projects/app/src/components/MyInput/index.tsx b/projects/app/src/components/MyInput/index.tsx index 5b52fb4cef66..46d83e7e57f9 100644 --- a/projects/app/src/components/MyInput/index.tsx +++ b/projects/app/src/components/MyInput/index.tsx @@ -3,24 +3,28 @@ import { Flex, Input, InputProps } from '@chakra-ui/react'; interface Props extends InputProps { leftIcon?: React.ReactNode; + rightIcon?: React.ReactNode; } -const MyInput = ({ leftIcon, ...props }: Props) => { +const MyInput = ({ leftIcon, rightIcon, ...props }: Props) => { return ( - - + + {leftIcon && ( - + {leftIcon} )} + {rightIcon && ( + + {rightIcon} + + )} ); }; diff --git a/projects/app/src/components/common/NextHead/index.tsx b/projects/app/src/components/common/NextHead/index.tsx new file mode 100644 index 000000000000..a3f529bc0f1c --- /dev/null +++ b/projects/app/src/components/common/NextHead/index.tsx @@ -0,0 +1,14 @@ +import Head from 'next/head'; +import React from 'react'; + +const NextHead = ({ title, icon, desc }: { title?: string; icon?: string; desc?: string }) => { + return ( + + {title} + {desc && } + {icon && } + + ); +}; + +export default NextHead; diff --git a/projects/app/src/components/common/Rowtabs/index.tsx b/projects/app/src/components/common/Rowtabs/index.tsx new file mode 100644 index 000000000000..c4be6631e4b7 --- /dev/null +++ b/projects/app/src/components/common/Rowtabs/index.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { Flex, Box, BoxProps, border } from '@chakra-ui/react'; +import MyIcon from '@fastgpt/web/components/common/Icon'; + +type Props = BoxProps & { + list: { + icon?: string; + label: string | React.ReactNode; + value: string; + }[]; + value: string; + onChange: (e: string) => void; +}; + +const RowTabs = ({ list, value, onChange, py = '7px', px = '12px', ...props }: Props) => { + return ( + + {list.map((item) => ( + onChange(item.value) + })} + > + {item.icon && } + {item.label} + + ))} + + ); +}; + +export default RowTabs; diff --git a/projects/app/src/components/core/app/DatasetSelectModal.tsx b/projects/app/src/components/core/app/DatasetSelectModal.tsx index 983b4f8cf347..ebe00353b150 100644 --- a/projects/app/src/components/core/app/DatasetSelectModal.tsx +++ b/projects/app/src/components/core/app/DatasetSelectModal.tsx @@ -96,7 +96,7 @@ export const DatasetSelectModal = ({ _hover={{ color: 'red.500' }} onClick={() => { setSelectedDatasets((state) => - state.filter((kb) => kb.datasetId !== item._id) + state.filter((dataset) => dataset.datasetId !== item._id) ); }} /> @@ -141,7 +141,9 @@ export const DatasetSelectModal = ({ if (item.type === DatasetTypeEnum.folder) { setParentId(item._id); } else { - const vectorModel = selectedDatasets[0]?.vectorModel?.model; + const vectorModel = datasets.find( + (dataset) => dataset._id === selectedDatasets[0]?.datasetId + )?.vectorModel?.model; if (vectorModel && vectorModel !== item.vectorModel.model) { return toast({ @@ -149,10 +151,7 @@ export const DatasetSelectModal = ({ title: t('dataset.Select Dataset Tips') }); } - setSelectedDatasets((state) => [ - ...state, - { datasetId: item._id, vectorModel: item.vectorModel } - ]); + setSelectedDatasets((state) => [...state, { datasetId: item._id }]); } }} > diff --git a/projects/app/src/components/core/app/InputGuideConfig.tsx b/projects/app/src/components/core/app/InputGuideConfig.tsx new file mode 100644 index 000000000000..b84ba7e99382 --- /dev/null +++ b/projects/app/src/components/core/app/InputGuideConfig.tsx @@ -0,0 +1,483 @@ +import MyIcon from '@fastgpt/web/components/common/Icon'; +import MyTooltip from '@/components/MyTooltip'; +import { + Box, + Button, + Flex, + ModalBody, + useDisclosure, + Switch, + Textarea, + Checkbox, + HStack +} from '@chakra-ui/react'; +import React, { useMemo, useState } from 'react'; +import { useTranslation } from 'next-i18next'; +import type { ChatInputGuideConfigType } from '@fastgpt/global/core/app/type.d'; +import MyModal from '@fastgpt/web/components/common/MyModal'; +import MyInput from '@/components/MyInput'; +import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; +import { useI18n } from '@/web/context/I18n'; +import { fileDownload } from '@/web/common/file/utils'; +import { getDocPath } from '@/web/common/system/doc'; +import { + delChatInputGuide, + getChatInputGuideList, + getCountChatInputGuideTotal, + postChatInputGuides, + putChatInputGuide +} from '@/web/core/chat/inputGuide/api'; +import { useQuery } from '@tanstack/react-query'; +import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; +import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; +import { useToast } from '@fastgpt/web/hooks/useToast'; +import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; +import { readCsvRawText } from '@fastgpt/web/common/file/utils'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; +import { useRequest } from 'ahooks'; +import HighlightText from '@fastgpt/web/components/common/String/HighlightText'; +import { defaultChatInputGuideConfig } from '@fastgpt/global/core/app/constants'; +import ChatFunctionTip from './Tip'; + +const csvTemplate = `"第一列内容" +"只会将第一列内容导入,其余列会被忽略" +"AIGC发展分为几个阶段?"`; + +const InputGuideConfig = ({ + appId, + value = defaultChatInputGuideConfig, + onChange +}: { + appId: string; + value?: ChatInputGuideConfigType; + onChange: (e: ChatInputGuideConfigType) => void; +}) => { + const { t } = useTranslation(); + const { chatT, commonT } = useI18n(); + const { isOpen, onOpen, onClose } = useDisclosure(); + const { + isOpen: isOpenLexiconConfig, + onOpen: onOpenLexiconConfig, + onClose: onCloseLexiconConfig + } = useDisclosure(); + const isOpenQuestionGuide = value.open; + + const { data } = useQuery( + [appId, isOpenLexiconConfig], + () => { + return getCountChatInputGuideTotal({ + appId + }); + }, + { + enabled: !!appId + } + ); + const total = data?.total || 0; + + const formLabel = useMemo(() => { + if (!isOpenQuestionGuide) { + return t('core.app.whisper.Close'); + } + return t('core.app.whisper.Open'); + }, [t, isOpenQuestionGuide]); + + return ( + + + + {chatT('Input guide')} + + + + + + + + + + {t('Is open')} + { + onChange({ + ...value, + open: e.target.checked + }); + }} + /> + + {isOpenQuestionGuide && ( + <> + + {chatT('Input guide lexicon')} + + {total} + + + + + <> + + {chatT('Custom input guide url')} + window.open(getDocPath('/docs/course/chat_input_guide'))} + color={'primary.700'} + alignItems={'center'} + cursor={'pointer'} + > + + {commonT('common.Documents')} + + + +