mirror of
https://github.com/Yidadaa/ChatGPT-Next-Web.git
synced 2025-09-08 21:42:49 +08:00
Compare commits
115 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7748a980f9 | ||
|
b044e274aa | ||
|
6c3d4a11cc | ||
|
98afd5516b | ||
|
ea6926cad3 | ||
|
3298961748 | ||
|
0140f771c6 | ||
|
64c4f512ce | ||
|
5b1d45c1a9 | ||
|
efbd1c15a9 | ||
|
bce74890dc | ||
|
eb93a43d13 | ||
|
1dd75b63de | ||
|
6caf79121b | ||
|
5cdd34a388 | ||
|
38c8ee8cd2 | ||
|
d5c33a1183 | ||
|
058e28911a | ||
|
25a3bb351d | ||
|
1607640bed | ||
|
5f0cda829f | ||
|
b003a374b8 | ||
|
5f7c262759 | ||
|
f3ab6b27c9 | ||
|
d62eb56886 | ||
|
c2724c6aad | ||
|
0cde1683b6 | ||
|
128f596f93 | ||
|
27fae8eed0 | ||
|
82ec4474c2 | ||
|
0d85dae239 | ||
|
7893693706 | ||
|
25ce6af36e | ||
|
c0269254e8 | ||
|
2f2aefd48e | ||
|
c05de45d99 | ||
|
8f66da1128 | ||
|
b5eaa8272b | ||
|
7ee062e1de | ||
|
8915af9b6d | ||
|
ae1ef3215b | ||
|
5d06fa217c | ||
|
50b1f7db12 | ||
|
fb82806956 | ||
|
0658a93962 | ||
|
f33be37070 | ||
|
9278d7f851 | ||
|
35ba898c97 | ||
|
15f8d13d81 | ||
|
946e508e8f | ||
|
35b4125b98 | ||
|
91d8f9d73e | ||
|
c636993989 | ||
|
65a24c16bc | ||
|
15ce114440 | ||
|
1722f75dcb | ||
|
be597a551d | ||
|
56bc945335 | ||
|
fa9ceb5875 | ||
|
0ccf5a16c7 | ||
|
93c666b03d | ||
|
d5c28b506c | ||
|
3318f01aa1 | ||
|
1641019091 | ||
|
3572969866 | ||
|
ad1fe8762b | ||
|
c9c3e32a78 | ||
|
f4c99c9cf7 | ||
|
57447c24c8 | ||
|
514ed03378 | ||
|
078b039cf1 | ||
|
a120670785 | ||
|
9c05d136f5 | ||
|
daeb8a67a3 | ||
|
c64888cccd | ||
|
6fc2637870 | ||
|
fc4df23075 | ||
|
3ae502986b | ||
|
67f23d202a | ||
|
3c38b9c93b | ||
|
152a00baf5 | ||
|
405d02023c | ||
|
4ba2d0d7e0 | ||
|
38ce230cf5 | ||
|
c6696313bf | ||
|
89717c9b15 | ||
|
3aca699ad9 | ||
|
f3ec9f02eb | ||
|
1c7f3e6057 | ||
|
db63a5a670 | ||
|
0a2cccfd6e | ||
|
113bd24796 | ||
|
374a27a72e | ||
|
567eff9ef4 | ||
|
bfe33af03d | ||
|
7ebc5eb70f | ||
|
52287fd01d | ||
|
e0f2bc2725 | ||
|
4355ec3b44 | ||
|
0c2f11ffd7 | ||
|
65e2f38fac | ||
|
aeaefbf8a9 | ||
|
719cb3ae05 | ||
|
08816c8f7d | ||
|
1031203e3f | ||
|
63ef6e7d3d | ||
|
590c9bb978 | ||
|
5055a8c7a3 | ||
|
284c3f27e7 | ||
|
468f198a6b | ||
|
b0c6f6d4d3 | ||
|
473061b4d5 | ||
|
72cbb156ae | ||
|
5a10b2a75f | ||
|
72b553efe8 |
@@ -27,3 +27,8 @@ HIDE_USER_API_KEY=
|
|||||||
# Default: Empty
|
# Default: Empty
|
||||||
# If you do not want users to use GPT-4, set this value to 1.
|
# If you do not want users to use GPT-4, set this value to 1.
|
||||||
DISABLE_GPT4=
|
DISABLE_GPT4=
|
||||||
|
|
||||||
|
# (optional)
|
||||||
|
# Default: Empty
|
||||||
|
# If you do not want users to query balance, set this value to 1.
|
||||||
|
HIDE_BALANCE_QUERY=
|
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "npm" # See documentation for possible values
|
||||||
|
directory: "/" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
1
.github/workflows/app.yml
vendored
1
.github/workflows/app.yml
vendored
@@ -61,6 +61,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
||||||
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
with:
|
with:
|
||||||
releaseId: ${{ needs.create-release.outputs.release_id }}
|
releaseId: ${{ needs.create-release.outputs.release_id }}
|
||||||
|
|
||||||
|
15
.github/workflows/issue-translator.yml
vendored
Normal file
15
.github/workflows/issue-translator.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: Issue Translator
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: usthe/issues-translate-action@v2.7
|
||||||
|
with:
|
||||||
|
IS_MODIFY_TITLE: false
|
||||||
|
CUSTOM_BOT_NOTE: Bot detected the issue body's language is not English, translate it automatically.
|
59
README.md
59
README.md
@@ -5,13 +5,25 @@
|
|||||||
|
|
||||||
English / [简体中文](./README_CN.md)
|
English / [简体中文](./README_CN.md)
|
||||||
|
|
||||||
One-Click to deploy well-designed ChatGPT web UI on Vercel.
|
One-Click to get well-designed cross-platform ChatGPT web UI.
|
||||||
|
|
||||||
一键免费部署你的私人 ChatGPT 网页应用。
|
一键免费部署你的跨平台私人 ChatGPT 应用。
|
||||||
|
|
||||||
[Demo](https://chatgpt.nextweb.fun/) / [Issues](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [Buy Me a Coffee](https://www.buymeacoffee.com/yidadaa)
|
[![Web][Web-image]][web-url]
|
||||||
|
[![Windows][Windows-image]][download-url]
|
||||||
|
[![MacOS][MacOS-image]][download-url]
|
||||||
|
[![Linux][Linux-image]][download-url]
|
||||||
|
|
||||||
[演示](https://chatgpt.nextweb.fun/) / [反馈](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [QQ 群](https://github.com/Yidadaa/ChatGPT-Next-Web/discussions/1724) / [打赏开发者](https://user-images.githubusercontent.com/16968934/227772541-5bcd52d8-61b7-488c-a203-0330d8006e2b.jpg)
|
[Web App](https://chatgpt.nextweb.fun/) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Issues](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [Buy Me a Coffee](https://www.buymeacoffee.com/yidadaa)
|
||||||
|
|
||||||
|
[网页版](https://chatgpt.nextweb.fun/) / [客户端](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [反馈](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [QQ 群](https://github.com/Yidadaa/ChatGPT-Next-Web/discussions/1724) / [打赏开发者](https://user-images.githubusercontent.com/16968934/227772541-5bcd52d8-61b7-488c-a203-0330d8006e2b.jpg)
|
||||||
|
|
||||||
|
[web-url]: https://chatgpt.nextweb.fun
|
||||||
|
[download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases
|
||||||
|
[Web-image]: https://img.shields.io/badge/Web-PWA-orange?logo=microsoftedge
|
||||||
|
[Windows-image]: https://img.shields.io/badge/-Windows-blue?logo=windows
|
||||||
|
[MacOS-image]: https://img.shields.io/badge/-MacOS-black?logo=apple
|
||||||
|
[Linux-image]: https://img.shields.io/badge/-Linux-333?logo=ubuntu
|
||||||
|
|
||||||
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web)
|
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FYidadaa%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=chatgpt-next-web&repository-name=ChatGPT-Next-Web)
|
||||||
|
|
||||||
@@ -24,6 +36,8 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel.
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Deploy for free with one-click** on Vercel in under 1 minute
|
- **Deploy for free with one-click** on Vercel in under 1 minute
|
||||||
|
- Compact client (~5MB) on Linux/Windows/MacOS, [download it now](https://github.com/Yidadaa/ChatGPT-Next-Web/releases)
|
||||||
|
- Fully compatible with self-deployed llms, recommended for use with [RWKV-Runner](https://github.com/josStorer/RWKV-Runner) or [LocalAI](https://github.com/go-skynet/LocalAI)
|
||||||
- Privacy first, all data stored locally in the browser
|
- Privacy first, all data stored locally in the browser
|
||||||
- Markdown support: LaTex, mermaid, code highlight, etc.
|
- Markdown support: LaTex, mermaid, code highlight, etc.
|
||||||
- Responsive design, dark mode and PWA
|
- Responsive design, dark mode and PWA
|
||||||
@@ -39,23 +53,20 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel.
|
|||||||
- [x] User Prompt: user can edit and save custom prompts to prompt list
|
- [x] User Prompt: user can edit and save custom prompts to prompt list
|
||||||
- [x] Prompt Template: create a new chat with pre-defined in-context prompts [#993](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/993)
|
- [x] Prompt Template: create a new chat with pre-defined in-context prompts [#993](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/993)
|
||||||
- [x] Share as image, share to ShareGPT [#1741](https://github.com/Yidadaa/ChatGPT-Next-Web/pull/1741)
|
- [x] Share as image, share to ShareGPT [#1741](https://github.com/Yidadaa/ChatGPT-Next-Web/pull/1741)
|
||||||
- [ ] Desktop App with tauri
|
- [x] Desktop App with tauri
|
||||||
- [ ] Self-host Model: support llama, alpaca, ChatGLM, BELLE etc.
|
- [x] Self-host Model: Fully compatible with [RWKV-Runner](https://github.com/josStorer/RWKV-Runner), as well as server deployment of [LocalAI](https://github.com/go-skynet/LocalAI): llama/gpt4all/rwkv/vicuna/koala/gpt4all-j/cerebras/falcon/dolly etc.
|
||||||
- [ ] Plugins: support network search, calculator, any other apis etc. [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165)
|
- [ ] Plugins: support network search, calculator, any other apis etc. [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165)
|
||||||
|
|
||||||
### Not in Plan
|
|
||||||
|
|
||||||
- User login, accounts, cloud sync
|
|
||||||
- UI text customize
|
|
||||||
|
|
||||||
## What's New
|
## What's New
|
||||||
|
|
||||||
- 🚀 v2.0 is released, now you can create prompt templates, turn your ideas into reality! Read this: [ChatGPT Prompt Engineering Tips: Zero, One and Few Shot Prompting](https://www.allabtai.com/prompt-engineering-tips-zero-one-and-few-shot-prompting/).
|
- 🚀 v2.0 is released, now you can create prompt templates, turn your ideas into reality! Read this: [ChatGPT Prompt Engineering Tips: Zero, One and Few Shot Prompting](https://www.allabtai.com/prompt-engineering-tips-zero-one-and-few-shot-prompting/).
|
||||||
- 🚀 v2.7 let's share conversations as image, or share to ShareGPT!
|
- 🚀 v2.7 let's share conversations as image, or share to ShareGPT!
|
||||||
|
- 🚀 v2.8 now we have a client that runs across all platforms!
|
||||||
|
|
||||||
## 主要功能
|
## 主要功能
|
||||||
|
|
||||||
- 在 1 分钟内使用 Vercel **免费一键部署**
|
- 在 1 分钟内使用 Vercel **免费一键部署**
|
||||||
|
- 提供体积极小(~5MB)的跨平台客户端(Linux/Windows/MacOS), [下载地址](https://github.com/Yidadaa/ChatGPT-Next-Web/releases)
|
||||||
- 完整的 Markdown 支持:LaTex 公式、Mermaid 流程图、代码高亮等等
|
- 完整的 Markdown 支持:LaTex 公式、Mermaid 流程图、代码高亮等等
|
||||||
- 精心设计的 UI,响应式设计,支持深色模式,支持 PWA
|
- 精心设计的 UI,响应式设计,支持深色模式,支持 PWA
|
||||||
- 极快的首屏加载速度(~100kb),支持流式响应
|
- 极快的首屏加载速度(~100kb),支持流式响应
|
||||||
@@ -72,20 +83,16 @@ One-Click to deploy well-designed ChatGPT web UI on Vercel.
|
|||||||
- [x] 允许用户自行编辑内置 Prompt 列表
|
- [x] 允许用户自行编辑内置 Prompt 列表
|
||||||
- [x] 预制角色:使用预制角色快速定制新对话 [#993](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/993)
|
- [x] 预制角色:使用预制角色快速定制新对话 [#993](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/993)
|
||||||
- [x] 分享为图片,分享到 ShareGPT 链接 [#1741](https://github.com/Yidadaa/ChatGPT-Next-Web/pull/1741)
|
- [x] 分享为图片,分享到 ShareGPT 链接 [#1741](https://github.com/Yidadaa/ChatGPT-Next-Web/pull/1741)
|
||||||
- [ ] 使用 tauri 打包桌面应用
|
- [x] 使用 tauri 打包桌面应用
|
||||||
- [ ] 支持自部署的大语言模型
|
- [x] 支持自部署的大语言模型:开箱即用 [RWKV-Runner](https://github.com/josStorer/RWKV-Runner) ,服务端部署 [LocalAI 项目](https://github.com/go-skynet/LocalAI) llama / gpt4all / rwkv / vicuna / koala / gpt4all-j / cerebras / falcon / dolly 等等
|
||||||
- [ ] 插件机制,支持联网搜索、计算器、调用其他平台 api [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165)
|
- [ ] 插件机制,支持联网搜索、计算器、调用其他平台 api [#165](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/165)
|
||||||
|
|
||||||
### 不会开发的功能
|
|
||||||
|
|
||||||
- 界面文字自定义
|
|
||||||
- 用户登录、账号管理、消息云同步
|
|
||||||
|
|
||||||
## 最新动态
|
## 最新动态
|
||||||
|
|
||||||
- 🚀 v2.0 已经发布,现在你可以使用面具功能快速创建预制对话了! 了解更多: [ChatGPT 提示词高阶技能:零次、一次和少样本提示](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/138)。
|
- 🚀 v2.0 已经发布,现在你可以使用面具功能快速创建预制对话了! 了解更多: [ChatGPT 提示词高阶技能:零次、一次和少样本提示](https://github.com/Yidadaa/ChatGPT-Next-Web/issues/138)。
|
||||||
- 💡 想要更方便地随时随地使用本项目?可以试下这款桌面插件:https://github.com/mushan0x0/AI0x0.com
|
- 💡 想要更方便地随时随地使用本项目?可以试下这款桌面插件:https://github.com/mushan0x0/AI0x0.com
|
||||||
- 🚀 v2.7 现在可以将会话分享为图片了,也可以分享到 ShareGPT 的在线链接。
|
- 🚀 v2.7 现在可以将会话分享为图片了,也可以分享到 ShareGPT 的在线链接。
|
||||||
|
- 🚀 v2.8 发布了横跨 Linux/Windows/MacOS 的体积极小的客户端。
|
||||||
|
|
||||||
## Get Started
|
## Get Started
|
||||||
|
|
||||||
@@ -178,6 +185,16 @@ If you do not want users to input their own API key, set this value to 1.
|
|||||||
|
|
||||||
If you do not want users to use GPT-4, set this value to 1.
|
If you do not want users to use GPT-4, set this value to 1.
|
||||||
|
|
||||||
|
### `HIDE_BALANCE_QUERY` (optional)
|
||||||
|
|
||||||
|
> Default: Empty
|
||||||
|
|
||||||
|
If you do not want users to query balance, set this value to 1.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
NodeJS >= 18, Docker >= 20
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
> [简体中文 > 如何进行二次开发](./README_CN.md#开发)
|
> [简体中文 > 如何进行二次开发](./README_CN.md#开发)
|
||||||
@@ -228,6 +245,12 @@ docker run -d -p 3000:3000 \
|
|||||||
yidadaa/chatgpt-next-web
|
yidadaa/chatgpt-next-web
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If your proxy needs password, use:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
-e PROXY_URL="http://127.0.0.1:7890 user pass"
|
||||||
|
```
|
||||||
|
|
||||||
### Shell
|
### Shell
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
10
README_CN.md
10
README_CN.md
@@ -98,6 +98,10 @@ OpenAI 接口代理 URL,如果你手动配置了 openai 接口代理,请填
|
|||||||
|
|
||||||
如果你不想让用户使用 GPT-4,将此环境变量设置为 1 即可。
|
如果你不想让用户使用 GPT-4,将此环境变量设置为 1 即可。
|
||||||
|
|
||||||
|
### `HIDE_BALANCE_QUERY` (可选)
|
||||||
|
|
||||||
|
如果你不想让用户查询余额,将此环境变量设置为 1 即可。
|
||||||
|
|
||||||
## 开发
|
## 开发
|
||||||
|
|
||||||
点击下方按钮,开始二次开发:
|
点击下方按钮,开始二次开发:
|
||||||
@@ -147,6 +151,12 @@ docker run -d -p 3000:3000 \
|
|||||||
yidadaa/chatgpt-next-web
|
yidadaa/chatgpt-next-web
|
||||||
```
|
```
|
||||||
|
|
||||||
|
如果你的本地代理需要账号密码,可以使用:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
-e PROXY_URL="http://127.0.0.1:7890 user password"
|
||||||
|
```
|
||||||
|
|
||||||
如果你需要指定其他环境变量,请自行在上述命令中增加 `-e 环境变量=环境变量值` 来指定。
|
如果你需要指定其他环境变量,请自行在上述命令中增加 `-e 环境变量=环境变量值` 来指定。
|
||||||
|
|
||||||
### 本地部署
|
### 本地部署
|
||||||
|
@@ -96,6 +96,10 @@ Si no desea que los usuarios rellenen la clave de API ellos mismos, establezca e
|
|||||||
|
|
||||||
Si no desea que los usuarios utilicen GPT-4, establezca esta variable de entorno en 1.
|
Si no desea que los usuarios utilicen GPT-4, establezca esta variable de entorno en 1.
|
||||||
|
|
||||||
|
### `HIDE_BALANCE_QUERY` (Opcional)
|
||||||
|
|
||||||
|
Si no desea que los usuarios consulte el saldo, establezca esta variable de entorno en 1.
|
||||||
|
|
||||||
## explotación
|
## explotación
|
||||||
|
|
||||||
> No se recomienda encarecidamente desarrollar o implementar localmente, debido a algunas razones técnicas, es difícil configurar el agente API de OpenAI localmente, a menos que pueda asegurarse de que puede conectarse directamente al servidor OpenAI.
|
> No se recomienda encarecidamente desarrollar o implementar localmente, debido a algunas razones técnicas, es difícil configurar el agente API de OpenAI localmente, a menos que pueda asegurarse de que puede conectarse directamente al servidor OpenAI.
|
||||||
|
@@ -43,6 +43,8 @@ export async function requestOpenai(req: NextRequest) {
|
|||||||
cache: "no-store",
|
cache: "no-store",
|
||||||
method: req.method,
|
method: req.method,
|
||||||
body: req.body,
|
body: req.body,
|
||||||
|
// @ts-ignore
|
||||||
|
duplex: "half",
|
||||||
signal: controller.signal,
|
signal: controller.signal,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@ const DANGER_CONFIG = {
|
|||||||
needCode: serverConfig.needCode,
|
needCode: serverConfig.needCode,
|
||||||
hideUserApiKey: serverConfig.hideUserApiKey,
|
hideUserApiKey: serverConfig.hideUserApiKey,
|
||||||
enableGPT4: serverConfig.enableGPT4,
|
enableGPT4: serverConfig.enableGPT4,
|
||||||
|
hideBalanceQuery: serverConfig.hideBalanceQuery,
|
||||||
};
|
};
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
@@ -1,4 +1,8 @@
|
|||||||
import { OpenaiPath, REQUEST_TIMEOUT_MS } from "@/app/constant";
|
import {
|
||||||
|
DEFAULT_API_HOST,
|
||||||
|
OpenaiPath,
|
||||||
|
REQUEST_TIMEOUT_MS,
|
||||||
|
} from "@/app/constant";
|
||||||
import { useAccessStore, useAppConfig, useChatStore } from "@/app/store";
|
import { useAccessStore, useAppConfig, useChatStore } from "@/app/store";
|
||||||
|
|
||||||
import { ChatOptions, getHeaders, LLMApi, LLMUsage } from "../api";
|
import { ChatOptions, getHeaders, LLMApi, LLMUsage } from "../api";
|
||||||
@@ -12,6 +16,9 @@ import { prettyObject } from "@/app/utils/format";
|
|||||||
export class ChatGPTApi implements LLMApi {
|
export class ChatGPTApi implements LLMApi {
|
||||||
path(path: string): string {
|
path(path: string): string {
|
||||||
let openaiUrl = useAccessStore.getState().openaiUrl;
|
let openaiUrl = useAccessStore.getState().openaiUrl;
|
||||||
|
if (openaiUrl.length === 0) {
|
||||||
|
openaiUrl = DEFAULT_API_HOST;
|
||||||
|
}
|
||||||
if (openaiUrl.endsWith("/")) {
|
if (openaiUrl.endsWith("/")) {
|
||||||
openaiUrl = openaiUrl.slice(0, openaiUrl.length - 1);
|
openaiUrl = openaiUrl.slice(0, openaiUrl.length - 1);
|
||||||
}
|
}
|
||||||
@@ -42,6 +49,7 @@ export class ChatGPTApi implements LLMApi {
|
|||||||
model: modelConfig.model,
|
model: modelConfig.model,
|
||||||
temperature: modelConfig.temperature,
|
temperature: modelConfig.temperature,
|
||||||
presence_penalty: modelConfig.presence_penalty,
|
presence_penalty: modelConfig.presence_penalty,
|
||||||
|
frequency_penalty: modelConfig.frequency_penalty,
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log("[Request] openai payload: ", requestPayload);
|
console.log("[Request] openai payload: ", requestPayload);
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { useSearchParams } from "react-router-dom";
|
import { useSearchParams } from "react-router-dom";
|
||||||
|
import Locale from "./locales";
|
||||||
|
|
||||||
type Command = (param: string) => void;
|
type Command = (param: string) => void;
|
||||||
interface Commands {
|
interface Commands {
|
||||||
@@ -26,3 +27,45 @@ export function useCommand(commands: Commands = {}) {
|
|||||||
setSearchParams(searchParams);
|
setSearchParams(searchParams);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ChatCommands {
|
||||||
|
new?: Command;
|
||||||
|
newm?: Command;
|
||||||
|
next?: Command;
|
||||||
|
prev?: Command;
|
||||||
|
clear?: Command;
|
||||||
|
del?: Command;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ChatCommandPrefix = ":";
|
||||||
|
|
||||||
|
export function useChatCommand(commands: ChatCommands = {}) {
|
||||||
|
function extract(userInput: string) {
|
||||||
|
return (
|
||||||
|
userInput.startsWith(ChatCommandPrefix) ? userInput.slice(1) : userInput
|
||||||
|
) as keyof ChatCommands;
|
||||||
|
}
|
||||||
|
|
||||||
|
function search(userInput: string) {
|
||||||
|
const input = extract(userInput);
|
||||||
|
const desc = Locale.Chat.Commands;
|
||||||
|
return Object.keys(commands)
|
||||||
|
.filter((c) => c.startsWith(input))
|
||||||
|
.map((c) => ({
|
||||||
|
title: desc[c as keyof ChatCommands],
|
||||||
|
content: ChatCommandPrefix + c,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function match(userInput: string) {
|
||||||
|
const command = extract(userInput);
|
||||||
|
const matched = typeof commands[command] === "function";
|
||||||
|
|
||||||
|
return {
|
||||||
|
matched,
|
||||||
|
invoke: () => matched && commands[command]!(userInput),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return { match, search };
|
||||||
|
}
|
||||||
|
@@ -27,6 +27,26 @@
|
|||||||
fill: white !important;
|
fill: white !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.danger {
|
||||||
|
color: rgba($color: red, $alpha: 0.8);
|
||||||
|
border-color: rgba($color: red, $alpha: 0.5);
|
||||||
|
background-color: rgba($color: red, $alpha: 0.05);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: red;
|
||||||
|
background-color: rgba($color: red, $alpha: 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
path {
|
||||||
|
fill: red !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
border-color: var(--primary);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.shadow {
|
.shadow {
|
||||||
@@ -37,10 +57,6 @@
|
|||||||
border: var(--border-in-light);
|
border: var(--border-in-light);
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-button:hover {
|
|
||||||
border-color: var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon-button-icon {
|
.icon-button-icon {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
@@ -56,9 +72,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.icon-button-text {
|
.icon-button-text {
|
||||||
margin-left: 5px;
|
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&:not(:first-child) {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,16 +2,20 @@ import * as React from "react";
|
|||||||
|
|
||||||
import styles from "./button.module.scss";
|
import styles from "./button.module.scss";
|
||||||
|
|
||||||
|
export type ButtonType = "primary" | "danger" | null;
|
||||||
|
|
||||||
export function IconButton(props: {
|
export function IconButton(props: {
|
||||||
onClick?: () => void;
|
onClick?: () => void;
|
||||||
icon?: JSX.Element;
|
icon?: JSX.Element;
|
||||||
type?: "primary" | "danger";
|
type?: ButtonType;
|
||||||
text?: string;
|
text?: string;
|
||||||
bordered?: boolean;
|
bordered?: boolean;
|
||||||
shadow?: boolean;
|
shadow?: boolean;
|
||||||
className?: string;
|
className?: string;
|
||||||
title?: string;
|
title?: string;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
|
tabIndex?: number;
|
||||||
|
autoFocus?: boolean;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
@@ -25,6 +29,8 @@ export function IconButton(props: {
|
|||||||
title={props.title}
|
title={props.title}
|
||||||
disabled={props.disabled}
|
disabled={props.disabled}
|
||||||
role="button"
|
role="button"
|
||||||
|
tabIndex={props.tabIndex}
|
||||||
|
autoFocus={props.autoFocus}
|
||||||
>
|
>
|
||||||
{props.icon && (
|
{props.icon && (
|
||||||
<div
|
<div
|
||||||
|
@@ -17,6 +17,7 @@ import { Path } from "../constant";
|
|||||||
import { MaskAvatar } from "./mask";
|
import { MaskAvatar } from "./mask";
|
||||||
import { Mask } from "../store/mask";
|
import { Mask } from "../store/mask";
|
||||||
import { useRef, useEffect } from "react";
|
import { useRef, useEffect } from "react";
|
||||||
|
import { showConfirm } from "./ui-lib";
|
||||||
|
|
||||||
export function ChatItem(props: {
|
export function ChatItem(props: {
|
||||||
onClick?: () => void;
|
onClick?: () => void;
|
||||||
@@ -139,8 +140,11 @@ export function ChatList(props: { narrow?: boolean }) {
|
|||||||
navigate(Path.Chat);
|
navigate(Path.Chat);
|
||||||
selectSession(i);
|
selectSession(i);
|
||||||
}}
|
}}
|
||||||
onDelete={() => {
|
onDelete={async () => {
|
||||||
if (!props.narrow || confirm(Locale.Home.DeleteChat)) {
|
if (
|
||||||
|
!props.narrow ||
|
||||||
|
(await showConfirm(Locale.Home.DeleteChat))
|
||||||
|
) {
|
||||||
chatStore.deleteSession(i);
|
chatStore.deleteSession(i);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
animation: slide-in ease 0.3s;
|
animation: slide-in ease 0.3s;
|
||||||
box-shadow: var(--card-shadow);
|
box-shadow: var(--card-shadow);
|
||||||
transition: all ease 0.3s;
|
transition: all ease 0.3s;
|
||||||
margin-bottom: 10px;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
width: var(--icon-width);
|
width: var(--icon-width);
|
||||||
@@ -202,3 +201,269 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.chat {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-body {
|
||||||
|
flex: 1;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 20px;
|
||||||
|
padding-bottom: 40px;
|
||||||
|
position: relative;
|
||||||
|
overscroll-behavior: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-body-main-title {
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 600px) {
|
||||||
|
.chat-body-title {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
animation: slide-in ease 0.3s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-user {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row-reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-container {
|
||||||
|
max-width: var(--message-max-width);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.chat-message-edit {
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-user > .chat-message-container {
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-avatar {
|
||||||
|
margin-top: 20px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.chat-message-edit {
|
||||||
|
position: absolute;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
opacity: 0;
|
||||||
|
transition: all ease 0.3s;
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 7px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-status {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #aaa;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-item {
|
||||||
|
box-sizing: border-box;
|
||||||
|
max-width: 100%;
|
||||||
|
margin-top: 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
padding: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
user-select: text;
|
||||||
|
word-break: break-word;
|
||||||
|
border: var(--border-in-light);
|
||||||
|
position: relative;
|
||||||
|
transition: all ease 0.3s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
.chat-message-actions {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0px);
|
||||||
|
max-width: 100%;
|
||||||
|
height: 40px;
|
||||||
|
|
||||||
|
.chat-message-action-date {
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-actions {
|
||||||
|
display: flex;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 12px;
|
||||||
|
align-items: flex-end;
|
||||||
|
justify-content: space-between;
|
||||||
|
transition: all ease 0.3s;
|
||||||
|
transform: translateY(10px);
|
||||||
|
opacity: 0;
|
||||||
|
height: 0;
|
||||||
|
max-width: 0;
|
||||||
|
|
||||||
|
.chat-input-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-action-date {
|
||||||
|
white-space: nowrap;
|
||||||
|
transition: all ease 0.6s;
|
||||||
|
color: var(--black);
|
||||||
|
opacity: 0;
|
||||||
|
text-align: right;
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message-user > .chat-message-container > .chat-message-item {
|
||||||
|
background-color: var(--second);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input-panel {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
padding: 20px;
|
||||||
|
padding-top: 10px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
flex-direction: column;
|
||||||
|
border-top: var(--border-in-light);
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
|
||||||
|
.chat-input-actions {
|
||||||
|
.chat-input-action {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin single-line {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-hints {
|
||||||
|
min-height: 20px;
|
||||||
|
width: 100%;
|
||||||
|
max-height: 50vh;
|
||||||
|
overflow: auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
|
||||||
|
background-color: var(--white);
|
||||||
|
border: var(--border-in-light);
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
|
||||||
|
.prompt-hint {
|
||||||
|
color: var(--black);
|
||||||
|
padding: 6px 10px;
|
||||||
|
animation: slide-in ease 0.3s;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all ease 0.3s;
|
||||||
|
border: transparent 1px solid;
|
||||||
|
margin: 4px;
|
||||||
|
border-radius: 8px;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hint-title {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bolder;
|
||||||
|
|
||||||
|
@include single-line();
|
||||||
|
}
|
||||||
|
.hint-content {
|
||||||
|
font-size: 12px;
|
||||||
|
|
||||||
|
@include single-line();
|
||||||
|
}
|
||||||
|
|
||||||
|
&-selected,
|
||||||
|
&:hover {
|
||||||
|
border-color: var(--primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input-panel-inner {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 10px;
|
||||||
|
border: var(--border-in-light);
|
||||||
|
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.03);
|
||||||
|
background-color: var(--white);
|
||||||
|
color: var(--black);
|
||||||
|
font-family: inherit;
|
||||||
|
padding: 10px 90px 10px 14px;
|
||||||
|
resize: none;
|
||||||
|
outline: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
min-height: 68px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input:focus {
|
||||||
|
border: 1px solid var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input-send {
|
||||||
|
background-color: var(--primary);
|
||||||
|
color: white;
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
right: 30px;
|
||||||
|
bottom: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 600px) {
|
||||||
|
.chat-input {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input-send {
|
||||||
|
bottom: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -3,8 +3,8 @@ import React, {
|
|||||||
useState,
|
useState,
|
||||||
useRef,
|
useRef,
|
||||||
useEffect,
|
useEffect,
|
||||||
useLayoutEffect,
|
|
||||||
useMemo,
|
useMemo,
|
||||||
|
useCallback,
|
||||||
} from "react";
|
} from "react";
|
||||||
|
|
||||||
import SendWhiteIcon from "../icons/send-white.svg";
|
import SendWhiteIcon from "../icons/send-white.svg";
|
||||||
@@ -21,12 +21,16 @@ import MinIcon from "../icons/min.svg";
|
|||||||
import ResetIcon from "../icons/reload.svg";
|
import ResetIcon from "../icons/reload.svg";
|
||||||
import BreakIcon from "../icons/break.svg";
|
import BreakIcon from "../icons/break.svg";
|
||||||
import SettingsIcon from "../icons/chat-settings.svg";
|
import SettingsIcon from "../icons/chat-settings.svg";
|
||||||
|
import DeleteIcon from "../icons/clear.svg";
|
||||||
|
import PinIcon from "../icons/pin.svg";
|
||||||
|
import EditIcon from "../icons/rename.svg";
|
||||||
|
|
||||||
import LightIcon from "../icons/light.svg";
|
import LightIcon from "../icons/light.svg";
|
||||||
import DarkIcon from "../icons/dark.svg";
|
import DarkIcon from "../icons/dark.svg";
|
||||||
import AutoIcon from "../icons/auto.svg";
|
import AutoIcon from "../icons/auto.svg";
|
||||||
import BottomIcon from "../icons/bottom.svg";
|
import BottomIcon from "../icons/bottom.svg";
|
||||||
import StopIcon from "../icons/pause.svg";
|
import StopIcon from "../icons/pause.svg";
|
||||||
|
import RobotIcon from "../icons/robot.svg";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ChatMessage,
|
ChatMessage,
|
||||||
@@ -38,6 +42,7 @@ import {
|
|||||||
Theme,
|
Theme,
|
||||||
useAppConfig,
|
useAppConfig,
|
||||||
DEFAULT_TOPIC,
|
DEFAULT_TOPIC,
|
||||||
|
ALL_MODELS,
|
||||||
} from "../store";
|
} from "../store";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -55,16 +60,15 @@ import { Prompt, usePromptStore } from "../store/prompt";
|
|||||||
import Locale from "../locales";
|
import Locale from "../locales";
|
||||||
|
|
||||||
import { IconButton } from "./button";
|
import { IconButton } from "./button";
|
||||||
import styles from "./home.module.scss";
|
import styles from "./chat.module.scss";
|
||||||
import chatStyle from "./chat.module.scss";
|
|
||||||
|
|
||||||
import { ListItem, Modal } from "./ui-lib";
|
import { ListItem, Modal, showConfirm, showPrompt, showToast } from "./ui-lib";
|
||||||
import { useLocation, useNavigate } from "react-router-dom";
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
import { LAST_INPUT_KEY, Path, REQUEST_TIMEOUT_MS } from "../constant";
|
import { LAST_INPUT_KEY, Path, REQUEST_TIMEOUT_MS } from "../constant";
|
||||||
import { Avatar } from "./emoji";
|
import { Avatar } from "./emoji";
|
||||||
import { MaskAvatar, MaskConfig } from "./mask";
|
import { MaskAvatar, MaskConfig } from "./mask";
|
||||||
import { useMaskStore } from "../store/mask";
|
import { useMaskStore } from "../store/mask";
|
||||||
import { useCommand } from "../command";
|
import { ChatCommandPrefix, useChatCommand, useCommand } from "../command";
|
||||||
import { prettyObject } from "../utils/format";
|
import { prettyObject } from "../utils/format";
|
||||||
import { ExportMessageModal } from "./exporter";
|
import { ExportMessageModal } from "./exporter";
|
||||||
import { getClientConfig } from "../config/client";
|
import { getClientConfig } from "../config/client";
|
||||||
@@ -90,8 +94,8 @@ export function SessionConfigModel(props: { onClose: () => void }) {
|
|||||||
icon={<ResetIcon />}
|
icon={<ResetIcon />}
|
||||||
bordered
|
bordered
|
||||||
text={Locale.Chat.Config.Reset}
|
text={Locale.Chat.Config.Reset}
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
if (confirm(Locale.Memory.ResetConfirm)) {
|
if (await showConfirm(Locale.Memory.ResetConfirm)) {
|
||||||
chatStore.updateCurrentSession(
|
chatStore.updateCurrentSession(
|
||||||
(session) => (session.memoryPrompt = ""),
|
(session) => (session.memoryPrompt = ""),
|
||||||
);
|
);
|
||||||
@@ -146,15 +150,15 @@ function PromptToast(props: {
|
|||||||
const context = session.mask.context;
|
const context = session.mask.context;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={chatStyle["prompt-toast"]} key="prompt-toast">
|
<div className={styles["prompt-toast"]} key="prompt-toast">
|
||||||
{props.showToast && (
|
{props.showToast && (
|
||||||
<div
|
<div
|
||||||
className={chatStyle["prompt-toast-inner"] + " clickable"}
|
className={styles["prompt-toast-inner"] + " clickable"}
|
||||||
role="button"
|
role="button"
|
||||||
onClick={() => props.setShowModal(true)}
|
onClick={() => props.setShowModal(true)}
|
||||||
>
|
>
|
||||||
<BrainIcon />
|
<BrainIcon />
|
||||||
<span className={chatStyle["prompt-toast-content"]}>
|
<span className={styles["prompt-toast-content"]}>
|
||||||
{Locale.Context.Toast(context.length)}
|
{Locale.Context.Toast(context.length)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -206,8 +210,7 @@ export function PromptHints(props: {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onKeyDown = (e: KeyboardEvent) => {
|
const onKeyDown = (e: KeyboardEvent) => {
|
||||||
if (noPrompts) return;
|
if (noPrompts || e.metaKey || e.altKey || e.ctrlKey) {
|
||||||
if (e.metaKey || e.altKey || e.ctrlKey) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// arrow up / down to select prompt
|
// arrow up / down to select prompt
|
||||||
@@ -269,17 +272,15 @@ function ClearContextDivider() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={chatStyle["clear-context"]}
|
className={styles["clear-context"]}
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
chatStore.updateCurrentSession(
|
chatStore.updateCurrentSession(
|
||||||
(session) => (session.clearContextIndex = undefined),
|
(session) => (session.clearContextIndex = undefined),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div className={chatStyle["clear-context-tips"]}>
|
<div className={styles["clear-context-tips"]}>{Locale.Context.Clear}</div>
|
||||||
{Locale.Context.Clear}
|
<div className={styles["clear-context-revert-btn"]}>
|
||||||
</div>
|
|
||||||
<div className={chatStyle["clear-context-revert-btn"]}>
|
|
||||||
{Locale.Context.Revert}
|
{Locale.Context.Revert}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -294,8 +295,8 @@ function ChatAction(props: {
|
|||||||
const iconRef = useRef<HTMLDivElement>(null);
|
const iconRef = useRef<HTMLDivElement>(null);
|
||||||
const textRef = useRef<HTMLDivElement>(null);
|
const textRef = useRef<HTMLDivElement>(null);
|
||||||
const [width, setWidth] = useState({
|
const [width, setWidth] = useState({
|
||||||
full: 20,
|
full: 16,
|
||||||
icon: 20,
|
icon: 16,
|
||||||
});
|
});
|
||||||
|
|
||||||
function updateWidth() {
|
function updateWidth() {
|
||||||
@@ -309,17 +310,15 @@ function ChatAction(props: {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
updateWidth();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={`${chatStyle["chat-input-action"]} clickable`}
|
className={`${styles["chat-input-action"]} clickable`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
props.onClick();
|
props.onClick();
|
||||||
setTimeout(updateWidth, 1);
|
setTimeout(updateWidth, 1);
|
||||||
}}
|
}}
|
||||||
|
onMouseEnter={updateWidth}
|
||||||
|
onTouchStart={updateWidth}
|
||||||
style={
|
style={
|
||||||
{
|
{
|
||||||
"--icon-width": `${width.icon}px`,
|
"--icon-width": `${width.icon}px`,
|
||||||
@@ -327,10 +326,10 @@ function ChatAction(props: {
|
|||||||
} as React.CSSProperties
|
} as React.CSSProperties
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div ref={iconRef} className={chatStyle["icon"]}>
|
<div ref={iconRef} className={styles["icon"]}>
|
||||||
{props.icon}
|
{props.icon}
|
||||||
</div>
|
</div>
|
||||||
<div className={chatStyle["text"]} ref={textRef}>
|
<div className={styles["text"]} ref={textRef}>
|
||||||
{props.text}
|
{props.text}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -341,15 +340,15 @@ function useScrollToBottom() {
|
|||||||
// for auto-scroll
|
// for auto-scroll
|
||||||
const scrollRef = useRef<HTMLDivElement>(null);
|
const scrollRef = useRef<HTMLDivElement>(null);
|
||||||
const [autoScroll, setAutoScroll] = useState(true);
|
const [autoScroll, setAutoScroll] = useState(true);
|
||||||
const scrollToBottom = () => {
|
const scrollToBottom = useCallback(() => {
|
||||||
const dom = scrollRef.current;
|
const dom = scrollRef.current;
|
||||||
if (dom) {
|
if (dom) {
|
||||||
setTimeout(() => (dom.scrollTop = dom.scrollHeight), 1);
|
requestAnimationFrame(() => dom.scrollTo(0, dom.scrollHeight));
|
||||||
}
|
}
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
// auto scroll
|
// auto scroll
|
||||||
useLayoutEffect(() => {
|
useEffect(() => {
|
||||||
autoScroll && scrollToBottom();
|
autoScroll && scrollToBottom();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -385,8 +384,21 @@ export function ChatActions(props: {
|
|||||||
const couldStop = ChatControllerPool.hasPending();
|
const couldStop = ChatControllerPool.hasPending();
|
||||||
const stopAll = () => ChatControllerPool.stopAll();
|
const stopAll = () => ChatControllerPool.stopAll();
|
||||||
|
|
||||||
|
// switch model
|
||||||
|
const currentModel = chatStore.currentSession().mask.modelConfig.model;
|
||||||
|
function nextModel() {
|
||||||
|
const models = ALL_MODELS.filter((m) => m.available).map((m) => m.name);
|
||||||
|
const modelIndex = models.indexOf(currentModel);
|
||||||
|
const nextIndex = (modelIndex + 1) % models.length;
|
||||||
|
const nextModel = models[nextIndex];
|
||||||
|
chatStore.updateCurrentSession((session) => {
|
||||||
|
session.mask.modelConfig.model = nextModel;
|
||||||
|
session.mask.syncGlobalConfig = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={chatStyle["chat-input-actions"]}>
|
<div className={styles["chat-input-actions"]}>
|
||||||
{couldStop && (
|
{couldStop && (
|
||||||
<ChatAction
|
<ChatAction
|
||||||
onClick={stopAll}
|
onClick={stopAll}
|
||||||
@@ -453,6 +465,12 @@ export function ChatActions(props: {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<ChatAction
|
||||||
|
onClick={nextModel}
|
||||||
|
text={currentModel}
|
||||||
|
icon={<RobotIcon />}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -480,7 +498,7 @@ export function Chat() {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const onChatBodyScroll = (e: HTMLElement) => {
|
const onChatBodyScroll = (e: HTMLElement) => {
|
||||||
const isTouchBottom = e.scrollTop + e.clientHeight >= e.scrollHeight - 100;
|
const isTouchBottom = e.scrollTop + e.clientHeight >= e.scrollHeight - 10;
|
||||||
setHitBottom(isTouchBottom);
|
setHitBottom(isTouchBottom);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -489,18 +507,13 @@ export function Chat() {
|
|||||||
const [promptHints, setPromptHints] = useState<Prompt[]>([]);
|
const [promptHints, setPromptHints] = useState<Prompt[]>([]);
|
||||||
const onSearch = useDebouncedCallback(
|
const onSearch = useDebouncedCallback(
|
||||||
(text: string) => {
|
(text: string) => {
|
||||||
setPromptHints(promptStore.search(text));
|
const matchedPrompts = promptStore.search(text);
|
||||||
|
setPromptHints(matchedPrompts);
|
||||||
},
|
},
|
||||||
100,
|
100,
|
||||||
{ leading: true, trailing: true },
|
{ leading: true, trailing: true },
|
||||||
);
|
);
|
||||||
|
|
||||||
const onPromptSelect = (prompt: Prompt) => {
|
|
||||||
setPromptHints([]);
|
|
||||||
inputRef.current?.focus();
|
|
||||||
setTimeout(() => setUserInput(prompt.content), 60);
|
|
||||||
};
|
|
||||||
|
|
||||||
// auto grow input
|
// auto grow input
|
||||||
const [inputRows, setInputRows] = useState(2);
|
const [inputRows, setInputRows] = useState(2);
|
||||||
const measure = useDebouncedCallback(
|
const measure = useDebouncedCallback(
|
||||||
@@ -522,6 +535,19 @@ export function Chat() {
|
|||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
useEffect(measure, [userInput]);
|
useEffect(measure, [userInput]);
|
||||||
|
|
||||||
|
// chat commands shortcuts
|
||||||
|
const chatCommands = useChatCommand({
|
||||||
|
new: () => chatStore.newSession(),
|
||||||
|
newm: () => navigate(Path.NewChat),
|
||||||
|
prev: () => chatStore.nextSession(-1),
|
||||||
|
next: () => chatStore.nextSession(1),
|
||||||
|
clear: () =>
|
||||||
|
chatStore.updateCurrentSession(
|
||||||
|
(session) => (session.clearContextIndex = session.messages.length),
|
||||||
|
),
|
||||||
|
del: () => chatStore.deleteSession(chatStore.currentSessionIndex),
|
||||||
|
});
|
||||||
|
|
||||||
// only search prompts when user input is short
|
// only search prompts when user input is short
|
||||||
const SEARCH_TEXT_LIMIT = 30;
|
const SEARCH_TEXT_LIMIT = 30;
|
||||||
const onInput = (text: string) => {
|
const onInput = (text: string) => {
|
||||||
@@ -531,6 +557,8 @@ export function Chat() {
|
|||||||
// clear search results
|
// clear search results
|
||||||
if (n === 0) {
|
if (n === 0) {
|
||||||
setPromptHints([]);
|
setPromptHints([]);
|
||||||
|
} else if (text.startsWith(ChatCommandPrefix)) {
|
||||||
|
setPromptHints(chatCommands.search(text));
|
||||||
} else if (!config.disablePromptHint && n < SEARCH_TEXT_LIMIT) {
|
} else if (!config.disablePromptHint && n < SEARCH_TEXT_LIMIT) {
|
||||||
// check if need to trigger auto completion
|
// check if need to trigger auto completion
|
||||||
if (text.startsWith("/")) {
|
if (text.startsWith("/")) {
|
||||||
@@ -542,6 +570,13 @@ export function Chat() {
|
|||||||
|
|
||||||
const doSubmit = (userInput: string) => {
|
const doSubmit = (userInput: string) => {
|
||||||
if (userInput.trim() === "") return;
|
if (userInput.trim() === "") return;
|
||||||
|
const matchCommand = chatCommands.match(userInput);
|
||||||
|
if (matchCommand.matched) {
|
||||||
|
setUserInput("");
|
||||||
|
setPromptHints([]);
|
||||||
|
matchCommand.invoke();
|
||||||
|
return;
|
||||||
|
}
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
chatStore.onUserInput(userInput).then(() => setIsLoading(false));
|
chatStore.onUserInput(userInput).then(() => setIsLoading(false));
|
||||||
localStorage.setItem(LAST_INPUT_KEY, userInput);
|
localStorage.setItem(LAST_INPUT_KEY, userInput);
|
||||||
@@ -551,6 +586,23 @@ export function Chat() {
|
|||||||
setAutoScroll(true);
|
setAutoScroll(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onPromptSelect = (prompt: Prompt) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setPromptHints([]);
|
||||||
|
|
||||||
|
const matchedChatCommand = chatCommands.match(prompt.content);
|
||||||
|
if (matchedChatCommand.matched) {
|
||||||
|
// if user is selecting a chat command, just trigger it
|
||||||
|
matchedChatCommand.invoke();
|
||||||
|
setUserInput("");
|
||||||
|
} else {
|
||||||
|
// or fill the prompt
|
||||||
|
setUserInput(prompt.content);
|
||||||
|
}
|
||||||
|
inputRef.current?.focus();
|
||||||
|
}, 30);
|
||||||
|
};
|
||||||
|
|
||||||
// stop response
|
// stop response
|
||||||
const onUserStop = (messageId: number) => {
|
const onUserStop = (messageId: number) => {
|
||||||
ChatControllerPool.stop(sessionIndex, messageId);
|
ChatControllerPool.stop(sessionIndex, messageId);
|
||||||
@@ -605,6 +657,10 @@ export function Chat() {
|
|||||||
const onRightClick = (e: any, message: ChatMessage) => {
|
const onRightClick = (e: any, message: ChatMessage) => {
|
||||||
// copy to clipboard
|
// copy to clipboard
|
||||||
if (selectOrCopy(e.currentTarget, message.content)) {
|
if (selectOrCopy(e.currentTarget, message.content)) {
|
||||||
|
if (userInput.length === 0) {
|
||||||
|
setUserInput(message.content);
|
||||||
|
}
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -649,6 +705,24 @@ export function Chat() {
|
|||||||
inputRef.current?.focus();
|
inputRef.current?.focus();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onPinMessage = (botMessage: ChatMessage) => {
|
||||||
|
if (!botMessage.id) return;
|
||||||
|
const userMessageIndex = findLastUserIndex(botMessage.id);
|
||||||
|
if (userMessageIndex === null) return;
|
||||||
|
|
||||||
|
const userMessage = session.messages[userMessageIndex];
|
||||||
|
chatStore.updateCurrentSession((session) =>
|
||||||
|
session.mask.context.push(userMessage, botMessage),
|
||||||
|
);
|
||||||
|
|
||||||
|
showToast(Locale.Chat.Actions.PinToastContent, {
|
||||||
|
text: Locale.Chat.Actions.PinToastAction,
|
||||||
|
onClick: () => {
|
||||||
|
setShowPromptModal(true);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const context: RenderMessage[] = session.mask.hideContext
|
const context: RenderMessage[] = session.mask.hideContext
|
||||||
? []
|
? []
|
||||||
: session.mask.context.slice();
|
: session.mask.context.slice();
|
||||||
@@ -705,10 +779,13 @@ export function Chat() {
|
|||||||
const [showPromptModal, setShowPromptModal] = useState(false);
|
const [showPromptModal, setShowPromptModal] = useState(false);
|
||||||
|
|
||||||
const renameSession = () => {
|
const renameSession = () => {
|
||||||
const newTopic = prompt(Locale.Chat.Rename, session.topic);
|
showPrompt(Locale.Chat.Rename, session.topic).then((newTopic) => {
|
||||||
if (newTopic && newTopic !== session.topic) {
|
if (newTopic && newTopic !== session.topic) {
|
||||||
chatStore.updateCurrentSession((session) => (session.topic = newTopic!));
|
chatStore.updateCurrentSession(
|
||||||
}
|
(session) => (session.topic = newTopic!),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const clientConfig = useMemo(() => getClientConfig(), []);
|
const clientConfig = useMemo(() => getClientConfig(), []);
|
||||||
@@ -729,9 +806,22 @@ export function Chat() {
|
|||||||
return (
|
return (
|
||||||
<div className={styles.chat} key={session.id}>
|
<div className={styles.chat} key={session.id}>
|
||||||
<div className="window-header" data-tauri-drag-region>
|
<div className="window-header" data-tauri-drag-region>
|
||||||
<div className="window-header-title">
|
{isMobileScreen && (
|
||||||
|
<div className="window-actions">
|
||||||
|
<div className={"window-action-button"}>
|
||||||
|
<IconButton
|
||||||
|
icon={<ReturnIcon />}
|
||||||
|
bordered
|
||||||
|
title={Locale.Chat.Actions.ChatList}
|
||||||
|
onClick={() => navigate(Path.Home)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className={`window-header-title ${styles["chat-body-title"]}`}>
|
||||||
<div
|
<div
|
||||||
className={`window-header-main-title " ${styles["chat-body-title"]}`}
|
className={`window-header-main-title ${styles["chat-body-main-title"]}`}
|
||||||
onClickCapture={renameSession}
|
onClickCapture={renameSession}
|
||||||
>
|
>
|
||||||
{!session.topic ? DEFAULT_TOPIC : session.topic}
|
{!session.topic ? DEFAULT_TOPIC : session.topic}
|
||||||
@@ -741,21 +831,15 @@ export function Chat() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="window-actions">
|
<div className="window-actions">
|
||||||
<div className={"window-action-button" + " " + styles.mobile}>
|
{!isMobileScreen && (
|
||||||
<IconButton
|
<div className="window-action-button">
|
||||||
icon={<ReturnIcon />}
|
<IconButton
|
||||||
bordered
|
icon={<RenameIcon />}
|
||||||
title={Locale.Chat.Actions.ChatList}
|
bordered
|
||||||
onClick={() => navigate(Path.Home)}
|
onClick={renameSession}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="window-action-button">
|
)}
|
||||||
<IconButton
|
|
||||||
icon={<RenameIcon />}
|
|
||||||
bordered
|
|
||||||
onClick={renameSession}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="window-action-button">
|
<div className="window-action-button">
|
||||||
<IconButton
|
<IconButton
|
||||||
icon={<ExportIcon />}
|
icon={<ExportIcon />}
|
||||||
@@ -819,6 +903,25 @@ export function Chat() {
|
|||||||
>
|
>
|
||||||
<div className={styles["chat-message-container"]}>
|
<div className={styles["chat-message-container"]}>
|
||||||
<div className={styles["chat-message-avatar"]}>
|
<div className={styles["chat-message-avatar"]}>
|
||||||
|
<div className={styles["chat-message-edit"]}>
|
||||||
|
<IconButton
|
||||||
|
icon={<EditIcon />}
|
||||||
|
onClick={async () => {
|
||||||
|
const newMessage = await showPrompt(
|
||||||
|
Locale.Chat.Actions.Edit,
|
||||||
|
message.content,
|
||||||
|
);
|
||||||
|
chatStore.updateCurrentSession((session) => {
|
||||||
|
const m = session.messages.find(
|
||||||
|
(m) => m.id === message.id,
|
||||||
|
);
|
||||||
|
if (m) {
|
||||||
|
m.content = newMessage;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
></IconButton>
|
||||||
|
</div>
|
||||||
{message.role === "user" ? (
|
{message.role === "user" ? (
|
||||||
<Avatar avatar={config.avatar} />
|
<Avatar avatar={config.avatar} />
|
||||||
) : (
|
) : (
|
||||||
@@ -831,40 +934,6 @@ export function Chat() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className={styles["chat-message-item"]}>
|
<div className={styles["chat-message-item"]}>
|
||||||
{showActions && (
|
|
||||||
<div className={styles["chat-message-top-actions"]}>
|
|
||||||
{message.streaming ? (
|
|
||||||
<div
|
|
||||||
className={styles["chat-message-top-action"]}
|
|
||||||
onClick={() => onUserStop(message.id ?? i)}
|
|
||||||
>
|
|
||||||
{Locale.Chat.Actions.Stop}
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<div
|
|
||||||
className={styles["chat-message-top-action"]}
|
|
||||||
onClick={() => onDelete(message.id ?? i)}
|
|
||||||
>
|
|
||||||
{Locale.Chat.Actions.Delete}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
className={styles["chat-message-top-action"]}
|
|
||||||
onClick={() => onResend(message.id ?? i)}
|
|
||||||
>
|
|
||||||
{Locale.Chat.Actions.Retry}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div
|
|
||||||
className={styles["chat-message-top-action"]}
|
|
||||||
onClick={() => copyToClipboard(message.content)}
|
|
||||||
>
|
|
||||||
{Locale.Chat.Actions.Copy}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<Markdown
|
<Markdown
|
||||||
content={message.content}
|
content={message.content}
|
||||||
loading={
|
loading={
|
||||||
@@ -880,14 +949,56 @@ export function Chat() {
|
|||||||
parentRef={scrollRef}
|
parentRef={scrollRef}
|
||||||
defaultShow={i >= messages.length - 10}
|
defaultShow={i >= messages.length - 10}
|
||||||
/>
|
/>
|
||||||
</div>
|
|
||||||
{!isUser && !message.preview && (
|
{showActions && (
|
||||||
<div className={styles["chat-message-actions"]}>
|
<div className={styles["chat-message-actions"]}>
|
||||||
<div className={styles["chat-message-action-date"]}>
|
<div
|
||||||
{message.date.toLocaleString()}
|
className={styles["chat-input-actions"]}
|
||||||
|
style={{
|
||||||
|
marginTop: 10,
|
||||||
|
marginBottom: 0,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{message.streaming ? (
|
||||||
|
<ChatAction
|
||||||
|
text={Locale.Chat.Actions.Stop}
|
||||||
|
icon={<StopIcon />}
|
||||||
|
onClick={() => onUserStop(message.id ?? i)}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<ChatAction
|
||||||
|
text={Locale.Chat.Actions.Retry}
|
||||||
|
icon={<ResetIcon />}
|
||||||
|
onClick={() => onResend(message.id ?? i)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ChatAction
|
||||||
|
text={Locale.Chat.Actions.Delete}
|
||||||
|
icon={<DeleteIcon />}
|
||||||
|
onClick={() => onDelete(message.id ?? i)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ChatAction
|
||||||
|
text={Locale.Chat.Actions.Pin}
|
||||||
|
icon={<PinIcon />}
|
||||||
|
onClick={() => onPinMessage(message)}
|
||||||
|
/>
|
||||||
|
<ChatAction
|
||||||
|
text={Locale.Chat.Actions.Copy}
|
||||||
|
icon={<CopyIcon />}
|
||||||
|
onClick={() => copyToClipboard(message.content)}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles["chat-message-action-date"]}>
|
||||||
|
{message.date.toLocaleString()}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
)}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{shouldShowClearContextDivider && <ClearContextDivider />}
|
{shouldShowClearContextDivider && <ClearContextDivider />}
|
||||||
@@ -927,6 +1038,9 @@ export function Chat() {
|
|||||||
onBlur={() => setAutoScroll(false)}
|
onBlur={() => setAutoScroll(false)}
|
||||||
rows={inputRows}
|
rows={inputRows}
|
||||||
autoFocus={autoFocus}
|
autoFocus={autoFocus}
|
||||||
|
style={{
|
||||||
|
fontSize: config.fontSize,
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<IconButton
|
<IconButton
|
||||||
icon={<SendWhiteIcon />}
|
icon={<SendWhiteIcon />}
|
||||||
|
@@ -5,6 +5,7 @@ import ResetIcon from "../icons/reload.svg";
|
|||||||
import { ISSUE_URL } from "../constant";
|
import { ISSUE_URL } from "../constant";
|
||||||
import Locale from "../locales";
|
import Locale from "../locales";
|
||||||
import { downloadAs } from "../utils";
|
import { downloadAs } from "../utils";
|
||||||
|
import { showConfirm } from "./ui-lib";
|
||||||
|
|
||||||
interface IErrorBoundaryState {
|
interface IErrorBoundaryState {
|
||||||
hasError: boolean;
|
hasError: boolean;
|
||||||
@@ -57,10 +58,11 @@ export class ErrorBoundary extends React.Component<any, IErrorBoundaryState> {
|
|||||||
<IconButton
|
<IconButton
|
||||||
icon={<ResetIcon />}
|
icon={<ResetIcon />}
|
||||||
text="Clear All Data"
|
text="Clear All Data"
|
||||||
onClick={() =>
|
onClick={async () => {
|
||||||
confirm(Locale.Settings.Actions.ConfirmClearAll) &&
|
if (await showConfirm(Locale.Settings.Danger.Reset.Confirm)) {
|
||||||
this.clearAndSaveData()
|
this.clearAndSaveData();
|
||||||
}
|
}
|
||||||
|
}}
|
||||||
bordered
|
bordered
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -449,16 +449,16 @@ export function ImagePreviewer(props: {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div className={styles["chat-info-item"]}>
|
<div className={styles["chat-info-item"]}>
|
||||||
Model: {mask.modelConfig.model}
|
{Locale.Exporter.Model}: {mask.modelConfig.model}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles["chat-info-item"]}>
|
<div className={styles["chat-info-item"]}>
|
||||||
Messages: {props.messages.length}
|
{Locale.Exporter.Messages}: {props.messages.length}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles["chat-info-item"]}>
|
<div className={styles["chat-info-item"]}>
|
||||||
Topic: {session.topic}
|
{Locale.Exporter.Topic}: {session.topic}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles["chat-info-item"]}>
|
<div className={styles["chat-info-item"]}>
|
||||||
Time:{" "}
|
{Locale.Exporter.Time}:{" "}
|
||||||
{new Date(
|
{new Date(
|
||||||
props.messages.at(-1)?.date ?? Date.now(),
|
props.messages.at(-1)?.date ?? Date.now(),
|
||||||
).toLocaleString()}
|
).toLocaleString()}
|
||||||
|
@@ -185,7 +185,7 @@
|
|||||||
|
|
||||||
.chat-item-delete {
|
.chat-item-delete {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
transition: all ease 0.3s;
|
transition: all ease 0.3s;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
@@ -194,7 +194,7 @@
|
|||||||
|
|
||||||
.chat-item:hover > .chat-item-delete {
|
.chat-item:hover > .chat-item-delete {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
transform: translateX(-10px);
|
transform: translateX(-4px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-item:hover > .chat-item-delete:hover {
|
.chat-item:hover > .chat-item-delete:hover {
|
||||||
@@ -283,15 +283,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-item-delete {
|
|
||||||
top: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-item:hover > .chat-item-delete {
|
|
||||||
opacity: 0.5;
|
|
||||||
right: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-tail {
|
.sidebar-tail {
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -322,243 +313,6 @@
|
|||||||
margin-right: 15px;
|
margin-right: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-body {
|
|
||||||
flex: 1;
|
|
||||||
overflow: auto;
|
|
||||||
padding: 20px;
|
|
||||||
padding-bottom: 40px;
|
|
||||||
position: relative;
|
|
||||||
overscroll-behavior: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-body-title {
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
animation: slide-in ease 0.3s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-user {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row-reverse;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-container {
|
|
||||||
max-width: var(--message-max-width);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: flex-start;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.chat-message-top-actions {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateX(10px);
|
|
||||||
pointer-events: all;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-user > .chat-message-container {
|
|
||||||
align-items: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-avatar {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-status {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #aaa;
|
|
||||||
line-height: 1.5;
|
|
||||||
margin-top: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-item {
|
|
||||||
box-sizing: border-box;
|
|
||||||
max-width: 100%;
|
|
||||||
margin-top: 10px;
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: rgba(0, 0, 0, 0.05);
|
|
||||||
padding: 10px;
|
|
||||||
font-size: 14px;
|
|
||||||
user-select: text;
|
|
||||||
word-break: break-word;
|
|
||||||
border: var(--border-in-light);
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-top-actions {
|
|
||||||
min-width: 120px;
|
|
||||||
font-size: 12px;
|
|
||||||
position: absolute;
|
|
||||||
right: 20px;
|
|
||||||
top: -26px;
|
|
||||||
left: 30px;
|
|
||||||
transition: all ease 0.3s;
|
|
||||||
opacity: 0;
|
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row-reverse;
|
|
||||||
|
|
||||||
.chat-message-top-action {
|
|
||||||
opacity: 0.5;
|
|
||||||
color: var(--black);
|
|
||||||
white-space: nowrap;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:first-child) {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-user > .chat-message-container > .chat-message-item {
|
|
||||||
background-color: var(--second);
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-actions {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row-reverse;
|
|
||||||
width: 100%;
|
|
||||||
padding-top: 5px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-message-action-date {
|
|
||||||
color: #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input-panel {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
padding: 20px;
|
|
||||||
padding-top: 10px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
flex-direction: column;
|
|
||||||
border-top-left-radius: 10px;
|
|
||||||
border-top-right-radius: 10px;
|
|
||||||
border-top: var(--border-in-light);
|
|
||||||
box-shadow: var(--card-shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin single-line {
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prompt-hints {
|
|
||||||
min-height: 20px;
|
|
||||||
width: 100%;
|
|
||||||
max-height: 50vh;
|
|
||||||
overflow: auto;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column-reverse;
|
|
||||||
|
|
||||||
background-color: var(--white);
|
|
||||||
border: var(--border-in-light);
|
|
||||||
border-radius: 10px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
box-shadow: var(--shadow);
|
|
||||||
|
|
||||||
.prompt-hint {
|
|
||||||
color: var(--black);
|
|
||||||
padding: 6px 10px;
|
|
||||||
animation: slide-in ease 0.3s;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: all ease 0.3s;
|
|
||||||
border: transparent 1px solid;
|
|
||||||
margin: 4px;
|
|
||||||
border-radius: 8px;
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hint-title {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: bolder;
|
|
||||||
|
|
||||||
@include single-line();
|
|
||||||
}
|
|
||||||
.hint-content {
|
|
||||||
font-size: 12px;
|
|
||||||
|
|
||||||
@include single-line();
|
|
||||||
}
|
|
||||||
|
|
||||||
&-selected,
|
|
||||||
&:hover {
|
|
||||||
border-color: var(--primary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input-panel-inner {
|
|
||||||
display: flex;
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
border-radius: 10px;
|
|
||||||
border: var(--border-in-light);
|
|
||||||
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.03);
|
|
||||||
background-color: var(--white);
|
|
||||||
color: var(--black);
|
|
||||||
font-family: inherit;
|
|
||||||
padding: 10px 90px 10px 14px;
|
|
||||||
resize: none;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input:focus {
|
|
||||||
border: 1px solid var(--primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input-send {
|
|
||||||
background-color: var(--primary);
|
|
||||||
color: white;
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
right: 30px;
|
|
||||||
bottom: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (max-width: 600px) {
|
|
||||||
.chat-input {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chat-input-send {
|
|
||||||
bottom: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-content {
|
.loading-content {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -567,3 +321,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.rtl-screen {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
@@ -15,6 +15,8 @@ import dynamic from "next/dynamic";
|
|||||||
import { Path, SlotID } from "../constant";
|
import { Path, SlotID } from "../constant";
|
||||||
import { ErrorBoundary } from "./error";
|
import { ErrorBoundary } from "./error";
|
||||||
|
|
||||||
|
import { getLang } from "../locales";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
HashRouter as Router,
|
HashRouter as Router,
|
||||||
Routes,
|
Routes,
|
||||||
@@ -124,7 +126,7 @@ function Screen() {
|
|||||||
config.tightBorder && !isMobileScreen
|
config.tightBorder && !isMobileScreen
|
||||||
? styles["tight-container"]
|
? styles["tight-container"]
|
||||||
: styles.container
|
: styles.container
|
||||||
}`
|
} ${getLang() === "ar" ? styles["rtl-screen"] : ""}`
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{isAuth ? (
|
{isAuth ? (
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
.input-range {
|
.input-range {
|
||||||
border: var(--border-in-light);
|
border: var(--border-in-light);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
padding: 5px 15px 5px 10px;
|
padding: 5px 10px 5px 10px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
max-width: 40%;
|
max-width: 40%;
|
||||||
|
|
||||||
input[type="range"] {
|
input[type="range"] {
|
||||||
max-width: calc(100% - 50px);
|
max-width: calc(100% - 34px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,19 +11,21 @@ import mermaid from "mermaid";
|
|||||||
|
|
||||||
import LoadingIcon from "../icons/three-dots.svg";
|
import LoadingIcon from "../icons/three-dots.svg";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useThrottledCallback } from "use-debounce";
|
import { useDebouncedCallback, useThrottledCallback } from "use-debounce";
|
||||||
|
|
||||||
export function Mermaid(props: { code: string; onError: () => void }) {
|
export function Mermaid(props: { code: string }) {
|
||||||
const ref = useRef<HTMLDivElement>(null);
|
const ref = useRef<HTMLDivElement>(null);
|
||||||
|
const [hasError, setHasError] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (props.code && ref.current) {
|
if (props.code && ref.current) {
|
||||||
mermaid
|
mermaid
|
||||||
.run({
|
.run({
|
||||||
nodes: [ref.current],
|
nodes: [ref.current],
|
||||||
|
suppressErrors: true,
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
props.onError();
|
setHasError(true);
|
||||||
console.error("[Mermaid] ", e.message);
|
console.error("[Mermaid] ", e.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -42,10 +44,17 @@ export function Mermaid(props: { code: string; onError: () => void }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasError) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="no-dark"
|
className="no-dark mermaid"
|
||||||
style={{ cursor: "pointer", overflow: "auto" }}
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
overflow: "auto",
|
||||||
|
}}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
onClick={() => viewSvgInNewWindow()}
|
onClick={() => viewSvgInNewWindow()}
|
||||||
>
|
>
|
||||||
@@ -56,33 +65,40 @@ export function Mermaid(props: { code: string; onError: () => void }) {
|
|||||||
|
|
||||||
export function PreCode(props: { children: any }) {
|
export function PreCode(props: { children: any }) {
|
||||||
const ref = useRef<HTMLPreElement>(null);
|
const ref = useRef<HTMLPreElement>(null);
|
||||||
|
const refText = ref.current?.innerText;
|
||||||
const [mermaidCode, setMermaidCode] = useState("");
|
const [mermaidCode, setMermaidCode] = useState("");
|
||||||
|
|
||||||
useEffect(() => {
|
const renderMermaid = useDebouncedCallback(() => {
|
||||||
if (!ref.current) return;
|
if (!ref.current) return;
|
||||||
const mermaidDom = ref.current.querySelector("code.language-mermaid");
|
const mermaidDom = ref.current.querySelector("code.language-mermaid");
|
||||||
if (mermaidDom) {
|
if (mermaidDom) {
|
||||||
setMermaidCode((mermaidDom as HTMLElement).innerText);
|
setMermaidCode((mermaidDom as HTMLElement).innerText);
|
||||||
}
|
}
|
||||||
}, [props.children]);
|
}, 600);
|
||||||
|
|
||||||
if (mermaidCode) {
|
useEffect(() => {
|
||||||
return <Mermaid code={mermaidCode} onError={() => setMermaidCode("")} />;
|
setTimeout(renderMermaid, 1);
|
||||||
}
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [refText]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<pre ref={ref}>
|
<>
|
||||||
<span
|
{mermaidCode.length > 0 && (
|
||||||
className="copy-code-button"
|
<Mermaid code={mermaidCode} key={mermaidCode} />
|
||||||
onClick={() => {
|
)}
|
||||||
if (ref.current) {
|
<pre ref={ref}>
|
||||||
const code = ref.current.innerText;
|
<span
|
||||||
copyToClipboard(code);
|
className="copy-code-button"
|
||||||
}
|
onClick={() => {
|
||||||
}}
|
if (ref.current) {
|
||||||
></span>
|
const code = ref.current.innerText;
|
||||||
{props.children}
|
copyToClipboard(code);
|
||||||
</pre>
|
}
|
||||||
|
}}
|
||||||
|
></span>
|
||||||
|
{props.children}
|
||||||
|
</pre>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,6 +195,7 @@ export function Markdown(
|
|||||||
fontSize: `${props.fontSize ?? 14}px`,
|
fontSize: `${props.fontSize ?? 14}px`,
|
||||||
height: getSize(renderedHeight.current),
|
height: getSize(renderedHeight.current),
|
||||||
width: getSize(renderedWidth.current),
|
width: getSize(renderedWidth.current),
|
||||||
|
direction: /[\u0600-\u06FF]/.test(props.content) ? "rtl" : "ltr",
|
||||||
}}
|
}}
|
||||||
ref={mdRef}
|
ref={mdRef}
|
||||||
onContextMenu={props.onContextMenu}
|
onContextMenu={props.onContextMenu}
|
||||||
|
@@ -15,7 +15,15 @@ import CopyIcon from "../icons/copy.svg";
|
|||||||
import { DEFAULT_MASK_AVATAR, Mask, useMaskStore } from "../store/mask";
|
import { DEFAULT_MASK_AVATAR, Mask, useMaskStore } from "../store/mask";
|
||||||
import { ChatMessage, ModelConfig, useAppConfig, useChatStore } from "../store";
|
import { ChatMessage, ModelConfig, useAppConfig, useChatStore } from "../store";
|
||||||
import { ROLES } from "../client/api";
|
import { ROLES } from "../client/api";
|
||||||
import { Input, List, ListItem, Modal, Popover, Select } from "./ui-lib";
|
import {
|
||||||
|
Input,
|
||||||
|
List,
|
||||||
|
ListItem,
|
||||||
|
Modal,
|
||||||
|
Popover,
|
||||||
|
Select,
|
||||||
|
showConfirm,
|
||||||
|
} from "./ui-lib";
|
||||||
import { Avatar, AvatarPicker } from "./emoji";
|
import { Avatar, AvatarPicker } from "./emoji";
|
||||||
import Locale, { AllLangs, ALL_LANG_OPTIONS, Lang } from "../locales";
|
import Locale, { AllLangs, ALL_LANG_OPTIONS, Lang } from "../locales";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
@@ -125,10 +133,10 @@ export function MaskConfig(props: {
|
|||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
checked={props.mask.syncGlobalConfig}
|
checked={props.mask.syncGlobalConfig}
|
||||||
onChange={(e) => {
|
onChange={async (e) => {
|
||||||
if (
|
if (
|
||||||
e.currentTarget.checked &&
|
e.currentTarget.checked &&
|
||||||
confirm(Locale.Mask.Config.Sync.Confirm)
|
(await showConfirm(Locale.Mask.Config.Sync.Confirm))
|
||||||
) {
|
) {
|
||||||
props.updateMask((mask) => {
|
props.updateMask((mask) => {
|
||||||
mask.syncGlobalConfig = e.currentTarget.checked;
|
mask.syncGlobalConfig = e.currentTarget.checked;
|
||||||
@@ -439,8 +447,8 @@ export function MaskPage() {
|
|||||||
<IconButton
|
<IconButton
|
||||||
icon={<DeleteIcon />}
|
icon={<DeleteIcon />}
|
||||||
text={Locale.Mask.Item.Delete}
|
text={Locale.Mask.Item.Delete}
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
if (confirm(Locale.Mask.Item.DeleteConfirm)) {
|
if (await showConfirm(Locale.Mask.Item.DeleteConfirm)) {
|
||||||
maskStore.delete(m.id);
|
maskStore.delete(m.id);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@@ -2,7 +2,7 @@ import { ALL_MODELS, ModalConfigValidator, ModelConfig } from "../store";
|
|||||||
|
|
||||||
import Locale from "../locales";
|
import Locale from "../locales";
|
||||||
import { InputRange } from "./input-range";
|
import { InputRange } from "./input-range";
|
||||||
import { List, ListItem, Select } from "./ui-lib";
|
import { ListItem, Select } from "./ui-lib";
|
||||||
|
|
||||||
export function ModelConfigList(props: {
|
export function ModelConfigList(props: {
|
||||||
modelConfig: ModelConfig;
|
modelConfig: ModelConfig;
|
||||||
@@ -88,6 +88,42 @@ export function ModelConfigList(props: {
|
|||||||
></InputRange>
|
></InputRange>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
|
|
||||||
|
<ListItem
|
||||||
|
title={Locale.Settings.FrequencyPenalty.Title}
|
||||||
|
subTitle={Locale.Settings.FrequencyPenalty.SubTitle}
|
||||||
|
>
|
||||||
|
<InputRange
|
||||||
|
value={props.modelConfig.frequency_penalty?.toFixed(1)}
|
||||||
|
min="-2"
|
||||||
|
max="2"
|
||||||
|
step="0.1"
|
||||||
|
onChange={(e) => {
|
||||||
|
props.updateConfig(
|
||||||
|
(config) =>
|
||||||
|
(config.frequency_penalty =
|
||||||
|
ModalConfigValidator.frequency_penalty(
|
||||||
|
e.currentTarget.valueAsNumber,
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
></InputRange>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
|
<ListItem
|
||||||
|
title={Locale.Settings.InputTemplate.Title}
|
||||||
|
subTitle={Locale.Settings.InputTemplate.SubTitle}
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={props.modelConfig.template}
|
||||||
|
onChange={(e) =>
|
||||||
|
props.updateConfig(
|
||||||
|
(config) => (config.template = e.currentTarget.value),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
></input>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
<ListItem
|
<ListItem
|
||||||
title={Locale.Settings.HistoryCount.Title}
|
title={Locale.Settings.HistoryCount.Title}
|
||||||
subTitle={Locale.Settings.HistoryCount.SubTitle}
|
subTitle={Locale.Settings.HistoryCount.SubTitle}
|
||||||
|
@@ -14,6 +14,7 @@ import Locale from "../locales";
|
|||||||
import { useAppConfig, useChatStore } from "../store";
|
import { useAppConfig, useChatStore } from "../store";
|
||||||
import { MaskAvatar } from "./mask";
|
import { MaskAvatar } from "./mask";
|
||||||
import { useCommand } from "../command";
|
import { useCommand } from "../command";
|
||||||
|
import { showConfirm } from "./ui-lib";
|
||||||
|
|
||||||
function getIntersectionArea(aRect: DOMRect, bRect: DOMRect) {
|
function getIntersectionArea(aRect: DOMRect, bRect: DOMRect) {
|
||||||
const xmin = Math.max(aRect.x, bRect.x);
|
const xmin = Math.max(aRect.x, bRect.x);
|
||||||
@@ -125,8 +126,8 @@ export function NewChat() {
|
|||||||
{!state?.fromHome && (
|
{!state?.fromHome && (
|
||||||
<IconButton
|
<IconButton
|
||||||
text={Locale.NewChat.NotShow}
|
text={Locale.NewChat.NotShow}
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
if (confirm(Locale.NewChat.ConfirmNoShow)) {
|
if (await showConfirm(Locale.NewChat.ConfirmNoShow)) {
|
||||||
startChat();
|
startChat();
|
||||||
config.update(
|
config.update(
|
||||||
(config) => (config.dontShowMaskSplashScreen = true),
|
(config) => (config.dontShowMaskSplashScreen = true),
|
||||||
|
@@ -18,6 +18,7 @@ import {
|
|||||||
PasswordInput,
|
PasswordInput,
|
||||||
Popover,
|
Popover,
|
||||||
Select,
|
Select,
|
||||||
|
showConfirm,
|
||||||
} from "./ui-lib";
|
} from "./ui-lib";
|
||||||
import { ModelConfigList } from "./model-config";
|
import { ModelConfigList } from "./model-config";
|
||||||
|
|
||||||
@@ -46,6 +47,7 @@ import { InputRange } from "./input-range";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { Avatar, AvatarPicker } from "./emoji";
|
import { Avatar, AvatarPicker } from "./emoji";
|
||||||
import { getClientConfig } from "../config/client";
|
import { getClientConfig } from "../config/client";
|
||||||
|
import { useSyncStore } from "../store/sync";
|
||||||
|
|
||||||
function EditPromptModal(props: { id: number; onClose: () => void }) {
|
function EditPromptModal(props: { id: number; onClose: () => void }) {
|
||||||
const promptStore = usePromptStore();
|
const promptStore = usePromptStore();
|
||||||
@@ -198,6 +200,116 @@ function UserPromptModal(props: { onClose?: () => void }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function DangerItems() {
|
||||||
|
const chatStore = useChatStore();
|
||||||
|
const appConfig = useAppConfig();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<List>
|
||||||
|
<ListItem
|
||||||
|
title={Locale.Settings.Danger.Reset.Title}
|
||||||
|
subTitle={Locale.Settings.Danger.Reset.SubTitle}
|
||||||
|
>
|
||||||
|
<IconButton
|
||||||
|
text={Locale.Settings.Danger.Reset.Action}
|
||||||
|
onClick={async () => {
|
||||||
|
if (await showConfirm(Locale.Settings.Danger.Reset.Confirm)) {
|
||||||
|
appConfig.reset();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
type="danger"
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
<ListItem
|
||||||
|
title={Locale.Settings.Danger.Clear.Title}
|
||||||
|
subTitle={Locale.Settings.Danger.Clear.SubTitle}
|
||||||
|
>
|
||||||
|
<IconButton
|
||||||
|
text={Locale.Settings.Danger.Clear.Action}
|
||||||
|
onClick={async () => {
|
||||||
|
if (await showConfirm(Locale.Settings.Danger.Clear.Confirm)) {
|
||||||
|
chatStore.clearAllData();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
type="danger"
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
</List>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function SyncItems() {
|
||||||
|
const syncStore = useSyncStore();
|
||||||
|
const webdav = syncStore.webDavConfig;
|
||||||
|
|
||||||
|
// not ready: https://github.com/Yidadaa/ChatGPT-Next-Web/issues/920#issuecomment-1609866332
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<List>
|
||||||
|
<ListItem
|
||||||
|
title={"上次同步:" + new Date().toLocaleString()}
|
||||||
|
subTitle={"20 次对话,100 条消息,200 提示词,20 面具"}
|
||||||
|
>
|
||||||
|
<IconButton
|
||||||
|
icon={<ResetIcon />}
|
||||||
|
text="同步"
|
||||||
|
onClick={() => {
|
||||||
|
syncStore.check().then(console.log);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
|
<ListItem
|
||||||
|
title={"本地备份"}
|
||||||
|
subTitle={"20 次对话,100 条消息,200 提示词,20 面具"}
|
||||||
|
></ListItem>
|
||||||
|
|
||||||
|
<ListItem
|
||||||
|
title={"Web Dav Server"}
|
||||||
|
subTitle={Locale.Settings.AccessCode.SubTitle}
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
value={webdav.server}
|
||||||
|
type="text"
|
||||||
|
placeholder={"https://example.com"}
|
||||||
|
onChange={(e) => {
|
||||||
|
syncStore.update(
|
||||||
|
(config) => (config.server = e.currentTarget.value),
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
|
<ListItem title="Web Dav User Name" subTitle="user name here">
|
||||||
|
<input
|
||||||
|
value={webdav.username}
|
||||||
|
type="text"
|
||||||
|
placeholder={"username"}
|
||||||
|
onChange={(e) => {
|
||||||
|
syncStore.update(
|
||||||
|
(config) => (config.username = e.currentTarget.value),
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
|
||||||
|
<ListItem title="Web Dav Password" subTitle="password here">
|
||||||
|
<input
|
||||||
|
value={webdav.password}
|
||||||
|
type="text"
|
||||||
|
placeholder={"password"}
|
||||||
|
onChange={(e) => {
|
||||||
|
syncStore.update(
|
||||||
|
(config) => (config.password = e.currentTarget.value),
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
</List>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function formatVersionDate(t: string) {
|
function formatVersionDate(t: string) {
|
||||||
const d = new Date(+t);
|
const d = new Date(+t);
|
||||||
const year = d.getUTCFullYear();
|
const year = d.getUTCFullYear();
|
||||||
@@ -216,7 +328,6 @@ export function Settings() {
|
|||||||
const [showEmojiPicker, setShowEmojiPicker] = useState(false);
|
const [showEmojiPicker, setShowEmojiPicker] = useState(false);
|
||||||
const config = useAppConfig();
|
const config = useAppConfig();
|
||||||
const updateConfig = config.update;
|
const updateConfig = config.update;
|
||||||
const resetConfig = config.reset;
|
|
||||||
const chatStore = useChatStore();
|
const chatStore = useChatStore();
|
||||||
|
|
||||||
const updateStore = useUpdateStore();
|
const updateStore = useUpdateStore();
|
||||||
@@ -301,36 +412,13 @@ export function Settings() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="window-actions">
|
<div className="window-actions">
|
||||||
<div className="window-action-button">
|
<div className="window-action-button"></div>
|
||||||
<IconButton
|
<div className="window-action-button"></div>
|
||||||
icon={<ClearIcon />}
|
|
||||||
onClick={() => {
|
|
||||||
if (confirm(Locale.Settings.Actions.ConfirmClearAll)) {
|
|
||||||
chatStore.clearAllData();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
bordered
|
|
||||||
title={Locale.Settings.Actions.ClearAll}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="window-action-button">
|
|
||||||
<IconButton
|
|
||||||
icon={<ResetIcon />}
|
|
||||||
onClick={() => {
|
|
||||||
if (confirm(Locale.Settings.Actions.ConfirmResetAll)) {
|
|
||||||
resetConfig();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
bordered
|
|
||||||
title={Locale.Settings.Actions.ResetAll}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="window-action-button">
|
<div className="window-action-button">
|
||||||
<IconButton
|
<IconButton
|
||||||
icon={<CloseIcon />}
|
icon={<CloseIcon />}
|
||||||
onClick={() => navigate(Path.Home)}
|
onClick={() => navigate(Path.Home)}
|
||||||
bordered
|
bordered
|
||||||
title={Locale.Settings.Actions.Close}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -522,29 +610,31 @@ export function Settings() {
|
|||||||
</ListItem>
|
</ListItem>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
<ListItem
|
{!accessStore.hideBalanceQuery ? (
|
||||||
title={Locale.Settings.Usage.Title}
|
<ListItem
|
||||||
subTitle={
|
title={Locale.Settings.Usage.Title}
|
||||||
showUsage
|
subTitle={
|
||||||
? loadingUsage
|
showUsage
|
||||||
? Locale.Settings.Usage.IsChecking
|
? loadingUsage
|
||||||
: Locale.Settings.Usage.SubTitle(
|
? Locale.Settings.Usage.IsChecking
|
||||||
usage?.used ?? "[?]",
|
: Locale.Settings.Usage.SubTitle(
|
||||||
usage?.subscription ?? "[?]",
|
usage?.used ?? "[?]",
|
||||||
)
|
usage?.subscription ?? "[?]",
|
||||||
: Locale.Settings.Usage.NoAccess
|
)
|
||||||
}
|
: Locale.Settings.Usage.NoAccess
|
||||||
>
|
}
|
||||||
{!showUsage || loadingUsage ? (
|
>
|
||||||
<div />
|
{!showUsage || loadingUsage ? (
|
||||||
) : (
|
<div />
|
||||||
<IconButton
|
) : (
|
||||||
icon={<ResetIcon></ResetIcon>}
|
<IconButton
|
||||||
text={Locale.Settings.Usage.Check}
|
icon={<ResetIcon></ResetIcon>}
|
||||||
onClick={() => checkUsage(true)}
|
text={Locale.Settings.Usage.Check}
|
||||||
/>
|
onClick={() => checkUsage(true)}
|
||||||
)}
|
/>
|
||||||
</ListItem>
|
)}
|
||||||
|
</ListItem>
|
||||||
|
) : null}
|
||||||
|
|
||||||
{!accessStore.hideUserApiKey ? (
|
{!accessStore.hideUserApiKey ? (
|
||||||
<ListItem
|
<ListItem
|
||||||
@@ -554,6 +644,7 @@ export function Settings() {
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
value={accessStore.openaiUrl}
|
value={accessStore.openaiUrl}
|
||||||
|
placeholder="https://api.openai.com/"
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
accessStore.updateOpenAiUrl(e.currentTarget.value)
|
accessStore.updateOpenAiUrl(e.currentTarget.value)
|
||||||
}
|
}
|
||||||
@@ -594,6 +685,8 @@ export function Settings() {
|
|||||||
</ListItem>
|
</ListItem>
|
||||||
</List>
|
</List>
|
||||||
|
|
||||||
|
<SyncItems />
|
||||||
|
|
||||||
<List>
|
<List>
|
||||||
<ModelConfigList
|
<ModelConfigList
|
||||||
modelConfig={config.modelConfig}
|
modelConfig={config.modelConfig}
|
||||||
@@ -608,6 +701,8 @@ export function Settings() {
|
|||||||
{shouldShowPromptModal && (
|
{shouldShowPromptModal && (
|
||||||
<UserPromptModal onClose={() => setShowPromptModal(false)} />
|
<UserPromptModal onClose={() => setShowPromptModal(false)} />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<DangerItems />
|
||||||
</div>
|
</div>
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
);
|
);
|
||||||
|
@@ -26,7 +26,7 @@ import {
|
|||||||
import { Link, useNavigate } from "react-router-dom";
|
import { Link, useNavigate } from "react-router-dom";
|
||||||
import { useMobileScreen } from "../utils";
|
import { useMobileScreen } from "../utils";
|
||||||
import dynamic from "next/dynamic";
|
import dynamic from "next/dynamic";
|
||||||
import { showToast } from "./ui-lib";
|
import { showConfirm, showToast } from "./ui-lib";
|
||||||
|
|
||||||
const ChatList = dynamic(async () => (await import("./chat-list")).ChatList, {
|
const ChatList = dynamic(async () => (await import("./chat-list")).ChatList, {
|
||||||
loading: () => null,
|
loading: () => null,
|
||||||
@@ -37,14 +37,11 @@ function useHotKey() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onKeyDown = (e: KeyboardEvent) => {
|
const onKeyDown = (e: KeyboardEvent) => {
|
||||||
if (e.metaKey || e.altKey || e.ctrlKey) {
|
if (e.altKey || e.ctrlKey) {
|
||||||
const n = chatStore.sessions.length;
|
|
||||||
const limit = (x: number) => (x + n) % n;
|
|
||||||
const i = chatStore.currentSessionIndex;
|
|
||||||
if (e.key === "ArrowUp") {
|
if (e.key === "ArrowUp") {
|
||||||
chatStore.selectSession(limit(i - 1));
|
chatStore.nextSession(-1);
|
||||||
} else if (e.key === "ArrowDown") {
|
} else if (e.key === "ArrowDown") {
|
||||||
chatStore.selectSession(limit(i + 1));
|
chatStore.nextSession(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -163,8 +160,8 @@ export function SideBar(props: { className?: string }) {
|
|||||||
<div className={styles["sidebar-action"] + " " + styles.mobile}>
|
<div className={styles["sidebar-action"] + " " + styles.mobile}>
|
||||||
<IconButton
|
<IconButton
|
||||||
icon={<CloseIcon />}
|
icon={<CloseIcon />}
|
||||||
onClick={() => {
|
onClick={async () => {
|
||||||
if (confirm(Locale.Home.DeleteChat)) {
|
if (await showConfirm(Locale.Home.DeleteChat)) {
|
||||||
chatStore.deleteSession(chatStore.currentSessionIndex);
|
chatStore.deleteSession(chatStore.currentSessionIndex);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@@ -207,7 +207,7 @@
|
|||||||
.select-with-icon {
|
.select-with-icon {
|
||||||
position: relative;
|
position: relative;
|
||||||
max-width: fit-content;
|
max-width: fit-content;
|
||||||
|
|
||||||
.select-with-icon-select {
|
.select-with-icon-select {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border: var(--border-in-light);
|
border: var(--border-in-light);
|
||||||
@@ -227,4 +227,24 @@
|
|||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal-input {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 10px;
|
||||||
|
border: var(--border-in-light);
|
||||||
|
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.03);
|
||||||
|
background-color: var(--white);
|
||||||
|
color: var(--black);
|
||||||
|
font-family: inherit;
|
||||||
|
padding: 10px 90px 10px 14px;
|
||||||
|
resize: none;
|
||||||
|
outline: none;
|
||||||
|
box-sizing: border-box;
|
||||||
|
min-height: 68px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
border: 1px solid var(--primary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -4,6 +4,10 @@ import CloseIcon from "../icons/close.svg";
|
|||||||
import EyeIcon from "../icons/eye.svg";
|
import EyeIcon from "../icons/eye.svg";
|
||||||
import EyeOffIcon from "../icons/eye-off.svg";
|
import EyeOffIcon from "../icons/eye-off.svg";
|
||||||
import DownIcon from "../icons/down.svg";
|
import DownIcon from "../icons/down.svg";
|
||||||
|
import ConfirmIcon from "../icons/confirm.svg";
|
||||||
|
import CancelIcon from "../icons/cancel.svg";
|
||||||
|
|
||||||
|
import Locale from "../locales";
|
||||||
|
|
||||||
import { createRoot } from "react-dom/client";
|
import { createRoot } from "react-dom/client";
|
||||||
import React, { HTMLProps, useEffect, useState } from "react";
|
import React, { HTMLProps, useEffect, useState } from "react";
|
||||||
@@ -87,7 +91,7 @@ export function Loading() {
|
|||||||
|
|
||||||
interface ModalProps {
|
interface ModalProps {
|
||||||
title: string;
|
title: string;
|
||||||
children?: JSX.Element | JSX.Element[];
|
children?: any;
|
||||||
actions?: JSX.Element[];
|
actions?: JSX.Element[];
|
||||||
onClose?: () => void;
|
onClose?: () => void;
|
||||||
}
|
}
|
||||||
@@ -262,3 +266,128 @@ export function Select(
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function showConfirm(content: any) {
|
||||||
|
const div = document.createElement("div");
|
||||||
|
div.className = "modal-mask";
|
||||||
|
document.body.appendChild(div);
|
||||||
|
|
||||||
|
const root = createRoot(div);
|
||||||
|
const closeModal = () => {
|
||||||
|
root.unmount();
|
||||||
|
div.remove();
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Promise<boolean>((resolve) => {
|
||||||
|
root.render(
|
||||||
|
<Modal
|
||||||
|
title={Locale.UI.Confirm}
|
||||||
|
actions={[
|
||||||
|
<IconButton
|
||||||
|
key="cancel"
|
||||||
|
text={Locale.UI.Cancel}
|
||||||
|
onClick={() => {
|
||||||
|
resolve(false);
|
||||||
|
closeModal();
|
||||||
|
}}
|
||||||
|
icon={<CancelIcon />}
|
||||||
|
tabIndex={0}
|
||||||
|
bordered
|
||||||
|
shadow
|
||||||
|
></IconButton>,
|
||||||
|
<IconButton
|
||||||
|
key="confirm"
|
||||||
|
text={Locale.UI.Confirm}
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
resolve(true);
|
||||||
|
closeModal();
|
||||||
|
}}
|
||||||
|
icon={<ConfirmIcon />}
|
||||||
|
tabIndex={0}
|
||||||
|
autoFocus
|
||||||
|
bordered
|
||||||
|
shadow
|
||||||
|
></IconButton>,
|
||||||
|
]}
|
||||||
|
onClose={closeModal}
|
||||||
|
>
|
||||||
|
{content}
|
||||||
|
</Modal>,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function PromptInput(props: {
|
||||||
|
value: string;
|
||||||
|
onChange: (value: string) => void;
|
||||||
|
}) {
|
||||||
|
const [input, setInput] = useState(props.value);
|
||||||
|
const onInput = (value: string) => {
|
||||||
|
props.onChange(value);
|
||||||
|
setInput(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<textarea
|
||||||
|
className={styles["modal-input"]}
|
||||||
|
autoFocus
|
||||||
|
value={input}
|
||||||
|
onInput={(e) => onInput(e.currentTarget.value)}
|
||||||
|
></textarea>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function showPrompt(content: any, value = "") {
|
||||||
|
const div = document.createElement("div");
|
||||||
|
div.className = "modal-mask";
|
||||||
|
document.body.appendChild(div);
|
||||||
|
|
||||||
|
const root = createRoot(div);
|
||||||
|
const closeModal = () => {
|
||||||
|
root.unmount();
|
||||||
|
div.remove();
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Promise<string>((resolve) => {
|
||||||
|
let userInput = "";
|
||||||
|
|
||||||
|
root.render(
|
||||||
|
<Modal
|
||||||
|
title={content}
|
||||||
|
actions={[
|
||||||
|
<IconButton
|
||||||
|
key="cancel"
|
||||||
|
text={Locale.UI.Cancel}
|
||||||
|
onClick={() => {
|
||||||
|
closeModal();
|
||||||
|
}}
|
||||||
|
icon={<CancelIcon />}
|
||||||
|
bordered
|
||||||
|
shadow
|
||||||
|
tabIndex={0}
|
||||||
|
></IconButton>,
|
||||||
|
<IconButton
|
||||||
|
key="confirm"
|
||||||
|
text={Locale.UI.Confirm}
|
||||||
|
type="primary"
|
||||||
|
onClick={() => {
|
||||||
|
resolve(userInput);
|
||||||
|
closeModal();
|
||||||
|
}}
|
||||||
|
icon={<ConfirmIcon />}
|
||||||
|
bordered
|
||||||
|
shadow
|
||||||
|
tabIndex={0}
|
||||||
|
></IconButton>,
|
||||||
|
]}
|
||||||
|
onClose={closeModal}
|
||||||
|
>
|
||||||
|
<PromptInput
|
||||||
|
onChange={(val) => (userInput = val)}
|
||||||
|
value={value}
|
||||||
|
></PromptInput>
|
||||||
|
</Modal>,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@@ -12,6 +12,7 @@ declare global {
|
|||||||
DISABLE_GPT4?: string; // allow user to use gpt-4 or not
|
DISABLE_GPT4?: string; // allow user to use gpt-4 or not
|
||||||
BUILD_MODE?: "standalone" | "export";
|
BUILD_MODE?: "standalone" | "export";
|
||||||
BUILD_APP?: string; // is building desktop app
|
BUILD_APP?: string; // is building desktop app
|
||||||
|
HIDE_BALANCE_QUERY?: string; // allow user to query balance or not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -46,5 +47,6 @@ export const getServerSideConfig = () => {
|
|||||||
isVercel: !!process.env.VERCEL,
|
isVercel: !!process.env.VERCEL,
|
||||||
hideUserApiKey: !!process.env.HIDE_USER_API_KEY,
|
hideUserApiKey: !!process.env.HIDE_USER_API_KEY,
|
||||||
enableGPT4: !process.env.DISABLE_GPT4,
|
enableGPT4: !process.env.DISABLE_GPT4,
|
||||||
|
hideBalanceQuery: !!process.env.HIDE_BALANCE_QUERY,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@@ -33,6 +33,7 @@ export enum StoreKey {
|
|||||||
Mask = "mask-store",
|
Mask = "mask-store",
|
||||||
Prompt = "prompt-store",
|
Prompt = "prompt-store",
|
||||||
Update = "chat-update",
|
Update = "chat-update",
|
||||||
|
Sync = "sync",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MAX_SIDEBAR_WIDTH = 500;
|
export const MAX_SIDEBAR_WIDTH = 500;
|
||||||
@@ -52,3 +53,10 @@ export const OpenaiPath = {
|
|||||||
UsagePath: "dashboard/billing/usage",
|
UsagePath: "dashboard/billing/usage",
|
||||||
SubsPath: "dashboard/billing/subscription",
|
SubsPath: "dashboard/billing/subscription",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const DEFAULT_INPUT_TEMPLATE = `{{input}}`; // input / time / model / lang
|
||||||
|
export const DEFAULT_SYSTEM_TEMPLATE = `
|
||||||
|
You are ChatGPT, a large language model trained by OpenAI.
|
||||||
|
Knowledge cutoff: 2021-09
|
||||||
|
Current model: {{model}}
|
||||||
|
Current time: {{time}}`;
|
||||||
|
6
app/global.d.ts
vendored
6
app/global.d.ts
vendored
@@ -9,3 +9,9 @@ declare module "*.scss" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
declare module "*.svg";
|
declare module "*.svg";
|
||||||
|
|
||||||
|
declare interface Window {
|
||||||
|
__TAURI__?: {
|
||||||
|
writeText(text: string): Promise<void>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
1
app/icons/cancel.svg
Normal file
1
app/icons/cancel.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16" fill="none"><g opacity="1" transform="translate(0 0) rotate(0)"><mask id="bg-mask-0" fill="white"><use xlink:href="#path_0"></use></mask><g mask="url(#bg-mask-0)" ><path id="路径 1" style="fill:#333333; opacity:1;" d="M13.9967,8.00337c0,-0.81625 -0.1569,-1.59615 -0.4707,-2.3397c-0.30307,-0.71824 -0.73117,-1.3542 -1.2843,-1.90789c-0.55287,-0.55348 -1.18783,-0.98185 -1.9049,-1.28512c-0.74182,-0.31375 -1.51963,-0.47062 -2.33343,-0.47062c-0.81634,0 -1.59621,0.15693 -2.3396,0.47079c-0.71828,0.30325 -1.35419,0.73165 -1.90774,1.2852c-0.55355,0.55354 -0.98195,1.18945 -1.2852,1.90774c-0.31386,0.74339 -0.47079,1.52326 -0.47079,2.3396c0,0.8138 0.15687,1.59161 0.47062,2.33343c0.30327,0.71707 0.73164,1.35203 1.28512,1.9049c0.55369,0.55313 1.18965,0.98123 1.90789,1.2843c0.74355,0.3138 1.52345,0.4707 2.3397,0.4707c0.81371,0 1.59155,-0.15683 2.33353,-0.4705c0.717,-0.30313 1.35203,-0.7312 1.9051,-1.2842c0.553,-0.55307 0.98107,-1.1881 1.2842,-1.9051c0.31367,-0.74198 0.4705,-1.51982 0.4705,-2.33353zM15.33,8.00337c0,0.99387 -0.1919,1.94478 -0.5757,2.85273c-0.37067,0.87673 -0.89383,1.65297 -1.5695,2.3287c-0.67573,0.67567 -1.45197,1.19883 -2.3287,1.5695c-0.90795,0.3838 -1.85886,0.5757 -2.85273,0.5757c-0.99612,0 -1.94882,-0.19183 -2.8581,-0.5755c-0.8781,-0.3706 -1.65537,-0.89377 -2.33181,-1.5695c-0.67631,-0.6756 -1.19992,-1.45187 -1.57081,-2.3288c-0.38396,-0.90784 -0.57594,-1.85878 -0.57594,-2.85283c0,-0.99629 0.19192,-1.94903 0.57577,-2.8582c0.37081,-0.87829 0.89439,-1.6556 1.57074,-2.33195c0.67635,-0.67635 1.45367,-1.19993 2.33195,-1.57074c0.90917,-0.38385 1.86191,-0.57577 2.8582,-0.57577c0.99405,0 1.94499,0.19198 2.85283,0.57594c0.87693,0.37089 1.6532,0.8945 2.3288,1.57081c0.67573,0.67644 1.1989,1.45371 1.5695,2.33181c0.38367,0.90928 0.5755,1.86198 0.5755,2.8581z"></path><path id="路径 2" style="fill:#333333; opacity:1;" d="M5.4714,4.5286l6,6c0.03093,0.03093 0.05857,0.0646 0.0829,0.101c0.02433,0.0364 0.04487,0.07483 0.0616,0.1153c0.01673,0.0404 0.0294,0.08207 0.038,0.125c0.00853,0.04293 0.0128,0.0863 0.0128,0.1301c0,0.0438 -0.00427,0.08717 -0.0128,0.1301c-0.0086,0.04293 -0.02127,0.0846 -0.038,0.125c-0.01673,0.04047 -0.03727,0.0789 -0.0616,0.1153c-0.02433,0.0364 -0.05197,0.07007 -0.0829,0.101c-0.03093,0.03093 -0.0646,0.05857 -0.101,0.0829c-0.0364,0.02433 -0.07483,0.04487 -0.1153,0.0616c-0.0404,0.01673 -0.08207,0.0294 -0.125,0.038c-0.04293,0.00853 -0.0863,0.0128 -0.1301,0.0128c-0.0438,0 -0.08717,-0.00427 -0.1301,-0.0128c-0.04293,-0.0086 -0.0846,-0.02127 -0.125,-0.038c-0.04047,-0.01673 -0.0789,-0.03727 -0.1153,-0.0616c-0.0364,-0.02433 -0.07007,-0.05197 -0.101,-0.0829l-6,-6c-0.03095,-0.03095 -0.05859,-0.06463 -0.08291,-0.10102c-0.02432,-0.0364 -0.04486,-0.07482 -0.06161,-0.11526c-0.01675,-0.04044 -0.0294,-0.08213 -0.03794,-0.12506c-0.00854,-0.04293 -0.01281,-0.08629 -0.01281,-0.13006c0,-0.04377 0.00427,-0.08713 0.01281,-0.13006c0.00854,-0.04293 0.02119,-0.08462 0.03794,-0.12506c0.01675,-0.04045 0.03729,-0.07887 0.06161,-0.11526c0.02432,-0.0364 0.05196,-0.07007 0.08291,-0.10102c0.03095,-0.03095 0.06462,-0.05859 0.10102,-0.08291c0.03639,-0.02432 0.07481,-0.04486 0.11526,-0.06161c0.04044,-0.01675 0.08213,-0.0294 0.12506,-0.03794c0.04293,-0.00854 0.08629,-0.01281 0.13006,-0.01281c0.04377,0 0.08713,0.00427 0.13006,0.01281c0.04293,0.00854 0.08462,0.02119 0.12506,0.03794c0.04044,0.01675 0.07886,0.03729 0.11526,0.06161c0.03639,0.02432 0.07007,0.05196 0.10102,0.08291z"></path></g></g><defs><rect id="path_0" x="0" y="0" width="16" height="16" /></defs></svg>
|
After Width: | Height: | Size: 3.5 KiB |
1
app/icons/confirm.svg
Normal file
1
app/icons/confirm.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16" fill="none"><g opacity="1" transform="translate(0 0) rotate(0)"><mask id="bg-mask-0" fill="white"><use xlink:href="#path_0"></use></mask><g mask="url(#bg-mask-0)" ><path id="路径 1" style="fill:#333333; opacity:1;" d="M5.99607,12.8916c-0.03633,0.02413 -0.07466,0.04453 -0.11499,0.0612c-0.04034,0.01667 -0.08191,0.02923 -0.12471,0.0377c-0.04281,0.00853 -0.08603,0.0128 -0.12967,0.0128c-0.04364,0 -0.08686,-0.00423 -0.12966,-0.0127c-0.04281,-0.00847 -0.08438,-0.02103 -0.12472,-0.0377c-0.04034,-0.01667 -0.07867,-0.03707 -0.115,-0.0612c-0.03633,-0.0242 -0.06997,-0.0517 -0.1009,-0.0825l-3.96,-3.93998c-0.03103,-0.03087 -0.05876,-0.06448 -0.08317,-0.10081c-0.02441,-0.03634 -0.04505,-0.07471 -0.0619,-0.1151c-0.01685,-0.0404 -0.0296,-0.08206 -0.03825,-0.12497c-0.00865,-0.04291 -0.01303,-0.08626 -0.01314,-0.13003c-0.00011,-0.04377 0.00405,-0.08714 0.01248,-0.13009c0.00843,-0.04295 0.02097,-0.08467 0.03762,-0.12516c0.01665,-0.04048 0.03709,-0.07895 0.06132,-0.11541c0.02423,-0.03646 0.05178,-0.0702 0.08265,-0.10123c0.03087,-0.03103 0.06448,-0.05876 0.10081,-0.08317c0.03634,-0.02441 0.07471,-0.04505 0.11511,-0.0619c0.04039,-0.01685 0.08205,-0.0296 0.12496,-0.03825c0.04291,-0.00865 0.08626,-0.01303 0.13003,-0.01314c0.04377,-0.00011 0.08714,0.00405 0.13009,0.01248c0.04295,0.00843 0.08467,0.02097 0.12516,0.03762c0.04048,0.01665 0.07895,0.03709 0.11541,0.06132c0.03646,0.02423 0.07021,0.05178 0.10124,0.08265l3.48968,3.47207l8.23978,-8.20196c0.031,-0.03088 0.06473,-0.05844 0.1012,-0.08268c0.03647,-0.02423 0.07493,-0.04468 0.1154,-0.06134c0.04047,-0.01666 0.0822,-0.02921 0.1252,-0.03765c0.04293,-0.00844 0.0863,-0.01261 0.1301,-0.01251c0.04373,0.0001 0.08707,0.00447 0.13,0.01311c0.04293,0.00864 0.0846,0.02138 0.125,0.03822c0.0404,0.01685 0.07877,0.03747 0.1151,0.06188c0.03633,0.0244 0.06993,0.05211 0.1008,0.08314c0.0624,0.06265 0.1104,0.13486 0.144,0.21661c0.03367,0.08175 0.0504,0.16683 0.0502,0.25524c-0.0002,0.08841 -0.0173,0.17341 -0.0513,0.25501c-0.03407,0.08159 -0.08243,0.15357 -0.1451,0.21594l-8.70996,8.66999c-0.03093,0.0308 -0.06455,0.0583 -0.10087,0.0825z"></path></g></g><defs><rect id="path_0" x="0" y="0" width="16" height="16" /></defs></svg>
|
After Width: | Height: | Size: 2.2 KiB |
1
app/icons/pin.svg
Normal file
1
app/icons/pin.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 5.8 KiB |
1
app/icons/robot.svg
Normal file
1
app/icons/robot.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 12 KiB |
290
app/locales/ar.ts
Normal file
290
app/locales/ar.ts
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
import { SubmitKey } from "../store/config";
|
||||||
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
|
const ar: PartialLocaleType = {
|
||||||
|
WIP: "قريبًا...",
|
||||||
|
Error: {
|
||||||
|
Unauthorized:
|
||||||
|
"غير مصرح بالوصول، يرجى إدخال رمز الوصول [auth](/#/auth) في صفحة المصادقة.",
|
||||||
|
},
|
||||||
|
Auth: {
|
||||||
|
Title: "تحتاج إلى رمز الوصول",
|
||||||
|
Tips: "يرجى إدخال رمز الوصول أدناه",
|
||||||
|
Input: "رمز الوصول",
|
||||||
|
Confirm: "تأكيد",
|
||||||
|
Later: "لاحقًا",
|
||||||
|
},
|
||||||
|
ChatItem: {
|
||||||
|
ChatItemCount: (count: number) => `${count} رسائل`,
|
||||||
|
},
|
||||||
|
Chat: {
|
||||||
|
SubTitle: (count: number) => ` ${count} رسائل مع ChatGPT`,
|
||||||
|
Actions: {
|
||||||
|
ChatList: "الانتقال إلى قائمة الدردشة",
|
||||||
|
CompressedHistory: "ملخص ضغط ذاكرة التاريخ",
|
||||||
|
Export: "تصدير جميع الرسائل كـ Markdown",
|
||||||
|
Copy: "نسخ",
|
||||||
|
Stop: "توقف",
|
||||||
|
Retry: "إعادة المحاولة",
|
||||||
|
Delete: "حذف",
|
||||||
|
},
|
||||||
|
InputActions: {
|
||||||
|
Stop: "توقف",
|
||||||
|
ToBottom: "إلى آخر",
|
||||||
|
Theme: {
|
||||||
|
auto: "تلقائي",
|
||||||
|
light: "نمط فاتح",
|
||||||
|
dark: "نمط داكن",
|
||||||
|
},
|
||||||
|
Prompt: "الاقتراحات",
|
||||||
|
Masks: "الأقنعة",
|
||||||
|
Clear: "مسح السياق",
|
||||||
|
Settings: "الإعدادات",
|
||||||
|
},
|
||||||
|
Rename: "إعادة تسمية الدردشة",
|
||||||
|
Typing: "كتابة...",
|
||||||
|
Input: (submitKey: string) => {
|
||||||
|
var inputHints = ` اضغط على ${submitKey} للإرسال`;
|
||||||
|
if (submitKey === String(SubmitKey.Enter)) {
|
||||||
|
inputHints += "، Shift + Enter للإنشاء";
|
||||||
|
}
|
||||||
|
return inputHints + "، / للبحث في الاقتراحات";
|
||||||
|
},
|
||||||
|
Send: "إرسال",
|
||||||
|
Config: {
|
||||||
|
Reset: "إعادة التعيين إلى الإعدادات الافتراضية",
|
||||||
|
SaveAs: "حفظ كأقنعة",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Export: {
|
||||||
|
Title: "تصدير الرسائل",
|
||||||
|
Copy: "نسخ الكل",
|
||||||
|
Download: "تنزيل",
|
||||||
|
MessageFromYou: "رسالة منك",
|
||||||
|
MessageFromChatGPT: "رسالة من ChatGPT",
|
||||||
|
Share: "مشاركة على ShareGPT",
|
||||||
|
Format: {
|
||||||
|
Title: "صيغة التصدير",
|
||||||
|
SubTitle: "Markdown أو صورة PNG",
|
||||||
|
},
|
||||||
|
IncludeContext: {
|
||||||
|
Title: "تضمين السياق",
|
||||||
|
SubTitle: "تصدير اقتراحات السياق في الأقنعة أم لا",
|
||||||
|
},
|
||||||
|
Steps: {
|
||||||
|
Select: "تحديد",
|
||||||
|
Preview: "معاينة",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Select: {
|
||||||
|
Search: "بحث",
|
||||||
|
All: "تحديد الكل",
|
||||||
|
Latest: "تحديد أحدث",
|
||||||
|
Clear: "مسح",
|
||||||
|
},
|
||||||
|
Memory: {
|
||||||
|
Title: "اقتراحات الذاكرة",
|
||||||
|
EmptyContent: "لا شيء حتى الآن.",
|
||||||
|
Send: "إرسال الذاكرة",
|
||||||
|
Copy: "نسخ الذاكرة",
|
||||||
|
Reset: "إعادة التعيين",
|
||||||
|
ResetConfirm:
|
||||||
|
"سيؤدي إعادة التعيين إلى مسح سجل المحادثة الحالي والذاكرة التاريخية. هل أنت متأكد أنك تريد الاستمرار؟",
|
||||||
|
},
|
||||||
|
Home: {
|
||||||
|
NewChat: "دردشة جديدة",
|
||||||
|
DeleteChat: "هل تريد تأكيد حذف المحادثة المحددة؟",
|
||||||
|
DeleteToast: "تم حذف الدردشة",
|
||||||
|
Revert: "التراجع",
|
||||||
|
},
|
||||||
|
Settings: {
|
||||||
|
Title: "الإعدادات",
|
||||||
|
SubTitle: "جميع الإعدادات",
|
||||||
|
|
||||||
|
Lang: {
|
||||||
|
Name: "Language", // تنبيه: إذا كنت ترغب في إضافة ترجمة جديدة، يرجى عدم ترجمة هذه القيمة وتركها "Language"
|
||||||
|
All: "كل اللغات",
|
||||||
|
},
|
||||||
|
Avatar: "الصورة الرمزية",
|
||||||
|
FontSize: {
|
||||||
|
Title: "حجم الخط",
|
||||||
|
SubTitle: "ضبط حجم الخط لمحتوى الدردشة",
|
||||||
|
},
|
||||||
|
InputTemplate: {
|
||||||
|
Title: "نموذج الإدخال",
|
||||||
|
SubTitle: "سيتم ملء أحدث رسالة في هذا النموذج",
|
||||||
|
},
|
||||||
|
Update: {
|
||||||
|
Version: (x: string) => ` الإصدار: ${x}`,
|
||||||
|
IsLatest: "أحدث إصدار",
|
||||||
|
CheckUpdate: "التحقق من التحديث",
|
||||||
|
IsChecking: "جارٍ التحقق من التحديث...",
|
||||||
|
FoundUpdate: (x: string) => ` تم العثور على إصدار جديد: ${x}`,
|
||||||
|
GoToUpdate: "التحديث",
|
||||||
|
},
|
||||||
|
SendKey: "مفتاح الإرسال",
|
||||||
|
Theme: "السمة",
|
||||||
|
TightBorder: "حدود ضيقة",
|
||||||
|
SendPreviewBubble: {
|
||||||
|
Title: "عرض معاينة الـ Send",
|
||||||
|
SubTitle: "معاينة Markdown في فقاعة",
|
||||||
|
},
|
||||||
|
Mask: {
|
||||||
|
Title: "شاشة تظهر الأقنعة",
|
||||||
|
SubTitle: "عرض شاشة تظهر الأقنعة قبل بدء الدردشة الجديدة",
|
||||||
|
},
|
||||||
|
Prompt: {
|
||||||
|
Disable: {
|
||||||
|
Title: "تعطيل الاكتمال التلقائي",
|
||||||
|
SubTitle: "اكتب / لتشغيل الاكتمال التلقائي",
|
||||||
|
},
|
||||||
|
List: "قائمة الاقتراحات",
|
||||||
|
ListCount: (builtin: number, custom: number) => `
|
||||||
|
${builtin} مدمجة، ${custom} تم تعريفها من قبل المستخدم`,
|
||||||
|
Edit: "تعديل",
|
||||||
|
Modal: {
|
||||||
|
Title: "قائمة الاقتراحات",
|
||||||
|
Add: "إضافة واحدة",
|
||||||
|
Search: "البحث في الاقتراحات",
|
||||||
|
},
|
||||||
|
EditModal: {
|
||||||
|
Title: "تحرير الاقتراح",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
HistoryCount: {
|
||||||
|
Title: "عدد الرسائل المرفقة",
|
||||||
|
SubTitle: "عدد الرسائل المرسلة المرفقة في كل طلب",
|
||||||
|
},
|
||||||
|
CompressThreshold: {
|
||||||
|
Title: "حد الضغط للتاريخ",
|
||||||
|
SubTitle: "سيتم الضغط إذا تجاوزت طول الرسائل غير المضغوطة الحد المحدد",
|
||||||
|
},
|
||||||
|
Token: {
|
||||||
|
Title: "مفتاح API",
|
||||||
|
SubTitle: "استخدم مفتاحك لتجاوز حد رمز الوصول",
|
||||||
|
Placeholder: "مفتاح OpenAI API",
|
||||||
|
},
|
||||||
|
Usage: {
|
||||||
|
Title: "رصيد الحساب",
|
||||||
|
SubTitle(used: any, total: any) {
|
||||||
|
return `تم استخدام $${used} من هذا الشهر، الاشتراك ${total}`;
|
||||||
|
},
|
||||||
|
IsChecking: "جارٍ التحقق...",
|
||||||
|
Check: "التحقق",
|
||||||
|
NoAccess: "أدخل مفتاح API للتحقق من الرصيد",
|
||||||
|
},
|
||||||
|
AccessCode: {
|
||||||
|
Title: "رمز الوصول",
|
||||||
|
SubTitle: "تم تمكين التحكم في الوصول",
|
||||||
|
Placeholder: "رمز الوصول المطلوب",
|
||||||
|
},
|
||||||
|
Endpoint: {
|
||||||
|
Title: "نقطة النهاية",
|
||||||
|
SubTitle: "يجب أن تبدأ نقطة النهاية المخصصة بـ http(s)://",
|
||||||
|
},
|
||||||
|
Model: "النموذج",
|
||||||
|
Temperature: {
|
||||||
|
Title: "الحرارة",
|
||||||
|
SubTitle: "قيمة أكبر تجعل الإخراج أكثر عشوائية",
|
||||||
|
},
|
||||||
|
MaxTokens: {
|
||||||
|
Title: "الحد الأقصى للرموز",
|
||||||
|
SubTitle: "الحد الأقصى لعدد الرموز المدخلة والرموز المُنشأة",
|
||||||
|
},
|
||||||
|
PresencePenalty: {
|
||||||
|
Title: "تأثير الوجود",
|
||||||
|
SubTitle: "قيمة أكبر تزيد من احتمالية التحدث عن مواضيع جديدة",
|
||||||
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "تأثير التكرار",
|
||||||
|
SubTitle: "قيمة أكبر تقلل من احتمالية تكرار نفس السطر",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Store: {
|
||||||
|
DefaultTopic: "محادثة جديدة",
|
||||||
|
BotHello: "مرحبًا! كيف يمكنني مساعدتك اليوم؟",
|
||||||
|
Error: "حدث خطأ ما، يرجى المحاولة مرة أخرى في وقت لاحق.",
|
||||||
|
Prompt: {
|
||||||
|
History: (content: string) => "هذا ملخص لسجل الدردشة كمراجعة: " + content,
|
||||||
|
Topic:
|
||||||
|
"يرجى إنشاء عنوان يتكون من أربع إلى خمس كلمات يلخص محادثتنا دون أي مقدمة أو ترقيم أو علامات ترقيم أو نقاط أو رموز إضافية. قم بإزالة علامات التنصيص المحيطة.",
|
||||||
|
Summarize:
|
||||||
|
"قم بتلخيص النقاش بشكل موجز في 200 كلمة أو أقل لاستخدامه كاقتراح للسياق في المستقبل.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Copy: {
|
||||||
|
Success: "تم النسخ إلى الحافظة",
|
||||||
|
Failed: "فشلت عملية النسخ، يرجى منح الإذن للوصول إلى الحافظة",
|
||||||
|
},
|
||||||
|
Context: {
|
||||||
|
Toast: (x: any) => `مع ${x} اقتراحًا ذا سياق`,
|
||||||
|
Edit: "الاقتراحات السياقية والذاكرة",
|
||||||
|
Add: "إضافة اقتراح",
|
||||||
|
Clear: "مسح السياق",
|
||||||
|
Revert: "التراجع",
|
||||||
|
},
|
||||||
|
Plugin: {
|
||||||
|
Name: "المكوّن الإضافي",
|
||||||
|
},
|
||||||
|
Mask: {
|
||||||
|
Name: "الأقنعة",
|
||||||
|
Page: {
|
||||||
|
Title: "قالب الاقتراح",
|
||||||
|
SubTitle: (count: number) => `${count} قوالب الاقتراح`,
|
||||||
|
Search: "البحث في القوالب",
|
||||||
|
Create: "إنشاء",
|
||||||
|
},
|
||||||
|
Item: {
|
||||||
|
Info: (count: number) => `${count} اقتراحات`,
|
||||||
|
Chat: "الدردشة",
|
||||||
|
View: "عرض",
|
||||||
|
Edit: "تعديل",
|
||||||
|
Delete: "حذف",
|
||||||
|
DeleteConfirm: "تأكيد الحذف؟",
|
||||||
|
},
|
||||||
|
EditModal: {
|
||||||
|
Title: (readonly: boolean) => `
|
||||||
|
تعديل قالب الاقتراح ${readonly ? "(للقراءة فقط)" : ""}`,
|
||||||
|
Download: "تنزيل",
|
||||||
|
Clone: "استنساخ",
|
||||||
|
},
|
||||||
|
Config: {
|
||||||
|
Avatar: "صورة الروبوت",
|
||||||
|
Name: "اسم الروبوت",
|
||||||
|
Sync: {
|
||||||
|
Title: "استخدام الإعدادات العامة",
|
||||||
|
SubTitle: "استخدام الإعدادات العامة في هذه الدردشة",
|
||||||
|
Confirm: "تأكيد الاستبدال بالإعدادات المخصصة بالإعدادات العامة؟",
|
||||||
|
},
|
||||||
|
HideContext: {
|
||||||
|
Title: "إخفاء اقتراحات السياق",
|
||||||
|
SubTitle: "عدم عرض اقتراحات السياق في الدردشة",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
NewChat: {
|
||||||
|
Return: "العودة",
|
||||||
|
Skip: "ابدأ فقط",
|
||||||
|
Title: "اختيار قناع",
|
||||||
|
SubTitle: "دردشة مع الروح وراء القناع",
|
||||||
|
More: "المزيد",
|
||||||
|
NotShow: "عدم العرض مرة أخرى",
|
||||||
|
ConfirmNoShow: "تأكيد تعطيله؟ يمكنك تمكينه في الإعدادات لاحقًا.",
|
||||||
|
},
|
||||||
|
|
||||||
|
UI: {
|
||||||
|
Confirm: "تأكيد",
|
||||||
|
Cancel: "إلغاء",
|
||||||
|
Close: "إغلاق",
|
||||||
|
Create: "إنشاء",
|
||||||
|
Edit: "تعديل",
|
||||||
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "النموذج",
|
||||||
|
Messages: "الرسائل",
|
||||||
|
Topic: "الموضوع",
|
||||||
|
Time: "الوقت",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ar;
|
@@ -17,7 +17,7 @@ const cn = {
|
|||||||
ChatItemCount: (count: number) => `${count} 条对话`,
|
ChatItemCount: (count: number) => `${count} 条对话`,
|
||||||
},
|
},
|
||||||
Chat: {
|
Chat: {
|
||||||
SubTitle: (count: number) => `与 ChatGPT 的 ${count} 条对话`,
|
SubTitle: (count: number) => `共 ${count} 条对话`,
|
||||||
Actions: {
|
Actions: {
|
||||||
ChatList: "查看消息列表",
|
ChatList: "查看消息列表",
|
||||||
CompressedHistory: "查看压缩后的历史 Prompt",
|
CompressedHistory: "查看压缩后的历史 Prompt",
|
||||||
@@ -25,7 +25,19 @@ const cn = {
|
|||||||
Copy: "复制",
|
Copy: "复制",
|
||||||
Stop: "停止",
|
Stop: "停止",
|
||||||
Retry: "重试",
|
Retry: "重试",
|
||||||
|
Pin: "固定",
|
||||||
|
PinToastContent: "已将 2 条对话固定至预设提示词",
|
||||||
|
PinToastAction: "查看",
|
||||||
Delete: "删除",
|
Delete: "删除",
|
||||||
|
Edit: "编辑",
|
||||||
|
},
|
||||||
|
Commands: {
|
||||||
|
new: "新建聊天",
|
||||||
|
newm: "从面具新建聊天",
|
||||||
|
next: "下一个聊天",
|
||||||
|
prev: "上一个聊天",
|
||||||
|
clear: "清除上下文",
|
||||||
|
del: "删除聊天",
|
||||||
},
|
},
|
||||||
InputActions: {
|
InputActions: {
|
||||||
Stop: "停止响应",
|
Stop: "停止响应",
|
||||||
@@ -47,7 +59,7 @@ const cn = {
|
|||||||
if (submitKey === String(SubmitKey.Enter)) {
|
if (submitKey === String(SubmitKey.Enter)) {
|
||||||
inputHints += ",Shift + Enter 换行";
|
inputHints += ",Shift + Enter 换行";
|
||||||
}
|
}
|
||||||
return inputHints + ",/ 触发补全";
|
return inputHints + ",/ 触发补全,: 触发命令";
|
||||||
},
|
},
|
||||||
Send: "发送",
|
Send: "发送",
|
||||||
Config: {
|
Config: {
|
||||||
@@ -97,13 +109,21 @@ const cn = {
|
|||||||
},
|
},
|
||||||
Settings: {
|
Settings: {
|
||||||
Title: "设置",
|
Title: "设置",
|
||||||
SubTitle: "设置选项",
|
SubTitle: "所有设置选项",
|
||||||
Actions: {
|
|
||||||
ClearAll: "清除所有数据",
|
Danger: {
|
||||||
ResetAll: "重置所有选项",
|
Reset: {
|
||||||
Close: "关闭",
|
Title: "重置所有设置",
|
||||||
ConfirmResetAll: "确认重置所有配置?",
|
SubTitle: "重置所有设置项回默认值",
|
||||||
ConfirmClearAll: "确认清除所有数据?",
|
Action: "立即重置",
|
||||||
|
Confirm: "确认重置所有设置?",
|
||||||
|
},
|
||||||
|
Clear: {
|
||||||
|
Title: "清除所有数据",
|
||||||
|
SubTitle: "清除所有聊天、设置数据",
|
||||||
|
Action: "立即清除",
|
||||||
|
Confirm: "确认清除所有聊天、设置数据?",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
@@ -115,6 +135,11 @@ const cn = {
|
|||||||
SubTitle: "聊天内容的字体大小",
|
SubTitle: "聊天内容的字体大小",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
InputTemplate: {
|
||||||
|
Title: "用户输入预处理",
|
||||||
|
SubTitle: "用户最新的一条消息会填充到此模板",
|
||||||
|
},
|
||||||
|
|
||||||
Update: {
|
Update: {
|
||||||
Version: (x: string) => `当前版本:${x}`,
|
Version: (x: string) => `当前版本:${x}`,
|
||||||
IsLatest: "已是最新版本",
|
IsLatest: "已是最新版本",
|
||||||
@@ -197,6 +222,10 @@ const cn = {
|
|||||||
Title: "话题新鲜度 (presence_penalty)",
|
Title: "话题新鲜度 (presence_penalty)",
|
||||||
SubTitle: "值越大,越有可能扩展到新话题",
|
SubTitle: "值越大,越有可能扩展到新话题",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "频率惩罚度 (frequency_penalty)",
|
||||||
|
SubTitle: "值越大,越有可能降低重复字词",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "新的聊天",
|
DefaultTopic: "新的聊天",
|
||||||
@@ -277,6 +306,12 @@ const cn = {
|
|||||||
Create: "新建",
|
Create: "新建",
|
||||||
Edit: "编辑",
|
Edit: "编辑",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "模型",
|
||||||
|
Messages: "消息",
|
||||||
|
Topic: "主题",
|
||||||
|
Time: "时间",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
type DeepPartial<T> = T extends object
|
type DeepPartial<T> = T extends object
|
||||||
@@ -284,7 +319,8 @@ type DeepPartial<T> = T extends object
|
|||||||
[P in keyof T]?: DeepPartial<T[P]>;
|
[P in keyof T]?: DeepPartial<T[P]>;
|
||||||
}
|
}
|
||||||
: T;
|
: T;
|
||||||
export type LocaleType = DeepPartial<typeof cn>;
|
|
||||||
export type RequiredLocaleType = typeof cn;
|
export type LocaleType = typeof cn;
|
||||||
|
export type PartialLocaleType = DeepPartial<typeof cn>;
|
||||||
|
|
||||||
export default cn;
|
export default cn;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const cs: LocaleType = {
|
const cs: PartialLocaleType = {
|
||||||
WIP: "V přípravě...",
|
WIP: "V přípravě...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,13 +61,7 @@ const cs: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Nastavení",
|
Title: "Nastavení",
|
||||||
SubTitle: "Všechna nastavení",
|
SubTitle: "Všechna nastavení",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Vymazat všechna data",
|
|
||||||
ResetAll: "Obnovit veškeré nastavení",
|
|
||||||
Close: "Zavřít",
|
|
||||||
ConfirmResetAll: "Jste si jisti, že chcete obnovit všechna nastavení?",
|
|
||||||
ConfirmClearAll: "Jste si jisti, že chcete smazat všechna data?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Všechny jazyky",
|
All: "Všechny jazyky",
|
||||||
@@ -155,6 +149,11 @@ const cs: LocaleType = {
|
|||||||
Title: "Přítomnostní korekce",
|
Title: "Přítomnostní korekce",
|
||||||
SubTitle: "Větší hodnota zvyšuje pravděpodobnost nových témat.",
|
SubTitle: "Větší hodnota zvyšuje pravděpodobnost nových témat.",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Frekvenční penalizace",
|
||||||
|
SubTitle:
|
||||||
|
"Větší hodnota snižující pravděpodobnost opakování stejného řádku",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Nová konverzace",
|
DefaultTopic: "Nová konverzace",
|
||||||
@@ -226,6 +225,12 @@ const cs: LocaleType = {
|
|||||||
Create: "Vytvořit",
|
Create: "Vytvořit",
|
||||||
Edit: "Upravit",
|
Edit: "Upravit",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Model",
|
||||||
|
Messages: "Zprávy",
|
||||||
|
Topic: "Téma",
|
||||||
|
Time: "Čas",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default cs;
|
export default cs;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const de: LocaleType = {
|
const de: PartialLocaleType = {
|
||||||
WIP: "In Bearbeitung...",
|
WIP: "In Bearbeitung...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,14 +61,7 @@ const de: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Einstellungen",
|
Title: "Einstellungen",
|
||||||
SubTitle: "Alle Einstellungen",
|
SubTitle: "Alle Einstellungen",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Alle Daten löschen",
|
|
||||||
ResetAll: "Alle Einstellungen zurücksetzen",
|
|
||||||
Close: "Schließen",
|
|
||||||
ConfirmResetAll:
|
|
||||||
"Möchten Sie wirklich alle Konfigurationen zurücksetzen?",
|
|
||||||
ConfirmClearAll: "Möchten Sie wirklich alle Chats zurücksetzen?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Alle Sprachen",
|
All: "Alle Sprachen",
|
||||||
@@ -158,6 +151,11 @@ const de: LocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"Ein größerer Wert erhöht die Wahrscheinlichkeit, dass über neue Themen gesprochen wird",
|
"Ein größerer Wert erhöht die Wahrscheinlichkeit, dass über neue Themen gesprochen wird",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Frequency Penalty", // HäufigkeitStrafe
|
||||||
|
SubTitle:
|
||||||
|
"Ein größerer Wert, der die Wahrscheinlichkeit verringert, dass dieselbe Zeile wiederholt wird",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Neues Gespräch",
|
DefaultTopic: "Neues Gespräch",
|
||||||
@@ -231,6 +229,12 @@ const de: LocaleType = {
|
|||||||
Create: "Create",
|
Create: "Create",
|
||||||
Edit: "Edit",
|
Edit: "Edit",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Modell",
|
||||||
|
Messages: "Nachrichten",
|
||||||
|
Topic: "Thema",
|
||||||
|
Time: "Zeit",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default de;
|
export default de;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import { RequiredLocaleType } from "./index";
|
import { LocaleType } from "./index";
|
||||||
|
|
||||||
const en: RequiredLocaleType = {
|
const en: LocaleType = {
|
||||||
WIP: "Coming Soon...",
|
WIP: "Coming Soon...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -18,7 +18,7 @@ const en: RequiredLocaleType = {
|
|||||||
ChatItemCount: (count: number) => `${count} messages`,
|
ChatItemCount: (count: number) => `${count} messages`,
|
||||||
},
|
},
|
||||||
Chat: {
|
Chat: {
|
||||||
SubTitle: (count: number) => `${count} messages with ChatGPT`,
|
SubTitle: (count: number) => `${count} messages`,
|
||||||
Actions: {
|
Actions: {
|
||||||
ChatList: "Go To Chat List",
|
ChatList: "Go To Chat List",
|
||||||
CompressedHistory: "Compressed History Memory Prompt",
|
CompressedHistory: "Compressed History Memory Prompt",
|
||||||
@@ -26,7 +26,19 @@ const en: RequiredLocaleType = {
|
|||||||
Copy: "Copy",
|
Copy: "Copy",
|
||||||
Stop: "Stop",
|
Stop: "Stop",
|
||||||
Retry: "Retry",
|
Retry: "Retry",
|
||||||
|
Pin: "Pin",
|
||||||
|
PinToastContent: "Pinned 2 messages to contextual prompts",
|
||||||
|
PinToastAction: "View",
|
||||||
Delete: "Delete",
|
Delete: "Delete",
|
||||||
|
Edit: "Edit",
|
||||||
|
},
|
||||||
|
Commands: {
|
||||||
|
new: "Start a new chat",
|
||||||
|
newm: "Start a new chat with mask",
|
||||||
|
next: "Next Chat",
|
||||||
|
prev: "Previous Chat",
|
||||||
|
clear: "Clear Context",
|
||||||
|
del: "Delete Chat",
|
||||||
},
|
},
|
||||||
InputActions: {
|
InputActions: {
|
||||||
Stop: "Stop",
|
Stop: "Stop",
|
||||||
@@ -48,7 +60,7 @@ const en: RequiredLocaleType = {
|
|||||||
if (submitKey === String(SubmitKey.Enter)) {
|
if (submitKey === String(SubmitKey.Enter)) {
|
||||||
inputHints += ", Shift + Enter to wrap";
|
inputHints += ", Shift + Enter to wrap";
|
||||||
}
|
}
|
||||||
return inputHints + ", / to search prompts";
|
return inputHints + ", / to search prompts, : to use commands";
|
||||||
},
|
},
|
||||||
Send: "Send",
|
Send: "Send",
|
||||||
Config: {
|
Config: {
|
||||||
@@ -100,12 +112,19 @@ const en: RequiredLocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Settings",
|
Title: "Settings",
|
||||||
SubTitle: "All Settings",
|
SubTitle: "All Settings",
|
||||||
Actions: {
|
Danger: {
|
||||||
ClearAll: "Clear All Data",
|
Reset: {
|
||||||
ResetAll: "Reset All Settings",
|
Title: "Reset All Settings",
|
||||||
Close: "Close",
|
SubTitle: "Reset all setting items to default",
|
||||||
ConfirmResetAll: "Are you sure you want to reset all configurations?",
|
Action: "Reset",
|
||||||
ConfirmClearAll: "Are you sure you want to reset all data?",
|
Confirm: "Confirm to reset all settings to default?",
|
||||||
|
},
|
||||||
|
Clear: {
|
||||||
|
Title: "Clear All Data",
|
||||||
|
SubTitle: "Clear all messages and settings",
|
||||||
|
Action: "Clear",
|
||||||
|
Confirm: "Confirm to clear all messages and settings?",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
@@ -116,6 +135,12 @@ const en: RequiredLocaleType = {
|
|||||||
Title: "Font Size",
|
Title: "Font Size",
|
||||||
SubTitle: "Adjust font size of chat content",
|
SubTitle: "Adjust font size of chat content",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
InputTemplate: {
|
||||||
|
Title: "Input Template",
|
||||||
|
SubTitle: "Newest message will be filled to this template",
|
||||||
|
},
|
||||||
|
|
||||||
Update: {
|
Update: {
|
||||||
Version: (x: string) => `Version: ${x}`,
|
Version: (x: string) => `Version: ${x}`,
|
||||||
IsLatest: "Latest version",
|
IsLatest: "Latest version",
|
||||||
@@ -199,6 +224,11 @@ const en: RequiredLocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"A larger value increases the likelihood to talk about new topics",
|
"A larger value increases the likelihood to talk about new topics",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Frequency Penalty",
|
||||||
|
SubTitle:
|
||||||
|
"A larger value decreasing the likelihood to repeat the same line",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "New Conversation",
|
DefaultTopic: "New Conversation",
|
||||||
@@ -280,6 +310,12 @@ const en: RequiredLocaleType = {
|
|||||||
Create: "Create",
|
Create: "Create",
|
||||||
Edit: "Edit",
|
Edit: "Edit",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Model",
|
||||||
|
Messages: "Messages",
|
||||||
|
Topic: "Topic",
|
||||||
|
Time: "Time",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default en;
|
export default en;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const es: LocaleType = {
|
const es: PartialLocaleType = {
|
||||||
WIP: "En construcción...",
|
WIP: "En construcción...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,13 +61,7 @@ const es: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Configuración",
|
Title: "Configuración",
|
||||||
SubTitle: "Todas las configuraciones",
|
SubTitle: "Todas las configuraciones",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Borrar todos los datos",
|
|
||||||
ResetAll: "Restablecer todas las configuraciones",
|
|
||||||
Close: "Cerrar",
|
|
||||||
ConfirmResetAll: "Are you sure you want to reset all configurations?",
|
|
||||||
ConfirmClearAll: "Are you sure you want to reset all chat?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Todos los idiomas",
|
All: "Todos los idiomas",
|
||||||
@@ -156,6 +150,11 @@ const es: LocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"Un valor mayor aumenta la probabilidad de hablar sobre nuevos temas",
|
"Un valor mayor aumenta la probabilidad de hablar sobre nuevos temas",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Penalización de frecuencia",
|
||||||
|
SubTitle:
|
||||||
|
"Un valor mayor que disminuye la probabilidad de repetir la misma línea",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Nueva conversación",
|
DefaultTopic: "Nueva conversación",
|
||||||
@@ -228,6 +227,12 @@ const es: LocaleType = {
|
|||||||
Create: "Create",
|
Create: "Create",
|
||||||
Edit: "Edit",
|
Edit: "Edit",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Modelo",
|
||||||
|
Messages: "Mensajes",
|
||||||
|
Topic: "Tema",
|
||||||
|
Time: "Time",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default es;
|
export default es;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const fr: LocaleType = {
|
const fr: PartialLocaleType = {
|
||||||
WIP: "Prochainement...",
|
WIP: "Prochainement...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,14 +61,7 @@ const fr: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Paramètres",
|
Title: "Paramètres",
|
||||||
SubTitle: "Toutes les configurations",
|
SubTitle: "Toutes les configurations",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Effacer toutes les données",
|
|
||||||
ResetAll: "Réinitialiser les configurations",
|
|
||||||
Close: "Fermer",
|
|
||||||
ConfirmResetAll:
|
|
||||||
"Êtes-vous sûr de vouloir réinitialiser toutes les configurations?",
|
|
||||||
ConfirmClearAll: "Êtes-vous sûr de vouloir supprimer toutes les données?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION : si vous souhaitez ajouter une nouvelle traduction, ne traduisez pas cette valeur, laissez-la sous forme de `Language`
|
Name: "Language", // ATTENTION : si vous souhaitez ajouter une nouvelle traduction, ne traduisez pas cette valeur, laissez-la sous forme de `Language`
|
||||||
All: "Toutes les langues",
|
All: "Toutes les langues",
|
||||||
@@ -159,6 +152,11 @@ const fr: LocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"Une valeur plus élevée augmentera la probabilité d'introduire de nouveaux sujets",
|
"Une valeur plus élevée augmentera la probabilité d'introduire de nouveaux sujets",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Pénalité de fréquence",
|
||||||
|
SubTitle:
|
||||||
|
"Une valeur plus élevée diminuant la probabilité de répéter la même ligne",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Nouvelle conversation",
|
DefaultTopic: "Nouvelle conversation",
|
||||||
@@ -232,6 +230,12 @@ const fr: LocaleType = {
|
|||||||
Create: "Créer",
|
Create: "Créer",
|
||||||
Edit: "Éditer",
|
Edit: "Éditer",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Modèle",
|
||||||
|
Messages: "Messages",
|
||||||
|
Topic: "Sujet",
|
||||||
|
Time: "Temps",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fr;
|
export default fr;
|
||||||
|
@@ -1,56 +1,74 @@
|
|||||||
import CN from "./cn";
|
import cn from "./cn";
|
||||||
import EN from "./en";
|
import en from "./en";
|
||||||
import TW from "./tw";
|
import tw from "./tw";
|
||||||
import FR from "./fr";
|
import fr from "./fr";
|
||||||
import ES from "./es";
|
import es from "./es";
|
||||||
import IT from "./it";
|
import it from "./it";
|
||||||
import TR from "./tr";
|
import tr from "./tr";
|
||||||
import JP from "./jp";
|
import jp from "./jp";
|
||||||
import DE from "./de";
|
import de from "./de";
|
||||||
import VI from "./vi";
|
import vi from "./vi";
|
||||||
import RU from "./ru";
|
import ru from "./ru";
|
||||||
import CS from "./cs";
|
import no from "./no";
|
||||||
import KO from "./ko";
|
import cs from "./cs";
|
||||||
|
import ko from "./ko";
|
||||||
|
import ar from "./ar";
|
||||||
import { merge } from "../utils/merge";
|
import { merge } from "../utils/merge";
|
||||||
|
|
||||||
export type { LocaleType, RequiredLocaleType } from "./cn";
|
import type { LocaleType } from "./cn";
|
||||||
|
export type { LocaleType, PartialLocaleType } from "./cn";
|
||||||
|
|
||||||
export const AllLangs = [
|
const ALL_LANGS = {
|
||||||
"en",
|
cn,
|
||||||
"cn",
|
en,
|
||||||
"tw",
|
tw,
|
||||||
"fr",
|
jp,
|
||||||
"es",
|
ko,
|
||||||
"it",
|
fr,
|
||||||
"tr",
|
es,
|
||||||
"jp",
|
it,
|
||||||
"de",
|
tr,
|
||||||
"vi",
|
de,
|
||||||
"ru",
|
vi,
|
||||||
"cs",
|
ru,
|
||||||
"ko",
|
cs,
|
||||||
] as const;
|
no,
|
||||||
export type Lang = (typeof AllLangs)[number];
|
ar,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Lang = keyof typeof ALL_LANGS;
|
||||||
|
|
||||||
|
export const AllLangs = Object.keys(ALL_LANGS) as Lang[];
|
||||||
|
|
||||||
export const ALL_LANG_OPTIONS: Record<Lang, string> = {
|
export const ALL_LANG_OPTIONS: Record<Lang, string> = {
|
||||||
cn: "简体中文",
|
cn: "简体中文",
|
||||||
en: "English",
|
en: "English",
|
||||||
tw: "繁體中文",
|
tw: "繁體中文",
|
||||||
|
jp: "日本語",
|
||||||
|
ko: "한국어",
|
||||||
fr: "Français",
|
fr: "Français",
|
||||||
es: "Español",
|
es: "Español",
|
||||||
it: "Italiano",
|
it: "Italiano",
|
||||||
tr: "Türkçe",
|
tr: "Türkçe",
|
||||||
jp: "日本語",
|
|
||||||
de: "Deutsch",
|
de: "Deutsch",
|
||||||
vi: "Tiếng Việt",
|
vi: "Tiếng Việt",
|
||||||
ru: "Русский",
|
ru: "Русский",
|
||||||
cs: "Čeština",
|
cs: "Čeština",
|
||||||
ko: "한국어",
|
no: "Nynorsk",
|
||||||
|
ar: "العربية",
|
||||||
};
|
};
|
||||||
|
|
||||||
const LANG_KEY = "lang";
|
const LANG_KEY = "lang";
|
||||||
const DEFAULT_LANG = "en";
|
const DEFAULT_LANG = "en";
|
||||||
|
|
||||||
|
const fallbackLang = en;
|
||||||
|
const targetLang = ALL_LANGS[getLang()] as LocaleType;
|
||||||
|
|
||||||
|
// if target lang missing some fields, it will use fallback lang string
|
||||||
|
merge(fallbackLang, targetLang);
|
||||||
|
|
||||||
|
export default fallbackLang as LocaleType;
|
||||||
|
|
||||||
function getItem(key: string) {
|
function getItem(key: string) {
|
||||||
try {
|
try {
|
||||||
return localStorage.getItem(key);
|
return localStorage.getItem(key);
|
||||||
@@ -95,25 +113,3 @@ export function changeLang(lang: Lang) {
|
|||||||
setItem(LANG_KEY, lang);
|
setItem(LANG_KEY, lang);
|
||||||
location.reload();
|
location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
const fallbackLang = EN;
|
|
||||||
const targetLang = {
|
|
||||||
en: EN,
|
|
||||||
cn: CN,
|
|
||||||
tw: TW,
|
|
||||||
fr: FR,
|
|
||||||
es: ES,
|
|
||||||
it: IT,
|
|
||||||
tr: TR,
|
|
||||||
jp: JP,
|
|
||||||
de: DE,
|
|
||||||
vi: VI,
|
|
||||||
ru: RU,
|
|
||||||
cs: CS,
|
|
||||||
ko: KO,
|
|
||||||
}[getLang()] as typeof CN;
|
|
||||||
|
|
||||||
// if target lang missing some fields, it will use fallback lang string
|
|
||||||
merge(fallbackLang, targetLang);
|
|
||||||
|
|
||||||
export default fallbackLang as typeof CN;
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const it: LocaleType = {
|
const it: PartialLocaleType = {
|
||||||
WIP: "Work in progress...",
|
WIP: "Work in progress...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,13 +61,7 @@ const it: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Impostazioni",
|
Title: "Impostazioni",
|
||||||
SubTitle: "Tutte le impostazioni",
|
SubTitle: "Tutte le impostazioni",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Cancella tutti i dati",
|
|
||||||
ResetAll: "Resetta tutte le impostazioni",
|
|
||||||
Close: "Chiudi",
|
|
||||||
ConfirmResetAll: "Sei sicuro vuoi cancellare tutte le impostazioni?",
|
|
||||||
ConfirmClearAll: "Sei sicuro vuoi cancellare tutte le chat?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Tutte le lingue",
|
All: "Tutte le lingue",
|
||||||
@@ -157,6 +151,11 @@ const it: LocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"Un valore maggiore aumenta la probabilità di parlare di nuovi argomenti",
|
"Un valore maggiore aumenta la probabilità di parlare di nuovi argomenti",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Penalità di frequenza",
|
||||||
|
SubTitle:
|
||||||
|
"Un valore maggiore che diminuisce la probabilità di ripetere la stessa riga",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Nuova conversazione",
|
DefaultTopic: "Nuova conversazione",
|
||||||
@@ -229,6 +228,12 @@ const it: LocaleType = {
|
|||||||
Create: "Create",
|
Create: "Create",
|
||||||
Edit: "Edit",
|
Edit: "Edit",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Modello",
|
||||||
|
Messages: "Messaggi",
|
||||||
|
Topic: "Argomento",
|
||||||
|
Time: "Tempo",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default it;
|
export default it;
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const jp: LocaleType = {
|
const jp: PartialLocaleType = {
|
||||||
WIP: "この機能は開発中です……",
|
WIP: "この機能は開発中です",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
"現在は未承認状態です。左下の設定ボタンをクリックし、アクセスパスワードを入力してください。",
|
"現在は未承認状態です。左下の設定ボタンをクリックし、アクセスパスワードかOpenAIのAPIキーを入力してください。",
|
||||||
},
|
},
|
||||||
ChatItem: {
|
ChatItem: {
|
||||||
ChatItemCount: (count: number) => `${count} 通のチャット`,
|
ChatItemCount: (count: number) => `${count} 通のチャット`,
|
||||||
@@ -19,7 +19,7 @@ const jp: LocaleType = {
|
|||||||
Copy: "コピー",
|
Copy: "コピー",
|
||||||
Stop: "停止",
|
Stop: "停止",
|
||||||
Retry: "リトライ",
|
Retry: "リトライ",
|
||||||
Delete: "Delete",
|
Delete: "削除",
|
||||||
},
|
},
|
||||||
Rename: "チャットの名前を変更",
|
Rename: "チャットの名前を変更",
|
||||||
Typing: "入力中…",
|
Typing: "入力中…",
|
||||||
@@ -32,7 +32,7 @@ const jp: LocaleType = {
|
|||||||
},
|
},
|
||||||
Send: "送信",
|
Send: "送信",
|
||||||
Config: {
|
Config: {
|
||||||
Reset: "重置默认",
|
Reset: "リセット",
|
||||||
SaveAs: "另存为面具",
|
SaveAs: "另存为面具",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -61,16 +61,10 @@ const jp: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "設定",
|
Title: "設定",
|
||||||
SubTitle: "設定オプション",
|
SubTitle: "設定オプション",
|
||||||
Actions: {
|
|
||||||
ClearAll: "すべてのデータをクリア",
|
|
||||||
ResetAll: "すべてのオプションをリセット",
|
|
||||||
Close: "閉じる",
|
|
||||||
ConfirmResetAll: "すべての設定をリセットしてもよろしいですか?",
|
|
||||||
ConfirmClearAll: "すべてのチャットをリセットしてもよろしいですか?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "所有语言",
|
All: "全ての言語",
|
||||||
},
|
},
|
||||||
Avatar: "アバター",
|
Avatar: "アバター",
|
||||||
FontSize: {
|
FontSize: {
|
||||||
@@ -91,11 +85,11 @@ const jp: LocaleType = {
|
|||||||
TightBorder: "ボーダーレスモード",
|
TightBorder: "ボーダーレスモード",
|
||||||
SendPreviewBubble: {
|
SendPreviewBubble: {
|
||||||
Title: "プレビューバブルの送信",
|
Title: "プレビューバブルの送信",
|
||||||
SubTitle: "在预览气泡中预览 Markdown 内容",
|
SubTitle: "プレビューバブルでマークダウンコンテンツをプレビュー",
|
||||||
},
|
},
|
||||||
Mask: {
|
Mask: {
|
||||||
Title: "面具启动页",
|
Title: "キャラクターページ",
|
||||||
SubTitle: "新建聊天时,展示面具启动页",
|
SubTitle: "新規チャット作成時にキャラクターページを表示する",
|
||||||
},
|
},
|
||||||
Prompt: {
|
Prompt: {
|
||||||
Disable: {
|
Disable: {
|
||||||
@@ -113,7 +107,7 @@ const jp: LocaleType = {
|
|||||||
Search: "プロンプトワード検索",
|
Search: "プロンプトワード検索",
|
||||||
},
|
},
|
||||||
EditModal: {
|
EditModal: {
|
||||||
Title: "编辑提示词",
|
Title: "編集",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HistoryCount: {
|
HistoryCount: {
|
||||||
@@ -158,6 +152,10 @@ const jp: LocaleType = {
|
|||||||
Title: "トピックの新鮮度 (presence_penalty)",
|
Title: "トピックの新鮮度 (presence_penalty)",
|
||||||
SubTitle: "値が大きいほど、新しいトピックへの展開が可能になります。",
|
SubTitle: "値が大きいほど、新しいトピックへの展開が可能になります。",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "話題の頻度 (frequency_penalty)",
|
||||||
|
SubTitle: "値が大きいほど、重複語を低減する可能性が高くなります",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "新しいチャット",
|
DefaultTopic: "新しいチャット",
|
||||||
@@ -178,54 +176,70 @@ const jp: LocaleType = {
|
|||||||
Failed: "コピーに失敗しました。クリップボード許可を与えてください。",
|
Failed: "コピーに失敗しました。クリップボード許可を与えてください。",
|
||||||
},
|
},
|
||||||
Context: {
|
Context: {
|
||||||
Toast: (x: any) => `前置コンテキストが ${x} 件設定されました`,
|
Toast: (x: any) => `キャラクターが ${x} 件設定されました`,
|
||||||
Edit: "前置コンテキストと履歴メモリ",
|
Edit: "キャラクタープリセットとモデル設定",
|
||||||
Add: "新規追加",
|
Add: "追加",
|
||||||
},
|
},
|
||||||
Plugin: { Name: "插件" },
|
Plugin: { Name: "プラグイン" },
|
||||||
Mask: {
|
Mask: {
|
||||||
Name: "面具",
|
Name: "キャラクタープリセット",
|
||||||
Page: {
|
Page: {
|
||||||
Title: "预设角色面具",
|
Title: "キャラクタープリセット",
|
||||||
SubTitle: (count: number) => `${count} 个预设角色定义`,
|
SubTitle: (count: number) => `${count} 件見つかりました。`,
|
||||||
Search: "搜索角色面具",
|
Search: "検索",
|
||||||
Create: "新建",
|
Create: "新規",
|
||||||
},
|
},
|
||||||
Item: {
|
Item: {
|
||||||
Info: (count: number) => `包含 ${count} 条预设对话`,
|
Info: (count: number) => `包含 ${count} 条预设对话`,
|
||||||
Chat: "对话",
|
Chat: "会話",
|
||||||
View: "查看",
|
View: "詳細",
|
||||||
Edit: "编辑",
|
Edit: "編集",
|
||||||
Delete: "删除",
|
Delete: "削除",
|
||||||
DeleteConfirm: "确认删除?",
|
DeleteConfirm: "本当に削除しますか?",
|
||||||
},
|
},
|
||||||
EditModal: {
|
EditModal: {
|
||||||
Title: (readonly: boolean) =>
|
Title: (readonly: boolean) =>
|
||||||
`编辑预设面具 ${readonly ? "(只读)" : ""}`,
|
`キャラクタープリセットを編集 ${readonly ? "(読み取り専用)" : ""}`,
|
||||||
Download: "下载预设",
|
Download: "ダウンロード",
|
||||||
Clone: "克隆预设",
|
Clone: "複製",
|
||||||
},
|
},
|
||||||
Config: {
|
Config: {
|
||||||
Avatar: "角色头像",
|
Avatar: "キャラクターのアイコン",
|
||||||
Name: "角色名称",
|
Name: "キャラクターの名前",
|
||||||
|
Sync: {
|
||||||
|
Title: "グローバル設定を利用する",
|
||||||
|
SubTitle: "このチャットでグローバル設定を利用します。",
|
||||||
|
Confirm:
|
||||||
|
"カスタム設定を上書きしてグローバル設定を使用します、よろしいですか?",
|
||||||
|
},
|
||||||
|
HideContext: {
|
||||||
|
Title: "キャラクター設定を表示しない",
|
||||||
|
SubTitle: "チャット画面でのキャラクター設定を非表示にします。",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
NewChat: {
|
NewChat: {
|
||||||
Return: "返回",
|
Return: "戻る",
|
||||||
Skip: "跳过",
|
Skip: "スキップ",
|
||||||
Title: "挑选一个面具",
|
Title: "キャラクター",
|
||||||
SubTitle: "现在开始,与面具背后的灵魂思维碰撞",
|
SubTitle: "さあ、AIにキャラクターを設定して会話を始めてみましょう",
|
||||||
More: "搜索更多",
|
More: "もっと探す",
|
||||||
NotShow: "不再展示",
|
NotShow: "今後は表示しない",
|
||||||
ConfirmNoShow: "确认禁用?禁用后可以随时在设置中重新启用。",
|
ConfirmNoShow: "いつでも設定から有効化できます。",
|
||||||
},
|
},
|
||||||
|
|
||||||
UI: {
|
UI: {
|
||||||
Confirm: "确认",
|
Confirm: "確認",
|
||||||
Cancel: "取消",
|
Cancel: "キャンセル",
|
||||||
Close: "关闭",
|
Close: "閉じる",
|
||||||
Create: "新建",
|
Create: "新規",
|
||||||
Edit: "编辑",
|
Edit: "編集",
|
||||||
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "モデル",
|
||||||
|
Messages: "メッセージ",
|
||||||
|
Topic: "トピック",
|
||||||
|
Time: "時間",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
|
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const ko: LocaleType = {
|
const ko: PartialLocaleType = {
|
||||||
WIP: "곧 출시 예정...",
|
WIP: "곧 출시 예정...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized: "권한이 없습니다. 설정 페이지에서 액세스 코드를 입력하세요.",
|
Unauthorized: "권한이 없습니다. 설정 페이지에서 액세스 코드를 입력하세요.",
|
||||||
@@ -61,13 +61,7 @@ const ko: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "설정",
|
Title: "설정",
|
||||||
SubTitle: "모든 설정",
|
SubTitle: "모든 설정",
|
||||||
Actions: {
|
|
||||||
ClearAll: "모든 데이터 지우기",
|
|
||||||
ResetAll: "모든 설정 초기화",
|
|
||||||
Close: "닫기",
|
|
||||||
ConfirmResetAll: "모든 설정을 초기화하시겠습니까?",
|
|
||||||
ConfirmClearAll: "모든 데이터를 지우시겠습니까?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "All Languages",
|
All: "All Languages",
|
||||||
@@ -154,6 +148,10 @@ const ko: LocaleType = {
|
|||||||
Title: "존재 페널티 (presence_penalty)",
|
Title: "존재 페널티 (presence_penalty)",
|
||||||
SubTitle: "값이 클수록 새로운 주제에 대해 대화할 가능성이 높아집니다.",
|
SubTitle: "값이 클수록 새로운 주제에 대해 대화할 가능성이 높아집니다.",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "빈도 페널티(frequency penalty)",
|
||||||
|
SubTitle: "값이 클수록 같은 줄이 반복될 가능성이 줄어듭니다.",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "새 대화",
|
DefaultTopic: "새 대화",
|
||||||
@@ -225,6 +223,12 @@ const ko: LocaleType = {
|
|||||||
Create: "생성",
|
Create: "생성",
|
||||||
Edit: "편집",
|
Edit: "편집",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "모델",
|
||||||
|
Messages: "메시지",
|
||||||
|
Topic: "주제",
|
||||||
|
Time: "시간",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ko;
|
export default ko;
|
||||||
|
164
app/locales/no.ts
Normal file
164
app/locales/no.ts
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
import { SubmitKey } from "../store/config";
|
||||||
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
|
const no: PartialLocaleType = {
|
||||||
|
WIP: "Arbeid pågår ...",
|
||||||
|
Error: {
|
||||||
|
Unauthorized: "Du har ikke tilgang. Vennlig oppgi tildelt adgangskode.",
|
||||||
|
},
|
||||||
|
ChatItem: {
|
||||||
|
ChatItemCount: (count: number) => `${count} meldinger`,
|
||||||
|
},
|
||||||
|
Chat: {
|
||||||
|
SubTitle: (count: number) => `${count} meldinger med ChatGPT`,
|
||||||
|
Actions: {
|
||||||
|
ChatList: "Gå til chatlisten",
|
||||||
|
CompressedHistory: "Komprimert historikk for instrukser",
|
||||||
|
Export: "Eksporter alle meldinger i markdown-format",
|
||||||
|
Copy: "Kopier",
|
||||||
|
Stop: "Stopp",
|
||||||
|
Retry: "Prøv igjen",
|
||||||
|
Delete: "Slett",
|
||||||
|
},
|
||||||
|
Rename: "Gi nytt navn",
|
||||||
|
Typing: "Skriver …",
|
||||||
|
Input: (submitKey: string) => {
|
||||||
|
var inputHints = `${submitKey} for å sende`;
|
||||||
|
if (submitKey === String(SubmitKey.Enter)) {
|
||||||
|
inputHints += ", Shift + Enter for å omgi";
|
||||||
|
}
|
||||||
|
return inputHints + ", / for å søke instrukser";
|
||||||
|
},
|
||||||
|
Send: "Send",
|
||||||
|
},
|
||||||
|
Export: {
|
||||||
|
Title: "Alle meldinger",
|
||||||
|
Copy: "Kopiere alle",
|
||||||
|
Download: "Last ned",
|
||||||
|
MessageFromYou: "Melding fra deg",
|
||||||
|
MessageFromChatGPT: "Melding fra ChatGPT",
|
||||||
|
},
|
||||||
|
Memory: {
|
||||||
|
Title: "Minneinstruks",
|
||||||
|
EmptyContent: "Ingen sålant.",
|
||||||
|
Send: "Send minne",
|
||||||
|
Copy: "Kopiere minne",
|
||||||
|
Reset: "Nulstill sesjon",
|
||||||
|
ResetConfirm:
|
||||||
|
"Om du nillstiller vil du slette hele historikken. Er du sikker på at du vil nullstille?",
|
||||||
|
},
|
||||||
|
Home: {
|
||||||
|
NewChat: "Ny chat",
|
||||||
|
DeleteChat: "Bekreft for å slette det valgte dialogen",
|
||||||
|
DeleteToast: "Samtale slettet",
|
||||||
|
Revert: "Tilbakestill",
|
||||||
|
},
|
||||||
|
Settings: {
|
||||||
|
Title: "Innstillinger",
|
||||||
|
SubTitle: "Alle innstillinger",
|
||||||
|
|
||||||
|
Lang: {
|
||||||
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
|
},
|
||||||
|
Avatar: "Avatar",
|
||||||
|
FontSize: {
|
||||||
|
Title: "Fontstørrelsen",
|
||||||
|
SubTitle: "Juster fontstørrelsen for samtaleinnholdet.",
|
||||||
|
},
|
||||||
|
Update: {
|
||||||
|
Version: (x: string) => `Versjon: ${x}`,
|
||||||
|
IsLatest: "Siste versjon",
|
||||||
|
CheckUpdate: "Se etter oppdatering",
|
||||||
|
IsChecking: "Ser etter oppdatering ...",
|
||||||
|
FoundUpdate: (x: string) => `Fant ny versjon: ${x}`,
|
||||||
|
GoToUpdate: "Oppdater",
|
||||||
|
},
|
||||||
|
SendKey: "Send nøkkel",
|
||||||
|
Theme: "Tema",
|
||||||
|
TightBorder: "Stram innramming",
|
||||||
|
Prompt: {
|
||||||
|
Disable: {
|
||||||
|
Title: "Skru av autofullfør",
|
||||||
|
SubTitle: "Skriv / for å trigge autofullfør",
|
||||||
|
},
|
||||||
|
List: "Instruksliste",
|
||||||
|
ListCount: (builtin: number, custom: number) =>
|
||||||
|
`${builtin} innebygde, ${custom} brukerdefinerte`,
|
||||||
|
Edit: "Endre",
|
||||||
|
Modal: {
|
||||||
|
Title: "Instruksliste",
|
||||||
|
Add: "Legg til",
|
||||||
|
Search: "Søk instrukser",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
HistoryCount: {
|
||||||
|
Title: "Tall på tilhørende meldinger",
|
||||||
|
SubTitle: "Antall sendte meldinger tilknyttet hver spørring",
|
||||||
|
},
|
||||||
|
CompressThreshold: {
|
||||||
|
Title: "Terskeverdi for komprimering av historikk",
|
||||||
|
SubTitle:
|
||||||
|
"Komprimer dersom ikke-komprimert lengde på meldinger overskrider denne verdien",
|
||||||
|
},
|
||||||
|
Token: {
|
||||||
|
Title: "API Key",
|
||||||
|
SubTitle:
|
||||||
|
"Bruk din egen API-nøkkel for å ignorere tilgangskoden begrensning",
|
||||||
|
Placeholder: "OpenAI API-nøkkel",
|
||||||
|
},
|
||||||
|
Usage: {
|
||||||
|
Title: "Saldo for konto",
|
||||||
|
SubTitle(used: any, total: any) {
|
||||||
|
return `Brukt denne måneden $${used}, abonnement $${total}`;
|
||||||
|
},
|
||||||
|
IsChecking: "Sjekker ...",
|
||||||
|
Check: "Sjekk",
|
||||||
|
NoAccess: "Skriv inn API-nøkkelen for å sjekke saldo",
|
||||||
|
},
|
||||||
|
AccessCode: {
|
||||||
|
Title: "Tilgangskode",
|
||||||
|
SubTitle: "Tilgangskontroll på",
|
||||||
|
Placeholder: "Trenger tilgangskode",
|
||||||
|
},
|
||||||
|
Model: "Model",
|
||||||
|
Temperature: {
|
||||||
|
Title: "Temperatur",
|
||||||
|
SubTitle: "Høyere verdi gir mer kreative svar",
|
||||||
|
},
|
||||||
|
MaxTokens: {
|
||||||
|
Title: "Maks tokens",
|
||||||
|
SubTitle: "Maksimum lengde på tokens for instrukser og svar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Store: {
|
||||||
|
DefaultTopic: "Ny samtale",
|
||||||
|
BotHello: "Hei! Hva kan jeg hjelpe deg med i dag?",
|
||||||
|
Error: "Noe gikk galt, vennligst prøv igjen senere.",
|
||||||
|
Prompt: {
|
||||||
|
History: (content: string) =>
|
||||||
|
"Dette er et sammendrag av chatthistorikken mellom AI-en og brukeren som en oppsummering: " +
|
||||||
|
content,
|
||||||
|
Topic:
|
||||||
|
"Vennligst lag en fire til fem ords tittel som oppsummerer samtalen vår uten innledning, punktsetting, anførselstegn, punktum, symboler eller tillegg tekst. Fjern innrammende anførselstegn.",
|
||||||
|
Summarize:
|
||||||
|
"Oppsummer diskusjonen vår kort i 200 ord eller mindre for å bruke som en oppfordring til fremtidig sammenheng.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Copy: {
|
||||||
|
Success: "Kopiert til utklippstavle",
|
||||||
|
Failed: "Kopiering feilet. Vennligst gi tilgang til utklippstavlen.",
|
||||||
|
},
|
||||||
|
Context: {
|
||||||
|
Toast: (x: any) => `Med ${x} kontekstuelle instrukser`,
|
||||||
|
Edit: "Kontekstuelle -og minneinstrukser",
|
||||||
|
Add: "Legg til",
|
||||||
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Model",
|
||||||
|
Messages: "Meldingar",
|
||||||
|
Topic: "Emne",
|
||||||
|
Time: "Tid",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default no;
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const ru: LocaleType = {
|
const ru: PartialLocaleType = {
|
||||||
WIP: "Скоро...",
|
WIP: "Скоро...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,13 +61,7 @@ const ru: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Настройки",
|
Title: "Настройки",
|
||||||
SubTitle: "Все настройки",
|
SubTitle: "Все настройки",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Очистить все данные",
|
|
||||||
ResetAll: "Сбросить все настройки",
|
|
||||||
Close: "Закрыть",
|
|
||||||
ConfirmResetAll: "Вы уверены, что хотите сбросить все настройки?",
|
|
||||||
ConfirmClearAll: "Вы уверены, что хотите очистить все данные?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Все языки",
|
All: "Все языки",
|
||||||
@@ -157,6 +151,11 @@ const ru: LocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"Чем выше значение, тем больше вероятность общения на новые темы",
|
"Чем выше значение, тем больше вероятность общения на новые темы",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Штраф за частоту",
|
||||||
|
SubTitle:
|
||||||
|
"Большее значение снижает вероятность повторения одной и той же строки",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Новый разговор",
|
DefaultTopic: "Новый разговор",
|
||||||
@@ -232,6 +231,12 @@ const ru: LocaleType = {
|
|||||||
Create: "Создать",
|
Create: "Создать",
|
||||||
Edit: "Редактировать",
|
Edit: "Редактировать",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Модель",
|
||||||
|
Messages: "Сообщения",
|
||||||
|
Topic: "Тема",
|
||||||
|
Time: "Время",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ru;
|
export default ru;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const tr: LocaleType = {
|
const tr: PartialLocaleType = {
|
||||||
WIP: "Çalışma devam ediyor...",
|
WIP: "Çalışma devam ediyor...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,13 +61,7 @@ const tr: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Ayarlar",
|
Title: "Ayarlar",
|
||||||
SubTitle: "Tüm Ayarlar",
|
SubTitle: "Tüm Ayarlar",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Tüm Verileri Temizle",
|
|
||||||
ResetAll: "Tüm Ayarları Sıfırla",
|
|
||||||
Close: "Kapat",
|
|
||||||
ConfirmResetAll: "Tüm ayarları sıfırlamak istediğinizden emin misiniz?",
|
|
||||||
ConfirmClearAll: "Tüm sohbeti sıfırlamak istediğinizden emin misiniz?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Tüm Diller",
|
All: "Tüm Diller",
|
||||||
@@ -158,6 +152,11 @@ const tr: LocaleType = {
|
|||||||
SubTitle:
|
SubTitle:
|
||||||
"Daha büyük bir değer, yeni konular hakkında konuşma olasılığını artırır",
|
"Daha büyük bir değer, yeni konular hakkında konuşma olasılığını artırır",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Frekans Cezası",
|
||||||
|
SubTitle:
|
||||||
|
"Aynı satırı tekrar etme olasılığını azaltan daha büyük bir değer",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Yeni Konuşma",
|
DefaultTopic: "Yeni Konuşma",
|
||||||
@@ -229,6 +228,12 @@ const tr: LocaleType = {
|
|||||||
Create: "Create",
|
Create: "Create",
|
||||||
Edit: "Edit",
|
Edit: "Edit",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Model",
|
||||||
|
Messages: "Mesajlar",
|
||||||
|
Topic: "Konu",
|
||||||
|
Time: "Zaman",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default tr;
|
export default tr;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const tw: LocaleType = {
|
const tw: PartialLocaleType = {
|
||||||
WIP: "該功能仍在開發中……",
|
WIP: "該功能仍在開發中……",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized: "目前您的狀態是未授權,請前往設定頁面輸入授權碼。",
|
Unauthorized: "目前您的狀態是未授權,請前往設定頁面輸入授權碼。",
|
||||||
@@ -59,13 +59,7 @@ const tw: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "設定",
|
Title: "設定",
|
||||||
SubTitle: "設定選項",
|
SubTitle: "設定選項",
|
||||||
Actions: {
|
|
||||||
ClearAll: "清除所有資料",
|
|
||||||
ResetAll: "重設所有設定",
|
|
||||||
Close: "關閉",
|
|
||||||
ConfirmResetAll: "您確定要重設所有設定嗎?",
|
|
||||||
ConfirmClearAll: "您確定要清除所有数据嗎?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "所有语言",
|
All: "所有语言",
|
||||||
@@ -152,6 +146,10 @@ const tw: LocaleType = {
|
|||||||
Title: "話題新穎度 (presence_penalty)",
|
Title: "話題新穎度 (presence_penalty)",
|
||||||
SubTitle: "值越大,越有可能擴展到新話題",
|
SubTitle: "值越大,越有可能擴展到新話題",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "頻率懲罰度 (frequency_penalty)",
|
||||||
|
SubTitle: "值越大,越有可能降低重複字詞",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "新的對話",
|
DefaultTopic: "新的對話",
|
||||||
@@ -219,6 +217,12 @@ const tw: LocaleType = {
|
|||||||
Create: "新建",
|
Create: "新建",
|
||||||
Edit: "编辑",
|
Edit: "编辑",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "模型",
|
||||||
|
Messages: "消息",
|
||||||
|
Topic: "主題",
|
||||||
|
Time: "時間",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default tw;
|
export default tw;
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { SubmitKey } from "../store/config";
|
import { SubmitKey } from "../store/config";
|
||||||
import type { LocaleType } from "./index";
|
import type { PartialLocaleType } from "./index";
|
||||||
|
|
||||||
const vi: LocaleType = {
|
const vi: PartialLocaleType = {
|
||||||
WIP: "Sắp ra mắt...",
|
WIP: "Sắp ra mắt...",
|
||||||
Error: {
|
Error: {
|
||||||
Unauthorized:
|
Unauthorized:
|
||||||
@@ -61,13 +61,7 @@ const vi: LocaleType = {
|
|||||||
Settings: {
|
Settings: {
|
||||||
Title: "Cài đặt",
|
Title: "Cài đặt",
|
||||||
SubTitle: "Tất cả cài đặt",
|
SubTitle: "Tất cả cài đặt",
|
||||||
Actions: {
|
|
||||||
ClearAll: "Xóa toàn bộ dữ liệu",
|
|
||||||
ResetAll: "Khôi phục cài đặt gốc",
|
|
||||||
Close: "Đóng",
|
|
||||||
ConfirmResetAll: "Bạn chắc chắn muốn thiết lập lại tất cả cài đặt?",
|
|
||||||
ConfirmClearAll: "Bạn chắc chắn muốn thiết lập lại tất cả dữ liệu?",
|
|
||||||
},
|
|
||||||
Lang: {
|
Lang: {
|
||||||
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
|
||||||
All: "Tất cả ngôn ngữ",
|
All: "Tất cả ngôn ngữ",
|
||||||
@@ -154,6 +148,10 @@ const vi: LocaleType = {
|
|||||||
Title: "Chủ đề mới (presence_penalty)",
|
Title: "Chủ đề mới (presence_penalty)",
|
||||||
SubTitle: "Giá trị càng lớn tăng khả năng mở rộng sang các chủ đề mới",
|
SubTitle: "Giá trị càng lớn tăng khả năng mở rộng sang các chủ đề mới",
|
||||||
},
|
},
|
||||||
|
FrequencyPenalty: {
|
||||||
|
Title: "Hình phạt tần suất",
|
||||||
|
SubTitle: "Giá trị lớn hơn làm giảm khả năng lặp lại cùng một dòng",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Store: {
|
Store: {
|
||||||
DefaultTopic: "Cuộc trò chuyện mới",
|
DefaultTopic: "Cuộc trò chuyện mới",
|
||||||
@@ -225,6 +223,12 @@ const vi: LocaleType = {
|
|||||||
Create: "Tạo",
|
Create: "Tạo",
|
||||||
Edit: "Chỉnh sửa",
|
Edit: "Chỉnh sửa",
|
||||||
},
|
},
|
||||||
|
Exporter: {
|
||||||
|
Model: "Mô hình",
|
||||||
|
Messages: "Thông điệp",
|
||||||
|
Topic: "Chủ đề",
|
||||||
|
Time: "Thời gian",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default vi;
|
export default vi;
|
||||||
|
@@ -29,6 +29,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 32,
|
historyMessageCount: 32,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -52,6 +53,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -75,6 +77,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -98,6 +101,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -121,6 +125,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -144,6 +149,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: false,
|
sendMemory: false,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -167,6 +173,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: false,
|
sendMemory: false,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -190,6 +197,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: false,
|
sendMemory: false,
|
||||||
historyMessageCount: 0,
|
historyMessageCount: 0,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -218,6 +226,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 0.5,
|
temperature: 0.5,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -241,6 +250,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -270,6 +280,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: false,
|
sendMemory: false,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -299,6 +310,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: false,
|
sendMemory: false,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -349,6 +361,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 1,
|
temperature: 1,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: false,
|
sendMemory: false,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -377,6 +390,7 @@ export const CN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 0.5,
|
temperature: 0.5,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
|
@@ -17,6 +17,7 @@ export const EN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 0.3,
|
temperature: 0.3,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -57,6 +58,7 @@ export const EN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 0.5,
|
temperature: 0.5,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -80,6 +82,7 @@ export const EN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 0.5,
|
temperature: 0.5,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
@@ -108,6 +111,7 @@ export const EN_MASKS: BuiltinMask[] = [
|
|||||||
temperature: 0.5,
|
temperature: 0.5,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 2000,
|
compressMessageLengthThreshold: 2000,
|
||||||
|
@@ -9,7 +9,7 @@ export const BUILTIN_MASK_ID = 100000;
|
|||||||
|
|
||||||
export const BUILTIN_MASK_STORE = {
|
export const BUILTIN_MASK_STORE = {
|
||||||
buildinId: BUILTIN_MASK_ID,
|
buildinId: BUILTIN_MASK_ID,
|
||||||
masks: {} as Record<number, Mask>,
|
masks: {} as Record<number, BuiltinMask>,
|
||||||
get(id?: number) {
|
get(id?: number) {
|
||||||
if (!id) return undefined;
|
if (!id) return undefined;
|
||||||
return this.masks[id] as Mask | undefined;
|
return this.masks[id] as Mask | undefined;
|
||||||
@@ -21,6 +21,6 @@ export const BUILTIN_MASK_STORE = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const BUILTIN_MASKS: Mask[] = [...CN_MASKS, ...EN_MASKS].map((m) =>
|
export const BUILTIN_MASKS: BuiltinMask[] = [...CN_MASKS, ...EN_MASKS].map(
|
||||||
BUILTIN_MASK_STORE.add(m),
|
(m) => BUILTIN_MASK_STORE.add(m),
|
||||||
);
|
);
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
|
import { ModelConfig } from "../store";
|
||||||
import { type Mask } from "../store/mask";
|
import { type Mask } from "../store/mask";
|
||||||
|
|
||||||
export type BuiltinMask = Omit<Mask, "id"> & {
|
export type BuiltinMask = Omit<Mask, "id" | "modelConfig"> & {
|
||||||
builtin: true;
|
builtin: Boolean;
|
||||||
|
modelConfig: Partial<ModelConfig>;
|
||||||
};
|
};
|
||||||
|
@@ -13,6 +13,7 @@ export interface AccessControlStore {
|
|||||||
needCode: boolean;
|
needCode: boolean;
|
||||||
hideUserApiKey: boolean;
|
hideUserApiKey: boolean;
|
||||||
openaiUrl: string;
|
openaiUrl: string;
|
||||||
|
hideBalanceQuery: boolean;
|
||||||
|
|
||||||
updateToken: (_: string) => void;
|
updateToken: (_: string) => void;
|
||||||
updateCode: (_: string) => void;
|
updateCode: (_: string) => void;
|
||||||
@@ -36,6 +37,7 @@ export const useAccessStore = create<AccessControlStore>()(
|
|||||||
needCode: true,
|
needCode: true,
|
||||||
hideUserApiKey: false,
|
hideUserApiKey: false,
|
||||||
openaiUrl: DEFAULT_OPENAI_URL,
|
openaiUrl: DEFAULT_OPENAI_URL,
|
||||||
|
hideBalanceQuery: false,
|
||||||
|
|
||||||
enabledAccessControl() {
|
enabledAccessControl() {
|
||||||
get().fetch();
|
get().fetch();
|
||||||
|
@@ -3,11 +3,15 @@ import { persist } from "zustand/middleware";
|
|||||||
|
|
||||||
import { trimTopic } from "../utils";
|
import { trimTopic } from "../utils";
|
||||||
|
|
||||||
import Locale from "../locales";
|
import Locale, { getLang } from "../locales";
|
||||||
import { showToast } from "../components/ui-lib";
|
import { showToast } from "../components/ui-lib";
|
||||||
import { ModelType } from "./config";
|
import { ModelConfig, ModelType, useAppConfig } from "./config";
|
||||||
import { createEmptyMask, Mask } from "./mask";
|
import { createEmptyMask, Mask } from "./mask";
|
||||||
import { StoreKey } from "../constant";
|
import {
|
||||||
|
DEFAULT_INPUT_TEMPLATE,
|
||||||
|
DEFAULT_SYSTEM_TEMPLATE,
|
||||||
|
StoreKey,
|
||||||
|
} from "../constant";
|
||||||
import { api, RequestMessage } from "../client/api";
|
import { api, RequestMessage } from "../client/api";
|
||||||
import { ChatControllerPool } from "../client/controller";
|
import { ChatControllerPool } from "../client/controller";
|
||||||
import { prettyObject } from "../utils/format";
|
import { prettyObject } from "../utils/format";
|
||||||
@@ -85,6 +89,7 @@ interface ChatStore {
|
|||||||
newSession: (mask?: Mask) => void;
|
newSession: (mask?: Mask) => void;
|
||||||
deleteSession: (index: number) => void;
|
deleteSession: (index: number) => void;
|
||||||
currentSession: () => ChatSession;
|
currentSession: () => ChatSession;
|
||||||
|
nextSession: (delta: number) => void;
|
||||||
onNewMessage: (message: ChatMessage) => void;
|
onNewMessage: (message: ChatMessage) => void;
|
||||||
onUserInput: (content: string) => Promise<void>;
|
onUserInput: (content: string) => Promise<void>;
|
||||||
summarizeSession: () => void;
|
summarizeSession: () => void;
|
||||||
@@ -106,6 +111,29 @@ function countMessages(msgs: ChatMessage[]) {
|
|||||||
return msgs.reduce((pre, cur) => pre + estimateTokenLength(cur.content), 0);
|
return msgs.reduce((pre, cur) => pre + estimateTokenLength(cur.content), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function fillTemplateWith(input: string, modelConfig: ModelConfig) {
|
||||||
|
const vars = {
|
||||||
|
model: modelConfig.model,
|
||||||
|
time: new Date().toLocaleString(),
|
||||||
|
lang: getLang(),
|
||||||
|
input: input,
|
||||||
|
};
|
||||||
|
|
||||||
|
let output = modelConfig.template ?? DEFAULT_INPUT_TEMPLATE;
|
||||||
|
|
||||||
|
// must contains {{input}}
|
||||||
|
const inputVar = "{{input}}";
|
||||||
|
if (!output.includes(inputVar)) {
|
||||||
|
output += "\n" + inputVar;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.entries(vars).forEach(([name, value]) => {
|
||||||
|
output = output.replaceAll(`{{${name}}}`, value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
export const useChatStore = create<ChatStore>()(
|
export const useChatStore = create<ChatStore>()(
|
||||||
persist(
|
persist(
|
||||||
(set, get) => ({
|
(set, get) => ({
|
||||||
@@ -158,7 +186,16 @@ export const useChatStore = create<ChatStore>()(
|
|||||||
session.id = get().globalId;
|
session.id = get().globalId;
|
||||||
|
|
||||||
if (mask) {
|
if (mask) {
|
||||||
session.mask = { ...mask };
|
const config = useAppConfig.getState();
|
||||||
|
const globalModelConfig = config.modelConfig;
|
||||||
|
|
||||||
|
session.mask = {
|
||||||
|
...mask,
|
||||||
|
modelConfig: {
|
||||||
|
...globalModelConfig,
|
||||||
|
...mask.modelConfig,
|
||||||
|
},
|
||||||
|
};
|
||||||
session.topic = mask.name;
|
session.topic = mask.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,6 +205,13 @@ export const useChatStore = create<ChatStore>()(
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
nextSession(delta) {
|
||||||
|
const n = get().sessions.length;
|
||||||
|
const limit = (x: number) => (x + n) % n;
|
||||||
|
const i = get().currentSessionIndex;
|
||||||
|
get().selectSession(limit(i + delta));
|
||||||
|
},
|
||||||
|
|
||||||
deleteSession(index) {
|
deleteSession(index) {
|
||||||
const deletingLastSession = get().sessions.length === 1;
|
const deletingLastSession = get().sessions.length === 1;
|
||||||
const deletedSession = get().sessions.at(index);
|
const deletedSession = get().sessions.at(index);
|
||||||
@@ -238,9 +282,12 @@ export const useChatStore = create<ChatStore>()(
|
|||||||
const session = get().currentSession();
|
const session = get().currentSession();
|
||||||
const modelConfig = session.mask.modelConfig;
|
const modelConfig = session.mask.modelConfig;
|
||||||
|
|
||||||
|
const userContent = fillTemplateWith(content, modelConfig);
|
||||||
|
console.log("[User Input] after template: ", userContent);
|
||||||
|
|
||||||
const userMessage: ChatMessage = createMessage({
|
const userMessage: ChatMessage = createMessage({
|
||||||
role: "user",
|
role: "user",
|
||||||
content,
|
content: userContent,
|
||||||
});
|
});
|
||||||
|
|
||||||
const botMessage: ChatMessage = createMessage({
|
const botMessage: ChatMessage = createMessage({
|
||||||
@@ -250,35 +297,25 @@ export const useChatStore = create<ChatStore>()(
|
|||||||
model: modelConfig.model,
|
model: modelConfig.model,
|
||||||
});
|
});
|
||||||
|
|
||||||
const systemInfo = createMessage({
|
|
||||||
role: "system",
|
|
||||||
content: `IMPORTANT: You are a virtual assistant powered by the ${
|
|
||||||
modelConfig.model
|
|
||||||
} model, now time is ${new Date().toLocaleString()}}`,
|
|
||||||
id: botMessage.id! + 1,
|
|
||||||
});
|
|
||||||
|
|
||||||
// get recent messages
|
// get recent messages
|
||||||
const systemMessages = [];
|
|
||||||
// if user define a mask with context prompts, wont send system info
|
|
||||||
if (session.mask.context.length === 0) {
|
|
||||||
systemMessages.push(systemInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
const recentMessages = get().getMessagesWithMemory();
|
const recentMessages = get().getMessagesWithMemory();
|
||||||
const sendMessages = systemMessages.concat(
|
const sendMessages = recentMessages.concat(userMessage);
|
||||||
recentMessages.concat(userMessage),
|
|
||||||
);
|
|
||||||
const sessionIndex = get().currentSessionIndex;
|
const sessionIndex = get().currentSessionIndex;
|
||||||
const messageIndex = get().currentSession().messages.length + 1;
|
const messageIndex = get().currentSession().messages.length + 1;
|
||||||
|
|
||||||
// save user's and bot's message
|
// save user's and bot's message
|
||||||
get().updateCurrentSession((session) => {
|
get().updateCurrentSession((session) => {
|
||||||
session.messages = session.messages.concat([userMessage, botMessage]);
|
const savedUserMessage = {
|
||||||
|
...userMessage,
|
||||||
|
content,
|
||||||
|
};
|
||||||
|
session.messages = session.messages.concat([
|
||||||
|
savedUserMessage,
|
||||||
|
botMessage,
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
// make request
|
// make request
|
||||||
console.log("[User Input] ", sendMessages);
|
|
||||||
api.llm.chat({
|
api.llm.chat({
|
||||||
messages: sendMessages,
|
messages: sendMessages,
|
||||||
config: { ...modelConfig, stream: true },
|
config: { ...modelConfig, stream: true },
|
||||||
@@ -350,53 +387,84 @@ export const useChatStore = create<ChatStore>()(
|
|||||||
getMessagesWithMemory() {
|
getMessagesWithMemory() {
|
||||||
const session = get().currentSession();
|
const session = get().currentSession();
|
||||||
const modelConfig = session.mask.modelConfig;
|
const modelConfig = session.mask.modelConfig;
|
||||||
|
const clearContextIndex = session.clearContextIndex ?? 0;
|
||||||
|
const messages = session.messages.slice();
|
||||||
|
const totalMessageCount = session.messages.length;
|
||||||
|
|
||||||
// wont send cleared context messages
|
// in-context prompts
|
||||||
const clearedContextMessages = session.messages.slice(
|
const contextPrompts = session.mask.context.slice();
|
||||||
session.clearContextIndex ?? 0,
|
|
||||||
);
|
|
||||||
const messages = clearedContextMessages.filter((msg) => !msg.isError);
|
|
||||||
const n = messages.length;
|
|
||||||
|
|
||||||
const context = session.mask.context.slice();
|
// system prompts, to get close to OpenAI Web ChatGPT
|
||||||
|
// only will be injected if user does not use a mask or set none context prompts
|
||||||
// long term memory
|
const shouldInjectSystemPrompts = contextPrompts.length === 0;
|
||||||
if (
|
const systemPrompts = shouldInjectSystemPrompts
|
||||||
modelConfig.sendMemory &&
|
? [
|
||||||
session.memoryPrompt &&
|
createMessage({
|
||||||
session.memoryPrompt.length > 0
|
role: "system",
|
||||||
) {
|
content: fillTemplateWith("", {
|
||||||
const memoryPrompt = get().getMemoryPrompt();
|
...modelConfig,
|
||||||
context.push(memoryPrompt);
|
template: DEFAULT_SYSTEM_TEMPLATE,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
: [];
|
||||||
|
if (shouldInjectSystemPrompts) {
|
||||||
|
console.log(
|
||||||
|
"[Global System Prompt] ",
|
||||||
|
systemPrompts.at(0)?.content ?? "empty",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get short term and unmemoried long term memory
|
// long term memory
|
||||||
const shortTermMemoryMessageIndex = Math.max(
|
const shouldSendLongTermMemory =
|
||||||
0,
|
modelConfig.sendMemory &&
|
||||||
n - modelConfig.historyMessageCount,
|
session.memoryPrompt &&
|
||||||
);
|
session.memoryPrompt.length > 0 &&
|
||||||
const longTermMemoryMessageIndex = session.lastSummarizeIndex;
|
session.lastSummarizeIndex <= clearContextIndex;
|
||||||
const mostRecentIndex = Math.max(
|
const longTermMemoryPrompts = shouldSendLongTermMemory
|
||||||
shortTermMemoryMessageIndex,
|
? [get().getMemoryPrompt()]
|
||||||
longTermMemoryMessageIndex,
|
: [];
|
||||||
);
|
const longTermMemoryStartIndex = session.lastSummarizeIndex;
|
||||||
const threshold = modelConfig.compressMessageLengthThreshold * 2;
|
|
||||||
|
|
||||||
// get recent messages as many as possible
|
// short term memory
|
||||||
|
const shortTermMemoryStartIndex = Math.max(
|
||||||
|
0,
|
||||||
|
totalMessageCount - modelConfig.historyMessageCount,
|
||||||
|
);
|
||||||
|
|
||||||
|
// lets concat send messages, including 4 parts:
|
||||||
|
// 0. system prompt: to get close to OpenAI Web ChatGPT
|
||||||
|
// 1. long term memory: summarized memory messages
|
||||||
|
// 2. pre-defined in-context prompts
|
||||||
|
// 3. short term memory: latest n messages
|
||||||
|
// 4. newest input message
|
||||||
|
const memoryStartIndex = shouldSendLongTermMemory
|
||||||
|
? Math.min(longTermMemoryStartIndex, shortTermMemoryStartIndex)
|
||||||
|
: shortTermMemoryStartIndex;
|
||||||
|
// and if user has cleared history messages, we should exclude the memory too.
|
||||||
|
const contextStartIndex = Math.max(clearContextIndex, memoryStartIndex);
|
||||||
|
const maxTokenThreshold = modelConfig.max_tokens;
|
||||||
|
|
||||||
|
// get recent messages as much as possible
|
||||||
const reversedRecentMessages = [];
|
const reversedRecentMessages = [];
|
||||||
for (
|
for (
|
||||||
let i = n - 1, count = 0;
|
let i = totalMessageCount - 1, tokenCount = 0;
|
||||||
i >= mostRecentIndex && count < threshold;
|
i >= contextStartIndex && tokenCount < maxTokenThreshold;
|
||||||
i -= 1
|
i -= 1
|
||||||
) {
|
) {
|
||||||
const msg = messages[i];
|
const msg = messages[i];
|
||||||
if (!msg || msg.isError) continue;
|
if (!msg || msg.isError) continue;
|
||||||
count += msg.content.length;
|
tokenCount += estimateTokenLength(msg.content);
|
||||||
reversedRecentMessages.push(msg);
|
reversedRecentMessages.push(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// concat
|
// concat all messages
|
||||||
const recentMessages = context.concat(reversedRecentMessages.reverse());
|
const recentMessages = [
|
||||||
|
...systemPrompts,
|
||||||
|
...longTermMemoryPrompts,
|
||||||
|
...contextPrompts,
|
||||||
|
...reversedRecentMessages.reverse(),
|
||||||
|
];
|
||||||
|
|
||||||
return recentMessages;
|
return recentMessages;
|
||||||
},
|
},
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { persist } from "zustand/middleware";
|
import { persist } from "zustand/middleware";
|
||||||
import { getClientConfig } from "../config/client";
|
import { getClientConfig } from "../config/client";
|
||||||
import { StoreKey } from "../constant";
|
import { DEFAULT_INPUT_TEMPLATE, StoreKey } from "../constant";
|
||||||
|
|
||||||
export enum SubmitKey {
|
export enum SubmitKey {
|
||||||
Enter = "Enter",
|
Enter = "Enter",
|
||||||
@@ -35,9 +35,11 @@ export const DEFAULT_CONFIG = {
|
|||||||
temperature: 0.5,
|
temperature: 0.5,
|
||||||
max_tokens: 2000,
|
max_tokens: 2000,
|
||||||
presence_penalty: 0,
|
presence_penalty: 0,
|
||||||
|
frequency_penalty: 0,
|
||||||
sendMemory: true,
|
sendMemory: true,
|
||||||
historyMessageCount: 4,
|
historyMessageCount: 4,
|
||||||
compressMessageLengthThreshold: 1000,
|
compressMessageLengthThreshold: 1000,
|
||||||
|
template: DEFAULT_INPUT_TEMPLATE,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -150,6 +152,9 @@ export const ModalConfigValidator = {
|
|||||||
presence_penalty(x: number) {
|
presence_penalty(x: number) {
|
||||||
return limitNumber(x, -2, 2, 0);
|
return limitNumber(x, -2, 2, 0);
|
||||||
},
|
},
|
||||||
|
frequency_penalty(x: number) {
|
||||||
|
return limitNumber(x, -2, 2, 0);
|
||||||
|
},
|
||||||
temperature(x: number) {
|
temperature(x: number) {
|
||||||
return limitNumber(x, 0, 1, 1);
|
return limitNumber(x, 0, 1, 1);
|
||||||
},
|
},
|
||||||
@@ -172,14 +177,16 @@ export const useAppConfig = create<ChatConfigStore>()(
|
|||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
name: StoreKey.Config,
|
name: StoreKey.Config,
|
||||||
version: 2,
|
version: 3.2,
|
||||||
migrate(persistedState, version) {
|
migrate(persistedState, version) {
|
||||||
if (version === 2) return persistedState as any;
|
if (version === 3.2) return persistedState as any;
|
||||||
|
|
||||||
const state = persistedState as ChatConfig;
|
const state = persistedState as ChatConfig;
|
||||||
state.modelConfig.sendMemory = true;
|
state.modelConfig.sendMemory = true;
|
||||||
state.modelConfig.historyMessageCount = 4;
|
state.modelConfig.historyMessageCount = 4;
|
||||||
state.modelConfig.compressMessageLengthThreshold = 1000;
|
state.modelConfig.compressMessageLengthThreshold = 1000;
|
||||||
|
state.modelConfig.frequency_penalty = 0;
|
||||||
|
state.modelConfig.template = DEFAULT_INPUT_TEMPLATE;
|
||||||
state.dontShowMaskSplashScreen = false;
|
state.dontShowMaskSplashScreen = false;
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
|
@@ -3,7 +3,7 @@ import { persist } from "zustand/middleware";
|
|||||||
import { BUILTIN_MASKS } from "../masks";
|
import { BUILTIN_MASKS } from "../masks";
|
||||||
import { getLang, Lang } from "../locales";
|
import { getLang, Lang } from "../locales";
|
||||||
import { DEFAULT_TOPIC, ChatMessage } from "./chat";
|
import { DEFAULT_TOPIC, ChatMessage } from "./chat";
|
||||||
import { ModelConfig, ModelType, useAppConfig } from "./config";
|
import { ModelConfig, useAppConfig } from "./config";
|
||||||
import { StoreKey } from "../constant";
|
import { StoreKey } from "../constant";
|
||||||
|
|
||||||
export type Mask = {
|
export type Mask = {
|
||||||
@@ -89,7 +89,18 @@ export const useMaskStore = create<MaskStore>()(
|
|||||||
const userMasks = Object.values(get().masks).sort(
|
const userMasks = Object.values(get().masks).sort(
|
||||||
(a, b) => b.id - a.id,
|
(a, b) => b.id - a.id,
|
||||||
);
|
);
|
||||||
return userMasks.concat(BUILTIN_MASKS);
|
const config = useAppConfig.getState();
|
||||||
|
const buildinMasks = BUILTIN_MASKS.map(
|
||||||
|
(m) =>
|
||||||
|
({
|
||||||
|
...m,
|
||||||
|
modelConfig: {
|
||||||
|
...config.modelConfig,
|
||||||
|
...m.modelConfig,
|
||||||
|
},
|
||||||
|
} as Mask),
|
||||||
|
);
|
||||||
|
return userMasks.concat(buildinMasks);
|
||||||
},
|
},
|
||||||
search(text) {
|
search(text) {
|
||||||
return Object.values(get().masks);
|
return Object.values(get().masks);
|
||||||
|
87
app/store/sync.ts
Normal file
87
app/store/sync.ts
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import { Updater } from "../typing";
|
||||||
|
import { create } from "zustand";
|
||||||
|
import { persist } from "zustand/middleware";
|
||||||
|
import { StoreKey } from "../constant";
|
||||||
|
|
||||||
|
export interface WebDavConfig {
|
||||||
|
server: string;
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SyncStore {
|
||||||
|
webDavConfig: WebDavConfig;
|
||||||
|
lastSyncTime: number;
|
||||||
|
|
||||||
|
update: Updater<WebDavConfig>;
|
||||||
|
check: () => Promise<boolean>;
|
||||||
|
|
||||||
|
path: (path: string) => string;
|
||||||
|
headers: () => { Authorization: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
const FILE = {
|
||||||
|
root: "/chatgpt-next-web/",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useSyncStore = create<SyncStore>()(
|
||||||
|
persist(
|
||||||
|
(set, get) => ({
|
||||||
|
webDavConfig: {
|
||||||
|
server: "",
|
||||||
|
username: "",
|
||||||
|
password: "",
|
||||||
|
},
|
||||||
|
|
||||||
|
lastSyncTime: 0,
|
||||||
|
|
||||||
|
update(updater) {
|
||||||
|
const config = { ...get().webDavConfig };
|
||||||
|
updater(config);
|
||||||
|
set({ webDavConfig: config });
|
||||||
|
},
|
||||||
|
|
||||||
|
async check() {
|
||||||
|
try {
|
||||||
|
const res = await fetch(this.path(""), {
|
||||||
|
method: "PROFIND",
|
||||||
|
headers: this.headers(),
|
||||||
|
});
|
||||||
|
console.log(res);
|
||||||
|
return res.status === 207;
|
||||||
|
} catch (e) {
|
||||||
|
console.error("[Sync] ", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
path(path: string) {
|
||||||
|
let url = get().webDavConfig.server;
|
||||||
|
|
||||||
|
if (!url.endsWith("/")) {
|
||||||
|
url += "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path.startsWith("/")) {
|
||||||
|
path = path.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return url + path;
|
||||||
|
},
|
||||||
|
|
||||||
|
headers() {
|
||||||
|
const auth = btoa(
|
||||||
|
[get().webDavConfig.username, get().webDavConfig.password].join(":"),
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
Authorization: `Basic ${auth}`,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
name: StoreKey.Sync,
|
||||||
|
version: 1,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
@@ -304,6 +304,9 @@ pre {
|
|||||||
&:hover {
|
&:hover {
|
||||||
filter: brightness(0.9);
|
filter: brightness(0.9);
|
||||||
}
|
}
|
||||||
|
&:focus {
|
||||||
|
filter: brightness(0.95);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.error {
|
.error {
|
||||||
|
@@ -844,6 +844,7 @@
|
|||||||
font-size: 85%;
|
font-size: 85%;
|
||||||
line-height: 1.45;
|
line-height: 1.45;
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
|
direction: ltr;
|
||||||
}
|
}
|
||||||
|
|
||||||
.markdown-body pre code,
|
.markdown-body pre code,
|
||||||
@@ -1117,3 +1118,15 @@
|
|||||||
.markdown-body ::-webkit-calendar-picker-indicator {
|
.markdown-body ::-webkit-calendar-picker-indicator {
|
||||||
filter: invert(50%);
|
filter: invert(50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.markdown-body .mermaid {
|
||||||
|
border: var(--border-in-light);
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: var(--white);
|
||||||
|
}
|
||||||
|
|
||||||
|
#dmermaid {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
.window-header-sub-title {
|
.window-header-sub-title {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin-top: 5px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +31,6 @@
|
|||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-action-button {
|
.window-action-button:not(:first-child) {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,12 @@ export function trimTopic(topic: string) {
|
|||||||
|
|
||||||
export async function copyToClipboard(text: string) {
|
export async function copyToClipboard(text: string) {
|
||||||
try {
|
try {
|
||||||
await navigator.clipboard.writeText(text);
|
if (window.__TAURI__) {
|
||||||
|
window.__TAURI__.writeText(text);
|
||||||
|
} else {
|
||||||
|
await navigator.clipboard.writeText(text);
|
||||||
|
}
|
||||||
|
|
||||||
showToast(Locale.Copy.Success);
|
showToast(Locale.Copy.Success);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const textArea = document.createElement("textarea");
|
const textArea = document.createElement("textarea");
|
||||||
@@ -152,6 +157,7 @@ export function autoGrowTextArea(dom: HTMLTextAreaElement) {
|
|||||||
const width = getDomContentWidth(dom);
|
const width = getDomContentWidth(dom);
|
||||||
measureDom.style.width = width + "px";
|
measureDom.style.width = width + "px";
|
||||||
measureDom.innerText = dom.value !== "" ? dom.value : "1";
|
measureDom.innerText = dom.value !== "" ? dom.value : "1";
|
||||||
|
measureDom.style.fontSize = dom.style.fontSize;
|
||||||
const endWithEmptyLine = dom.value.endsWith("\n");
|
const endWithEmptyLine = dom.value.endsWith("\n");
|
||||||
const height = parseFloat(window.getComputedStyle(measureDom).height);
|
const height = parseFloat(window.getComputedStyle(measureDom).height);
|
||||||
const singleLineHeight = parseFloat(
|
const singleLineHeight = parseFloat(
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||

|

|
||||||
1. 在项目配置页,点开 Environmane Variables 开始配置环境变量;
|
1. 在项目配置页,点开 Environmane Variables 开始配置环境变量;
|
||||||
2. 依次新增名为 OPENAI_API_KEY 和 CODE 的环境变量;
|
2. 依次新增名为 OPENAI_API_KEY 和 CODE ([访问密码](https://github.com/Yidadaa/ChatGPT-Next-Web/blob/357296986609c14de10bf210871d30e2f67a8784/docs/faq-cn.md#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F-code-%E6%98%AF%E4%BB%80%E4%B9%88%E5%BF%85%E9%A1%BB%E8%AE%BE%E7%BD%AE%E5%90%97)) 的环境变量;
|
||||||
3. 填入环境变量对应的值;
|
3. 填入环境变量对应的值;
|
||||||
4. 点击 Add 确认增加环境变量;
|
4. 点击 Add 确认增加环境变量;
|
||||||
5. 请确保你添加了 OPENAI_API_KEY,否则无法使用;
|
5. 请确保你添加了 OPENAI_API_KEY,否则无法使用;
|
||||||
@@ -36,4 +36,4 @@
|
|||||||

|

|
||||||
1. 进入 Vercel 项目内部控制台,点击顶部的 Deployments 按钮;
|
1. 进入 Vercel 项目内部控制台,点击顶部的 Deployments 按钮;
|
||||||
2. 选择列表最顶部一条的右侧按钮;
|
2. 选择列表最顶部一条的右侧按钮;
|
||||||
3. 点击 Redeploy 即可重新部署。
|
3. 点击 Redeploy 即可重新部署。
|
||||||
|
19
package.json
19
package.json
@@ -23,12 +23,12 @@
|
|||||||
"emoji-picker-react": "^4.4.7",
|
"emoji-picker-react": "^4.4.7",
|
||||||
"fuse.js": "^6.6.2",
|
"fuse.js": "^6.6.2",
|
||||||
"html-to-image": "^1.11.11",
|
"html-to-image": "^1.11.11",
|
||||||
"mermaid": "^10.1.0",
|
"mermaid": "^10.2.3",
|
||||||
"next": "^13.4.3",
|
"next": "^13.4.6",
|
||||||
"node-fetch": "^3.3.1",
|
"node-fetch": "^3.3.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-markdown": "^8.0.5",
|
"react-markdown": "^8.0.7",
|
||||||
"react-router-dom": "^6.10.0",
|
"react-router-dom": "^6.10.0",
|
||||||
"rehype-highlight": "^6.0.0",
|
"rehype-highlight": "^6.0.0",
|
||||||
"rehype-katex": "^6.0.2",
|
"rehype-katex": "^6.0.2",
|
||||||
@@ -37,13 +37,13 @@
|
|||||||
"remark-math": "^5.1.1",
|
"remark-math": "^5.1.1",
|
||||||
"sass": "^1.59.2",
|
"sass": "^1.59.2",
|
||||||
"spark-md5": "^3.0.2",
|
"spark-md5": "^3.0.2",
|
||||||
"use-debounce": "^9.0.3",
|
"use-debounce": "^9.0.4",
|
||||||
"zustand": "^4.3.6"
|
"zustand": "^4.3.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tauri-apps/cli": "^1.3.1",
|
"@tauri-apps/cli": "^1.3.1",
|
||||||
"@types/node": "^18.14.6",
|
"@types/node": "^20.3.1",
|
||||||
"@types/react": "^18.0.28",
|
"@types/react": "^18.2.12",
|
||||||
"@types/react-dom": "^18.0.11",
|
"@types/react-dom": "^18.0.11",
|
||||||
"@types/react-katex": "^3.0.0",
|
"@types/react-katex": "^3.0.0",
|
||||||
"@types/spark-md5": "^3.0.2",
|
"@types/spark-md5": "^3.0.2",
|
||||||
@@ -53,8 +53,11 @@
|
|||||||
"eslint-config-prettier": "^8.8.0",
|
"eslint-config-prettier": "^8.8.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
"husky": "^8.0.0",
|
"husky": "^8.0.0",
|
||||||
"lint-staged": "^13.2.0",
|
"lint-staged": "^13.2.2",
|
||||||
"prettier": "^2.8.7",
|
"prettier": "^2.8.7",
|
||||||
"typescript": "4.9.5"
|
"typescript": "4.9.5"
|
||||||
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"lint-staged/yaml": "^2.2.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
90
src-tauri/Cargo.lock
generated
90
src-tauri/Cargo.lock
generated
@@ -63,7 +63,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd"
|
checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atk-sys",
|
"atk-sys",
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"glib",
|
"glib",
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
@@ -114,12 +114,27 @@ version = "0.21.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
|
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bincode"
|
||||||
|
version = "1.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "block"
|
name = "block"
|
||||||
version = "0.1.6"
|
version = "0.1.6"
|
||||||
@@ -196,7 +211,7 @@ version = "0.15.12"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc"
|
checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cairo-sys-rs",
|
"cairo-sys-rs",
|
||||||
"glib",
|
"glib",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -280,6 +295,7 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"tauri",
|
"tauri",
|
||||||
"tauri-build",
|
"tauri-build",
|
||||||
|
"tauri-plugin-window-state",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -301,7 +317,7 @@ version = "0.24.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
|
checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"block",
|
"block",
|
||||||
"cocoa-foundation",
|
"cocoa-foundation",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
@@ -317,7 +333,7 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6"
|
checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"block",
|
"block",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
"core-graphics-types",
|
"core-graphics-types",
|
||||||
@@ -370,7 +386,7 @@ version = "0.22.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
|
checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
"core-graphics-types",
|
"core-graphics-types",
|
||||||
"foreign-types",
|
"foreign-types",
|
||||||
@@ -383,7 +399,7 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
|
checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
"foreign-types",
|
"foreign-types",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -802,7 +818,7 @@ version = "0.15.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8"
|
checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cairo-rs",
|
"cairo-rs",
|
||||||
"gdk-pixbuf",
|
"gdk-pixbuf",
|
||||||
"gdk-sys",
|
"gdk-sys",
|
||||||
@@ -818,7 +834,7 @@ version = "0.15.11"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a"
|
checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"gdk-pixbuf-sys",
|
"gdk-pixbuf-sys",
|
||||||
"gio",
|
"gio",
|
||||||
"glib",
|
"glib",
|
||||||
@@ -933,7 +949,7 @@ version = "0.15.12"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b"
|
checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-io",
|
"futures-io",
|
||||||
@@ -963,7 +979,7 @@ version = "0.15.12"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d"
|
checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-executor",
|
"futures-executor",
|
||||||
@@ -1039,7 +1055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0"
|
checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atk",
|
"atk",
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cairo-rs",
|
"cairo-rs",
|
||||||
"field-offset",
|
"field-offset",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
@@ -1298,7 +1314,7 @@ version = "0.16.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c"
|
checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"glib",
|
"glib",
|
||||||
"javascriptcore-rs-sys",
|
"javascriptcore-rs-sys",
|
||||||
]
|
]
|
||||||
@@ -1528,7 +1544,7 @@ version = "0.6.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
|
checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"jni-sys",
|
"jni-sys",
|
||||||
"ndk-sys",
|
"ndk-sys",
|
||||||
"num_enum",
|
"num_enum",
|
||||||
@@ -1699,11 +1715,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.10.52"
|
version = "0.10.55"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56"
|
checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"foreign-types",
|
"foreign-types",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -1731,9 +1747,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-sys"
|
name = "openssl-sys"
|
||||||
version = "0.9.87"
|
version = "0.9.90"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e"
|
checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -1753,7 +1769,7 @@ version = "0.15.10"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f"
|
checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"glib",
|
"glib",
|
||||||
"libc",
|
"libc",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@@ -1943,7 +1959,7 @@ version = "0.17.8"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa"
|
checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"crc32fast",
|
"crc32fast",
|
||||||
"fdeflate",
|
"fdeflate",
|
||||||
"flate2",
|
"flate2",
|
||||||
@@ -2125,7 +2141,7 @@ version = "0.2.16"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2134,7 +2150,7 @@ version = "0.3.5"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
|
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2219,7 +2235,7 @@ version = "0.37.19"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
|
checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"errno",
|
"errno",
|
||||||
"io-lifetimes",
|
"io-lifetimes",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -2281,7 +2297,7 @@ version = "2.9.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8"
|
checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"core-foundation",
|
"core-foundation",
|
||||||
"core-foundation-sys",
|
"core-foundation-sys",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -2304,7 +2320,7 @@ version = "0.22.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
|
checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cssparser",
|
"cssparser",
|
||||||
"derive_more",
|
"derive_more",
|
||||||
"fxhash",
|
"fxhash",
|
||||||
@@ -2503,7 +2519,7 @@ version = "0.2.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0"
|
checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"gio",
|
"gio",
|
||||||
"glib",
|
"glib",
|
||||||
"libc",
|
"libc",
|
||||||
@@ -2517,7 +2533,7 @@ version = "0.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf"
|
checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"gio-sys",
|
"gio-sys",
|
||||||
"glib-sys",
|
"glib-sys",
|
||||||
"gobject-sys",
|
"gobject-sys",
|
||||||
@@ -2626,7 +2642,7 @@ version = "0.16.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dd3cde9c0cd2b872616bba26b818e0d6469330196869d7e5000dba96ce9431df"
|
checksum = "dd3cde9c0cd2b872616bba26b818e0d6469330196869d7e5000dba96ce9431df"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cairo-rs",
|
"cairo-rs",
|
||||||
"cc",
|
"cc",
|
||||||
"cocoa",
|
"cocoa",
|
||||||
@@ -2806,6 +2822,20 @@ dependencies = [
|
|||||||
"tauri-utils",
|
"tauri-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tauri-plugin-window-state"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#7b9d7a1d8896c213998949a423d5835e8e2734c6"
|
||||||
|
dependencies = [
|
||||||
|
"bincode",
|
||||||
|
"bitflags 2.3.2",
|
||||||
|
"log",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"tauri",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-runtime"
|
name = "tauri-runtime"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
@@ -3313,7 +3343,7 @@ version = "0.18.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370"
|
checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cairo-rs",
|
"cairo-rs",
|
||||||
"gdk",
|
"gdk",
|
||||||
"gdk-sys",
|
"gdk-sys",
|
||||||
@@ -3338,7 +3368,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3"
|
checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atk-sys",
|
"atk-sys",
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cairo-sys-rs",
|
"cairo-sys-rs",
|
||||||
"gdk-pixbuf-sys",
|
"gdk-pixbuf-sys",
|
||||||
"gdk-sys",
|
"gdk-sys",
|
||||||
|
@@ -17,7 +17,8 @@ tauri-build = { version = "1.3.0", features = [] }
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
tauri = { version = "1.3.0", features = ["clipboard-all", "shell-open", "updater", "window-close", "window-hide", "window-maximize", "window-minimize", "window-set-icon", "window-set-ignore-cursor-events", "window-set-resizable", "window-show", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
|
tauri = { version = "1.3.0", features = ["clipboard-all", "dialog-all", "shell-open", "updater", "window-close", "window-hide", "window-maximize", "window-minimize", "window-set-icon", "window-set-ignore-cursor-events", "window-set-resizable", "window-show", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
|
||||||
|
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled.
|
# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled.
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
tauri::Builder::default()
|
tauri::Builder::default()
|
||||||
|
.plugin(tauri_plugin_window_state::Builder::default().build())
|
||||||
.run(tauri::generate_context!())
|
.run(tauri::generate_context!())
|
||||||
.expect("error while running tauri application");
|
.expect("error while running tauri application");
|
||||||
}
|
}
|
||||||
|
@@ -4,11 +4,12 @@
|
|||||||
"beforeBuildCommand": "yarn export",
|
"beforeBuildCommand": "yarn export",
|
||||||
"beforeDevCommand": "yarn export:dev",
|
"beforeDevCommand": "yarn export:dev",
|
||||||
"devPath": "http://localhost:3000",
|
"devPath": "http://localhost:3000",
|
||||||
"distDir": "../out"
|
"distDir": "../out",
|
||||||
|
"withGlobalTauri": true
|
||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "chatgpt-next-web",
|
"productName": "chatgpt-next-web",
|
||||||
"version": "2.8.2"
|
"version": "2.8.5"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
@@ -17,8 +18,18 @@
|
|||||||
"all": false,
|
"all": false,
|
||||||
"open": true
|
"open": true
|
||||||
},
|
},
|
||||||
|
"dialog": {
|
||||||
|
"all": true,
|
||||||
|
"ask": true,
|
||||||
|
"confirm": true,
|
||||||
|
"message": true,
|
||||||
|
"open": true,
|
||||||
|
"save": true
|
||||||
|
},
|
||||||
"clipboard": {
|
"clipboard": {
|
||||||
"all": true
|
"all": true,
|
||||||
|
"writeText": true,
|
||||||
|
"readText": true
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
"all": false,
|
"all": false,
|
||||||
@@ -74,7 +85,7 @@
|
|||||||
"updater": {
|
"updater": {
|
||||||
"active": true,
|
"active": true,
|
||||||
"endpoints": [
|
"endpoints": [
|
||||||
"https://github.com/Yidadaa/ChatGPT-Next-Web/releases/latest"
|
"https://github.com/Yidadaa/ChatGPT-Next-Web/releases/download/{{current_version}}/latest.json"
|
||||||
],
|
],
|
||||||
"dialog": false,
|
"dialog": false,
|
||||||
"windows": {
|
"windows": {
|
||||||
|
511
yarn.lock
511
yarn.lock
@@ -995,9 +995,9 @@
|
|||||||
"@babel/helper-validator-identifier" "^7.19.1"
|
"@babel/helper-validator-identifier" "^7.19.1"
|
||||||
to-fast-properties "^2.0.0"
|
to-fast-properties "^2.0.0"
|
||||||
|
|
||||||
"@braintree/sanitize-url@^6.0.0":
|
"@braintree/sanitize-url@^6.0.2":
|
||||||
version "6.0.2"
|
version "6.0.2"
|
||||||
resolved "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f"
|
resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f"
|
||||||
integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==
|
integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==
|
||||||
|
|
||||||
"@eslint-community/eslint-utils@^4.2.0":
|
"@eslint-community/eslint-utils@^4.2.0":
|
||||||
@@ -1109,17 +1109,10 @@
|
|||||||
"@jridgewell/resolve-uri" "3.1.0"
|
"@jridgewell/resolve-uri" "3.1.0"
|
||||||
"@jridgewell/sourcemap-codec" "1.4.14"
|
"@jridgewell/sourcemap-codec" "1.4.14"
|
||||||
|
|
||||||
"@khanacademy/simple-markdown@^0.8.6":
|
"@next/env@13.4.6":
|
||||||
version "0.8.6"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz#9c9aef1f5ce2ce60292d13849165965a57c26f25"
|
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.6.tgz#3f2041c7758660d7255707ae4cb9166519113dea"
|
||||||
integrity sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==
|
integrity sha512-nqUxEtvDqFhmV1/awSg0K2XHNwkftNaiUqCYO9e6+MYmqNObpKVl7OgMkGaQ2SZnFx5YqF0t60ZJTlyJIDAijg==
|
||||||
dependencies:
|
|
||||||
"@types/react" ">=16.0.0"
|
|
||||||
|
|
||||||
"@next/env@13.4.3":
|
|
||||||
version "13.4.3"
|
|
||||||
resolved "https://registry.npmmirror.com/@next/env/-/env-13.4.3.tgz#cb00bdd43a0619a79a52c9336df8a0aa84f8f4bf"
|
|
||||||
integrity sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==
|
|
||||||
|
|
||||||
"@next/eslint-plugin-next@13.2.3":
|
"@next/eslint-plugin-next@13.2.3":
|
||||||
version "13.2.3"
|
version "13.2.3"
|
||||||
@@ -1128,50 +1121,50 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob "7.1.7"
|
glob "7.1.7"
|
||||||
|
|
||||||
"@next/swc-darwin-arm64@13.4.3":
|
"@next/swc-darwin-arm64@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.3.tgz#2d6c99dd5afbcce37e4ba0f64196317a1259034d"
|
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.6.tgz#47485f3deaee6681b4a4036c74bb9c4b728d5ddd"
|
||||||
integrity sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==
|
integrity sha512-ahi6VP98o4HV19rkOXPSUu+ovfHfUxbJQ7VVJ7gL2FnZRr7onEFC1oGQ6NQHpm8CxpIzSSBW79kumlFMOmZVjg==
|
||||||
|
|
||||||
"@next/swc-darwin-x64@13.4.3":
|
"@next/swc-darwin-x64@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.3.tgz#162b15fb8a54d9f64e69c898ebeb55b7dac9bddd"
|
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.6.tgz#a6a5b232ec0f2079224fb8ed6bf11dc479af1acf"
|
||||||
integrity sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==
|
integrity sha512-13cXxKFsPJIJKzUqrU5XB1mc0xbUgYsRcdH6/rB8c4NMEbWGdtD4QoK9ShN31TZdePpD4k416Ur7p+deMIxnnA==
|
||||||
|
|
||||||
"@next/swc-linux-arm64-gnu@13.4.3":
|
"@next/swc-linux-arm64-gnu@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.3.tgz#aee57422f11183d6a2e4a2e8aa23b9285873e18f"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.6.tgz#2a67144e863d9c45fdbd13c7827370e7f2a28405"
|
||||||
integrity sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==
|
integrity sha512-Ti+NMHEjTNktCVxNjeWbYgmZvA2AqMMI2AMlzkXsU7W4pXCMhrryAmAIoo+7YdJbsx01JQWYVxGe62G6DoCLaA==
|
||||||
|
|
||||||
"@next/swc-linux-arm64-musl@13.4.3":
|
"@next/swc-linux-arm64-musl@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.3.tgz#c10b6aaaa47b341c6c9ea15f8b0ddb37e255d035"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.6.tgz#5a191ac3575a70598e9e9c6e7264fc0b8a90b2db"
|
||||||
integrity sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==
|
integrity sha512-OHoC6gO7XfjstgwR+z6UHKlvhqJfyMtNaJidjx3sEcfaDwS7R2lqR5AABi8PuilGgi0BO0O0sCXqLlpp3a0emQ==
|
||||||
|
|
||||||
"@next/swc-linux-x64-gnu@13.4.3":
|
"@next/swc-linux-x64-gnu@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.3.tgz#3f85bc5591c6a0d4908404f7e88e3c04f4462039"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.6.tgz#d38adf842a8b8f9de492454328fd32a2c53350f3"
|
||||||
integrity sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==
|
integrity sha512-zHZxPGkUlpfNJCboUrFqwlwEX5vI9LSN70b8XEb0DYzzlrZyCyOi7hwDp/+3Urm9AB7YCAJkgR5Sp1XBVjHdfQ==
|
||||||
|
|
||||||
"@next/swc-linux-x64-musl@13.4.3":
|
"@next/swc-linux-x64-musl@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.3.tgz#f4535adc2374a86bc8e43af149b551567df065de"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.6.tgz#74c745774358b78be7f958e7a8b7d93936cd6ebc"
|
||||||
integrity sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==
|
integrity sha512-K/Y8lYGTwTpv5ME8PSJxwxLolaDRdVy+lOd9yMRMiQE0BLUhtxtCWC9ypV42uh9WpLjoaD0joOsB9Q6mbrSGJg==
|
||||||
|
|
||||||
"@next/swc-win32-arm64-msvc@13.4.3":
|
"@next/swc-win32-arm64-msvc@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.3.tgz#e76106d85391c308c5ed70cda2bca2c582d65536"
|
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.6.tgz#1e1e02c175573e64808fc1a7e8650e3e217f1edc"
|
||||||
integrity sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==
|
integrity sha512-U6LtxEUrjBL2tpW+Kr1nHCSJWNeIed7U7l5o7FiKGGwGgIlFi4UHDiLI6TQ2lxi20fAU33CsruV3U0GuzMlXIw==
|
||||||
|
|
||||||
"@next/swc-win32-ia32-msvc@13.4.3":
|
"@next/swc-win32-ia32-msvc@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.3.tgz#8eb5d9dd71ed7a971671291605ad64ad522fb3bc"
|
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.6.tgz#2b528ae3ec7f6e727f4f0d81a1015f63da55c7a6"
|
||||||
integrity sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==
|
integrity sha512-eEBeAqpCfhdPSlCZCayjCiyIllVqy4tcqvm1xmg3BgJG0G5ITiMM4Cw2WVeRSgWDJqQGRyyb+q8Y2ltzhXOWsQ==
|
||||||
|
|
||||||
"@next/swc-win32-x64-msvc@13.4.3":
|
"@next/swc-win32-x64-msvc@13.4.6":
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.3.tgz#c7b2b1b9e158fd7749f8209e68ee8e43a997eb4c"
|
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.6.tgz#38620bd68267ff13e50ecd432f1822eac51382a8"
|
||||||
integrity sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==
|
integrity sha512-OrZs94AuO3ZS5tnqlyPRNgfWvboXaDQCi5aXGve3o3C+Sj0ctMUV9+Do+0zMvvLRumR8E0PTWKvtz9n5vzIsWw==
|
||||||
|
|
||||||
"@nodelib/fs.scandir@2.1.5":
|
"@nodelib/fs.scandir@2.1.5":
|
||||||
version "2.1.5"
|
version "2.1.5"
|
||||||
@@ -1438,10 +1431,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
|
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
|
||||||
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
|
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
|
||||||
|
|
||||||
"@types/node@^18.14.6":
|
"@types/node@^20.3.1":
|
||||||
version "18.15.11"
|
version "20.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe"
|
||||||
integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==
|
integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==
|
||||||
|
|
||||||
"@types/parse-json@^4.0.0":
|
"@types/parse-json@^4.0.0":
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
@@ -1467,19 +1460,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/react" "*"
|
"@types/react" "*"
|
||||||
|
|
||||||
"@types/react@*", "@types/react@^18.0.28":
|
"@types/react@*", "@types/react@^18.2.12":
|
||||||
version "18.0.31"
|
version "18.2.12"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.31.tgz#a69ef8dd7bfa849734d258c793a8fe343a338205"
|
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.12.tgz#95d584338610b78bb9ba0415e3180fb03debdf97"
|
||||||
integrity sha512-EEG67of7DsvRDU6BLLI0p+k1GojDLz9+lZsnCpCRTa/lOokvyPBvp8S5x+A24hME3yyQuIipcP70KJ6H7Qupww==
|
integrity sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw==
|
||||||
dependencies:
|
|
||||||
"@types/prop-types" "*"
|
|
||||||
"@types/scheduler" "*"
|
|
||||||
csstype "^3.0.2"
|
|
||||||
|
|
||||||
"@types/react@>=16.0.0":
|
|
||||||
version "18.2.5"
|
|
||||||
resolved "https://registry.npmmirror.com/@types/react/-/react-18.2.5.tgz#f9403e1113b12b53f7edcdd9a900c10dd4b49a59"
|
|
||||||
integrity sha512-RuoMedzJ5AOh23Dvws13LU9jpZHIc/k90AgmK7CecAYeWmSr3553L4u5rk4sWAPBuQosfT7HmTfG4Rg5o4nGEA==
|
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/prop-types" "*"
|
"@types/prop-types" "*"
|
||||||
"@types/scheduler" "*"
|
"@types/scheduler" "*"
|
||||||
@@ -1754,25 +1738,11 @@ balanced-match@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||||
|
|
||||||
base64-js@^1.3.1:
|
|
||||||
version "1.5.1"
|
|
||||||
resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
|
||||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
|
||||||
|
|
||||||
binary-extensions@^2.0.0:
|
binary-extensions@^2.0.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
||||||
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
|
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
|
||||||
|
|
||||||
bl@^4.0.3:
|
|
||||||
version "4.1.0"
|
|
||||||
resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
|
|
||||||
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
|
|
||||||
dependencies:
|
|
||||||
buffer "^5.5.0"
|
|
||||||
inherits "^2.0.4"
|
|
||||||
readable-stream "^3.4.0"
|
|
||||||
|
|
||||||
boolbase@^1.0.0:
|
boolbase@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
|
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
|
||||||
@@ -1803,14 +1773,6 @@ browserslist@^4.21.3, browserslist@^4.21.5:
|
|||||||
node-releases "^2.0.8"
|
node-releases "^2.0.8"
|
||||||
update-browserslist-db "^1.0.10"
|
update-browserslist-db "^1.0.10"
|
||||||
|
|
||||||
buffer@^5.5.0:
|
|
||||||
version "5.7.1"
|
|
||||||
resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
|
||||||
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
|
|
||||||
dependencies:
|
|
||||||
base64-js "^1.3.1"
|
|
||||||
ieee754 "^1.1.13"
|
|
||||||
|
|
||||||
busboy@1.6.0:
|
busboy@1.6.0:
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
|
resolved "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
|
||||||
@@ -1888,11 +1850,6 @@ character-entities@^2.0.0:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
chownr@^1.1.1:
|
|
||||||
version "1.1.4"
|
|
||||||
resolved "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
|
|
||||||
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
|
|
||||||
|
|
||||||
clean-stack@^2.0.0:
|
clean-stack@^2.0.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
|
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
|
||||||
@@ -1950,27 +1907,11 @@ color-name@1.1.3:
|
|||||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
|
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
|
||||||
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
||||||
|
|
||||||
color-name@^1.0.0, color-name@~1.1.4:
|
color-name@~1.1.4:
|
||||||
version "1.1.4"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||||
|
|
||||||
color-string@^1.9.0:
|
|
||||||
version "1.9.1"
|
|
||||||
resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
|
|
||||||
integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
|
|
||||||
dependencies:
|
|
||||||
color-name "^1.0.0"
|
|
||||||
simple-swizzle "^0.2.2"
|
|
||||||
|
|
||||||
color@^4.2.3:
|
|
||||||
version "4.2.3"
|
|
||||||
resolved "https://registry.npmmirror.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
|
|
||||||
integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
|
|
||||||
dependencies:
|
|
||||||
color-convert "^2.0.1"
|
|
||||||
color-string "^1.9.0"
|
|
||||||
|
|
||||||
colorette@^2.0.19:
|
colorette@^2.0.19:
|
||||||
version "2.0.19"
|
version "2.0.19"
|
||||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
|
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
|
||||||
@@ -2407,13 +2348,6 @@ decode-named-character-reference@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
character-entities "^2.0.0"
|
character-entities "^2.0.0"
|
||||||
|
|
||||||
decompress-response@^6.0.0:
|
|
||||||
version "6.0.0"
|
|
||||||
resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
|
||||||
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
|
|
||||||
dependencies:
|
|
||||||
mimic-response "^3.1.0"
|
|
||||||
|
|
||||||
deep-equal@^2.0.5:
|
deep-equal@^2.0.5:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6"
|
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6"
|
||||||
@@ -2437,11 +2371,6 @@ deep-equal@^2.0.5:
|
|||||||
which-collection "^1.0.1"
|
which-collection "^1.0.1"
|
||||||
which-typed-array "^1.1.9"
|
which-typed-array "^1.1.9"
|
||||||
|
|
||||||
deep-extend@^0.6.0:
|
|
||||||
version "0.6.0"
|
|
||||||
resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
|
|
||||||
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
|
|
||||||
|
|
||||||
deep-is@^0.1.3:
|
deep-is@^0.1.3:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
|
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
|
||||||
@@ -2477,11 +2406,6 @@ dequal@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
|
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
|
||||||
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
|
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
|
||||||
|
|
||||||
detect-libc@^2.0.0, detect-libc@^2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
|
|
||||||
integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
|
|
||||||
|
|
||||||
diff@^5.0.0:
|
diff@^5.0.0:
|
||||||
version "5.1.0"
|
version "5.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40"
|
resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40"
|
||||||
@@ -2529,10 +2453,10 @@ domhandler@^4.2.0, domhandler@^4.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
domelementtype "^2.2.0"
|
domelementtype "^2.2.0"
|
||||||
|
|
||||||
dompurify@2.4.5:
|
dompurify@3.0.3:
|
||||||
version "2.4.5"
|
version "3.0.3"
|
||||||
resolved "https://registry.npmmirror.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87"
|
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.3.tgz#4b115d15a091ddc96f232bcef668550a2f6f1430"
|
||||||
integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==
|
integrity sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==
|
||||||
|
|
||||||
domutils@^2.8.0:
|
domutils@^2.8.0:
|
||||||
version "2.8.0"
|
version "2.8.0"
|
||||||
@@ -2575,13 +2499,6 @@ emoji-regex@^9.2.2:
|
|||||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
||||||
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
||||||
|
|
||||||
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
|
|
||||||
version "1.4.4"
|
|
||||||
resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
|
||||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
|
||||||
dependencies:
|
|
||||||
once "^1.4.0"
|
|
||||||
|
|
||||||
enhanced-resolve@^5.12.0:
|
enhanced-resolve@^5.12.0:
|
||||||
version "5.12.0"
|
version "5.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
|
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
|
||||||
@@ -2939,11 +2856,6 @@ execa@^7.0.0:
|
|||||||
signal-exit "^3.0.7"
|
signal-exit "^3.0.7"
|
||||||
strip-final-newline "^3.0.0"
|
strip-final-newline "^3.0.0"
|
||||||
|
|
||||||
expand-template@^2.0.3:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
|
|
||||||
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
|
|
||||||
|
|
||||||
extend@^3.0.0:
|
extend@^3.0.0:
|
||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
||||||
@@ -3056,11 +2968,6 @@ formdata-polyfill@^4.0.10:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fetch-blob "^3.1.2"
|
fetch-blob "^3.1.2"
|
||||||
|
|
||||||
fs-constants@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
|
||||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
|
||||||
|
|
||||||
fs.realpath@^1.0.0:
|
fs.realpath@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||||
@@ -3128,11 +3035,6 @@ get-tsconfig@^4.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f"
|
resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f"
|
||||||
integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==
|
integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==
|
||||||
|
|
||||||
github-from-package@0.0.0:
|
|
||||||
version "0.0.0"
|
|
||||||
resolved "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
|
|
||||||
integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
|
|
||||||
|
|
||||||
glob-parent@^5.1.2, glob-parent@~5.1.2:
|
glob-parent@^5.1.2, glob-parent@~5.1.2:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
||||||
@@ -3147,6 +3049,11 @@ glob-parent@^6.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-glob "^4.0.3"
|
is-glob "^4.0.3"
|
||||||
|
|
||||||
|
glob-to-regexp@^0.4.1:
|
||||||
|
version "0.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
|
||||||
|
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
|
||||||
|
|
||||||
glob@7.1.7:
|
glob@7.1.7:
|
||||||
version "7.1.7"
|
version "7.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
||||||
@@ -3230,7 +3137,7 @@ gopd@^1.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
get-intrinsic "^1.1.3"
|
get-intrinsic "^1.1.3"
|
||||||
|
|
||||||
graceful-fs@^4.2.4:
|
graceful-fs@^4.1.2, graceful-fs@^4.2.4:
|
||||||
version "4.2.11"
|
version "4.2.11"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
|
||||||
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
|
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
|
||||||
@@ -3379,11 +3286,6 @@ iconv-lite@0.6:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safer-buffer ">= 2.1.2 < 3.0.0"
|
safer-buffer ">= 2.1.2 < 3.0.0"
|
||||||
|
|
||||||
ieee754@^1.1.13:
|
|
||||||
version "1.2.1"
|
|
||||||
resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
|
||||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
|
||||||
|
|
||||||
ignore@^5.2.0:
|
ignore@^5.2.0:
|
||||||
version "5.2.4"
|
version "5.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
|
||||||
@@ -3420,16 +3322,11 @@ inflight@^1.0.4:
|
|||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
inherits@2, inherits@^2.0.3, inherits@^2.0.4:
|
inherits@2:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
|
||||||
ini@~1.3.0:
|
|
||||||
version "1.3.8"
|
|
||||||
resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
|
|
||||||
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
|
|
||||||
|
|
||||||
inline-style-parser@0.1.1:
|
inline-style-parser@0.1.1:
|
||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
|
resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
|
||||||
@@ -3471,11 +3368,6 @@ is-arrayish@^0.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
||||||
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
|
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
|
||||||
|
|
||||||
is-arrayish@^0.3.1:
|
|
||||||
version "0.3.2"
|
|
||||||
resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
|
|
||||||
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
|
|
||||||
|
|
||||||
is-bigint@^1.0.1:
|
is-bigint@^1.0.1:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
|
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
|
||||||
@@ -3794,10 +3686,10 @@ lines-and-columns@^1.1.6:
|
|||||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
||||||
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
||||||
|
|
||||||
lint-staged@^13.2.0:
|
lint-staged@^13.2.2:
|
||||||
version "13.2.0"
|
version "13.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a"
|
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.2.tgz#5e711d3139c234f73402177be2f8dd312e6508ca"
|
||||||
integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==
|
integrity sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==
|
||||||
dependencies:
|
dependencies:
|
||||||
chalk "5.2.0"
|
chalk "5.2.0"
|
||||||
cli-truncate "^3.1.0"
|
cli-truncate "^3.1.0"
|
||||||
@@ -3811,7 +3703,7 @@ lint-staged@^13.2.0:
|
|||||||
object-inspect "^1.12.3"
|
object-inspect "^1.12.3"
|
||||||
pidtree "^0.6.0"
|
pidtree "^0.6.0"
|
||||||
string-argv "^0.3.1"
|
string-argv "^0.3.1"
|
||||||
yaml "^2.2.1"
|
yaml "^2.2.2"
|
||||||
|
|
||||||
listr2@^5.0.7:
|
listr2@^5.0.7:
|
||||||
version "5.0.8"
|
version "5.0.8"
|
||||||
@@ -3923,10 +3815,10 @@ mdast-util-find-and-replace@^2.0.0:
|
|||||||
unist-util-is "^5.0.0"
|
unist-util-is "^5.0.0"
|
||||||
unist-util-visit-parents "^5.0.0"
|
unist-util-visit-parents "^5.0.0"
|
||||||
|
|
||||||
mdast-util-from-markdown@^1.0.0:
|
mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.3.0:
|
||||||
version "1.3.0"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894"
|
resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0"
|
||||||
integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==
|
integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/mdast" "^3.0.0"
|
"@types/mdast" "^3.0.0"
|
||||||
"@types/unist" "^2.0.0"
|
"@types/unist" "^2.0.0"
|
||||||
@@ -4071,25 +3963,25 @@ merge2@^1.3.0, merge2@^1.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
|
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
|
||||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||||
|
|
||||||
mermaid@^10.1.0:
|
mermaid@^10.2.3:
|
||||||
version "10.1.0"
|
version "10.2.3"
|
||||||
resolved "https://registry.npmmirror.com/mermaid/-/mermaid-10.1.0.tgz#6e40d5250174f4750ca6548e4ee00f6ae210855a"
|
resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.2.3.tgz#789d3b582c5da8c69aa4a7c0e2b826562c8c8b12"
|
||||||
integrity sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==
|
integrity sha512-cMVE5s9PlQvOwfORkyVpr5beMsLdInrycAosdr+tpZ0WFjG4RJ/bUHST7aTgHNJbujHkdBRAm+N50P3puQOfPw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@braintree/sanitize-url" "^6.0.0"
|
"@braintree/sanitize-url" "^6.0.2"
|
||||||
"@khanacademy/simple-markdown" "^0.8.6"
|
|
||||||
cytoscape "^3.23.0"
|
cytoscape "^3.23.0"
|
||||||
cytoscape-cose-bilkent "^4.1.0"
|
cytoscape-cose-bilkent "^4.1.0"
|
||||||
cytoscape-fcose "^2.1.0"
|
cytoscape-fcose "^2.1.0"
|
||||||
d3 "^7.4.0"
|
d3 "^7.4.0"
|
||||||
dagre-d3-es "7.0.10"
|
dagre-d3-es "7.0.10"
|
||||||
dayjs "^1.11.7"
|
dayjs "^1.11.7"
|
||||||
dompurify "2.4.5"
|
dompurify "3.0.3"
|
||||||
elkjs "^0.8.2"
|
elkjs "^0.8.2"
|
||||||
khroma "^2.0.0"
|
khroma "^2.0.0"
|
||||||
lodash-es "^4.17.21"
|
lodash-es "^4.17.21"
|
||||||
|
mdast-util-from-markdown "^1.3.0"
|
||||||
non-layered-tidy-tree-layout "^2.0.2"
|
non-layered-tidy-tree-layout "^2.0.2"
|
||||||
stylis "^4.1.2"
|
stylis "^4.1.3"
|
||||||
ts-dedent "^2.2.0"
|
ts-dedent "^2.2.0"
|
||||||
uuid "^9.0.0"
|
uuid "^9.0.0"
|
||||||
web-worker "^1.2.0"
|
web-worker "^1.2.0"
|
||||||
@@ -4400,11 +4292,6 @@ mimic-fn@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
|
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
|
||||||
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
|
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
|
||||||
|
|
||||||
mimic-response@^3.1.0:
|
|
||||||
version "3.1.0"
|
|
||||||
resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
|
|
||||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
|
||||||
|
|
||||||
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||||
@@ -4412,16 +4299,11 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6:
|
minimist@^1.2.0, minimist@^1.2.6:
|
||||||
version "1.2.8"
|
version "1.2.8"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
|
||||||
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
|
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
|
||||||
|
|
||||||
mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
|
|
||||||
version "0.5.3"
|
|
||||||
resolved "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
|
|
||||||
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
|
|
||||||
|
|
||||||
mri@^1.1.0:
|
mri@^1.1.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
|
resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
|
||||||
@@ -4442,50 +4324,34 @@ nanoid@^3.3.4:
|
|||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
|
||||||
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
|
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
|
||||||
|
|
||||||
napi-build-utils@^1.0.1:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
|
|
||||||
integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
|
|
||||||
|
|
||||||
natural-compare@^1.4.0:
|
natural-compare@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
|
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
|
||||||
|
|
||||||
next@^13.4.3:
|
next@^13.4.6:
|
||||||
version "13.4.3"
|
version "13.4.6"
|
||||||
resolved "https://registry.npmmirror.com/next/-/next-13.4.3.tgz#7f417dec9fa2731d8c1d1819a1c7d0919ad6fc75"
|
resolved "https://registry.yarnpkg.com/next/-/next-13.4.6.tgz#ebe52f5c74d60176d45b45e73f25a51103713ea4"
|
||||||
integrity sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==
|
integrity sha512-sjVqjxU+U2aXZnYt4Ud6CTLNNwWjdSfMgemGpIQJcN3Z7Jni9xRWbR0ie5fQzCg87aLqQVhKA2ud2gPoqJ9lGw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@next/env" "13.4.3"
|
"@next/env" "13.4.6"
|
||||||
"@swc/helpers" "0.5.1"
|
"@swc/helpers" "0.5.1"
|
||||||
busboy "1.6.0"
|
busboy "1.6.0"
|
||||||
caniuse-lite "^1.0.30001406"
|
caniuse-lite "^1.0.30001406"
|
||||||
postcss "8.4.14"
|
postcss "8.4.14"
|
||||||
styled-jsx "5.1.1"
|
styled-jsx "5.1.1"
|
||||||
|
watchpack "2.4.0"
|
||||||
zod "3.21.4"
|
zod "3.21.4"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@next/swc-darwin-arm64" "13.4.3"
|
"@next/swc-darwin-arm64" "13.4.6"
|
||||||
"@next/swc-darwin-x64" "13.4.3"
|
"@next/swc-darwin-x64" "13.4.6"
|
||||||
"@next/swc-linux-arm64-gnu" "13.4.3"
|
"@next/swc-linux-arm64-gnu" "13.4.6"
|
||||||
"@next/swc-linux-arm64-musl" "13.4.3"
|
"@next/swc-linux-arm64-musl" "13.4.6"
|
||||||
"@next/swc-linux-x64-gnu" "13.4.3"
|
"@next/swc-linux-x64-gnu" "13.4.6"
|
||||||
"@next/swc-linux-x64-musl" "13.4.3"
|
"@next/swc-linux-x64-musl" "13.4.6"
|
||||||
"@next/swc-win32-arm64-msvc" "13.4.3"
|
"@next/swc-win32-arm64-msvc" "13.4.6"
|
||||||
"@next/swc-win32-ia32-msvc" "13.4.3"
|
"@next/swc-win32-ia32-msvc" "13.4.6"
|
||||||
"@next/swc-win32-x64-msvc" "13.4.3"
|
"@next/swc-win32-x64-msvc" "13.4.6"
|
||||||
|
|
||||||
node-abi@^3.3.0:
|
|
||||||
version "3.45.0"
|
|
||||||
resolved "https://registry.npmmirror.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5"
|
|
||||||
integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==
|
|
||||||
dependencies:
|
|
||||||
semver "^7.3.5"
|
|
||||||
|
|
||||||
node-addon-api@^6.1.0:
|
|
||||||
version "6.1.0"
|
|
||||||
resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76"
|
|
||||||
integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
|
|
||||||
|
|
||||||
node-domexception@^1.0.0:
|
node-domexception@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
@@ -4598,7 +4464,7 @@ object.values@^1.1.6:
|
|||||||
define-properties "^1.1.4"
|
define-properties "^1.1.4"
|
||||||
es-abstract "^1.20.4"
|
es-abstract "^1.20.4"
|
||||||
|
|
||||||
once@^1.3.0, once@^1.3.1, once@^1.4.0:
|
once@^1.3.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
|
||||||
@@ -4737,24 +4603,6 @@ postcss@8.4.14:
|
|||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
source-map-js "^1.0.2"
|
source-map-js "^1.0.2"
|
||||||
|
|
||||||
prebuild-install@^7.1.1:
|
|
||||||
version "7.1.1"
|
|
||||||
resolved "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
|
|
||||||
integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==
|
|
||||||
dependencies:
|
|
||||||
detect-libc "^2.0.0"
|
|
||||||
expand-template "^2.0.3"
|
|
||||||
github-from-package "0.0.0"
|
|
||||||
minimist "^1.2.3"
|
|
||||||
mkdirp-classic "^0.5.3"
|
|
||||||
napi-build-utils "^1.0.1"
|
|
||||||
node-abi "^3.3.0"
|
|
||||||
pump "^3.0.0"
|
|
||||||
rc "^1.2.7"
|
|
||||||
simple-get "^4.0.0"
|
|
||||||
tar-fs "^2.0.0"
|
|
||||||
tunnel-agent "^0.6.0"
|
|
||||||
|
|
||||||
prelude-ls@^1.2.1:
|
prelude-ls@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
||||||
@@ -4786,14 +4634,6 @@ property-information@^6.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d"
|
resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d"
|
||||||
integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==
|
integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==
|
||||||
|
|
||||||
pump@^3.0.0:
|
|
||||||
version "3.0.0"
|
|
||||||
resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
|
|
||||||
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
|
|
||||||
dependencies:
|
|
||||||
end-of-stream "^1.1.0"
|
|
||||||
once "^1.3.1"
|
|
||||||
|
|
||||||
punycode@^2.1.0:
|
punycode@^2.1.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
|
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
|
||||||
@@ -4809,16 +4649,6 @@ raf-schd@^4.0.3:
|
|||||||
resolved "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a"
|
resolved "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a"
|
||||||
integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==
|
integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==
|
||||||
|
|
||||||
rc@^1.2.7:
|
|
||||||
version "1.2.8"
|
|
||||||
resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
|
||||||
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
|
|
||||||
dependencies:
|
|
||||||
deep-extend "^0.6.0"
|
|
||||||
ini "~1.3.0"
|
|
||||||
minimist "^1.2.0"
|
|
||||||
strip-json-comments "~2.0.1"
|
|
||||||
|
|
||||||
react-dom@^18.2.0:
|
react-dom@^18.2.0:
|
||||||
version "18.2.0"
|
version "18.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
|
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
|
||||||
@@ -4837,10 +4667,10 @@ react-is@^18.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
|
||||||
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
|
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
|
||||||
|
|
||||||
react-markdown@^8.0.5:
|
react-markdown@^8.0.7:
|
||||||
version "8.0.6"
|
version "8.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.6.tgz#3e939018f8bfce800ffdf22cf50aba3cdded7ad1"
|
resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b"
|
||||||
integrity sha512-KgPWsYgHuftdx510wwIzpwf+5js/iHqBR+fzxefv8Khk3mFbnioF1bmL2idHN3ler0LMQmICKeDrWnZrX9mtbQ==
|
integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/hast" "^2.0.0"
|
"@types/hast" "^2.0.0"
|
||||||
"@types/prop-types" "^15.0.0"
|
"@types/prop-types" "^15.0.0"
|
||||||
@@ -4892,15 +4722,6 @@ react@^18.2.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
loose-envify "^1.1.0"
|
loose-envify "^1.1.0"
|
||||||
|
|
||||||
readable-stream@^3.1.1, readable-stream@^3.4.0:
|
|
||||||
version "3.6.2"
|
|
||||||
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
|
|
||||||
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
|
|
||||||
dependencies:
|
|
||||||
inherits "^2.0.3"
|
|
||||||
string_decoder "^1.1.1"
|
|
||||||
util-deprecate "^1.0.1"
|
|
||||||
|
|
||||||
readdirp@~3.6.0:
|
readdirp@~3.6.0:
|
||||||
version "3.6.0"
|
version "3.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
||||||
@@ -5129,11 +4950,6 @@ sade@^1.7.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
mri "^1.1.0"
|
mri "^1.1.0"
|
||||||
|
|
||||||
safe-buffer@^5.0.1, safe-buffer@~5.2.0:
|
|
||||||
version "5.2.1"
|
|
||||||
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
|
||||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
|
||||||
|
|
||||||
safe-regex-test@^1.0.0:
|
safe-regex-test@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
|
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
|
||||||
@@ -5169,13 +4985,6 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
||||||
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
||||||
|
|
||||||
semver@^7.3.5, semver@^7.5.0:
|
|
||||||
version "7.5.1"
|
|
||||||
resolved "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
|
|
||||||
integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
|
|
||||||
dependencies:
|
|
||||||
lru-cache "^6.0.0"
|
|
||||||
|
|
||||||
semver@^7.3.7:
|
semver@^7.3.7:
|
||||||
version "7.3.8"
|
version "7.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
|
||||||
@@ -5183,20 +4992,6 @@ semver@^7.3.7:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^6.0.0"
|
lru-cache "^6.0.0"
|
||||||
|
|
||||||
sharp@^0.32.1:
|
|
||||||
version "0.32.1"
|
|
||||||
resolved "https://registry.npmmirror.com/sharp/-/sharp-0.32.1.tgz#41aa0d0b2048b2e0ee453d9fcb14ec1f408390fe"
|
|
||||||
integrity sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==
|
|
||||||
dependencies:
|
|
||||||
color "^4.2.3"
|
|
||||||
detect-libc "^2.0.1"
|
|
||||||
node-addon-api "^6.1.0"
|
|
||||||
prebuild-install "^7.1.1"
|
|
||||||
semver "^7.5.0"
|
|
||||||
simple-get "^4.0.1"
|
|
||||||
tar-fs "^2.1.1"
|
|
||||||
tunnel-agent "^0.6.0"
|
|
||||||
|
|
||||||
shebang-command@^2.0.0:
|
shebang-command@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||||
@@ -5223,27 +5018,6 @@ signal-exit@^3.0.2, signal-exit@^3.0.7:
|
|||||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
||||||
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
|
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
|
||||||
|
|
||||||
simple-concat@^1.0.0:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
|
|
||||||
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
|
|
||||||
|
|
||||||
simple-get@^4.0.0, simple-get@^4.0.1:
|
|
||||||
version "4.0.1"
|
|
||||||
resolved "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
|
|
||||||
integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
|
|
||||||
dependencies:
|
|
||||||
decompress-response "^6.0.0"
|
|
||||||
once "^1.3.1"
|
|
||||||
simple-concat "^1.0.0"
|
|
||||||
|
|
||||||
simple-swizzle@^0.2.2:
|
|
||||||
version "0.2.2"
|
|
||||||
resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
|
|
||||||
integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
|
|
||||||
dependencies:
|
|
||||||
is-arrayish "^0.3.1"
|
|
||||||
|
|
||||||
slash@^3.0.0:
|
slash@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
||||||
@@ -5381,13 +5155,6 @@ string.prototype.trimstart@^1.0.6:
|
|||||||
define-properties "^1.1.4"
|
define-properties "^1.1.4"
|
||||||
es-abstract "^1.20.4"
|
es-abstract "^1.20.4"
|
||||||
|
|
||||||
string_decoder@^1.1.1:
|
|
||||||
version "1.3.0"
|
|
||||||
resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
|
||||||
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
|
|
||||||
dependencies:
|
|
||||||
safe-buffer "~5.2.0"
|
|
||||||
|
|
||||||
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
@@ -5417,11 +5184,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||||
|
|
||||||
strip-json-comments@~2.0.1:
|
|
||||||
version "2.0.1"
|
|
||||||
resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
|
||||||
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
|
|
||||||
|
|
||||||
style-to-object@^0.4.0:
|
style-to-object@^0.4.0:
|
||||||
version "0.4.1"
|
version "0.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37"
|
resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37"
|
||||||
@@ -5436,10 +5198,10 @@ styled-jsx@5.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
client-only "0.0.1"
|
client-only "0.0.1"
|
||||||
|
|
||||||
stylis@^4.1.2:
|
stylis@^4.1.3:
|
||||||
version "4.1.4"
|
version "4.2.0"
|
||||||
resolved "https://registry.npmmirror.com/stylis/-/stylis-4.1.4.tgz#9cb60e7153d8ac6d02d773552bf51c7a0344535b"
|
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
|
||||||
integrity sha512-USf5pszRYwuE6hg9by0OkKChkQYEXfkeTtm0xKw+jqQhwyjCVLdYyMBK7R+n7dhzsblAWJnGxju4vxq5eH20GQ==
|
integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
|
||||||
|
|
||||||
supports-color@^5.3.0:
|
supports-color@^5.3.0:
|
||||||
version "5.5.0"
|
version "5.5.0"
|
||||||
@@ -5491,27 +5253,6 @@ tapable@^2.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
|
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
|
||||||
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
|
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
|
||||||
|
|
||||||
tar-fs@^2.0.0, tar-fs@^2.1.1:
|
|
||||||
version "2.1.1"
|
|
||||||
resolved "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
|
|
||||||
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
|
|
||||||
dependencies:
|
|
||||||
chownr "^1.1.1"
|
|
||||||
mkdirp-classic "^0.5.2"
|
|
||||||
pump "^3.0.0"
|
|
||||||
tar-stream "^2.1.4"
|
|
||||||
|
|
||||||
tar-stream@^2.1.4:
|
|
||||||
version "2.2.0"
|
|
||||||
resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
|
|
||||||
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
|
|
||||||
dependencies:
|
|
||||||
bl "^4.0.3"
|
|
||||||
end-of-stream "^1.4.1"
|
|
||||||
fs-constants "^1.0.0"
|
|
||||||
inherits "^2.0.3"
|
|
||||||
readable-stream "^3.1.1"
|
|
||||||
|
|
||||||
text-table@^0.2.0:
|
text-table@^0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||||
@@ -5589,13 +5330,6 @@ tsutils@^3.21.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib "^1.8.1"
|
tslib "^1.8.1"
|
||||||
|
|
||||||
tunnel-agent@^0.6.0:
|
|
||||||
version "0.6.0"
|
|
||||||
resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
|
|
||||||
integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
|
|
||||||
dependencies:
|
|
||||||
safe-buffer "^5.0.1"
|
|
||||||
|
|
||||||
type-check@^0.4.0, type-check@~0.4.0:
|
type-check@^0.4.0, type-check@~0.4.0:
|
||||||
version "0.4.0"
|
version "0.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
|
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
|
||||||
@@ -5747,10 +5481,10 @@ uri-js@^4.2.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
punycode "^2.1.0"
|
punycode "^2.1.0"
|
||||||
|
|
||||||
use-debounce@^9.0.3:
|
use-debounce@^9.0.4:
|
||||||
version "9.0.3"
|
version "9.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.3.tgz#bac660c19ab7b38662e08608fee23c7ad303f532"
|
resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.4.tgz#51d25d856fbdfeb537553972ce3943b897f1ac85"
|
||||||
integrity sha512-FhtlbDtDXILJV7Lix5OZj5yX/fW1tzq+VrvK1fnT2bUrPOGruU9Rw8NCEn+UI9wopfERBEZAOQ8lfeCJPllgnw==
|
integrity sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==
|
||||||
|
|
||||||
use-memo-one@^1.1.3:
|
use-memo-one@^1.1.3:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
@@ -5762,11 +5496,6 @@ use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
|
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
|
||||||
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
|
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
|
||||||
|
|
||||||
util-deprecate@^1.0.1:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
|
||||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
|
||||||
|
|
||||||
uuid@^9.0.0:
|
uuid@^9.0.0:
|
||||||
version "9.0.0"
|
version "9.0.0"
|
||||||
resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
|
resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
|
||||||
@@ -5808,6 +5537,14 @@ vfile@^5.0.0:
|
|||||||
unist-util-stringify-position "^3.0.0"
|
unist-util-stringify-position "^3.0.0"
|
||||||
vfile-message "^3.0.0"
|
vfile-message "^3.0.0"
|
||||||
|
|
||||||
|
watchpack@2.4.0:
|
||||||
|
version "2.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
|
||||||
|
integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
|
||||||
|
dependencies:
|
||||||
|
glob-to-regexp "^0.4.1"
|
||||||
|
graceful-fs "^4.1.2"
|
||||||
|
|
||||||
web-namespaces@^2.0.0:
|
web-namespaces@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
|
resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
|
||||||
@@ -5906,10 +5643,10 @@ yaml@^1.10.0:
|
|||||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
||||||
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
||||||
|
|
||||||
yaml@^2.2.1:
|
yaml@^2.2.2:
|
||||||
version "2.2.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4"
|
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b"
|
||||||
integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==
|
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
|
||||||
|
|
||||||
yocto-queue@^0.1.0:
|
yocto-queue@^0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
@@ -5921,10 +5658,10 @@ zod@3.21.4:
|
|||||||
resolved "https://registry.npmmirror.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"
|
resolved "https://registry.npmmirror.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"
|
||||||
integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==
|
integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==
|
||||||
|
|
||||||
zustand@^4.3.6:
|
zustand@^4.3.8:
|
||||||
version "4.3.6"
|
version "4.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.6.tgz#ce7804eb75361af0461a2d0536b65461ec5de86f"
|
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4"
|
||||||
integrity sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw==
|
integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==
|
||||||
dependencies:
|
dependencies:
|
||||||
use-sync-external-store "1.2.0"
|
use-sync-external-store "1.2.0"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user