diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..60da41dd8 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +# local env files +.env*.local + +# docker-compose env files +.env + +*.key +*.key.pub \ No newline at end of file diff --git a/.github/workflows/app.yml b/.github/workflows/app.yml index b928ad6c1..aebba28f7 100644 --- a/.github/workflows/app.yml +++ b/.github/workflows/app.yml @@ -18,7 +18,7 @@ jobs: - name: setup node uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./src-tauri/tauri.conf.json').package.version")" >> $GITHUB_ENV - name: create release @@ -59,7 +59,7 @@ jobs: - name: setup node uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: install Rust stable uses: dtolnay/rust-toolchain@stable with: diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index ebf5587d0..e04e30adb 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -24,7 +24,7 @@ jobs: id: sync uses: aormsby/Fork-Sync-With-Upstream-action@v3.4 with: - upstream_sync_repo: Yidadaa/ChatGPT-Next-Web + upstream_sync_repo: ChatGPTNextWeb/ChatGPT-Next-Web upstream_sync_branch: main target_sync_branch: main target_repo_token: ${{ secrets.GITHUB_TOKEN }} # automatically generated, no need to set diff --git a/README.md b/README.md index d4e304f9d..52ed68c0f 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ One-Click to get well-designed cross-platform ChatGPT web UI. - **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 +- 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 is stored locally in the browser - Markdown support: LaTex, mermaid, code highlight, etc. - Responsive design, dark mode and PWA - Fast first screen loading speed (~100kb), support streaming response @@ -75,7 +75,7 @@ One-Click to get well-designed cross-platform ChatGPT web UI. - 预制角色功能(面具),方便地创建、分享和调试你的个性化对话 - 海量的内置 prompt 列表,来自[中文](https://github.com/PlexPt/awesome-chatgpt-prompts-zh)和[英文](https://github.com/f/awesome-chatgpt-prompts) - 自动压缩上下文聊天记录,在节省 Token 的同时支持超长对话 -- 多国语言支持:English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština +- 多国语言支持:English, 简体中文, 繁体中文, 日本語, Español, Italiano, Türkçe, Deutsch, Tiếng Việt, Русский, Čeština, 한국어, Indonesia - 拥有自己的域名?好上加好,绑定后即可在任何地方**无障碍**快速访问 ## 开发计划 @@ -161,7 +161,7 @@ Access password, separated by comma. ### `OPENAI_API_KEY` (required) -Your openai api key. +Your openai api key, join multiple api keys with comma. ### `BASE_URL` (optional) @@ -216,9 +216,11 @@ If you want to disable parse settings from url, set this to 1. ### `CUSTOM_MODELS` (optional) > Default: Empty -> Example: `+llama,+claude-2,-gpt-3.5-turbo,gpt-4-1106-preview:gpt-4-turbo` means add `llama, claude-2` to model list, and remove `gpt-3.5-turbo` from list, and display `gpt-4-1106-preview` as `gpt-4-turbo`. +> Example: `+llama,+claude-2,-gpt-3.5-turbo,gpt-4-1106-preview=gpt-4-turbo` means add `llama, claude-2` to model list, and remove `gpt-3.5-turbo` from list, and display `gpt-4-1106-preview` as `gpt-4-turbo`. -To control custom models, use `+` to add a custom model, use `-` to hide a model, use `name:displayName` to customize model name, separated by comma. +To control custom models, use `+` to add a custom model, use `-` to hide a model, use `name=displayName` to customize model name, separated by comma. + +User `-all` to disable all default models, `+all` to enable all default models. ## Requirements @@ -344,6 +346,9 @@ If you want to add a new translation, read this [document](./docs/translation.md [@piksonGit](https://github.com/piksonGit) [@ouyangzhiping](https://github.com/ouyangzhiping) [@wenjiavv](https://github.com/wenjiavv) +[@LeXwDeX](https://github.com/LeXwDeX) +[@Licoy](https://github.com/Licoy) +[@shangmin2009](https://github.com/shangmin2009) ### Contributor diff --git a/README_CN.md b/README_CN.md index dde8c19b3..08b385573 100644 --- a/README_CN.md +++ b/README_CN.md @@ -68,7 +68,7 @@ code1,code2,code3 ### `OPENAI_API_KEY` (必填项) -OpanAI 密钥,你在 openai 账户页面申请的 api key。 +OpanAI 密钥,你在 openai 账户页面申请的 api key,使用英文逗号隔开多个 key,这样可以随机轮询这些 key。 ### `CODE` (可选) @@ -122,9 +122,10 @@ Azure Api 版本,你可以在这里找到:[Azure 文档](https://learn.micro ### `CUSTOM_MODELS` (可选) -> 示例:`+qwen-7b-chat,+glm-6b,-gpt-3.5-turbo,gpt-4-1106-preview:gpt-4-turbo` 表示增加 `qwen-7b-chat` 和 `glm-6b` 到模型列表,而从列表中删除 `gpt-3.5-turbo`,并将 `gpt-4-1106-preview` 模型名字展示为 `gpt-4-turbo`。 +> 示例:`+qwen-7b-chat,+glm-6b,-gpt-3.5-turbo,gpt-4-1106-preview=gpt-4-turbo` 表示增加 `qwen-7b-chat` 和 `glm-6b` 到模型列表,而从列表中删除 `gpt-3.5-turbo`,并将 `gpt-4-1106-preview` 模型名字展示为 `gpt-4-turbo`。 +> 如果你想先禁用所有模型,再启用指定模型,可以使用 `-all,+gpt-3.5-turbo`,则表示仅启用 `gpt-3.5-turbo` -用来控制模型列表,使用 `+` 增加一个模型,使用 `-` 来隐藏一个模型,使用 `模型名:展示名` 来自定义模型的展示名,用英文逗号隔开。 +用来控制模型列表,使用 `+` 增加一个模型,使用 `-` 来隐藏一个模型,使用 `模型名=展示名` 来自定义模型的展示名,用英文逗号隔开。 ## 开发 @@ -138,7 +139,7 @@ Azure Api 版本,你可以在这里找到:[Azure 文档](https://learn.micro OPENAI_API_KEY= # 中国大陆用户,可以使用本项目自带的代理进行开发,你也可以自由选择其他代理地址 -BASE_URL=https://a.nextweb.fun/api/proxy +BASE_URL=https://b.nextweb.fun/api/proxy ``` ### 本地开发 @@ -204,7 +205,6 @@ bash <(curl -s https://raw.githubusercontent.com/Yidadaa/ChatGPT-Next-Web/main/s [见项目贡献者列表](https://github.com/Yidadaa/ChatGPT-Next-Web/graphs/contributors) ### 相关项目 - - [one-api](https://github.com/songquanpeng/one-api): 一站式大模型额度管理平台,支持市面上所有主流大语言模型 ## 开源协议 diff --git a/app/api/common.ts b/app/api/common.ts index dd1cc0bb8..6b0d619df 100644 --- a/app/api/common.ts +++ b/app/api/common.ts @@ -30,7 +30,10 @@ export async function requestOpenai(req: NextRequest) { console.log("[Proxy] ", path); console.log("[Base Url]", baseUrl); - console.log("[Org ID]", serverConfig.openaiOrgId); + // this fix [Org ID] undefined in server side if not using custom point + if (serverConfig.openaiOrgId !== undefined) { + console.log("[Org ID]", serverConfig.openaiOrgId); + } const timeoutId = setTimeout( () => { diff --git a/app/api/openai/[...path]/route.ts b/app/api/openai/[...path]/route.ts index 9df005a31..2addd53a5 100644 --- a/app/api/openai/[...path]/route.ts +++ b/app/api/openai/[...path]/route.ts @@ -75,3 +75,4 @@ export const GET = handle; export const POST = handle; export const runtime = "edge"; +export const preferredRegion = ['arn1', 'bom1', 'cdg1', 'cle1', 'cpt1', 'dub1', 'fra1', 'gru1', 'hnd1', 'iad1', 'icn1', 'kix1', 'lhr1', 'pdx1', 'sfo1', 'sin1', 'syd1']; diff --git a/app/client/platforms/openai.ts b/app/client/platforms/openai.ts index 930d60690..8ea864692 100644 --- a/app/client/platforms/openai.ts +++ b/app/client/platforms/openai.ts @@ -115,12 +115,35 @@ export class ChatGPTApi implements LLMApi { if (shouldStream) { let responseText = ""; + let remainText = ""; let finished = false; + // animate response to make it looks smooth + function animateResponseText() { + if (finished || controller.signal.aborted) { + responseText += remainText; + console.log("[Response Animation] finished"); + return; + } + + if (remainText.length > 0) { + const fetchCount = Math.max(1, Math.round(remainText.length / 60)); + const fetchText = remainText.slice(0, fetchCount); + responseText += fetchText; + remainText = remainText.slice(fetchCount); + options.onUpdate?.(responseText, fetchText); + } + + requestAnimationFrame(animateResponseText); + } + + // start animaion + animateResponseText(); + const finish = () => { if (!finished) { - options.onFinish(responseText); finished = true; + options.onFinish(responseText + remainText); } }; @@ -183,8 +206,7 @@ export class ChatGPTApi implements LLMApi { }; const delta = json.choices[0]?.delta?.content; if (delta) { - responseText += delta; - options.onUpdate?.(responseText, delta); + remainText += delta; } } catch (e) { console.error("[Request] parse error", text); diff --git a/app/components/chat.tsx b/app/components/chat.tsx index 4d9de7259..39abdd97b 100644 --- a/app/components/chat.tsx +++ b/app/components/chat.tsx @@ -449,8 +449,7 @@ export function ChatActions(props: { ); showToast(nextModel); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [currentModel, models]); + }, [chatStore, currentModel, models]); return (
diff --git a/app/components/emoji.tsx b/app/components/emoji.tsx index 03aac05f2..616e80ed3 100644 --- a/app/components/emoji.tsx +++ b/app/components/emoji.tsx @@ -10,7 +10,7 @@ import BotIcon from "../icons/bot.svg"; import BlackBotIcon from "../icons/black-bot.svg"; export function getEmojiUrl(unified: string, style: EmojiStyle) { - return `https://cdn.staticfile.org/emoji-datasource-apple/14.0.0/img/${style}/64/${unified}.png`; + return `https://cdn.staticfile.org/emoji-datasource-apple/15.0.1/img/${style}/64/${unified}.png`; } export function AvatarPicker(props: { diff --git a/app/components/settings.tsx b/app/components/settings.tsx index 1edb3c6ba..f53024d6c 100644 --- a/app/components/settings.tsx +++ b/app/components/settings.tsx @@ -635,6 +635,11 @@ export function Settings() { navigate(Path.Home); } }; + if (clientConfig?.isApp) { // Force to set custom endpoint to true if it's app + accessStore.update((state) => { + state.useCustomConfig = true; + }); + } document.addEventListener("keydown", keydownEvent); return () => { document.removeEventListener("keydown", keydownEvent); @@ -909,21 +914,26 @@ export function Settings() { {!accessStore.hideUserApiKey && ( <> - - - accessStore.update( - (access) => - (access.useCustomConfig = e.currentTarget.checked), - ) - } - > - + { + // Conditionally render the following ListItem based on clientConfig.isApp + !clientConfig?.isApp && ( // only show if isApp is false + + + accessStore.update( + (access) => + (access.useCustomConfig = e.currentTarget.checked), + ) + } + > + + ) + } {accessStore.useCustomConfig && ( <> { const isAzure = !!process.env.AZURE_URL; + const apiKeyEnvVar = process.env.OPENAI_API_KEY ?? ""; + const apiKeys = apiKeyEnvVar.split(",").map((v) => v.trim()); + const randomIndex = Math.floor(Math.random() * apiKeys.length); + const apiKey = apiKeys[randomIndex]; + console.log( + `[Server Config] using ${randomIndex + 1} of ${apiKeys.length} api key`, + ); + return { baseUrl: process.env.BASE_URL, - apiKey: process.env.OPENAI_API_KEY, + apiKey, openaiOrgId: process.env.OPENAI_ORG_ID, isAzure, diff --git a/app/locales/index.ts b/app/locales/index.ts index 79e314fac..cfbdff297 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -1,5 +1,6 @@ import cn from "./cn"; import en from "./en"; +import pt from "./pt"; import tw from "./tw"; import id from "./id"; import fr from "./fr"; @@ -24,6 +25,7 @@ const ALL_LANGS = { cn, en, tw, + pt, jp, ko, id, @@ -47,6 +49,7 @@ export const AllLangs = Object.keys(ALL_LANGS) as Lang[]; export const ALL_LANG_OPTIONS: Record = { cn: "简体中文", en: "English", + pt: "Português", tw: "繁體中文", jp: "日本語", ko: "한국어", diff --git a/app/locales/pt.ts b/app/locales/pt.ts new file mode 100644 index 000000000..85226ed50 --- /dev/null +++ b/app/locales/pt.ts @@ -0,0 +1,466 @@ +import { SubmitKey } from "../store/config"; +import { PartialLocaleType } from "../locales/index"; +import { getClientConfig } from "../config/client"; + +const isApp = !!getClientConfig()?.isApp; + +const pt: PartialLocaleType = { + WIP: "Em breve...", + Error: { + Unauthorized: isApp + ? "Chave API inválida, por favor verifique em [Configurações](/#/settings)." + : "Acesso não autorizado, por favor insira o código de acesso em [auth](/#/auth) ou insira sua Chave API OpenAI.", + }, + Auth: { + Title: "Necessário Código de Acesso", + Tips: "Por favor, insira o código de acesso abaixo", + SubTips: "Ou insira sua Chave API OpenAI", + Input: "código de acesso", + Confirm: "Confirmar", + Later: "Depois", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} mensagens`, + }, + Chat: { + SubTitle: (count: number) => `${count} mensagens`, + EditMessage: { + Title: "Editar Todas as Mensagens", + Topic: { + Title: "Tópico", + SubTitle: "Mudar o tópico atual", + }, + }, + Actions: { + ChatList: "Ir Para Lista de Chat", + CompressedHistory: "Prompt de Memória Histórica Comprimida", + Export: "Exportar Todas as Mensagens como Markdown", + Copy: "Copiar", + Stop: "Parar", + Retry: "Tentar Novamente", + Pin: "Fixar", + PinToastContent: "Fixada 1 mensagem para prompts contextuais", + PinToastAction: "Visualizar", + Delete: "Deletar", + Edit: "Editar", + }, + Commands: { + new: "Iniciar um novo chat", + newm: "Iniciar um novo chat com máscara", + next: "Próximo Chat", + prev: "Chat Anterior", + clear: "Limpar Contexto", + del: "Deletar Chat", + }, + InputActions: { + Stop: "Parar", + ToBottom: "Para o Mais Recente", + Theme: { + auto: "Automático", + light: "Tema Claro", + dark: "Tema Escuro", + }, + Prompt: "Prompts", + Masks: "Máscaras", + Clear: "Limpar Contexto", + Settings: "Configurações", + }, + Rename: "Renomear Chat", + Typing: "Digitando…", + Input: (submitKey: string) => { + var inputHints = `${submitKey} para enviar`; + if (submitKey === String(SubmitKey.Enter)) { + inputHints += ", Shift + Enter para quebrar linha"; + } + return inputHints + ", / para buscar prompts, : para usar comandos"; + }, + Send: "Enviar", + Config: { + Reset: "Redefinir para Padrão", + SaveAs: "Salvar como Máscara", + }, + IsContext: "Prompt Contextual", + }, + Export: { + Title: "Exportar Mensagens", + Copy: "Copiar Tudo", + Download: "Baixar", + MessageFromYou: "Mensagem De Você", + MessageFromChatGPT: "Mensagem De ChatGPT", + Share: "Compartilhar para ShareGPT", + Format: { + Title: "Formato de Exportação", + SubTitle: "Markdown ou Imagem PNG", + }, + IncludeContext: { + Title: "Incluindo Contexto", + SubTitle: "Exportar prompts de contexto na máscara ou não", + }, + Steps: { + Select: "Selecionar", + Preview: "Pré-visualizar", + }, + Image: { + Toast: "Capturando Imagem...", + Modal: + "Pressione longamente ou clique com o botão direito para salvar a imagem", + }, + }, + Select: { + Search: "Buscar", + All: "Selecionar Tudo", + Latest: "Selecionar Mais Recente", + Clear: "Limpar", + }, + Memory: { + Title: "Prompt de Memória", + EmptyContent: "Nada ainda.", + Send: "Enviar Memória", + Copy: "Copiar Memória", + Reset: "Resetar Sessão", + ResetConfirm: + "Resetar irá limpar o histórico de conversa atual e a memória histórica. Você tem certeza que quer resetar?", + }, + Home: { + NewChat: "Novo Chat", + DeleteChat: "Confirmar para deletar a conversa selecionada?", + DeleteToast: "Chat Deletado", + Revert: "Reverter", + }, + Settings: { + Title: "Configurações", + SubTitle: "Todas as Configurações", + Danger: { + Reset: { + Title: "Resetar Todas as Configurações", + SubTitle: "Resetar todos os itens de configuração para o padrão", + Action: "Resetar", + Confirm: "Confirmar para resetar todas as configurações para o padrão?", + }, + Clear: { + Title: "Limpar Todos os Dados", + SubTitle: "Limpar todas as mensagens e configurações", + Action: "Limpar", + Confirm: "Confirmar para limpar todas as mensagens e configurações?", + }, + }, + Lang: { + Name: "Language", + All: "Todos os Idiomas", + }, + Avatar: "Avatar", + FontSize: { + Title: "Tamanho da Fonte", + SubTitle: "Ajustar o tamanho da fonte do conteúdo do chat", + }, + InjectSystemPrompts: { + Title: "Inserir Prompts de Sistema", + SubTitle: "Inserir um prompt de sistema global para cada requisição", + }, + InputTemplate: { + Title: "Modelo de Entrada", + SubTitle: "A mensagem mais recente será preenchida neste modelo", + }, + + Update: { + Version: (x: string) => `Versão: ${x}`, + IsLatest: "Última versão", + CheckUpdate: "Verificar Atualização", + IsChecking: "Verificando atualização...", + FoundUpdate: (x: string) => `Nova versão encontrada: ${x}`, + GoToUpdate: "Atualizar", + }, + SendKey: "Tecla de Envio", + Theme: "Tema", + TightBorder: "Borda Ajustada", + SendPreviewBubble: { + Title: "Bolha de Pré-visualização de Envio", + SubTitle: "Pré-visualizar markdown na bolha", + }, + AutoGenerateTitle: { + Title: "Gerar Título Automaticamente", + SubTitle: "Gerar um título adequado baseado no conteúdo da conversa", + }, + Sync: { + CloudState: "Última Atualização", + NotSyncYet: "Ainda não sincronizado", + Success: "Sincronização bem sucedida", + Fail: "Falha na sincronização", + + Config: { + Modal: { + Title: "Configurar Sincronização", + Check: "Verificar Conexão", + }, + SyncType: { + Title: "Tipo de Sincronização", + SubTitle: "Escolha seu serviço de sincronização favorito", + }, + Proxy: { + Title: "Habilitar Proxy CORS", + SubTitle: "Habilitar um proxy para evitar restrições de cross-origin", + }, + ProxyUrl: { + Title: "Endpoint de Proxy", + SubTitle: "Apenas aplicável ao proxy CORS embutido para este projeto", + }, + + WebDav: { + Endpoint: "Endpoint WebDAV", + UserName: "Nome de Usuário", + Password: "Senha", + }, + + UpStash: { + Endpoint: "URL REST Redis UpStash", + UserName: "Nome do Backup", + Password: "Token REST Redis UpStash", + }, + }, + + LocalState: "Dados Locais", + Overview: (overview: any) => { + return `${overview.chat} chats,${overview.message} mensagens,${overview.prompt} prompts,${overview.mask} máscaras`; + }, + ImportFailed: "Falha ao importar do arquivo", + }, + Mask: { + Splash: { + Title: "Tela de Início da Máscara", + SubTitle: + "Mostrar uma tela de início da máscara antes de iniciar novo chat", + }, + Builtin: { + Title: "Esconder Máscaras Embutidas", + SubTitle: "Esconder máscaras embutidas na lista de máscaras", + }, + }, + Prompt: { + Disable: { + Title: "Desabilitar auto-completar", + SubTitle: "Digite / para acionar auto-completar", + }, + List: "Lista de Prompts", + ListCount: (builtin: number, custom: number) => + `${builtin} embutidos, ${custom} definidos pelo usuário`, + Edit: "Editar", + Modal: { + Title: "Lista de Prompts", + Add: "Adicionar Um", + Search: "Buscar Prompts", + }, + EditModal: { + Title: "Editar Prompt", + }, + }, + HistoryCount: { + Title: "Contagem de Mensagens Anexadas", + SubTitle: "Número de mensagens enviadas anexadas por requisição", + }, + CompressThreshold: { + Title: "Limite de Compressão de Histórico", + SubTitle: + "Irá comprimir se o comprimento das mensagens não comprimidas exceder o valor", + }, + + Usage: { + Title: "Saldo da Conta", + SubTitle(used: any, total: any) { + return `Usado este mês ${used}, assinatura ${total}`; + }, + IsChecking: "Verificando...", + Check: "Verificar", + NoAccess: "Insira a Chave API para verificar o saldo", + }, + Access: { + AccessCode: { + Title: "Código de Acesso", + SubTitle: "Controle de Acesso Habilitado", + Placeholder: "Insira o Código", + }, + CustomEndpoint: { + Title: "Endpoint Personalizado", + SubTitle: "Use serviço personalizado Azure ou OpenAI", + }, + Provider: { + Title: "Provedor do Modelo", + SubTitle: "Selecione Azure ou OpenAI", + }, + OpenAI: { + ApiKey: { + Title: "Chave API OpenAI", + SubTitle: "Usar Chave API OpenAI personalizada", + Placeholder: "sk-xxx", + }, + + Endpoint: { + Title: "Endpoint OpenAI", + SubTitle: + "Deve começar com http(s):// ou usar /api/openai como padrão", + }, + }, + Azure: { + ApiKey: { + Title: "Chave API Azure", + SubTitle: "Verifique sua chave API do console Azure", + Placeholder: "Chave API Azure", + }, + + Endpoint: { + Title: "Endpoint Azure", + SubTitle: "Exemplo: ", + }, + + ApiVerion: { + Title: "Versão API Azure", + SubTitle: "Verifique sua versão API do console Azure", + }, + }, + CustomModel: { + Title: "Modelos Personalizados", + SubTitle: "Opções de modelo personalizado, separados por vírgula", + }, + }, + + Model: "Modelo", + Temperature: { + Title: "Temperatura", + SubTitle: "Um valor maior torna a saída mais aleatória", + }, + TopP: { + Title: "Top P", + SubTitle: "Não altere este valor junto com a temperatura", + }, + MaxTokens: { + Title: "Máximo de Tokens", + SubTitle: "Comprimento máximo de tokens de entrada e tokens gerados", + }, + PresencePenalty: { + Title: "Penalidade de Presença", + SubTitle: + "Um valor maior aumenta a probabilidade de falar sobre novos tópicos", + }, + FrequencyPenalty: { + Title: "Penalidade de Frequência", + SubTitle: + "Um valor maior diminui a probabilidade de repetir a mesma linha", + }, + }, + Store: { + DefaultTopic: "Nova Conversa", + BotHello: "Olá! Como posso ajudá-lo hoje?", + Error: "Algo deu errado, por favor tente novamente mais tarde.", + Prompt: { + History: (content: string) => + "Este é um resumo do histórico de chat como um recapitulativo: " + + content, + Topic: + "Por favor, gere um título de quatro a cinco palavras resumindo nossa conversa sem qualquer introdução, pontuação, aspas, períodos, símbolos ou texto adicional. Remova as aspas que o envolvem.", + Summarize: + "Resuma a discussão brevemente em 200 palavras ou menos para usar como um prompt para o contexto futuro.", + }, + }, + Copy: { + Success: "Copiado para a área de transferência", + Failed: + "Falha na cópia, por favor conceda permissão para acessar a área de transferência", + }, + Download: { + Success: "Conteúdo baixado para seu diretório.", + Failed: "Falha no download.", + }, + Context: { + Toast: (x: any) => `Com ${x} prompts contextuais`, + Edit: "Configurações do Chat Atual", + Add: "Adicionar um Prompt", + Clear: "Contexto Limpo", + Revert: "Reverter", + }, + Plugin: { + Name: "Plugin", + }, + FineTuned: { + Sysmessage: "Você é um assistente que", + }, + Mask: { + Name: "Máscara", + Page: { + Title: "Template de Prompt", + SubTitle: (count: number) => `${count} templates de prompt`, + Search: "Buscar Templates", + Create: "Criar", + }, + Item: { + Info: (count: number) => `${count} prompts`, + Chat: "Chat", + View: "Visualizar", + Edit: "Editar", + Delete: "Deletar", + DeleteConfirm: "Confirmar para deletar?", + }, + EditModal: { + Title: (readonly: boolean) => + `Editar Template de Prompt ${readonly ? "(somente leitura)" : ""}`, + Download: "Baixar", + Clone: "Clonar", + }, + Config: { + Avatar: "Avatar do Bot", + Name: "Nome do Bot", + Sync: { + Title: "Usar Configuração Global", + SubTitle: "Usar configuração global neste chat", + Confirm: + "Confirmar para substituir a configuração personalizada pela configuração global?", + }, + HideContext: { + Title: "Esconder Prompts de Contexto", + SubTitle: "Não mostrar prompts de contexto no chat", + }, + Share: { + Title: "Compartilhar Esta Máscara", + SubTitle: "Gerar um link para esta máscara", + Action: "Copiar Link", + }, + }, + }, + NewChat: { + Return: "Retornar", + Skip: "Apenas Começar", + Title: "Escolher uma Máscara", + SubTitle: "Converse com a Alma por trás da Máscara", + More: "Encontre Mais", + NotShow: "Nunca Mostrar Novamente", + ConfirmNoShow: + "Confirmar para desabilitar?Você pode habilitar nas configurações depois.", + }, + + UI: { + Confirm: "Confirmar", + Cancel: "Cancelar", + Close: "Fechar", + Create: "Criar", + Edit: "Editar", + Export: "Exportar", + Import: "Importar", + Sync: "Sincronizar", + Config: "Configurar", + }, + Exporter: { + Description: { + Title: "Apenas mensagens após a limpeza do contexto serão exibidas", + }, + Model: "Modelo", + Messages: "Mensagens", + Topic: "Tópico", + Time: "Tempo", + }, + + URLCommand: { + Code: "Código de acesso detectado a partir da url, confirmar para aplicar? ", + Settings: + "Configurações detectadas a partir da url, confirmar para aplicar?", + }, +}; + +export default pt; diff --git a/app/store/chat.ts b/app/store/chat.ts index ff7eb51b5..66a39d2b2 100644 --- a/app/store/chat.ts +++ b/app/store/chat.ts @@ -557,7 +557,10 @@ export const useChatStore = createPersistStore( }, onFinish(message) { console.log("[Memory] ", message); - session.lastSummarizeIndex = lastSummarizeIndex; + get().updateCurrentSession((session) => { + session.lastSummarizeIndex = lastSummarizeIndex; + session.memoryPrompt = message; // Update the memory prompt for stored it in local storage + }); }, onError(err) { console.error("[Summarize] ", err); diff --git a/app/utils.ts b/app/utils.ts index acc140ac3..ac7e80e7a 100644 --- a/app/utils.ts +++ b/app/utils.ts @@ -3,7 +3,10 @@ import { showToast } from "./components/ui-lib"; import Locale from "./locales"; export function trimTopic(topic: string) { - return topic.replace(/[,。!?”“"、,.!?]*$/, ""); + // Fix an issue where double quotes still show in the Indonesian language + // This will remove the specified punctuation from the end of the string + // and also trim quotes from both the start and end if they exist. + return topic.replace(/^["“”]+|["“”]+$/g, "").replace(/[,。!?”“"、,.!?]*$/, ""); } export async function copyToClipboard(text: string) { diff --git a/app/utils/model.ts b/app/utils/model.ts index d5c009c02..74b28a66a 100644 --- a/app/utils/model.ts +++ b/app/utils/model.ts @@ -26,7 +26,13 @@ export function collectModelTable( const available = !m.startsWith("-"); const nameConfig = m.startsWith("+") || m.startsWith("-") ? m.slice(1) : m; - const [name, displayName] = nameConfig.split(":"); + const [name, displayName] = nameConfig.split("="); + + // enable or disable all models + if (name === "all") { + Object.values(modelTable).forEach((m) => (m.available = available)); + } + modelTable[name] = { name, displayName: displayName || name, diff --git a/package.json b/package.json index c8673cf31..738e22ecc 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ }, "dependencies": { "@fortaine/fetch-event-source": "^3.0.6", - "@hello-pangea/dnd": "^16.3.0", + "@hello-pangea/dnd": "^16.5.0", "@svgr/webpack": "^6.5.1", "@vercel/analytics": "^0.1.11", "emoji-picker-react": "^4.5.15", - "fuse.js": "^6.6.2", + "fuse.js": "^7.0.0", "html-to-image": "^1.11.11", "mermaid": "^10.6.1", "nanoid": "^5.0.3", @@ -42,7 +42,7 @@ "zustand": "^4.3.8" }, "devDependencies": { - "@tauri-apps/cli": "^1.4.0", + "@tauri-apps/cli": "^1.5.8", "@types/node": "^20.9.0", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.7", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 397ae0d83..7f2ffb0f6 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -9,7 +9,7 @@ }, "package": { "productName": "ChatGPT Next Web", - "version": "2.9.11" + "version": "2.9.13" }, "tauri": { "allowlist": { diff --git a/vercel.json b/vercel.json index 1890a0f7d..0cae358a1 100644 --- a/vercel.json +++ b/vercel.json @@ -1,24 +1,5 @@ { "github": { "silent": true - }, - "headers": [ - { - "source": "/(.*)", - "headers": [ - { - "key": "X-Real-IP", - "value": "$remote_addr" - }, - { - "key": "X-Forwarded-For", - "value": "$proxy_add_x_forwarded_for" - }, - { - "key": "Host", - "value": "$http_host" - } - ] - } - ] + } } diff --git a/yarn.lock b/yarn.lock index 340282108..e608eda15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" @@ -58,6 +66,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -123,6 +141,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -138,6 +161,14 @@ "@babel/template" "^7.20.7" "@babel/types" "^7.21.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -145,6 +176,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" @@ -228,16 +266,33 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" @@ -271,11 +326,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": version "7.21.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -959,12 +1028,12 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.12.1", "@babel/runtime@^7.20.7", "@babel/runtime@^7.22.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" - integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== +"@babel/runtime@^7.12.1", "@babel/runtime@^7.20.7", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== dependencies: - regenerator-runtime "^0.13.11" + regenerator-runtime "^0.14.0" "@babel/template@^7.18.10", "@babel/template@^7.20.7": version "7.20.7" @@ -975,19 +1044,28 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" - integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.3" - "@babel/types" "^7.21.3" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -1000,6 +1078,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@braintree/sanitize-url@^6.0.1": version "6.0.4" resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" @@ -1042,16 +1129,16 @@ resolved "https://registry.npmmirror.com/@fortaine/fetch-event-source/-/fetch-event-source-3.0.6.tgz#b8552a2ca2c5202f5699b93a92be0188d422b06e" integrity sha512-621GAuLMvKtyZQ3IA6nlDWhV1V/7PGOTNIGLUifxt0KzM+dZIweJ6F3XvQF3QnqeNfS1N7WQ0Kil1Di/lhChEw== -"@hello-pangea/dnd@^16.3.0": - version "16.3.0" - resolved "https://registry.yarnpkg.com/@hello-pangea/dnd/-/dnd-16.3.0.tgz#3776212f812df4e8e69c42831ec8ab7ff3a087d6" - integrity sha512-RYQ/K8shtJoyNPvFWz0gfXIK7HF3P3mL9UZFGMuHB0ljRSXVgMjVFI/FxcZmakMzw6tO7NflWLriwTNBow/4vw== +"@hello-pangea/dnd@^16.5.0": + version "16.5.0" + resolved "https://registry.yarnpkg.com/@hello-pangea/dnd/-/dnd-16.5.0.tgz#f323ff9f813204818bc67648a383e8715f47c59c" + integrity sha512-n+am6O32jo/CFXciCysz83lPM3I3F58FJw4uS44TceieymcyxQSfzK5OhzPAKrVBZktmuOI6Zim9WABTMtXv4A== dependencies: - "@babel/runtime" "^7.22.5" + "@babel/runtime" "^7.23.2" css-box-model "^1.2.1" memoize-one "^6.0.0" raf-schd "^4.0.3" - react-redux "^8.1.1" + react-redux "^8.1.3" redux "^4.2.1" use-memo-one "^1.1.3" @@ -1344,71 +1431,71 @@ dependencies: tslib "^2.4.0" -"@tauri-apps/cli-darwin-arm64@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.4.0.tgz#e76bb8515ae31f03f2cbd440c1a09b237a79b3ac" - integrity sha512-nA/ml0SfUt6/CYLVbHmT500Y+ijqsuv5+s9EBnVXYSLVg9kbPUZJJHluEYK+xKuOj6xzyuT/+rZFMRapmJD3jQ== +"@tauri-apps/cli-darwin-arm64@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.8.tgz#28ca810b910979260dd77c92951d16340fcaa711" + integrity sha512-/AksDWfAt3NUSt8Rq2a3gTLASChKzldPVUjmJhcbtsuzFg2nx5g+hhOHxfBYzss2Te1K5mzlu+73LAMy1Sb9Gw== -"@tauri-apps/cli-darwin-x64@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.4.0.tgz#dd1472460550d0aa0ec6e699b073be2d77e5b962" - integrity sha512-ov/F6Zr+dg9B0PtRu65stFo2G0ow2TUlneqYYrkj+vA3n+moWDHfVty0raDjMLQbQt3rv3uayFMXGPMgble9OA== +"@tauri-apps/cli-darwin-x64@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.8.tgz#4060fb0ffcc8312cf48701df51e0e9b665f18382" + integrity sha512-gcfSh+BFRDdbIGpggZ1+5R5SgToz2A9LthH8P4ak3OHagDzDvI6ov6zy2UQE3XDWJKdnlna2rSR1dIuRZ0T9bA== -"@tauri-apps/cli-linux-arm-gnueabihf@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.4.0.tgz#325e90e47d260ba71a499850ce769b5a6bdfd48d" - integrity sha512-zwjbiMncycXDV7doovymyKD7sCg53ouAmfgpUqEBOTY3vgBi9TwijyPhJOqoG5vUVWhouNBC08akGmE4dja15g== +"@tauri-apps/cli-linux-arm-gnueabihf@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.8.tgz#00256432520edf04004962caa92cd84fbcc8b63f" + integrity sha512-ZHQYuOBGvZubPnh5n8bNaN2VMxPBZWs26960FGQWamm9569UV/TNDHb6mD0Jjk9o0f9P+f98qNhuu5Y37P+vfQ== -"@tauri-apps/cli-linux-arm64-gnu@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.4.0.tgz#b5d8f5cba3f8f7c7d44d071681f0ab0a37f2c46e" - integrity sha512-5MCBcziqXC72mMXnkZU68mutXIR6zavDxopArE2gQtK841IlE06bIgtLi0kUUhlFJk2nhPRgiDgdLbrPlyt7fw== +"@tauri-apps/cli-linux-arm64-gnu@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.8.tgz#7869571b06e8b36a072f2e0e7bb49baab9d3c868" + integrity sha512-FFs28Ew3R2EFPYKuyAIouTbp6YnR+shAmJGFNnVy7ibKHL0wxamVKqv1N5N9gUUr+EhbZu2syMBRfG9XQ5mgng== -"@tauri-apps/cli-linux-arm64-musl@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.4.0.tgz#f805ab2ee415875900f4b456f17dc4900d2a7911" - integrity sha512-7J3pRB6n6uNYgIfCeKt2Oz8J7oSaz2s8GGFRRH2HPxuTHrBNCinzVYm68UhVpJrL3bnGkU0ziVZLsW/iaOGfUg== +"@tauri-apps/cli-linux-arm64-musl@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.8.tgz#7cbe0395cbd09d4b49c945e36c2de99478c50a51" + integrity sha512-dEYvNyLMmWD0jb30FNfVPXmBq6OGg6is3km+4RlGg8tZU5Zvq78ClUZtaZuER+N/hv27+Uc6UHl9X3hin8cGGw== -"@tauri-apps/cli-linux-x64-gnu@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.4.0.tgz#d3f5e69c22420c7ac9e4021b7a94bce2e48cb45d" - integrity sha512-Zh5gfAJxOv5AVWxcwuueaQ2vIAhlg0d6nZui6nMyfIJ8dbf3aZQ5ZzP38sYow5h/fbvgL+3GSQxZRBIa3c2E1w== +"@tauri-apps/cli-linux-x64-gnu@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.8.tgz#d03ba73f1ac68bf6bace7bf45b50e6b12ce4468b" + integrity sha512-ut3TDbtLXmZhz6Q4wim57PV02wG+AfuLSWRPhTL9MsPsg/E7Y6sJhv0bIMAq6SwC59RCH52ZGft6RH7samV2NQ== -"@tauri-apps/cli-linux-x64-musl@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.4.0.tgz#2e7f718272ffdd9ace80f57a35023ba0c74767ad" - integrity sha512-OLAYoICU3FaYiTdBsI+lQTKnDHeMmFMXIApN0M+xGiOkoIOQcV9CConMPjgmJQ867+NHRNgUGlvBEAh9CiJodQ== +"@tauri-apps/cli-linux-x64-musl@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.8.tgz#4ce560aa102e9031d4c51c7bc853263cf3ab9616" + integrity sha512-k6ei7ETXVZlNpFOhl/8Cnj709UbEr+VuY9xKK/HgwvNfjA5f8HQ9TSKk/Um7oeT1Y61/eEcvcgF/hDURhFJDPQ== -"@tauri-apps/cli-win32-arm64-msvc@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.4.0.tgz#85cdb52a06feb92da785def4d02512099464525e" - integrity sha512-gZ05GENFbI6CB5MlOUsLlU0kZ9UtHn9riYtSXKT6MYs8HSPRffPHaHSL0WxsJweWh9nR5Hgh/TUU8uW3sYCzCg== +"@tauri-apps/cli-win32-arm64-msvc@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.8.tgz#df83af81c6d89d4a505f2e96b3d443dd411c1a4a" + integrity sha512-l6zm31x1inkS2K5e7otUZ90XBoK+xr2KJObFCZbzmluBE+LM0fgIXCrj7xwH/f0RCUX3VY9HHx4EIo7eLGBXKQ== -"@tauri-apps/cli-win32-ia32-msvc@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.4.0.tgz#0b7c921204058215aec9a5a00f735e73909bd330" - integrity sha512-JsetT/lTx/Zq98eo8T5CiRyF1nKeX04RO8JlJrI3ZOYsZpp/A5RJvMd/szQ17iOzwiHdge+tx7k2jHysR6oBlQ== +"@tauri-apps/cli-win32-ia32-msvc@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.8.tgz#92e5acc4dcd44aec88099059a04bb5ad3b4e59ff" + integrity sha512-0k3YpWl6PKV4Qp2N52Sb45egXafSgQXcBaO7TIJG4EDfaEf5f6StN+hYSzdnrq9idrK5x9DDCPuebZTuJ+Q8EA== -"@tauri-apps/cli-win32-x64-msvc@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.4.0.tgz#23abe3f08c0df89111c29602f91c21a23577b908" - integrity sha512-z8Olcnwp5aYhzqUAarFjqF+oELCjuYWnB2HAJHlfsYNfDCAORY5kct3Fklz8PSsubC3U2EugWn8n42DwnThurg== +"@tauri-apps/cli-win32-x64-msvc@1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.8.tgz#a0c363969cf5a21c95c235e5bf6a94a410130761" + integrity sha512-XjBg8VMswmD9JAHKlb10NRPfBVAZoiOJBbPRte+GP1BUQtqDnbIYcOLSnUCmNZoy3fUBJuKJUBT9tDCbkMr5fQ== -"@tauri-apps/cli@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.4.0.tgz#72732ae61e6b7d097e44a8a2ef5f211b2d01d98b" - integrity sha512-VXYr2i2iVFl98etQSQsqLzXgX96bnWiNZd1YADgatqwy/qecbd6Kl5ZAPB5R4ynsgE8A1gU7Fbzh7dCEQYFfmA== +"@tauri-apps/cli@^1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.5.8.tgz#feaf055af370cb192b24ea4c51edf0e577269fb2" + integrity sha512-c/mzk5vjjfxtH5uNXSc9h1eiprsolnoBcUwAa4/SZ3gxJ176CwrUKODz3cZBOnzs8omwagwgSN/j7K8NrdFL9g== optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "1.4.0" - "@tauri-apps/cli-darwin-x64" "1.4.0" - "@tauri-apps/cli-linux-arm-gnueabihf" "1.4.0" - "@tauri-apps/cli-linux-arm64-gnu" "1.4.0" - "@tauri-apps/cli-linux-arm64-musl" "1.4.0" - "@tauri-apps/cli-linux-x64-gnu" "1.4.0" - "@tauri-apps/cli-linux-x64-musl" "1.4.0" - "@tauri-apps/cli-win32-arm64-msvc" "1.4.0" - "@tauri-apps/cli-win32-ia32-msvc" "1.4.0" - "@tauri-apps/cli-win32-x64-msvc" "1.4.0" + "@tauri-apps/cli-darwin-arm64" "1.5.8" + "@tauri-apps/cli-darwin-x64" "1.5.8" + "@tauri-apps/cli-linux-arm-gnueabihf" "1.5.8" + "@tauri-apps/cli-linux-arm64-gnu" "1.5.8" + "@tauri-apps/cli-linux-arm64-musl" "1.5.8" + "@tauri-apps/cli-linux-x64-gnu" "1.5.8" + "@tauri-apps/cli-linux-x64-musl" "1.5.8" + "@tauri-apps/cli-win32-arm64-msvc" "1.5.8" + "@tauri-apps/cli-win32-ia32-msvc" "1.5.8" + "@tauri-apps/cli-win32-x64-msvc" "1.5.8" "@trysound/sax@0.2.0": version "0.2.0" @@ -2053,7 +2140,7 @@ chalk@5.2.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3301,10 +3388,10 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -fuse.js@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" - integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== +fuse.js@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" + integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -5073,10 +5160,10 @@ react-markdown@^8.0.7: unist-util-visit "^4.0.0" vfile "^5.0.0" -react-redux@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.1.tgz#8e740f3fd864a4cd0de5ba9cdc8ad39cc9e7c81a" - integrity sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA== +react-redux@^8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.3.tgz#4fdc0462d0acb59af29a13c27ffef6f49ab4df46" + integrity sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw== dependencies: "@babel/runtime" "^7.12.1" "@types/hoist-non-react-statics" "^3.3.1" @@ -5133,10 +5220,10 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.1: version "0.15.1"