diff --git a/.env.template b/.env.template index 89bab2cb1..166cc4ef4 100644 --- a/.env.template +++ b/.env.template @@ -14,8 +14,8 @@ PROXY_URL=http://localhost:7890 GOOGLE_API_KEY= # (optional) -# Default: https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent -# Googel Gemini Pro API url, set if you want to customize Google Gemini Pro API url. +# Default: https://generativelanguage.googleapis.com/ +# Googel Gemini Pro API url without pathname, set if you want to customize Google Gemini Pro API url. GOOGLE_URL= # Override openai api request base url. (optional) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml new file mode 100644 index 000000000..02ee0f192 --- /dev/null +++ b/.github/workflows/deploy_preview.yml @@ -0,0 +1,83 @@ +name: VercelPreviewDeployment + +on: + pull_request_target: + types: + - opened + - synchronize + +env: + VERCEL_TEAM: ${{ secrets.VERCEL_TEAM }} + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + VERCEL_PR_DOMAIN_SUFFIX: ${{ secrets.VERCEL_PR_DOMAIN_SUFFIX }} + +permissions: + contents: read + statuses: write + pull-requests: write + +jobs: + deploy-preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> "$GITHUB_OUTPUT" + id: extract_branch + + - name: Hash branch name + uses: pplanel/hash-calculator-action@v1.3.1 + id: hash_branch + with: + input: ${{ steps.extract_branch.outputs.branch }} + method: MD5 + + - name: Set Environment Variables + id: set_env + if: github.event_name == 'pull_request_target' + run: | + echo "VERCEL_ALIAS_DOMAIN=${{ github.event.pull_request.number }}-${{ github.workflow }}.${VERCEL_PR_DOMAIN_SUFFIX}" >> $GITHUB_OUTPUT + + - name: Install Vercel CLI + run: npm install --global vercel@latest + + - name: Cache dependencies + uses: actions/cache@v2 + id: cache-npm + with: + path: ~/.npm + key: npm-${{ hashFiles('package-lock.json') }} + restore-keys: npm- + + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=preview --token=${VERCEL_TOKEN} + + - name: Deploy Project Artifacts to Vercel + id: vercel + env: + META_TAG: ${{ steps.hash_branch.outputs.digest }}-${{ github.run_number }}-${{ github.run_attempt}} + run: | + set -e + vercel pull --yes --environment=preview --token=${VERCEL_TOKEN} + vercel build --token=${VERCEL_TOKEN} + vercel deploy --prebuilt --archive=tgz --token=${VERCEL_TOKEN} --meta base_hash=${{ env.META_TAG }} + + DEFAULT_URL=$(vercel ls --token=${VERCEL_TOKEN} --meta base_hash=${{ env.META_TAG }}) + ALIAS_URL=$(vercel alias set ${DEFAULT_URL} ${{ steps.set_env.outputs.VERCEL_ALIAS_DOMAIN }} --token=${VERCEL_TOKEN} --scope ${VERCEL_TEAM}| awk '{print $3}') + + echo "New preview URL: ${DEFAULT_URL}" + echo "New alias URL: ${ALIAS_URL}" + echo "VERCEL_URL=${ALIAS_URL}" >> "$GITHUB_OUTPUT" + + - uses: mshick/add-pr-comment@v2 + with: + message: | + Your build has completed! + + [Preview deployment](${{ steps.vercel.outputs.VERCEL_URL }}) diff --git a/.github/workflows/remove_deploy_preview.yml b/.github/workflows/remove_deploy_preview.yml new file mode 100644 index 000000000..4846cda2d --- /dev/null +++ b/.github/workflows/remove_deploy_preview.yml @@ -0,0 +1,40 @@ +name: Removedeploypreview + +permissions: + contents: read + statuses: write + pull-requests: write + +env: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + +on: + pull_request_target: + types: + - closed + +jobs: + delete-deployments: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT + id: extract_branch + + - name: Hash branch name + uses: pplanel/hash-calculator-action@v1.3.1 + id: hash_branch + with: + input: ${{ steps.extract_branch.outputs.branch }} + method: MD5 + + - name: Call the delete-deployment-preview.sh script + env: + META_TAG: ${{ steps.hash_branch.outputs.digest }} + run: | + bash ./scripts/delete-deployment-preview.sh diff --git a/README.md b/README.md index 69b649926..3ac537abc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-icon +icon

NextChat (ChatGPT Next Web)

@@ -14,9 +14,9 @@ One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 [![MacOS][MacOS-image]][download-url] [![Linux][Linux-image]][download-url] -[Web App](https://app.nextchat.dev/) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Discord](https://discord.gg/YCkeafCafC) / [Twitter](https://twitter.com/mortiest_ricky) / [Buy Me a Coffee](https://www.buymeacoffee.com/yidadaa) +[Web App](https://app.nextchat.dev/) / [Desktop App](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [Discord](https://discord.gg/YCkeafCafC) / [Twitter](https://twitter.com/NextChatDev) -[网页版](https://app.nextchat.dev/) / [客户端](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) +[网页版](https://app.nextchat.dev/) / [客户端](https://github.com/Yidadaa/ChatGPT-Next-Web/releases) / [反馈](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) [web-url]: https://chatgpt.nextweb.fun [download-url]: https://github.com/Yidadaa/ChatGPT-Next-Web/releases @@ -61,10 +61,11 @@ One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 ## 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.7 let's share conversations as image, or share to ShareGPT! -- 🚀 v2.8 now we have a client that runs across all platforms! +- 🚀 v2.10.1 support Google Gemini Pro model. - 🚀 v2.9.11 you can use azure endpoint now. +- 🚀 v2.8 now we have a client that runs across all platforms! +- 🚀 v2.7 let's share conversations as image, or share to ShareGPT! +- 🚀 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/). ## 主要功能 @@ -360,9 +361,11 @@ If you want to add a new translation, read this [document](./docs/translation.md [@Licoy](https://github.com/Licoy) [@shangmin2009](https://github.com/shangmin2009) -### Contributor +### Contributors -[Contributors](https://github.com/Yidadaa/ChatGPT-Next-Web/graphs/contributors) + + + ## LICENSE diff --git a/README_CN.md b/README_CN.md index 33acb44a3..bc1453778 100644 --- a/README_CN.md +++ b/README_CN.md @@ -5,7 +5,7 @@ 一键免费部署你的私人 ChatGPT 网页应用,支持 GPT3, GPT4 & Gemini Pro 模型。 -[演示 Demo](https://chat-gpt-next-web.vercel.app/) / [反馈 Issues](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [加入 Discord](https://discord.gg/zrhvHCr79N) / [QQ 群](https://user-images.githubusercontent.com/16968934/228190818-7dd00845-e9b9-4363-97e5-44c507ac76da.jpeg) / [打赏开发者](https://user-images.githubusercontent.com/16968934/227772541-5bcd52d8-61b7-488c-a203-0330d8006e2b.jpg) / [Donate](#捐赠-donate-usdt) +[演示 Demo](https://chat-gpt-next-web.vercel.app/) / [反馈 Issues](https://github.com/Yidadaa/ChatGPT-Next-Web/issues) / [加入 Discord](https://discord.gg/zrhvHCr79N) [![Deploy with Vercel](https://vercel.com/button)](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) diff --git a/app/api/cors/[...path]/route.ts b/app/api/cors/[...path]/route.ts index 0217b12b0..1f70d6630 100644 --- a/app/api/cors/[...path]/route.ts +++ b/app/api/cors/[...path]/route.ts @@ -40,4 +40,4 @@ export const POST = handle; export const GET = handle; export const OPTIONS = handle; -export const runtime = "nodejs"; +export const runtime = "edge"; diff --git a/app/api/google/[...path]/route.ts b/app/api/google/[...path]/route.ts index 869bd5076..ebd192891 100644 --- a/app/api/google/[...path]/route.ts +++ b/app/api/google/[...path]/route.ts @@ -101,19 +101,14 @@ 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", diff --git a/app/client/platforms/google.ts b/app/client/platforms/google.ts index c35e93cb3..f0f63659f 100644 --- a/app/client/platforms/google.ts +++ b/app/client/platforms/google.ts @@ -9,6 +9,7 @@ import { prettyObject } from "@/app/utils/format"; import { getClientConfig } from "@/app/config/client"; import Locale from "../../locales"; import { getServerSideConfig } from "@/app/config/server"; +import de from "@/app/locales/de"; export class GeminiProApi implements LLMApi { extractMessage(res: any) { console.log("[Response] gemini-pro response: ", res); @@ -20,6 +21,7 @@ export class GeminiProApi implements LLMApi { ); } async chat(options: ChatOptions): Promise { + const apiClient = this; const messages = options.messages.map((v) => ({ role: v.role.replace("assistant", "model").replace("system", "user"), parts: [{ text: v.content }], @@ -57,12 +59,29 @@ export class GeminiProApi implements LLMApi { topP: modelConfig.top_p, // "topK": modelConfig.top_k, }, + safetySettings: [ + { + category: "HARM_CATEGORY_HARASSMENT", + threshold: "BLOCK_ONLY_HIGH", + }, + { + category: "HARM_CATEGORY_HATE_SPEECH", + threshold: "BLOCK_ONLY_HIGH", + }, + { + category: "HARM_CATEGORY_SEXUALLY_EXPLICIT", + threshold: "BLOCK_ONLY_HIGH", + }, + { + category: "HARM_CATEGORY_DANGEROUS_CONTENT", + threshold: "BLOCK_ONLY_HIGH", + }, + ], }; console.log("[Request] google payload: ", requestPayload); - // todo: support stream later - const shouldStream = false; + const shouldStream = !!options.config.stream; const controller = new AbortController(); options.onController?.(controller); try { @@ -82,13 +101,23 @@ export class GeminiProApi implements LLMApi { if (shouldStream) { let responseText = ""; let remainText = ""; + let streamChatPath = chatPath.replace( + "generateContent", + "streamGenerateContent", + ); let finished = false; + let existingTexts: string[] = []; + const finish = () => { + finished = true; + options.onFinish(existingTexts.join("")); + }; + // animate response to make it looks smooth function animateResponseText() { if (finished || controller.signal.aborted) { responseText += remainText; - console.log("[Response Animation] finished"); + finish(); return; } @@ -105,88 +134,56 @@ export class GeminiProApi implements LLMApi { // start animaion animateResponseText(); + fetch(streamChatPath, chatPayload) + .then((response) => { + const reader = response?.body?.getReader(); + const decoder = new TextDecoder(); + let partialData = ""; - const finish = () => { - if (!finished) { - finished = true; - options.onFinish(responseText + remainText); - } - }; + return reader?.read().then(function processText({ + done, + value, + }): Promise { + if (done) { + console.log("Stream complete"); + // options.onFinish(responseText + remainText); + finished = true; + return Promise.resolve(); + } - controller.signal.onabort = finish; + partialData += decoder.decode(value, { stream: true }); - fetchEventSource(chatPath, { - ...chatPayload, - async onopen(res) { - clearTimeout(requestTimeoutId); - const contentType = res.headers.get("content-type"); - console.log( - "[OpenAI] request response content type: ", - contentType, - ); - - if (contentType?.startsWith("text/plain")) { - responseText = await res.clone().text(); - return finish(); - } - - if ( - !res.ok || - !res.headers - .get("content-type") - ?.startsWith(EventStreamContentType) || - res.status !== 200 - ) { - const responseTexts = [responseText]; - let extraInfo = await res.clone().text(); try { - const resJson = await res.clone().json(); - extraInfo = prettyObject(resJson); - } catch {} + let data = JSON.parse(ensureProperEnding(partialData)); - if (res.status === 401) { - responseTexts.push(Locale.Error.Unauthorized); + const textArray = data.reduce( + (acc: string[], item: { candidates: any[] }) => { + const texts = item.candidates.map((candidate) => + candidate.content.parts + .map((part: { text: any }) => part.text) + .join(""), + ); + return acc.concat(texts); + }, + [], + ); + + if (textArray.length > existingTexts.length) { + const deltaArray = textArray.slice(existingTexts.length); + existingTexts = textArray; + remainText += deltaArray.join(""); + } + } catch (error) { + // console.log("[Response Animation] error: ", error,partialData); + // skip error message when parsing json } - if (extraInfo) { - responseTexts.push(extraInfo); - } - - responseText = responseTexts.join("\n\n"); - - return finish(); - } - }, - onmessage(msg) { - if (msg.data === "[DONE]" || finished) { - return finish(); - } - const text = msg.data; - try { - const json = JSON.parse(text) as { - choices: Array<{ - delta: { - content: string; - }; - }>; - }; - const delta = json.choices[0]?.delta?.content; - if (delta) { - remainText += delta; - } - } catch (e) { - console.error("[Request] parse error", text); - } - }, - onclose() { - finish(); - }, - onerror(e) { - options.onError?.(e); - throw e; - }, - openWhenHidden: true, - }); + return reader.read().then(processText); + }); + }) + .catch((error) => { + console.error("Error:", error); + }); } else { const res = await fetch(chatPath, chatPayload); clearTimeout(requestTimeoutId); @@ -220,3 +217,10 @@ export class GeminiProApi implements LLMApi { return "/api/google/" + path; } } + +function ensureProperEnding(str: string) { + if (str.startsWith("[") && !str.endsWith("]")) { + return str + "]"; + } + return str; +} diff --git a/app/config/server.ts b/app/config/server.ts index c6251a5c2..c455d0b73 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -89,6 +89,8 @@ export const getServerSideConfig = () => { googleApiKey: process.env.GOOGLE_API_KEY, googleUrl: process.env.GOOGLE_URL, + gtmId: process.env.GTM_ID, + needCode: ACCESS_CODES.size > 0, code: process.env.CODE, codes: ACCESS_CODES, diff --git a/app/constant.ts b/app/constant.ts index 7668381c1..8f2518140 100644 --- a/app/constant.ts +++ b/app/constant.ts @@ -87,8 +87,7 @@ export const Azure = { }; export const Google = { - ExampleEndpoint: - "https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent", + ExampleEndpoint: "https://generativelanguage.googleapis.com/", ChatPath: "v1beta/models/gemini-pro:generateContent", // /api/openai/v1/chat/completions @@ -108,7 +107,9 @@ export const SUMMARIZE_MODEL = "gpt-3.5-turbo"; export const KnowledgeCutOffDate: Record = { default: "2021-09", + "gpt-4-turbo-preview": "2023-04", "gpt-4-1106-preview": "2023-04", + "gpt-4-0125-preview": "2023-04", "gpt-4-vision-preview": "2023-04", }; @@ -167,6 +168,15 @@ export const DEFAULT_MODELS = [ providerType: "openai", }, }, + { + name: "gpt-4-turbo-preview", + available: true, + provider: { + id: "openai", + providerName: "OpenAI", + providerType: "openai", + }, + }, { name: "gpt-4-1106-preview", available: true, @@ -176,6 +186,15 @@ export const DEFAULT_MODELS = [ providerType: "openai", }, }, + { + name: "gpt-4-0125-preview", + available: true, + provider: { + id: "openai", + providerName: "OpenAI", + providerType: "openai", + }, + }, { name: "gpt-4-vision-preview", available: true, diff --git a/app/layout.tsx b/app/layout.tsx index 3ad84a779..a2c85fd47 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -4,6 +4,10 @@ import "./styles/markdown.scss"; import "./styles/highlight.scss"; import { getClientConfig } from "./config/client"; import { type Metadata } from "next"; +import { SpeedInsights } from "@vercel/speed-insights/next"; +import { getServerSideConfig } from "./config/server"; +import { GoogleTagManager } from "@next/third-parties/google"; +const serverConfig = getServerSideConfig(); export const metadata: Metadata = { @@ -36,7 +40,19 @@ export default function RootLayout({ - {children} + + {children} + {serverConfig?.isVercel && ( + <> + + + )} + {serverConfig?.gtmId && ( + <> + + + )} + ); } diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 51cae2f9c..7144b0923 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -321,7 +321,7 @@ const cn = { Endpoint: { Title: "接口地址", - SubTitle: "样例:", + SubTitle: "不包含请求路径,样例:", }, ApiVerion: { diff --git a/app/locales/index.ts b/app/locales/index.ts index cfbdff297..6e8088a98 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -16,6 +16,7 @@ import cs from "./cs"; import ko from "./ko"; import ar from "./ar"; import bn from "./bn"; +import sk from "./sk"; import { merge } from "../utils/merge"; import type { LocaleType } from "./cn"; @@ -40,6 +41,7 @@ const ALL_LANGS = { no, ar, bn, + sk, }; export type Lang = keyof typeof ALL_LANGS; @@ -65,6 +67,7 @@ export const ALL_LANG_OPTIONS: Record = { no: "Nynorsk", ar: "العربية", bn: "বাংলা", + sk: "Slovensky", }; const LANG_KEY = "lang"; diff --git a/app/locales/sk.ts b/app/locales/sk.ts new file mode 100644 index 000000000..66cd8f041 --- /dev/null +++ b/app/locales/sk.ts @@ -0,0 +1,482 @@ +import { getClientConfig } from "../config/client"; +import { SubmitKey } from "../store/config"; +import { LocaleType } from "./index"; +import type { PartialLocaleType } from "./index"; + +// if you are adding a new translation, please use PartialLocaleType instead of LocaleType + +const isApp = !!getClientConfig()?.isApp; +const sk: PartialLocaleType = { + WIP: "Už čoskoro...", + Error: { + Unauthorized: isApp + ? "Neplatný API kľúč, prosím skontrolujte ho na stránke [Nastavenia](/#/settings)." + : "Neoprávnený prístup, prosím zadajte prístupový kód na stránke [auth](/#/auth), alebo zadajte váš OpenAI API kľúč.", + }, + Auth: { + Title: "Potrebný prístupový kód", + Tips: "Prosím, zadajte prístupový kód nižšie", + SubTips: "Alebo zadajte váš OpenAI alebo Google API kľúč", + Input: "prístupový kód", + Confirm: "Potvrdiť", + Later: "Neskôr", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} správ`, + }, + Chat: { + SubTitle: (count: number) => `${count} správ`, + EditMessage: { + Title: "Upraviť všetky správy", + Topic: { + Title: "Téma", + SubTitle: "Zmeniť aktuálnu tému", + }, + }, + Actions: { + ChatList: "Prejsť na zoznam chatov", + CompressedHistory: "Komprimovaná história výziev", + Export: "Exportovať všetky správy ako Markdown", + Copy: "Kopírovať", + Stop: "Zastaviť", + Retry: "Skúsiť znova", + Pin: "Pripnúť", + PinToastContent: "Pripnuté 1 správy do kontextových výziev", + PinToastAction: "Zobraziť", + Delete: "Vymazať", + Edit: "Upraviť", + }, + Commands: { + new: "Začať nový chat", + newm: "Začať nový chat s maskou", + next: "Ďalší Chat", + prev: "Predchádzajúci Chat", + clear: "Vymazať kontext", + del: "Vymazať Chat", + }, + InputActions: { + Stop: "Zastaviť", + ToBottom: "Na najnovšie", + Theme: { + auto: "Automaticky", + light: "Svetlý motív", + dark: "Tmavý motív", + }, + Prompt: "Výzvy", + Masks: "Masky", + Clear: "Vymazať kontext", + Settings: "Nastavenia", + }, + Rename: "Premenovať Chat", + Typing: "Písanie…", + Input: (submitKey: string) => { + var inputHints = `${submitKey} na odoslanie`; + if (submitKey === String(SubmitKey.Enter)) { + inputHints += ", Shift + Enter na zalomenie"; + } + return inputHints + ", / na vyhľadávanie výziev, : na použitie príkazov"; + }, + Send: "Odoslať", + Config: { + Reset: "Resetovať na predvolené", + SaveAs: "Uložiť ako masku", + }, + IsContext: "Kontextová výzva", + }, + Export: { + Title: "Export správ", + Copy: "Kopírovať všetko", + Download: "Stiahnuť", + MessageFromYou: "Správa od vás", + MessageFromChatGPT: "Správa od ChatGPT", + Share: "Zdieľať na ShareGPT", + Format: { + Title: "Formát exportu", + SubTitle: "Markdown alebo PNG obrázok", + }, + IncludeContext: { + Title: "Vrátane kontextu", + SubTitle: "Exportovať kontextové výzvy v maske alebo nie", + }, + Steps: { + Select: "Vybrať", + Preview: "Náhľad", + }, + Image: { + Toast: "Snímanie obrázka...", + Modal: + "Dlhým stlačením alebo kliknutím pravým tlačidlom myši uložte obrázok", + }, + }, + Select: { + Search: "Hľadať", + All: "Vybrať všetko", + Latest: "Vybrať najnovšie", + Clear: "Vymazať", + }, + Memory: { + Title: "Výzva pamäti", + EmptyContent: "Zatiaľ nič.", + Send: "Odoslať pamäť", + Copy: "Kopírovať pamäť", + Reset: "Resetovať reláciu", + ResetConfirm: + "Resetovaním sa vymaže aktuálna história konverzácie a historická pamäť. Ste si istí, že chcete resetovať?", + }, + Home: { + NewChat: "Nový Chat", + DeleteChat: "Potvrdiť vymazanie vybranej konverzácie?", + DeleteToast: "Chat vymazaný", + Revert: "Vrátiť späť", + }, + Settings: { + Title: "Nastavenia", + SubTitle: "Všetky nastavenia", + Danger: { + Reset: { + Title: "Resetovať všetky nastavenia", + SubTitle: "Resetovať všetky položky nastavení na predvolené", + Action: "Resetovať", + Confirm: "Potvrdiť resetovanie všetkých nastavení na predvolené?", + }, + Clear: { + Title: "Vymazať všetky údaje", + SubTitle: "Vymazať všetky správy a nastavenia", + Action: "Vymazať", + Confirm: "Potvrdiť vymazanie všetkých správ a nastavení?", + }, + }, + Lang: { + Name: "Jazyk", // POZOR: ak pridávate nový preklad, prosím neprekladajte túto hodnotu, nechajte ju ako "Jazyk" + All: "Všetky jazyky", + }, + Avatar: "Avatar", + FontSize: { + Title: "Veľkosť písma", + SubTitle: "Nastaviť veľkosť písma obsahu chatu", + }, + InjectSystemPrompts: { + Title: "Vložiť systémové výzvy", + SubTitle: "Vložiť globálnu systémovú výzvu pre každú požiadavku", + }, + InputTemplate: { + Title: "Šablóna vstupu", + SubTitle: "Najnovšia správa bude vyplnená do tejto šablóny", + }, + + Update: { + Version: (x: string) => `Verzia: ${x}`, + IsLatest: "Najnovšia verzia", + CheckUpdate: "Skontrolovať aktualizácie", + IsChecking: "Kontrola aktualizácií...", + FoundUpdate: (x: string) => `Nájdená nová verzia: ${x}`, + GoToUpdate: "Aktualizovať", + }, + SendKey: "Odoslať kľúč", + Theme: "Motív", + TightBorder: "Tesný okraj", + SendPreviewBubble: { + Title: "Bublina náhľadu odoslania", + SubTitle: "Náhľad markdownu v bubline", + }, + AutoGenerateTitle: { + Title: "Automaticky generovať názov", + SubTitle: "Generovať vhodný názov na základe obsahu konverzácie", + }, + Sync: { + CloudState: "Posledná aktualizácia", + NotSyncYet: "Zatiaľ nesynchronizované", + Success: "Synchronizácia úspešná", + Fail: "Synchronizácia zlyhala", + + Config: { + Modal: { + Title: "Konfigurácia synchronizácie", + Check: "Skontrolovať pripojenie", + }, + SyncType: { + Title: "Typ synchronizácie", + SubTitle: "Vyberte svoju obľúbenú službu synchronizácie", + }, + Proxy: { + Title: "Povoliť CORS Proxy", + SubTitle: "Povoliť proxy na obídenie obmedzení cross-origin", + }, + ProxyUrl: { + Title: "Koncový bod Proxy", + SubTitle: "Platné len pre vstavaný CORS proxy tohto projektu", + }, + + WebDav: { + Endpoint: "Koncový bod WebDAV", + UserName: "Meno používateľa", + Password: "Heslo", + }, + + UpStash: { + Endpoint: "URL REST služby UpStash Redis", + UserName: "Názov zálohy", + Password: "Token REST služby UpStash Redis", + }, + }, + + LocalState: "Lokálne údaje", + Overview: (overview: any) => { + return `${overview.chat} chaty, ${overview.message} správy, ${overview.prompt} výzvy, ${overview.mask} masky`; + }, + ImportFailed: "Import z súboru zlyhal", + }, + Mask: { + Splash: { + Title: "Úvodná obrazovka masky", + SubTitle: "Zobraziť úvodnú obrazovku masky pred začatím nového chatu", + }, + Builtin: { + Title: "Skryť vstavané masky", + SubTitle: "Skryť vstavané masky v zozname masiek", + }, + }, + Prompt: { + Disable: { + Title: "Zakázať automatické dopĺňanie", + SubTitle: "Zadajte / na spustenie automatického dopĺňania", + }, + List: "Zoznam výziev", + ListCount: (builtin: number, custom: number) => + `${builtin} vstavaných, ${custom} užívateľsky definovaných`, + Edit: "Upraviť", + Modal: { + Title: "Zoznam výziev", + Add: "Pridať jednu", + Search: "Hľadať výzvy", + }, + EditModal: { + Title: "Upraviť výzvu", + }, + }, + HistoryCount: { + Title: "Počet pripojených správ", + SubTitle: "Počet odoslaných správ pripojených na požiadavku", + }, + CompressThreshold: { + Title: "Práh kompresie histórie", + SubTitle: + "Bude komprimované, ak dĺžka nekomprimovaných správ presiahne túto hodnotu", + }, + + Usage: { + Title: "Stav účtu", + SubTitle(used: any, total: any) { + return `Tento mesiac použité ${used}, predplatné ${total}`; + }, + IsChecking: "Kontroluje sa...", + Check: "Skontrolovať", + NoAccess: "Zadajte API kľúč na skontrolovanie zostatku", + }, + Access: { + AccessCode: { + Title: "Prístupový kód", + SubTitle: "Povolený prístupový kód", + Placeholder: "Zadajte kód", + }, + CustomEndpoint: { + Title: "Vlastný koncový bod", + SubTitle: "Použiť vlastnú službu Azure alebo OpenAI", + }, + Provider: { + Title: "Poskytovateľ modelu", + SubTitle: "Vyberte Azure alebo OpenAI", + }, + OpenAI: { + ApiKey: { + Title: "API kľúč OpenAI", + SubTitle: "Použiť vlastný API kľúč OpenAI", + Placeholder: "sk-xxx", + }, + + Endpoint: { + Title: "Koncový bod OpenAI", + SubTitle: + "Musí začínať http(s):// alebo použiť /api/openai ako predvolený", + }, + }, + Azure: { + ApiKey: { + Title: "API kľúč Azure", + SubTitle: "Skontrolujte svoj API kľúč v Azure konzole", + Placeholder: "API kľúč Azure", + }, + + Endpoint: { + Title: "Koncový bod Azure", + SubTitle: "Príklad: ", + }, + + ApiVerion: { + Title: "Verzia API Azure", + SubTitle: "Skontrolujte svoju verziu API v Azure konzole", + }, + }, + CustomModel: { + Title: "Vlastné modely", + SubTitle: "Možnosti vlastného modelu, oddelené čiarkou", + }, + Google: { + ApiKey: { + Title: "API kľúč", + SubTitle: + "Obísť obmedzenia prístupu heslom pomocou vlastného API kľúča Google AI Studio", + Placeholder: "API kľúč Google AI Studio", + }, + + Endpoint: { + Title: "Adresa koncového bodu", + SubTitle: "Príklad:", + }, + + ApiVerion: { + Title: "Verzia API (gemini-pro verzia API)", + SubTitle: "Vyberte špecifickú verziu časti", + }, + }, + }, + + Model: "Model", + Temperature: { + Title: "Teplota", + SubTitle: "Vyššia hodnota robí výstup náhodnejším", + }, + TopP: { + Title: "Top P", + SubTitle: "Neupravujte túto hodnotu spolu s teplotou", + }, + MaxTokens: { + Title: "Maximálny počet tokenov", + SubTitle: "Maximálna dĺžka vstupných tokenov a generovaných tokenov", + }, + PresencePenalty: { + Title: "Penalizácia za prítomnosť", + SubTitle: + "Vyššia hodnota zvyšuje pravdepodobnosť hovorenia o nových témach", + }, + FrequencyPenalty: { + Title: "Penalizácia za frekvenciu", + SubTitle: + "Vyššia hodnota znižuje pravdepodobnosť opakovania rovnakej línie", + }, + }, + Store: { + DefaultTopic: "Nová konverzácia", + BotHello: "Ahoj! Ako vám dnes môžem pomôcť?", + Error: "Niečo sa pokazilo, skúste to prosím neskôr znova.", + Prompt: { + History: (content: string) => + "Toto je zhrnutie histórie chatu ako rekapitulácia: " + content, + Topic: + "Prosím, vygenerujte štvor- až päťslovný titul, ktorý zhrnie našu konverzáciu bez akéhokoľvek úvodu, interpunkcie, úvodzoviek, bodiek, symbolov, tučného textu alebo ďalšieho textu. Odstráňte uzatváracie úvodzovky.", + Summarize: + "Stručne zhrňte diskusiu na menej ako 200 slov, aby ste ju mohli použiť ako výzvu pre budúci kontext.", + }, + }, + Copy: { + Success: "Skopírované do schránky", + Failed: + "Kopírovanie zlyhalo, prosím udeľte povolenie na prístup k schránke", + }, + Download: { + Success: "Obsah stiahnutý do vášho adresára.", + Failed: "Stiahnutie zlyhalo.", + }, + Context: { + Toast: (x: any) => `S ${x} kontextovými výzvami`, + Edit: "Aktuálne nastavenia chatu", + Add: "Pridať výzvu", + Clear: "Kontext vyčistený", + Revert: "Vrátiť späť", + }, + Plugin: { + Name: "Plugin", + }, + FineTuned: { + Sysmessage: "Ste asistent, ktorý", + }, + Mask: { + Name: "Maska", + Page: { + Title: "Šablóna výziev", + SubTitle: (count: number) => `${count} šablón výziev`, + Search: "Hľadať šablóny", + Create: "Vytvoriť", + }, + Item: { + Info: (count: number) => `${count} výziev`, + Chat: "Chat", + View: "Zobraziť", + Edit: "Upraviť", + Delete: "Vymazať", + DeleteConfirm: "Potvrdiť vymazanie?", + }, + EditModal: { + Title: (readonly: boolean) => + `Upraviť šablónu výziev ${readonly ? "(iba na čítanie)" : ""}`, + Download: "Stiahnuť", + Clone: "Klonovať", + }, + Config: { + Avatar: "Avatar robota", + Name: "Meno robota", + Sync: { + Title: "Použiť globálne nastavenia", + SubTitle: "Použiť globálne nastavenia v tomto chate", + Confirm: "Potvrdiť prepísanie vlastného nastavenia globálnym?", + }, + HideContext: { + Title: "Skryť kontextové výzvy", + SubTitle: "Nezobrazovať kontextové výzvy v chate", + }, + Share: { + Title: "Zdieľať túto masku", + SubTitle: "Vygenerovať odkaz na túto masku", + Action: "Kopírovať odkaz", + }, + }, + }, + NewChat: { + Return: "Vrátiť sa", + Skip: "Len začať", + Title: "Vybrať masku", + SubTitle: "Chatovať s dušou za maskou", + More: "Nájsť viac", + NotShow: "Už nezobrazovať", + ConfirmNoShow: + "Potvrdiť deaktiváciu? Môžete ju neskôr znova povoliť v nastaveniach.", + }, + + UI: { + Confirm: "Potvrdiť", + Cancel: "Zrušiť", + Close: "Zavrieť", + Create: "Vytvoriť", + Edit: "Upraviť", + Export: "Exportovať", + Import: "Importovať", + Sync: "Synchronizovať", + Config: "Konfigurácia", + }, + Exporter: { + Description: { + Title: "Zobrazia sa len správy po vyčistení kontextu", + }, + Model: "Model", + Messages: "Správy", + Topic: "Téma", + Time: "Čas", + }, + + URLCommand: { + Code: "Zistený prístupový kód z URL, potvrdiť na aplikovanie?", + Settings: "Zistené nastavenia z URL, potvrdiť na aplikovanie?", + }, +}; + +export default sk; diff --git a/app/page.tsx b/app/page.tsx index 20b503174..b3f169a9b 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -10,7 +10,11 @@ export default async function App() { return ( <> - {serverConfig?.isVercel && } + {serverConfig?.isVercel && ( + <> + + + )} ); } diff --git a/app/store/chat.ts b/app/store/chat.ts index 4af5a52ac..dff6b7bf1 100644 --- a/app/store/chat.ts +++ b/app/store/chat.ts @@ -386,7 +386,9 @@ export const useChatStore = createPersistStore( const contextPrompts = session.mask.context.slice(); // system prompts, to get close to OpenAI Web ChatGPT - const shouldInjectSystemPrompts = modelConfig.enableInjectSystemPrompts; + const shouldInjectSystemPrompts = + modelConfig.enableInjectSystemPrompts && + session.mask.modelConfig.model.startsWith("gpt-"); var systemPrompts: ChatMessage[] = []; systemPrompts = shouldInjectSystemPrompts diff --git a/app/store/config.ts b/app/store/config.ts index 057e31b25..20bf664df 100644 --- a/app/store/config.ts +++ b/app/store/config.ts @@ -28,7 +28,7 @@ export enum Theme { export const DEFAULT_CONFIG = { lastUpdate: Date.now(), // timestamp, to merge state - submitKey: isMacOS() ? SubmitKey.MetaEnter : SubmitKey.CtrlEnter, + submitKey: SubmitKey.Enter, avatar: "1f603", fontSize: 14, theme: Theme.Auto as Theme, diff --git a/docs/images/head-cover.png b/docs/images/head-cover.png new file mode 100644 index 000000000..859d83b05 Binary files /dev/null and b/docs/images/head-cover.png differ diff --git a/package.json b/package.json index 738e22ecc..f28a5a6ec 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,10 @@ "dependencies": { "@fortaine/fetch-event-source": "^3.0.6", "@hello-pangea/dnd": "^16.5.0", + "@next/third-parties": "^14.1.0", "@svgr/webpack": "^6.5.1", "@vercel/analytics": "^0.1.11", + "@vercel/speed-insights": "^1.0.2", "emoji-picker-react": "^4.5.15", "fuse.js": "^7.0.0", "html-to-image": "^1.11.11", @@ -42,7 +44,7 @@ "zustand": "^4.3.8" }, "devDependencies": { - "@tauri-apps/cli": "^1.5.8", + "@tauri-apps/cli": "1.5.7", "@types/node": "^20.9.0", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.7", diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png index 700c48286..b191a58ac 100644 Binary files a/public/android-chrome-192x192.png and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png index e701ed2fb..c7e52c394 100644 Binary files a/public/android-chrome-512x512.png and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png index 387303114..b0da95315 100644 Binary files a/public/apple-touch-icon.png and b/public/apple-touch-icon.png differ diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png index 92f53492f..3f8e0a535 100644 Binary files a/public/favicon-16x16.png and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png index f1f439e85..2fee10dfb 100644 Binary files a/public/favicon-32x32.png and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico index a3737b350..b5e8234cd 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/macos.png b/public/macos.png index f1bd0e69f..2eb110707 100644 Binary files a/public/macos.png and b/public/macos.png differ diff --git a/scripts/delete-deployment-preview.sh b/scripts/delete-deployment-preview.sh new file mode 100755 index 000000000..4f2bb3495 --- /dev/null +++ b/scripts/delete-deployment-preview.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Set the pipefail option. +set -o pipefail + +# Get the Vercel API endpoints. +GET_DEPLOYMENTS_ENDPOINT="https://api.vercel.com/v6/deployments" +DELETE_DEPLOYMENTS_ENDPOINT="https://api.vercel.com/v13/deployments" + +# Create a list of deployments. +deployments=$(curl -s -X GET "$GET_DEPLOYMENTS_ENDPOINT/?projectId=$VERCEL_PROJECT_ID&teamId=$VERCEL_ORG_ID" -H "Authorization: Bearer $VERCEL_TOKEN ") +#deployments=$(curl -s -X GET "$GET_DEPLOYMENTS_ENDPOINT/?projectId=$VERCEL_PROJECT_ID" -H "Authorization: Bearer $VERCEL_TOKEN ") + +# Filter the deployments list by meta.base_hash === meta tag. +filtered_deployments=$(echo -E $deployments | jq --arg META_TAG "$META_TAG" '[.deployments[] | select(.meta.base_hash | type == "string" and contains($META_TAG)) | .uid] | join(",")') +filtered_deployments="${filtered_deployments//\"/}" # Remove double quotes + +# Clears the values from filtered_deployments +IFS=',' read -ra values <<<"$filtered_deployments" + +echo "META_TAG ${META_TAG}" +echo "Filtered deployments ${filtered_deployments}" + +# Iterate over the filtered deployments list. +for uid in "${values[@]}"; do + echo "Deleting ${uid}" + + delete_url="${DELETE_DEPLOYMENTS_ENDPOINT}/${uid}?teamId=${VERCEL_ORG_ID}" + echo $delete_url + + # Make DELETE a request to the /v13/deployments/{id} endpoint. + curl -X DELETE $delete_url -H "Authorization: Bearer $VERCEL_TOKEN" + + echo "Deleted!" +done diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index 7fee8db6e..148479fca 100644 Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index 178761b6a..c1a51d41f 100644 Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png index 471cdbb65..e06e30c4c 100644 Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png index 241e101ba..6b6f4a2fd 100644 Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png index b27ce753d..7c11ec3eb 100644 Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png index d9d58df2d..2da5070a4 100644 Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png index 64dd15d81..a3b0afca3 100644 Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png index c585069db..9adabd622 100644 Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png index 70b0b5ddb..5d5eabec6 100644 Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png index 6657a9617..16e472163 100644 Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png index 865a99ed8..534d53547 100644 Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png index 4be716430..a817c9b63 100644 Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png index 9791b7adb..01b40ebfc 100644 Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index 7432486f7..131a0810a 100644 Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index 59f1568ee..93e6e8af2 100644 Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index 3ae7ae9bf..84971ce12 100644 Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 30546227d..75d6a0d0a 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -9,7 +9,7 @@ }, "package": { "productName": "NextChat", - "version": "2.9.13" + "version": "2.10.1" }, "tauri": { "allowlist": { diff --git a/yarn.lock b/yarn.lock index e608eda15..db6da708b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1275,6 +1275,13 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz#0c2758164cccd61bc5a1c6cd8284fe66173e4a2b" integrity sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw== +"@next/third-parties@^14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/third-parties/-/third-parties-14.1.0.tgz#d9604fff8880e05d3804d2cf7ab42eb5430aec69" + integrity sha512-f55SdvQ1WWxi4mb5QqtYQh5wRzbm1XaeP7s39DPn4ks3re+n9VlFccbMxBRHqkE62zAyIKmvkUB2cByT/gugGA== + dependencies: + third-party-capital "1.0.20" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1431,71 +1438,71 @@ dependencies: tslib "^2.4.0" -"@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-arm64@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.7.tgz#3435f1b6c4b431e0283f94c3a0bd486be66b24ee" + integrity sha512-eUpOUhs2IOpKaLa6RyGupP2owDLfd0q2FR/AILzryjtBtKJJRDQQvuotf+LcbEce2Nc2AHeYJIqYAsB4sw9K+g== -"@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-darwin-x64@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.7.tgz#d3d646e790067158d14a1f631a50c67dc05e3360" + integrity sha512-zfumTv1xUuR+RB1pzhRy+51tB6cm8I76g0xUBaXOfEdOJ9FqW5GW2jdnEUbpNuU65qJ1lB8LVWHKGrSWWKazew== -"@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-arm-gnueabihf@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.7.tgz#049c12980cdfd67fe9e5163762bf77f3c85f6956" + integrity sha512-JngWNqS06bMND9PhiPWp0e+yknJJuSozsSbo+iMzHoJNRauBZCUx+HnUcygUR66Cy6qM4eJvLXtsRG7ApxvWmg== -"@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-gnu@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.7.tgz#d1c143da15cba74eebfaaf1662f0734e30f97562" + integrity sha512-WyIYP9BskgBGq+kf4cLAyru8ArrxGH2eMYGBJvuNEuSaqBhbV0i1uUxvyWdazllZLAEz1WvSocUmSwLknr1+sQ== -"@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-arm64-musl@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.7.tgz#f79a17f5360a8ab25b90f3a8e9e6327d5378072f" + integrity sha512-OrDpihQP2MB0JY1a/wP9wsl9dDjFDpVEZOQxt4hU+UVGRCZQok7ghPBg4+Xpd1CkNkcCCuIeY8VxRvwLXpnIzg== -"@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-gnu@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.7.tgz#2cbd17998dcfc8a465d61f30ac9e99ae65e2c2e8" + integrity sha512-4T7FAYVk76rZi8VkuLpiKUAqaSxlva86C1fHm/RtmoTKwZEV+MI3vIMoVg+AwhyWIy9PS55C75nF7+OwbnFnvQ== -"@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-linux-x64-musl@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.7.tgz#d5d4ddded945cc781568d72b7eba367121f28525" + integrity sha512-LL9aMK601BmQjAUDcKWtt5KvAM0xXi0iJpOjoUD3LPfr5dLvBMTflVHQDAEtuZexLQyqpU09+60781PrI/FCTw== -"@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-arm64-msvc@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.7.tgz#05a1bd4e2bc692bad995edb9d07e616cc5682fd5" + integrity sha512-TmAdM6GVkfir3AUFsDV2gyc25kIbJeAnwT72OnmJGAECHs/t/GLP9IkFLLVcFKsiosRf8BXhVyQ84NYkSWo14w== -"@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-ia32-msvc@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.7.tgz#8c832f4dc88374255ef1cda4d2d6a6d61a921388" + integrity sha512-bqWfxwCfLmrfZy69sEU19KHm5TFEaMb8KIekd4aRq/kyOlrjKLdZxN1PyNRP8zpJA1lTiRHzfUDfhpmnZH/skg== -"@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-win32-x64-msvc@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.7.tgz#adfcce46f796dd22ef69fb26ad8c6972a3263985" + integrity sha512-OxLHVBNdzyQ//xT3kwjQFnJTn/N5zta/9fofAkXfnL7vqmVn6s/RY1LDa3sxCHlRaKw0n3ShpygRbM9M8+sO9w== -"@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== +"@tauri-apps/cli@1.5.7": + version "1.5.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.5.7.tgz#8f9a8bf577a39b7f7c0e5b125e7b5b3e149cfb5a" + integrity sha512-z7nXLpDAYfQqR5pYhQlWOr88DgPq1AfQyxHhGiakiVgWlaG0ikEfQxop2txrd52H0TRADG0JHR9vFrVFPv4hVQ== optionalDependencies: - "@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" + "@tauri-apps/cli-darwin-arm64" "1.5.7" + "@tauri-apps/cli-darwin-x64" "1.5.7" + "@tauri-apps/cli-linux-arm-gnueabihf" "1.5.7" + "@tauri-apps/cli-linux-arm64-gnu" "1.5.7" + "@tauri-apps/cli-linux-arm64-musl" "1.5.7" + "@tauri-apps/cli-linux-x64-gnu" "1.5.7" + "@tauri-apps/cli-linux-x64-musl" "1.5.7" + "@tauri-apps/cli-win32-arm64-msvc" "1.5.7" + "@tauri-apps/cli-win32-ia32-msvc" "1.5.7" + "@tauri-apps/cli-win32-x64-msvc" "1.5.7" "@trysound/sax@0.2.0": version "0.2.0" @@ -1704,6 +1711,11 @@ resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-0.1.11.tgz#727a0ac655a4a89104cdea3e6925476470299428" integrity sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw== +"@vercel/speed-insights@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@vercel/speed-insights/-/speed-insights-1.0.2.tgz#1bebf3e7c7046b6a911721233b263b69214ddb3e" + integrity sha512-y5HWeB6RmlyVYxJAMrjiDEz8qAIy2cit0fhBq+MD78WaUwQvuBnQlX4+5MuwVTWi46bV3klaRMq83u9zUy1KOg== + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -5775,6 +5787,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +third-party-capital@1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/third-party-capital/-/third-party-capital-1.0.20.tgz#e218a929a35bf4d2245da9addb8ab978d2f41685" + integrity sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA== + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"